zhoufan 1 год назад
Родитель
Сommit
6caf70dcc0

+ 2 - 2
zxdt-api/src/main/java/api/controller/online/MessageController.java

95
     @Log(title = "查询留言消息列表",businessType = BusinessType.QUERY)
95
     @Log(title = "查询留言消息列表",businessType = BusinessType.QUERY)
96
     @GetMapping("/leavelist")
96
     @GetMapping("/leavelist")
97
     public AjaxResult getLeaveList() {
97
     public AjaxResult getLeaveList() {
98
-        LambdaQueryWrapper<Message> qw = new QueryWrapper().select("kh_user user,count(*) as count").lambda();
98
+        LambdaQueryWrapper<Message> qw = new QueryWrapper<Message>().select("kh_user user,count(*) as count,max(create_time) as time").lambda();
99
         qw.eq( Message::getSend, 1).isNull( Message::getKfUser).groupBy(Message::getKhUser);
99
         qw.eq( Message::getSend, 1).isNull( Message::getKfUser).groupBy(Message::getKhUser);
100
         List<Map<String,Object>> list=messageService.getMaps(qw);
100
         List<Map<String,Object>> list=messageService.getMaps(qw);
101
         if(list.stream().count()>0) {
101
         if(list.stream().count()>0) {
106
             for (Map<String, Object> map : list) {
106
             for (Map<String, Object> map : list) {
107
                 String user = map.get("user").toString();
107
                 String user = map.get("user").toString();
108
                 List<Map<String, Object>> mapUsers = userlist.stream().filter(p -> p.get("customerNo").equals(user)).collect(Collectors.toList());
108
                 List<Map<String, Object>> mapUsers = userlist.stream().filter(p -> p.get("customerNo").equals(user)).collect(Collectors.toList());
109
-                if (mapUsers != null && mapUsers.size() > 0) {
109
+                if (mapUsers.size() > 0) {
110
                     map.put("name", mapUsers.get(0).get("customerName"));
110
                     map.put("name", mapUsers.get(0).get("customerName"));
111
                 } else {
111
                 } else {
112
                     map.put("name", "");
112
                     map.put("name", "");

+ 1 - 1
zxdt-api/src/main/resources/application-dev.yml

1
 server:
1
 server:
2
-  port: 8060
2
+  port: 8110
3
 swagger: true
3
 swagger: true
4
 
4
 
5
 spring:
5
 spring:

+ 2 - 2
zxdt-api/src/main/resources/application.yml

3
     date-format: yyyy-MM-dd HH:mm:ss
3
     date-format: yyyy-MM-dd HH:mm:ss
4
     time-zone: GMT+8
4
     time-zone: GMT+8
5
   profiles:
5
   profiles:
6
-    active: production
7
-    #active: dev
6
+    #active: production
7
+    active: dev
8
   servlet:
8
   servlet:
9
     multipart:
9
     multipart:
10
       max-file-size: 20MB #单个文件最大为20M
10
       max-file-size: 20MB #单个文件最大为20M

+ 68 - 22
zxdt-service/src/main/java/api/service/websocket/WebSocket.java

94
                         mv.setStatus("success");
94
                         mv.setStatus("success");
95
                         mv.setType("text");
95
                         mv.setType("text");
96
                         mv.setContent(first);
96
                         mv.setContent(first);
97
-                        session.getAsyncRemote().sendText(JSON.toJSONString(mv));
97
+                        sendText(session,JSON.toJSONString(mv));
98
 
98
 
99
                         Message msg1 = new Message();
99
                         Message msg1 = new Message();
100
                         msg1.setCreateTime(new Date());
100
                         msg1.setCreateTime(new Date());
118
                 MessageView mv1 = new MessageView();
118
                 MessageView mv1 = new MessageView();
119
                 mv1.setStatus("error");
119
                 mv1.setStatus("error");
120
                 mv1.setContent("签入失败,重复签入");
120
                 mv1.setContent("签入失败,重复签入");
121
-                session.getAsyncRemote().sendText(JSON.toJSONString(mv1));
121
+                sendText(session,JSON.toJSONString(mv1));
122
                 session.close();
122
                 session.close();
123
             }
123
             }
124
         } catch (Exception e) {
124
         } catch (Exception e) {
149
                         mv1.setStatus("error");
149
                         mv1.setStatus("error");
150
                         mv1.setContent("客户已下线");
150
                         mv1.setContent("客户已下线");
151
                         mv1.setUser(userCode);
151
                         mv1.setUser(userCode);
152
-                        session1.getAsyncRemote().sendText(JSON.toJSONString(mv1));
152
+                        sendText(session1,JSON.toJSONString(mv1));
153
                     }
153
                     }
154
                     khsessionPool.remove(userCode);
154
                     khsessionPool.remove(userCode);
155
                     khkfs.remove(userCode);
155
                     khkfs.remove(userCode);
175
                 mvh.setStatus("success");
175
                 mvh.setStatus("success");
176
                 mvh.setType(type);
176
                 mvh.setType(type);
177
                 mvh.setContent(mv.getContent());
177
                 mvh.setContent(mv.getContent());
178
-                session.getAsyncRemote().sendText(JSON.toJSONString(mvh));
178
+                sendText(session,JSON.toJSONString(mvh));
179
                 return;
179
                 return;
180
             }
180
             }
181
 
181
 
215
                             WxMpKefuMessage wechatMessage = WxMpKefuMessage.TEXT().toUser(kh).content(content).build();
215
                             WxMpKefuMessage wechatMessage = WxMpKefuMessage.TEXT().toUser(kh).content(content).build();
216
                             webSocket.wxMpService.getKefuService().sendKefuMessage(wechatMessage);
216
                             webSocket.wxMpService.getKefuService().sendKefuMessage(wechatMessage);
217
                         } catch (WxErrorException e) {
217
                         } catch (WxErrorException e) {
218
-                            log.error("发送微信消息失败",e);
218
+                            log.error("发送微信消息失败", e);
219
                             mv1.setStatus("error");
219
                             mv1.setStatus("error");
220
                             mv1.setContent("发送微信消息失败");
220
                             mv1.setContent("发送微信消息失败");
221
-                            session.getAsyncRemote().sendText(JSON.toJSONString(mv1));
221
+                            sendText(session,JSON.toJSONString(mv1));
222
                             return;
222
                             return;
223
                         }
223
                         }
