From ad03f3f2dbf92a9b8ede7a77ca980fef6fd29933 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Wed, 24 Dec 2025 16:32:06 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E5=AE=A4=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/workcase/service/ChatRoomService.java | 2 +- .../controller/WorkcaseChatContorller.java | 12 +- .../workcase/mapper/TbChatRoomMapper.java | 2 +- .../workcase/service/ChatRoomServiceImpl.java | 8 +- .../workcase/src/api/workcase/workcaseChat.ts | 8 +- .../chatRoom/chatRoom/ChatRoom.scss | 2 +- .../views/public/ChatRoom/ChatRoomView.scss | 43 ++++++ .../views/public/ChatRoom/ChatRoomView.vue | 141 +++++++++++++++--- .../packages/workcase_wechat/api/base.ts | 4 +- .../api/workcase/workcaseChat.ts | 7 + .../packages/workcase_wechat/config/index.ts | 4 +- .../pages/chatRoom/chatRoom/chatRoom.scss | 25 ++++ .../pages/chatRoom/chatRoom/chatRoom.uvue | 140 ++++++++++++++++- .../chatRoom/chatRoomList/chatRoomList.scss | 2 + .../chatRoom/chatRoomList/chatRoomList.uvue | 30 +++- .../workcase_wechat/utils/websocket.ts | 55 ++++++- 16 files changed, 432 insertions(+), 53 deletions(-) diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/service/ChatRoomService.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/service/ChatRoomService.java index 47dae549..24097862 100644 --- a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/service/ChatRoomService.java +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/service/ChatRoomService.java @@ -66,7 +66,7 @@ public interface ChatRoomService { /** * @description 分页查询聊天室(含当前用户未读数) * @param pageRequest 分页请求参数 - * @param userId 当前用户ID + * @param userId 当前用户ID(用于查询未读数) * @author cascade * @since 2025-12-22 */ diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseChatContorller.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseChatContorller.java index 2e6d0ff4..ef1026d3 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseChatContorller.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseChatContorller.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -23,6 +24,8 @@ import org.xyzh.api.workcase.vo.ChatMemberVO; import org.xyzh.api.workcase.vo.ChatRoomMessageVO; import org.xyzh.api.workcase.vo.ChatRoomVO; import org.xyzh.api.workcase.vo.CustomerServiceVO; +import org.xyzh.common.auth.utils.JwtTokenUtil; +import org.xyzh.common.auth.utils.LoginUtil; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.core.page.PageRequest; import org.xyzh.common.utils.validation.ValidationResult; @@ -56,6 +59,9 @@ public class WorkcaseChatContorller { @Autowired private ChatRoomService chatRoomService; + @Autowired + private JwtTokenUtil jwtTokenUtil; + // ========================= ChatRoom聊天室管理(实时IM) ========================= @Operation(summary = "创建聊天室(转人工时调用)") @@ -107,8 +113,7 @@ public class WorkcaseChatContorller { @PreAuthorize("hasAuthority('workcase:room:view')") @PostMapping("/room/page") public ResultDomain getChatRoomPage( - @RequestBody PageRequest pageRequest, - @RequestParam(value = "userId", required = true) String userId) { + @RequestBody PageRequest pageRequest) { ValidationResult vr = ValidationUtils.validate(pageRequest, Arrays.asList( ValidationUtils.requiredNumber("pageParam.page", "页码", 1, null), ValidationUtils.requiredNumber("pageParam.pageSize", "每页数量", 1, 100) @@ -116,6 +121,9 @@ public class WorkcaseChatContorller { if (!vr.isValid()) { return ResultDomain.failure(vr.getAllErrors()); } + + String userId = LoginUtil.getCurrentUserId(); + return chatRoomService.getChatRoomPage(pageRequest, userId); } diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/mapper/TbChatRoomMapper.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/mapper/TbChatRoomMapper.java index d96a4f53..78275944 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/mapper/TbChatRoomMapper.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/mapper/TbChatRoomMapper.java @@ -44,7 +44,7 @@ public interface TbChatRoomMapper { List selectChatRoomList(@Param("filter") TbChatRoomDTO filter); /** - * 分页查询聊天室 + * 分页查询聊天室(含未读数) */ List selectChatRoomPage(@Param("filter") TbChatRoomDTO filter, @Param("pageParam") PageParam pageParam, @Param("userId") String userId); diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/ChatRoomServiceImpl.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/ChatRoomServiceImpl.java index 94047fe0..1485756a 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/ChatRoomServiceImpl.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/ChatRoomServiceImpl.java @@ -233,7 +233,13 @@ public class ChatRoomServiceImpl implements ChatRoomService { filter.setUserId(member.getUserId()); List existingMembers = chatRoomMemberMapper.selectChatRoomMemberList(filter); if (existingMembers != null && !existingMembers.isEmpty()) { - return ResultDomain.failure("用户已是聊天室成员"); + // 重置未读数量 + TbChatRoomMemberDTO updateMember = new TbChatRoomMemberDTO(); + updateMember.setMemberId(existingMembers.get(0).getMemberId()); + updateMember.setUnreadCount(0); + chatRoomMemberMapper.updateChatRoomMember(updateMember); + + return ResultDomain.failure("用户已是聊天室成员,更新未读"); } if (member.getMemberId() == null || member.getMemberId().isEmpty()) { diff --git a/urbanLifelineWeb/packages/workcase/src/api/workcase/workcaseChat.ts b/urbanLifelineWeb/packages/workcase/src/api/workcase/workcaseChat.ts index b0d4fcab..3947a02c 100644 --- a/urbanLifelineWeb/packages/workcase/src/api/workcase/workcaseChat.ts +++ b/urbanLifelineWeb/packages/workcase/src/api/workcase/workcaseChat.ts @@ -60,11 +60,11 @@ export const workcaseChatAPI = { /** * 分页查询聊天室(含当前用户未读数) + * @param pageRequest - 分页请求,filter.guestId用于过滤聊天室(guest用) + * 注:userId从token中自动获取,无需传递 */ - async getChatRoomPage(pageRequest: PageRequest, userId: string): Promise> { - const response = await api.post(`${this.baseUrl}/room/page`, pageRequest, { - params: { userId } - }) + async getChatRoomPage(pageRequest: PageRequest): Promise> { + const response = await api.post(`${this.baseUrl}/room/page`, pageRequest) return response.data }, diff --git a/urbanLifelineWeb/packages/workcase/src/components/chatRoom/chatRoom/ChatRoom.scss b/urbanLifelineWeb/packages/workcase/src/components/chatRoom/chatRoom/ChatRoom.scss index 2e2c6327..d911a6de 100644 --- a/urbanLifelineWeb/packages/workcase/src/components/chatRoom/chatRoom/ChatRoom.scss +++ b/urbanLifelineWeb/packages/workcase/src/components/chatRoom/chatRoom/ChatRoom.scss @@ -64,7 +64,7 @@ $brand-color-hover: #004488; // ==================== 消息列表 ==================== .messages-list { - max-width: 900px; + width: 100%; margin: 0 auto; padding: 24px 16px; diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatRoomView.scss b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatRoomView.scss index ce3e8712..e155db69 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatRoomView.scss +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatRoomView.scss @@ -644,3 +644,46 @@ $brand-color-hover: #004488; padding: 24px; } } + +// ==================== 聊天室包装容器 ==================== +.chat-room-wrapper { + position: relative; + width: 100%; + height: 100%; +} + +// ==================== 自动填充加载遮罩 ==================== +.auto-fill-mask { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.95); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + z-index: 1000; + gap: 16px; + + .loading-spinner { + width: 40px; + height: 40px; + border: 3px solid #e2e8f0; + border-top-color: $brand-color; + border-radius: 50%; + animation: spin 0.8s linear infinite; + } + + .loading-text { + font-size: 14px; + color: #64748b; + font-weight: 500; + } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatRoomView.vue b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatRoomView.vue index 6d0b295b..ff17c9ff 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatRoomView.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatRoomView.vue @@ -9,7 +9,7 @@