diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WebSocketController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WebSocketController.java
index 128b8d067..4ae0335ec 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WebSocketController.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WebSocketController.java
@@ -3,11 +3,10 @@ package com.stdiet.web.controller.custom;
import com.alibaba.fastjson.JSONObject;
import com.stdiet.common.core.controller.BaseController;
import com.stdiet.custom.utils.WsUtils;
-import com.stdiet.web.server.WebSocketServer;
+import com.stdiet.custom.server.WebSocketServer;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@@ -39,16 +38,16 @@ public class WebSocketController extends BaseController {
}
- @Scheduled(fixedRate = 30000)
- public void boardCast() {
- try {
- JSONObject heartBeat = new JSONObject();
- heartBeat.put("type", WsUtils.WS_TYPE_HEART_BEAT);
- heartBeat.put("msg", "ping");
-
- WebSocketServer.sendInfo(heartBeat.toJSONString(), null);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
+// @Scheduled(fixedRate = 30000)
+// public void boardCast() {
+// try {
+// JSONObject heartBeat = new JSONObject();
+// heartBeat.put("type", WsUtils.WS_TYPE_HEART_BEAT);
+// heartBeat.put("msg", "ping");
+//
+// WebSocketServer.sendInfo(heartBeat.toJSONString(), null);
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+// }
}
diff --git a/stdiet-custom/pom.xml b/stdiet-custom/pom.xml
index 5db28a2cc..a7e81b668 100644
--- a/stdiet-custom/pom.xml
+++ b/stdiet-custom/pom.xml
@@ -99,6 +99,11 @@
ikanalyzer
2012_u6
+
+ org.apache.tomcat.embed
+ tomcat-embed-websocket
+
+
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysServicesTopic.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysServicesTopic.java
index f465d7522..3ce77b0bd 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysServicesTopic.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysServicesTopic.java
@@ -89,4 +89,6 @@ public class SysServicesTopic {
List replys;
+ Integer count;
+
}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesTopicMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesTopicMapper.java
index 333417f81..0217a94e8 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesTopicMapper.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesTopicMapper.java
@@ -18,4 +18,6 @@ public interface SysServicesTopicMapper {
int inserSysServicesTopicReply(SysServicesTopic topic);
List selectSysServicesTopicSessionByTopicId(String topicId);
+
+ List selectUnreadTopicCount(List topics);
}
diff --git a/stdiet-admin/src/main/java/com/stdiet/web/server/WebSocketServer.java b/stdiet-custom/src/main/java/com/stdiet/custom/server/WebSocketServer.java
similarity index 70%
rename from stdiet-admin/src/main/java/com/stdiet/web/server/WebSocketServer.java
rename to stdiet-custom/src/main/java/com/stdiet/custom/server/WebSocketServer.java
index 8dfbb8deb..7bc506c04 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/server/WebSocketServer.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/server/WebSocketServer.java
@@ -1,7 +1,10 @@
-package com.stdiet.web.server;
+package com.stdiet.custom.server;
import com.alibaba.fastjson.JSONObject;
import com.stdiet.common.core.domain.model.LoginUser;
+import com.stdiet.common.utils.spring.SpringUtils;
+import com.stdiet.custom.domain.SysServicesTopic;
+import com.stdiet.custom.service.ISysServicesTopicService;
import com.stdiet.custom.utils.WsUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -10,15 +13,17 @@ import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;
@ServerEndpoint(value = "/ws")
@Component
@Slf4j
public class WebSocketServer {
-
// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();
+
//private static ConcurrentHashMap websocketList = new ConcurrentHashMap<>();
// 与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
@@ -74,23 +79,6 @@ public class WebSocketServer {
log.info("有一连接关闭!");
}
- // */
- /// **
- // * 收到客户端消息后调用的方法
- // *
- // * @param message 客户端发送过来的消息*//*
- @OnMessage
- public void onMessage(String message, Session session) {
- log.info("收到来自窗口" + sid + "的信息:" + message);
-// // 群发消息
-// for (WebSocketServer item : webSocketSet) {
-// try {
-// item.sendMessage(message);
-// } catch (IOException e) {
-// e.printStackTrace();
-// }
-// }
- }
/**
* @param session
@@ -118,5 +106,38 @@ public class WebSocketServer {
}
}
+ @OnMessage
+ public void onMessage(String message, Session session) {
+ log.info("收到来自窗口" + sid + "的信息:" + message);
+ try {
+ String sid = String.valueOf(getUserId(session));
+ if (sid.equals("0")) {
+ return;
+ }
+ JSONObject resultObj = new JSONObject();
+ if (message.equals(WsUtils.WS_GET_UNREAD_COUNT)) {
+ SysServicesTopic topic = new SysServicesTopic();
+ topic.setUid(sid);
+ List statusList = new ArrayList<>();
+ statusList.add(topic);
+ ISysServicesTopicService servicesTopicService = SpringUtils.getBean(ISysServicesTopicService.class);
+ List result = servicesTopicService.selectUnreadTopicCount(statusList);
+
+ JSONObject dataObj = new JSONObject();
+ dataObj.put("count", result.get(0).getCount());
+
+ resultObj.put("type", WsUtils.WS_TYPE_MESSAGE_COUNT);
+ resultObj.put("msg", "未读消息数");
+ resultObj.put("data", dataObj);
+
+ } else if (message.equals(WsUtils.WS_PING)) {
+
+ }
+ WebSocketServer.sendInfo(resultObj.toJSONString(), sid);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
}
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesTopicService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesTopicService.java
index 1b9b14291..054424584 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesTopicService.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesTopicService.java
@@ -17,4 +17,6 @@ public interface ISysServicesTopicService {
SysServicesTopic inserSysServicesTopicComment(SysServicesTopic topic);
List selectSysServicesTopicSessionByTopicId(String topicId);
+
+ List selectUnreadTopicCount(List topic);
}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesTopicServiceImp.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesTopicServiceImp.java
index dcecfdd49..941518c5b 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesTopicServiceImp.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesTopicServiceImp.java
@@ -1,15 +1,19 @@
package com.stdiet.custom.service.impl;
+import com.alibaba.fastjson.JSONObject;
import com.stdiet.common.utils.DateUtils;
import com.stdiet.common.utils.uuid.UUID;
import com.stdiet.custom.domain.SysCustomer;
import com.stdiet.custom.domain.SysServicesTopic;
import com.stdiet.custom.mapper.SysCustomerMapper;
import com.stdiet.custom.mapper.SysServicesTopicMapper;
+import com.stdiet.custom.server.WebSocketServer;
import com.stdiet.custom.service.ISysServicesTopicService;
+import com.stdiet.custom.utils.WsUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -40,35 +44,58 @@ public class SysServicesTopicServiceImp implements ISysServicesTopicService {
List statusList = new ArrayList<>();
+ String customerId = String.valueOf(customer.getId());
SysServicesTopic customerStatus = new SysServicesTopic();
- customerStatus.setUid(String.valueOf(customer.getId()));
+ customerStatus.setUid(customerId);
customerStatus.setRole("customer");
customerStatus.setRead(1);
customerStatus.setTopicId(topic.getTopicId());
statusList.add(customerStatus);
+ String dieticianId = String.valueOf(customer.getMainDietitian());
SysServicesTopic dieticianStatus = new SysServicesTopic();
- dieticianStatus.setUid(String.valueOf(customer.getMainDietitian()));
+ dieticianStatus.setUid(dieticianId);
dieticianStatus.setRole("dietician");
dieticianStatus.setRead(0);
dieticianStatus.setTopicId(topic.getTopicId());
statusList.add(dieticianStatus);
+ String afterSaleId = String.valueOf(customer.getAfterDietitian());
SysServicesTopic afterSaleStatus = new SysServicesTopic();
- afterSaleStatus.setUid(String.valueOf(customer.getAfterDietitian()));
+ afterSaleStatus.setUid(afterSaleId);
afterSaleStatus.setRole("after_sale");
afterSaleStatus.setRead(0);
afterSaleStatus.setTopicId(topic.getTopicId());
statusList.add(afterSaleStatus);
+ String dieticianAssistantId = String.valueOf(customer.getAssistantDietitian());
SysServicesTopic dieticianAssistantStatus = new SysServicesTopic();
- dieticianAssistantStatus.setUid(String.valueOf(customer.getAssistantDietitian()));
+ dieticianAssistantStatus.setUid(dieticianAssistantId);
dieticianAssistantStatus.setRole("dietician_assistant");
dieticianAssistantStatus.setRead(0);
dieticianAssistantStatus.setTopicId(topic.getTopicId());
statusList.add(dieticianAssistantStatus);
- servicesTopicMapper.insertSysServicesTopicStatus(statusList);
+ int rows = servicesTopicMapper.insertSysServicesTopicStatus(statusList);
+ if (rows > 0) {
+ try {
+ List counts = servicesTopicMapper.selectUnreadTopicCount(statusList);
+ for (int i = 0; i < counts.size(); i++) {
+ topic.setId(statusList.get(i).getId());
+ JSONObject dataObj = new JSONObject();
+ dataObj.put("count", counts.get(i).getCount());
+ dataObj.put("data", topic);
+
+ JSONObject msgObj = new JSONObject();
+ msgObj.put("type", WsUtils.WS_TYPE_MESSAGE_COUNT);
+ msgObj.put("msg", "未读消息数");
+ msgObj.put("data", dataObj);
+ WebSocketServer.sendInfo(msgObj.toJSONString(), counts.get(i).getUid());
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
topic.setId(customerStatus.getId());
topic.setUid(null);
@@ -94,10 +121,13 @@ public class SysServicesTopicServiceImp implements ISysServicesTopicService {
status.setTopicId(topic.getTopicId());
status.setRole(topic.getRole());
servicesTopicMapper.updateSysServicesTopicStatus(status);
+
+ afterReply(topic);
}
return topic;
}
+
@Override
public SysServicesTopic inserSysServicesTopicComment(SysServicesTopic topic) {
String uuid = java.util.UUID.randomUUID().toString().replace("-", "");
@@ -110,12 +140,51 @@ public class SysServicesTopicServiceImp implements ISysServicesTopicService {
status.setTopicId(topic.getTopicId());
status.setRole(topic.getRole());
servicesTopicMapper.updateSysServicesTopicStatus(status);
+
+ afterReply(topic);
}
return topic;
}
+ public void afterReply(SysServicesTopic topic) {
+ SysCustomer customer = sysCustomerMapper.selectSysCustomerById(Long.parseLong(topic.getFromUid()));
+
+ List statusList = new ArrayList<>();
+ SysServicesTopic dieticianStatus = new SysServicesTopic();
+ dieticianStatus.setUid(String.valueOf(customer.getMainDietitian()));
+ statusList.add(dieticianStatus);
+ SysServicesTopic afterSaleStatus = new SysServicesTopic();
+ afterSaleStatus.setUid(String.valueOf(customer.getAfterDietitian()));
+ statusList.add(afterSaleStatus);
+ SysServicesTopic dieticianAssistantStatus = new SysServicesTopic();
+ dieticianAssistantStatus.setUid(String.valueOf(customer.getAssistantDietitian()));
+ statusList.add(dieticianAssistantStatus);
+
+ try {
+ List counts = servicesTopicMapper.selectUnreadTopicCount(statusList);
+ for (int i = 0; i < counts.size(); i++) {
+ JSONObject dataObj = new JSONObject();
+ dataObj.put("count", counts.get(i).getCount());
+ dataObj.put("topicId", topic.getTopicId());
+
+ JSONObject msgObj = new JSONObject();
+ msgObj.put("type", WsUtils.WS_TYPE_NEW_CUSTOMER_REPLY);
+ msgObj.put("msg", "新客户回复");
+ msgObj.put("data", dataObj);
+ WebSocketServer.sendInfo(msgObj.toJSONString(), counts.get(i).getUid());
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
@Override
public List selectSysServicesTopicSessionByTopicId(String topicId) {
return servicesTopicMapper.selectSysServicesTopicSessionByTopicId(topicId);
}
+
+ @Override
+ public List selectUnreadTopicCount(List statusList) {
+ return servicesTopicMapper.selectUnreadTopicCount(statusList);
+ }
}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/utils/WsUtils.java b/stdiet-custom/src/main/java/com/stdiet/custom/utils/WsUtils.java
index 6d8e8f43c..a1b2286bf 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/utils/WsUtils.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/utils/WsUtils.java
@@ -5,4 +5,12 @@ public class WsUtils {
public static final String WS_TYPE_HEART_BEAT = "WS_TYPE_HEART_BEAT";
public static final String WS_TYPE_SYSTEM_MESSAGE = "WS_TYPE_SYSTEM_MESSAGE";
+
+ public static final String WS_TYPE_MESSAGE_COUNT = "WS_TYPE_MESSAGE_COUNT";
+
+ public static final String WS_TYPE_NEW_CUSTOMER_REPLY = "WS_TYPE_NEW_CUSTOMER_REPLY";
+
+ public static final String WS_GET_UNREAD_COUNT = "GET_UNREAD_COUNT";
+
+ public static final String WS_PING = "ping";
}
diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysServicesTopicMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysServicesTopicMapper.xml
index 688494714..a1dc84685 100644
--- a/stdiet-custom/src/main/resources/mapper/custom/SysServicesTopicMapper.xml
+++ b/stdiet-custom/src/main/resources/mapper/custom/SysServicesTopicMapper.xml
@@ -225,5 +225,23 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/stdiet-ui/src/layout/components/Navbar.vue b/stdiet-ui/src/layout/components/Navbar.vue
index af5333114..cb6a5d8b8 100644
--- a/stdiet-ui/src/layout/components/Navbar.vue
+++ b/stdiet-ui/src/layout/components/Navbar.vue
@@ -11,26 +11,11 @@