224
                     } else {
224
                     } else {
227
                         mv1.setStatus("success");
227
                         mv1.setStatus("success");
228
                         mv1.setType(type);
228
                         mv1.setType(type);
229
                         mv1.setContent(content);
229
                         mv1.setContent(content);
230
-                        session1.getAsyncRemote().sendText(JSON.toJSONString(mv1));
230
+                        sendText(session1,JSON.toJSONString(mv1));
231
                     }
231
                     }
232
                 } else {
232
                 } else {
233
                     mv1.setStatus("error");
233
                     mv1.setStatus("error");
235
                 }
235
                 }
236
 
236
 
237
                 if (!exist) {
237
                 if (!exist) {
238
-                    session.getAsyncRemote().sendText(JSON.toJSONString(mv1));
238
+                    sendText(session,JSON.toJSONString(mv1));
239
                     return;
239
                     return;
240
                 }
240
                 }
241
             } else {
241
             } else {
249
                     String first = webSocket.configService.getConfigValue("AutoReply");
249
                     String first = webSocket.configService.getConfigValue("AutoReply");
250
                     if (StringHelper.isNotEmpty(first)) {//自动回复
250
                     if (StringHelper.isNotEmpty(first)) {//自动回复
251
                         if ("text".equals(type)) {
251
                         if ("text".equals(type)) {
252
-                            if (!content.contains("人工")) {
252
+                            String[] keys = new String[]{"人工", "客服"};
253
+                            if (!StringHelper.containList(content, keys)) {
254
+                                //if (!content.contains("人工")) {
253
                                 //获取匹配的记录
255
                                 //获取匹配的记录
254
                                 AutoReply[] list = webSocket.autoReplyService.selectMatchList(1, content);
256
                                 AutoReply[] list = webSocket.autoReplyService.selectMatchList(1, content);
255
                                 if (list != null && list.length > 0) {
257
                                 if (list != null && list.length > 0) {
265
                                         throw new RuntimeException(e);
267
                                         throw new RuntimeException(e);
266
                                     }
268
                                     }
267
                                     long n = webSocket.messageService.getCount(qw);//当天回复次数
269
                                     long n = webSocket.messageService.getCount(qw);//当天回复次数
268
-                                    if (ar.getReplyCount()==0||(ar.getReplyCount() > 0 && n < ar.getReplyCount())) {
270
+                                    if (ar.getReplyCount() == 0 || (ar.getReplyCount() > 0 && n < ar.getReplyCount())) {
269
                                         //回复内容条数
271
                                         //回复内容条数
270
                                         List<Map<String, Object>> cs = ar.getContent();
272
                                         List<Map<String, Object>> cs = ar.getContent();
271
                                         if (cs != null && cs.size() > 0) {
273
                                         if (cs != null && cs.size() > 0) {
295
                                                     mv1.setStatus("success");
297
                                                     mv1.setStatus("success");
296
                                                     mv1.setType(hftype);
298
                                                     mv1.setType(hftype);
297
                                                     mv1.setContent(hfcontent);
299
                                                     mv1.setContent(hfcontent);
298
-                                                    try {
299
-                                                        session.getBasicRemote().sendText(JSON.toJSONString(mv1));
300
-                                                    } catch (IOException e) {
301
-                                                        throw new RuntimeException(e);
302
-                                                    }
300
+                                                    sendText(session,JSON.toJSONString(mv1));
303
                                                 }
301
                                                 }
304
                                             } else {
302
                                             } else {
305
                                                 int rn = cs.size();
303
                                                 int rn = cs.size();
329
                                                 mv1.setStatus("success");
327
                                                 mv1.setStatus("success");
330
                                                 mv1.setType(hftype);
328
                                                 mv1.setType(hftype);
331
                                                 mv1.setContent(hfcontent);
329
                                                 mv1.setContent(hfcontent);
332
-                                                session.getAsyncRemote().sendText(JSON.toJSONString(mv1));
330
+                                                sendText(session,JSON.toJSONString(mv1));
333
                                             }
331
                                             }
334
                                         }
332
                                         }
335
                                     }
333
                                     }
341
                     } else {
339
                     } else {
342
                         zrg = true;
340
                         zrg = true;
343
                     }
341
                     }
342
+                    if (zrg) {
343
+                        MessageView mv1 = new MessageView();
344
+                        mv1.setStatus("success");
345
+                        mv1.setType("text");
346
+                        mv1.setContent("人工客服正火速赶来,请稍等...");
347
+                        sendText(session,JSON.toJSONString(mv1));
348
+                        mv1.setContent("【人工客服工作时间为每天(含节假日)8:30-20:00,如现在非工作时间,建议您使用自助服务或者在工作时间联系我们。】");
349
+                        sendText(session,JSON.toJSONString(mv1));
350
+                        mv1.setContent("正在接入客服,请稍后...");
351
+                        sendText(session,JSON.toJSONString(mv1));
352
+                    }
344
                 } else if (servicers.get(kf) == 2) {//客服置忙
353
                 } else if (servicers.get(kf) == 2) {//客服置忙
345
                     zrg = true;
354
                     zrg = true;
346
                 }
