ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteMissionController.java
@@ -3,6 +3,7 @@ import java.util.List; import com.ard.route.domain.route.ArdRouteMission; import com.ard.route.domain.route.UpdateMission; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; @@ -110,10 +111,9 @@ */ @ApiOperation("批量修改航线任务已读状态") @Log(title = "航线任务", businessType = BusinessType.UPDATE) @PutMapping("editIsRead/{ids}/{isRead}") public AjaxResult editIsRead(@PathVariable String[] ids, @PathVariable String isRead) { return toAjax(ardRouteMissionService.updateIsRead(ids,isRead)); @PutMapping("editIsRead") public AjaxResult editIsRead(@RequestBody UpdateMission updateMission) { return toAjax(ardRouteMissionService.updateIsRead(updateMission)); } } ard-route/src/main/java/com/ard/route/domain/route/UpdateMission.java
New file @@ -0,0 +1,25 @@ package com.ard.route.domain.route; import lombok.Data; /** * 批量修改已读类型实体 * * @author xia */ @Data public class UpdateMission { /** * 主键集合 */ private String[] ids; /** * 是否已读 * 0:否 * 1:是 * */ private String isRead; } ard-route/src/main/java/com/ard/route/mapper/ArdRouteMissionMapper.java
@@ -77,6 +77,6 @@ * @param isRead 已读状态 * @return 结果 */ public int updateIsRead(@Param("id")String[] ids,@Param("isRead")String isRead); public int updateIsRead(@Param("ids")String[] ids, @Param("isRead")String isRead); } ard-route/src/main/java/com/ard/route/service/IArdRouteMissionService.java
@@ -1,6 +1,7 @@ package com.ard.route.service; import com.ard.route.domain.route.ArdRouteMission; import com.ard.route.domain.route.UpdateMission; import java.util.List; @@ -72,10 +73,9 @@ /** * 批量修改航线任务已读状态 * * @param ids 主键集合 * @param isRead 已读状态 * @param updateMission 批量修改已读类型实体 * @return 结果 */ public int updateIsRead(String[] ids,String isRead); public int updateIsRead(UpdateMission updateMission); } ard-route/src/main/java/com/ard/route/service/impl/ArdRouteMissionServiceImpl.java
@@ -9,11 +9,13 @@ import com.ard.common.utils.uuid.IdUtils; import com.ard.route.domain.route.ArdRouteMission; import com.ard.route.domain.route.ArdRoutePoint; import com.ard.route.domain.route.UpdateMission; import com.ard.route.mapper.ArdRoutePointMapper; import com.ard.route.websocket.utils.MiWebSocketUtils; import com.ard.system.mapper.SysUserMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.ard.route.mapper.ArdRouteMissionMapper; import com.ard.route.service.IArdRouteMissionService; @@ -82,6 +84,7 @@ ardRouteMission.setExecuteStatus("0"); ardRouteMission.setIsRead("0"); ardRouteMission.setCreateTime(DateUtils.getNowDate()); ardRouteMission.setIssuerTime(DateUtils.getNowDate()); ardRouteMission.setIssuerName(getUserName(ardRouteMission.getIssuerId())); dataProcessingRoutePoint(ardRouteMission.getMissionDetailList(),ardRouteMission.getId()); try { @@ -92,6 +95,25 @@ } return ardRouteMissionMapper.insertArdRouteMission(ardRouteMission); } // /** // * 定时任务,定时发送新增航线任务消息 // */ // @Scheduled(fixedRate = 2000) // public void sendMissionMessage() { // ArdRouteMission ardRouteMission = new ArdRouteMission(); // ardRouteMission.setIsRead("0"); // // 获取所有未读的消息给 // List<ArdRouteMission> routeMissionLs = ardRouteMissionMapper.selectArdRouteMissionList(ardRouteMission); // for (ArdRouteMission routeMissionL : routeMissionLs) { // if (routeMissionL.getIssuerId() != null){ // List<ArdRoutePoint> missionDetailList = ardRoutePointMapper.selectArdRoutePointByMissionId(routeMissionL.getId()); // routeMissionL.setMissionDetailList(missionDetailList); // MiWebSocketUtils.sendMessage(routeMissionL.getIssuerId(),JSON.toJSONString(routeMissionL)); // } // } // } /** * 修改航线任务 @@ -172,12 +194,16 @@ /** * 批量修改航线任务已读状态 * * @param ids 主键集合 * @param isRead 已读状态 * @param updateMission 批量修改已读类型实体 * @return 结果 */ @Override public int updateIsRead(String[] ids, String isRead) { public int updateIsRead(UpdateMission updateMission) { if (updateMission == null || updateMission.getIds() == null || updateMission.getIds().length == 0) { return 0; } String[] ids = updateMission.getIds(); String isRead = updateMission.getIsRead(); return ardRouteMissionMapper.updateIsRead(ids,isRead); } ard-route/src/main/java/com/ard/route/websocket/MiWebSocketSessionManager.java
New file @@ -0,0 +1,36 @@ package com.ard.route.websocket; import com.ard.work.component.websocket.utils.WebSocketUtil; import org.springframework.web.socket.WebSocketSession; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class MiWebSocketSessionManager { private static final ConcurrentMap<Long, WebSocketSession> ONLINE_USER_SESSIONS = new ConcurrentHashMap<>(); public static void addSession(Long userId, WebSocketSession session) { ONLINE_USER_SESSIONS.put(userId, session); } public static void removeSession(Long userId) { ONLINE_USER_SESSIONS.remove(userId); } public static WebSocketSession getSession(Long userId) { return ONLINE_USER_SESSIONS.get(userId); } public static void broadcast(String message) { ONLINE_USER_SESSIONS.forEach((userId, session) -> WebSocketUtil.sendMessage(session, message)); } //返回当前在线用户数 public static int getOnlineUserCount() { return ONLINE_USER_SESSIONS.size(); } public static boolean containsUser(Long userId) { return ONLINE_USER_SESSIONS.containsKey(userId); } } ard-route/src/main/java/com/ard/route/websocket/handler/MiWebSocketHandler.java
@@ -1,5 +1,6 @@ package com.ard.route.websocket.handler; import com.ard.route.websocket.MiWebSocketSessionManager; import com.ard.route.websocket.utils.MiWebSocketUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -17,23 +18,32 @@ // 处理接收到的消息 String payload = message.getPayload(); log.info("【mi_websocket】Received message: " + payload); log.info("【mi_websocket】size: " + MiWebSocketUtils.ONLINE_USER_SESSIONS.size()); log.info("【mi_websocket】size: " + MiWebSocketSessionManager.getOnlineUserCount()); } @Override public void afterConnectionEstablished(WebSocketSession session) { String userIdStr = (String) session.getAttributes().get("userId"); if (userIdStr == null || userIdStr.isBlank()) { return; } Long userId = Long.parseLong(userIdStr); log.info("【mi_websocket】Connected: " + session.getId()); String userId = (String) session.getAttributes().get("userId"); MiWebSocketUtils.ONLINE_USER_SESSIONS.put(userId, session); log.info("【mi_websocket】size: " + MiWebSocketUtils.ONLINE_USER_SESSIONS.size()); MiWebSocketSessionManager.addSession(userId, session); log.info("【mi_websocket】size: " + MiWebSocketSessionManager.getOnlineUserCount()); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { String userIdStr = (String) session.getAttributes().get("userId"); if (userIdStr == null || userIdStr.isBlank()) { return; } Long userId = Long.parseLong(userIdStr); MiWebSocketSessionManager.removeSession(userId); log.info("【mi_websocket】Disconnected: " + session.getId()); String userId = (String) session.getAttributes().get("userId"); MiWebSocketUtils.ONLINE_USER_SESSIONS.remove(userId); log.info("【mi_websocket】size: " + MiWebSocketUtils.ONLINE_USER_SESSIONS.size()); MiWebSocketSessionManager.removeSession(userId); log.info("【mi_websocket】size: " + MiWebSocketSessionManager.getOnlineUserCount()); } } ard-route/src/main/java/com/ard/route/websocket/utils/MiWebSocketUtils.java
@@ -2,6 +2,7 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ard.route.websocket.MiWebSocketSessionManager; import com.ard.work.component.websocket.WebSocketSessionManager; import com.ard.work.component.websocket.utils.WebSocketUtil; import com.ard.work.domain.message.BaseMessage; @@ -13,14 +14,9 @@ import java.net.InetSocketAddress; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @Slf4j public class MiWebSocketUtils { // 用于存储所有打开的WebSocket会话 public static final ConcurrentMap<String, WebSocketSession> ONLINE_USER_SESSIONS = new ConcurrentHashMap<>(); /** * @param session 用户 session @@ -45,7 +41,7 @@ } public static void sendMessage(Long userId, String message) { WebSocketSession session = WebSocketSessionManager.getSession(userId); WebSocketSession session = MiWebSocketSessionManager.getSession(userId); sendMessage(session, message); } @@ -93,7 +89,7 @@ * @param message */ public static void sendMessageAll(String message) { ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, message)); MiWebSocketSessionManager.broadcast(message); } /** @@ -103,7 +99,17 @@ */ public static void sendMessageAll(Map message) { JSONObject jsonObject = new JSONObject(message); ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, jsonObject.toString())); MiWebSocketSessionManager.broadcast(jsonObject.toString()); } /** * 推送消息到其他客户端 * * @param message */ public static void sendMessageAll(Object message) { String jsonMessage = JSONObject.toJSONString(message); // 确保对象转换为 JSON 字符串 WebSocketSessionManager.broadcast(jsonMessage); } /** @@ -112,7 +118,7 @@ * @param message */ public static void sendMessageAll(List message) { ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, JSON.toJSONString(message))); WebSocketSessionManager.broadcast(JSON.toJSONString(message)); } // 发送消息到所有 WebSocket 客户端 ard-route/src/main/resources/mapper/ArdRouteMissionMapper.xml
@@ -164,10 +164,10 @@ <update id="updateIsRead"> update ard_route_mission <trim prefix="SET" suffixOverrides=","> <if test="isRead != null">is_read = #{isRead},</if> <if test="isRead != null and isRead != ''">is_read = #{isRead},</if> </trim> where id in <foreach item="id" collection="array" open="(" separator="," close=")"> <foreach item="id" collection="ids" open="(" separator="," close=")"> #{id} </foreach> </update>