Browse Source

第二版

suntianwu 3 years ago
parent
commit
0b34965edf

+ 5 - 3
src/main/java/com/care/bigscreen/controller/CommonController.java

@@ -46,9 +46,12 @@ public class CommonController {
         }
     }
     @GetMapping("/pushEvent")
-    public Result<Object> pushEvent(@RequestParam("stationId") Long stationId) {
+    public Result<Object> pushEvent(@RequestParam("stationId") Long stationId,@RequestParam(value = "orderId") Long orderId) {
         try {
-            bigScreenService.pushRtEventFlag(String.valueOf(stationId));
+            bigScreenService.pushRtEventFlag(String.valueOf(stationId),orderId.toString(),"orderStatusUpdate");
+            bigScreenService.pushRtEventFlag(String.valueOf(stationId),orderId.toString(),"orderAdd");
+            bigScreenService.pushRtEventFlag(String.valueOf(stationId),orderId.toString(),"orderUpdate");
+
             return Result.success("成功");
         } catch (Exception e) {
             log.error("convertedCodeName: ",e);
@@ -56,5 +59,4 @@ public class CommonController {
         }
     }
 
-
 }

+ 1 - 5
src/main/java/com/care/bigscreen/service/BigScreenService.java

@@ -95,12 +95,8 @@ public interface BigScreenService {
     /**
      * 调用websocket推送实时事件标识给前端
      */
-    void pushRtEventFlag(String stationId);
+    void pushRtEventFlag(String stationId,String orderId,String flag);
 
-    /**
-     * 调用websocket推送实时事件标识给前端
-     */
-    void pushRtEventFlag2();
 
     /**
      * 进行统计

+ 14 - 16
src/main/java/com/care/bigscreen/service/impl/BigScreenServiceImpl.java

@@ -9,7 +9,8 @@ import com.care.bigscreen.mapper.StOrganizationMapper;
 import com.care.bigscreen.mapper.StStationMapper;
 import com.care.bigscreen.service.BigScreenService;
 import com.care.bigscreen.vo.*;
-import com.care.bigscreen.websocket.BigScreenWebSocketEndpoint;
+import com.care.bms.websocket.StationWebSocketEndpoint;
+import com.care.bms.websocket.WebSocketEndpoint;
 import com.care.common.service.CareStationService;
 import com.care.common.util.DomainEquals;
 import com.care.common.vo.PageResVO;
@@ -212,28 +213,25 @@ public class BigScreenServiceImpl implements BigScreenService {
      * 调用websocket推送实时事件标识给前端
      */
     @Override
-    public void pushRtEventFlag(String stationId){
+    public void pushRtEventFlag(String stationId,String orderId, String flag){
         try {
             //触发统计
             exeStatistics();
-            BigScreenWebSocketEndpoint.sendMessage(stationId, "rt_event_happen");
-        } catch (Exception e){
-            e.printStackTrace();
-        }
-    }
-    /**
-     * 调用websocket推送实时事件标识给前端
-     */
-    @Override
-    public void pushRtEventFlag2(){
-        try {
-            //触发统计
-            exeStatistics();
-            BigScreenWebSocketEndpoint.sendMessage("rt_event_happen2");
+
+            if("orderStatusUpdate".equals(flag)) {
+                StationWebSocketEndpoint.sendMessage(stationId, "rt_event_happen");
+            } else if("orderAdd".equals(flag)) {
+                WebSocketEndpoint.sendMessage("rt_event_add_happen@" + orderId);
+            } else if("orderUpdate".equals(flag)){
+                WebSocketEndpoint.sendMessage("rt_event_update_happen@" + orderId);
+            }
+
         } catch (Exception e){
             e.printStackTrace();
         }
     }
+
+
     /**
      * 进行统计
      */

+ 1 - 1
src/main/java/com/care/bms/controller/SysUserController.java

@@ -45,7 +45,7 @@ public class SysUserController {
     @GetMapping("/listKeeper4Select")
     @ApiOperation(value = "某个服务站下的管家下拉列表")
     public Result<List<CareSysUserVO>> listNotHandle(HttpServletRequest request, @RequestHeader(value = "token") String token,
-                                                     @RequestParam(name = "stationId") Long stationId){
+                                                     @RequestParam(name = "stationId", required = false) Long stationId){
         try {
             List<CareSysUserVO> datas = this.bmsSysUserService.queryKeeperListByStationId(stationId);
             return Result.success(datas);

+ 5 - 2
src/main/java/com/care/bms/service/BmsEventOrderService.java

@@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.care.bigscreen.service.BigScreenService;
+import com.care.bms.websocket.StationWebSocketEndpoint;
+import com.care.bms.websocket.WebSocketEndpoint;
 import com.care.common.cache.RedisKeyConstant;
 import com.care.common.cache.RedisUtil;
 import com.care.common.entity.*;
@@ -477,7 +479,7 @@ public class BmsEventOrderService {
                 .set(CareEventOrder::getStatus,orderStatusEnum.getValue())
                 .set(CareEventOrder::getModifyTime,DateUtil.date());
         this.careEventOrderService.update(updateWrapper);
-        this.bigScreenService.pushRtEventFlag(order.getStationId().toString());
+        this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),orderId.toString(),"orderStatusUpdate");
     }
 
     /**
@@ -685,7 +687,7 @@ public class BmsEventOrderService {
         CareEventOrder order =   this.careEventOrderService.getById(orderId);
 
         QueryWrapper<CareSysUser> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(CareSysUser::getStatus,ChambStatusEnum.FREE).eq(CareSysUser::getOrgId,order.getOrgId()).eq(CareSysUser::getStationId,order.getStationId());
+        queryWrapper.lambda().eq(CareSysUser::getStatus,ChambStatusEnum.FREE.getValue()).eq(CareSysUser::getOrgId,order.getOrgId()).eq(CareSysUser::getStationId,order.getStationId());
         List<CareSysUser> list = this.careSysUserService.list(queryWrapper);
         if(CollUtil.isNotEmpty(list)){
             list.forEach(item->{
@@ -718,4 +720,5 @@ public class BmsEventOrderService {
         this.careEventOrderChambService.update(updateWrapper);
         return true;
     }
+
 }

+ 1 - 1
src/main/java/com/care/bms/service/BmsSysUserService.java

@@ -83,7 +83,7 @@ public class BmsSysUserService{
     public List<CareSysUserVO> queryKeeperListByStationId(Long stationId){
         List<CareSysUserVO> datas = new ArrayList<>();
         QueryWrapper<CareSysUser>  userQueryWrapper = new QueryWrapper<>();
-        userQueryWrapper.lambda().eq(CareSysUser::getStationId,stationId)
+        userQueryWrapper.lambda().eq(stationId != null,CareSysUser::getStationId,stationId)
                 .eq(CareSysUser::getRole, UserRoleEnum.CHANMB.getValue())
                 .orderByAsc(CareSysUser::getName);
         List<CareSysUser> users = this.careSysUserService.list(userQueryWrapper);

+ 6 - 6
src/main/java/com/care/bigscreen/websocket/BigScreenWebSocketEndpoint.java

@@ -1,4 +1,4 @@
-package com.care.bigscreen.websocket;
+package com.care.bms.websocket;
 
 
 import cn.hutool.json.JSONUtil;
@@ -26,12 +26,12 @@ import java.util.concurrent.CopyOnWriteArraySet;
  **/
 @ServerEndpoint("/bms/bigscreen/ws")
 @Component
-public class BigScreenWebSocketEndpoint {
-    private static final Logger logger = LoggerFactory.getLogger(BigScreenWebSocketEndpoint.class);
+public class StationWebSocketEndpoint {
+    private static final Logger logger = LoggerFactory.getLogger(StationWebSocketEndpoint.class);
 
 
     //用来存放每个客户端对应的BigScreenWebSocketEndpoint对象
-    private static CopyOnWriteArraySet<BigScreenWebSocketEndpoint> currentWebSocketSession = new CopyOnWriteArraySet<>();
+    private static CopyOnWriteArraySet<StationWebSocketEndpoint> currentWebSocketSession = new CopyOnWriteArraySet<>();
 
     // 与某个客户端的连接会话,需要通过它来与客户端进行数据收发
     private Session session;
@@ -116,7 +116,7 @@ public class BigScreenWebSocketEndpoint {
     }
 
     public static void sendMessage(String message) throws IOException {
-        for (BigScreenWebSocketEndpoint endpoint : currentWebSocketSession) {
+        for (StationWebSocketEndpoint endpoint : currentWebSocketSession) {
             Session session = endpoint.getSession();
             if (session.isOpen()) {
                 //发送消息
@@ -137,7 +137,7 @@ public class BigScreenWebSocketEndpoint {
      */
     public static void sendMessage(String stationId,String msg) throws IOException  {
         //根据服务站ID,匹配连接并发送消息
-        for (BigScreenWebSocketEndpoint endpoint : currentWebSocketSession) {
+        for (StationWebSocketEndpoint endpoint : currentWebSocketSession) {
             Session session = endpoint.getSession();
             if (session.isOpen() && stationId.equals(endpoint.getStationId())) {
                 //发送消息

+ 160 - 0
src/main/java/com/care/bms/websocket/WebSocketEndpoint.java

@@ -0,0 +1,160 @@
+package com.care.bms.websocket;
+
+
+import cn.hutool.json.JSONUtil;
+import com.care.common.util.ExUtil;
+import com.care.common.util.JsonUtil;
+import com.care.common.util.JwtUtils;
+import com.care.common.util.Result;
+import com.care.common.vo.UserLogindConvertVO;
+import io.jsonwebtoken.Claims;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+/**
+ * Swagger2配置
+ *
+ * @author stw
+ * @version 1.0.0 创建于 2021/5/24
+ **/
+@ServerEndpoint("/bms/order/ws")
+@Component
+public class WebSocketEndpoint {
+    private static final Logger logger = LoggerFactory.getLogger(WebSocketEndpoint.class);
+
+
+    //用来存放每个客户端对应的BigScreenWebSocketEndpoint对象
+    private static CopyOnWriteArraySet<WebSocketEndpoint> currentWebSocketSession = new CopyOnWriteArraySet<>();
+
+    // 与某个客户端的连接会话,需要通过它来与客户端进行数据收发
+    private Session session;
+    //用于关联当前客户端和websocket会话的关系
+
+    //电话作为登陆用户名
+    private String phone;
+
+
+
+    /**
+     * websocket 连接打开操作
+     *
+     * @param session websocket会话对象
+     */
+    @OnOpen
+    public void webSocketOnOpen(Session session) {
+        try {
+            //校验参数
+            String requestParamString = session.getQueryString();
+            if (StringUtils.isEmpty(requestParamString)) {
+                closeSession(session, "-1", "连接失败,token为空");
+                return;
+            }
+            //建立websocket和登录用户、站点ID的关联关系
+            //从token中解析出登录用户的信息
+            String[] keyValues = requestParamString.split("&");
+            //取出token 字符串
+            String ts = null;
+
+            for (String t : keyValues) {
+                if (t.startsWith("token=")) {
+                    ts = t.replaceAll("token=", "");
+                }
+            }
+            if (StringUtils.isEmpty(ts)) {
+                closeSession(session, "-1", "连接失败,token为空");
+                return;
+            }
+            Claims claims = JwtUtils.tokenParse(ts);
+            if (claims != null) {
+                UserLogindConvertVO vo = JSONUtil.toBean(claims.getSubject(), UserLogindConvertVO.class);
+                if (vo != null) {
+                    this.phone = vo.getPhone();
+                } else{
+                    closeSession(session, "-1", "连接失败,token解析失败");
+                    return;
+                }
+            }
+            logger.info("websocket会话建立:登录用户={}登录!",this.phone);
+            this.session = session;
+            currentWebSocketSession.add(this);
+        } catch (Exception e) {
+            closeSession(session, "-1", "连接失败,token为空");
+            logger.error("websocket会话建立异常:"+ ExUtil.exToDetail(e));
+        }
+    }
+
+    @OnClose
+    public void onClose(Session session) {
+        //移除连接
+        currentWebSocketSession.remove(this);
+        logger.info("客户端断开连接,客户端id={},登录用户={},退出websocket连接", session.getId(), this.phone);
+    }
+
+    @OnError
+    public void onError(Session session, Throwable error) {
+        logger.error("客户端id={},登录用户={},连接异常信息={}.", session.getId(), this.phone, error.getCause());
+    }
+
+    @OnMessage
+    public void onMessage(String message, Session session) throws Exception {
+//        logger.info("Receive a message from client: " + message);
+        // 页面传过来的消息不做任何处理
+        logger.info("收到来自" + session.getId() + "的消息" + message);
+        //返回消息给Web Socket客户端(浏览器)
+//        sendMessage(message);
+    }
+
+    public static void sendMessage(String message) throws IOException {
+        for (WebSocketEndpoint endpoint : currentWebSocketSession) {
+            Session session = endpoint.getSession();
+            if (session.isOpen()) {
+                //发送消息
+                try {
+                    session.getBasicRemote().sendText(message);
+                } catch (IOException e) {
+                    logger.info("登录用户={} 发送数据失败,客户端连接已经断开.", endpoint.getPhone());
+                }
+            }
+        }
+    }
+
+    /**
+     * 关闭session操作
+     *
+     * @param session
+     * @param msg
+     * @throws Exception
+     */
+    private void closeSession(Session session,  String code, String msg) {
+        try {
+            if (session != null){
+                if("-1".equals(code)){
+                    session.getBasicRemote().sendText(JsonUtil.toJson(Result.error(msg)));
+                } else {
+                    session.getBasicRemote().sendText(JsonUtil.toJson(Result.success(msg)));
+                }
+
+                session.close();
+            }
+
+        } catch (Exception e) {
+            logger.info("关闭连接异常", e.getCause());
+        }
+    }
+
+    public Session getSession() {
+        return session;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+}

+ 4 - 1
src/main/java/com/care/common/service/impl/CareEventOrderServiceImpl.java

@@ -87,6 +87,8 @@ public class CareEventOrderServiceImpl extends ServiceImpl<CareEventOrderMapper,
             careEventOrderDb.setOrderType(order.getOrderType());
             this.updateById(careEventOrderDb);//更新
 
+            order.setId(careEventOrderDb.getId());
+
             CareEventOrderHandleHis his = new CareEventOrderHandleHis();
             his.setOrgId(order.getOrgId());
             his.setStationId(order.getStationId());
@@ -109,7 +111,7 @@ public class CareEventOrderServiceImpl extends ServiceImpl<CareEventOrderMapper,
             his.setCreateTime(order.getCreateTime());
             this.careEventOrderHandleHisService.save(his);
             //通知页面
-            bigScreenService.pushRtEventFlag2();
+            this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderUpdate");
         } else { //无,生成新的告警事件工单
             this.baseMapper.insert(order);
             CareEventOrderHandleHis his = new CareEventOrderHandleHis();
@@ -161,6 +163,7 @@ public class CareEventOrderServiceImpl extends ServiceImpl<CareEventOrderMapper,
                 }
             }
             this.careEventOrderHandleHisService.save(his);
+            this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
         }
 
         return true;