355
                 }
360
                         mv1.setType(type);
369
                         mv1.setType(type);
361
                         mv1.setContent(content);
370
                         mv1.setContent(content);
362
                         mv1.setUser(userCode);
371
                         mv1.setUser(userCode);
363
-                        session1.getAsyncRemote().sendText(JSON.toJSONString(mv1));
372
+                        sendText(session1,JSON.toJSONString(mv1));
364
                     }
373
                     }
365
                 }
374
                 }
366
             }
375
             }
399
                     mv1.setStatus("error");
408
                     mv1.setStatus("error");
400
                     mv1.setContent("客户已下线");
409
                     mv1.setContent("客户已下线");
401
                     mv1.setUser(userCode);
410
                     mv1.setUser(userCode);
402
-                    session1.getAsyncRemote().sendText(JSON.toJSONString(mv1));
411
+                    sendText(session1,JSON.toJSONString(mv1));
403
                 }
412
                 }
404
                 khsessionPool.remove(userCode);
413
                 khsessionPool.remove(userCode);
405
                 khkfs.remove(userCode);
414
                 khkfs.remove(userCode);
408
         error.printStackTrace();
417
         error.printStackTrace();
409
     }
418
     }
410
 
419
 
420
+    //发送消息处理
421
+    private void sendText(Session s,String msg){
422
+        if (s != null && s.isOpen()) {
423
+            synchronized (s) {
424
+                try {
425
+                    s.getBasicRemote().sendText(msg);
426
+                } catch (IOException e) {
427
+                    log.error(msg+" 发送失败",e);
428
+                    if(e.getMessage().contains("close")) {
429
+                        try {
430
+                            s.close();
431
+                        } catch (IOException ex) {
432
+                            log.error(msg + " 关闭失败", ex);
433
+                        }
434
+                    }
435
+                }
436
+            }
437
+        }
438
+    }
439
+
411
     //客户转移
440
     //客户转移
