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 @@