412
     public String khTransfer(String kf,String kh) {
441
     public String khTransfer(String kf,String kh) {
413
         String msg = "客户已下线";
442
         String msg = "客户已下线";
454
             mv1.setType("transfer");
483
             mv1.setType("transfer");
455
             mv1.setContent("转移客户");
484
             mv1.setContent("转移客户");
456
             mv1.setUser(kh);
485
             mv1.setUser(kh);
457
-            session1.getAsyncRemote().sendText(JSON.toJSONString(mv1));
486
+            sendText(session1,JSON.toJSONString(mv1));
458
         }
487
         }
459
 
488
 
460
         return msg;
489
         return msg;
545
             mv1.setStatus("success");
574
             mv1.setStatus("success");
546
             mv1.setType(type);
575
             mv1.setType(type);
547
             mv1.setContent(content);
576
             mv1.setContent(content);
548
-            khsessionPool.get(kh).getAsyncRemote().sendText(JSON.toJSONString(mv1));
577
+            sendText(khsessionPool.get(kh),JSON.toJSONString(mv1));
549
         }
578
         }
550
 
579
 
551
         webSocket.messageService.insert(message);
580
         webSocket.messageService.insert(message);
628
             String first = webSocket.configService.getConfigValue("AutoReply");
657
             String first = webSocket.configService.getConfigValue("AutoReply");
629
             if (StringHelper.isNotEmpty(first)) {//自动回复
658
             if (StringHelper.isNotEmpty(first)) {//自动回复
630
                 if ("text".equals(msgType)) {
659
                 if ("text".equals(msgType)) {
631
-                    if (!content.contains("人工")) {
660
+                    String[] keys = new String[]{"人工", "客服"};
661
+                    if (!StringHelper.containList(content, keys)) {
662
+                        //if (!content.contains("人工")) {
632
                         //获取匹配的记录
663
                         //获取匹配的记录
633
                         AutoReply[] list = webSocket.autoReplyService.selectMatchList(2, content);
664
                         AutoReply[] list = webSocket.autoReplyService.selectMatchList(2, content);
634
                         if (list != null && list.length > 0) {
665
                         if (list != null && list.length > 0) {
746
             } else {
777
             } else {
747
                 zrg = true;
778
                 zrg = true;
748
             }
779
             }
780
+            if (zrg) {
781
+                try {
782
+                    String ct1="人工客服正火速赶来,请稍等……";
783
+                    WxMpKefuMessage wechatMessage1 = WxMpKefuMessage.TEXT().toUser(sendUser).content(ct1).build();
784
+                    webSocket.wxMpService.getKefuService().sendKefuMessage(wechatMessage1);
785
+                    String ct2="【人工客服工作时间为每天(含节假日)8:30-20:00,如现在非工作时间,建议您使用自助服务或者在工作时间联系我们。】";
786
+                    WxMpKefuMessage wechatMessage2 = WxMpKefuMessage.TEXT().toUser(sendUser).content(ct2).build();
787
+                    webSocket.wxMpService.getKefuService().sendKefuMessage(wechatMessage2);
788
+                    String ct3="正在接入客服,请稍后...";
789
+                    WxMpKefuMessage wechatMessage3 = WxMpKefuMessage.TEXT().toUser(sendUser).content(ct3).build();
790
+                    webSocket.wxMpService.getKefuService().sendKefuMessage(wechatMessage3);
791
+                } catch (WxErrorException e) {
792
+                    throw new RuntimeException(e);
793
+                }
794
+            }
749
         } else if (servicers.get(kf) == 2) {//客服置忙
795
         } else if (servicers.get(kf) == 2) {//客服置忙
750
             zrg = true;
796
             zrg = true;
751
         }
797
         }
765
                 mv.setType(msgType);
811
                 mv.setType(msgType);
766
                 mv.setContent(content);
812
                 mv.setContent(content);
767
                 mv.setUser(sendUser);
813
                 mv.setUser(sendUser);
768
-                session1.getAsyncRemote().sendText(JSON.toJSONString(mv));
814
+                sendText(session1,JSON.toJSONString(mv));
769
             }
815
             }
770
         }
816
         }
771
 
817
 

+ 8 - 0
zxdt-util/src/main/java/api/util/helper/StringHelper.java

334
         }
334
         }
335
         return resultList;
335
         return resultList;
336
     }
336
     }
337
+
338
+    //字符串是否包含集合中的某一项
339
+    public static boolean containList(String source,String[] list){
340
+        for (String k:list ) {
341
+            if(source.contains(k)) return true;
342
+        }
343
+        return false;
344
+    }
337
 }
345
 }