From eb827a961c4d3c452e7f54829b030e364676f615 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Thu, 25 Dec 2025 13:36:53 +0800 Subject: [PATCH] =?UTF-8?q?index=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workcase/service/WorkcaseServiceImpl.java | 26 +--- .../workcase_wechat/pages/index/index.uvue | 44 +++++-- .../workcaseDetail/workcaseDetail.uvue | 111 ++++++++---------- .../75b9e4b3c6f8fcb3bb9e25a3b3c53af2a52efb4a | 1 - 4 files changed, 85 insertions(+), 97 deletions(-) delete mode 100644 urbanLifelineWeb/packages/workcase_wechat/unpackage/cache/.mp-weixin/.uts2js/cache/uts_9b1b54d07a7a4d66ee84f54872fe1ae86df34bb1/code/cache/75b9e4b3c6f8fcb3bb9e25a3b3c53af2a52efb4a diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java index 34858989..471feb90 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java @@ -47,27 +47,12 @@ public class WorkcaseServiceImpl implements WorkcaseService { public ResultDomain createWorkcase(TbWorkcaseDTO workcase) { logger.info("创建工单: userId={}, type={}, roomId={}", workcase.getUserId(), workcase.getType(), workcase.getRoomId()); - // 如果没有 roomId,先创建聊天室 - boolean needCreateRoom = (workcase.getRoomId() == null || workcase.getRoomId().isEmpty()); - if (needCreateRoom) { - logger.info("未提供 roomId,先创建聊天室"); - TbChatRoomDTO chatRoom = new TbChatRoomDTO(); - chatRoom.setGuestId(workcase.getUserId()); - chatRoom.setGuestName(workcase.getUsername()); - chatRoom.setRoomType("workcase"); - chatRoom.setRoomName("工单客服-" + workcase.getUsername()); - chatRoom.setStatus("active"); - chatRoom.setCreator(workcase.getCreator()); - - ResultDomain roomResult = chatRoomService.createChatRoom(chatRoom); - if (!roomResult.getSuccess() || roomResult.getData() == null) { - logger.error("创建聊天室失败: {}", roomResult.getMessage()); - return ResultDomain.failure("创建聊天室失败: " + roomResult.getMessage()); - } - - workcase.setRoomId(roomResult.getData().getRoomId()); - logger.info("聊天室创建成功: roomId={}", workcase.getRoomId()); + // 前端应确保 roomId 已创建并传入 + if (workcase.getRoomId() == null || workcase.getRoomId().isEmpty()) { + logger.error("创建工单失败: roomId 不能为空"); + return ResultDomain.failure("缺少聊天室ID (roomId),无法创建工单"); } + if (workcase.getWorkcaseId() == null || workcase.getWorkcaseId().isEmpty()) { workcase.setWorkcaseId(IdUtil.generateUUID()); @@ -81,6 +66,7 @@ public class WorkcaseServiceImpl implements WorkcaseService { if (workcase.getEmergency() == null || workcase.getEmergency().isEmpty()) { workcase.setEmergency("normal"); } + // 统一由后端从登录态设置 creator,避免前端传入不可信 workcase.setCreator(LoginUtil.getCurrentUserId()); int rows = workcaseMapper.insertWorkcase(workcase); diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue index 92a19303..0c82a391 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue @@ -413,26 +413,46 @@ } } - // 显示工单创建器 - function showCreator() { - showWorkcaseCreator.value = true + // 直接跳转到工单详情页的 create 模式(复用 workcaseDetail 页面) + async function showCreator() { + // 首页直接创建工单:为了让工单和聊天室绑定,这里先创建一个聊天室(workcase类型),再带 roomId 跳转 + // 如果你希望“无聊天室也能创建工单”,后端 WorkcaseServiceImpl 也支持 roomId 为空时自动创建聊天室 + uni.showLoading({ title: '正在创建工单...' }) + try { + const res = await workcaseChatAPI.createChatRoom({ + guestId: userInfo.value.userId || userInfo.value.wechatId, + guestName: userInfo.value.username || '访客', + roomName: `${userInfo.value.username || '访客'}的工单`, + roomType: 'workcase', + status: 'active', + aiSessionId: chatId.value || '' + }) + uni.hideLoading() + + if (res.success && res.data?.roomId) { + const roomId = res.data.roomId + uni.navigateTo({ + url: `/pages/workcase/workcaseDetail/workcaseDetail?mode=create&roomId=${roomId}` + }) + return + } + + uni.showToast({ title: res.message || '创建工单失败', icon: 'none' }) + } catch (e) { + uni.hideLoading() + console.error('首页创建工单失败:', e) + uni.showToast({ title: '创建工单失败,请稍后重试', icon: 'none' }) + } } - // 隐藏工单创建器 + // 兼容旧逻辑:不再使用页面内工单创建器 function hideCreator() { showWorkcaseCreator.value = false } - // 工单创建成功 + // 兼容旧逻辑:不再使用页面内工单创建器 function onWorkcaseCreated(workcaseData : TbWorkcaseDTO) { hideCreator() - - uni.showToast({ - title: '工单创建成功', - icon: 'success' - }) - - // 添加成功消息 addMessage('bot', `工单创建成功!\n类型:${workcaseData.type || ''}\n设备:${workcaseData.device || ''}\n我们会尽快处理您的问题。`, ['查看工单', '创建新工单']) } diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/workcase/workcaseDetail/workcaseDetail.uvue b/urbanLifelineWeb/packages/workcase_wechat/pages/workcase/workcaseDetail/workcaseDetail.uvue index 24abda14..8e77e86c 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/workcase/workcaseDetail/workcaseDetail.uvue +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/workcase/workcaseDetail/workcaseDetail.uvue @@ -254,72 +254,48 @@ onLoad((options: any) => { // 处理 mode 参数 if (options.mode === 'create') { mode.value = 'create' - - // 从 storage 读取登录信息 + // create 模式必须从上一页带入 roomId(前端先建 room 的策略) + const roomId = options.roomId || '' + if (!roomId) { + uni.showToast({ title: '缺少roomId,无法创建工单', icon: 'none' }) + // 直接退出,避免后续提交失败 + setTimeout(() => uni.navigateBack(), 800) + return + } + // 只使用 loginDomain(没有就空) + let username = '' + let phone = '' + let userId = '' try { - let loginDomainRaw = uni.getStorageSync('loginDomain') - - let username = '' - let phone = '' - let userId = '' - let roomId = options.roomId || '' - + const loginDomainRaw = uni.getStorageSync('loginDomain') if (loginDomainRaw) { - // 如果是字符串,需要先解析 - let loginDomain = loginDomainRaw - if (typeof loginDomainRaw === 'string') { - loginDomain = JSON.parse(loginDomainRaw) - } - - // 尝试多种可能的字段路径 - username = loginDomain.userInfo?.username - - phone = loginDomain.user?.phone - userId = loginDomain.userInfo?.userId - } - - // 创建模式,初始化表单并填充用户信息 - workcase.value = { - username: username, - phone: phone, - userId: userId, - device: '', - type: '', - address: '', - description: '', - emergency: 'normal', - imgs: [] - } - - // 如果有 roomId,添加到工单数据中 - if (roomId) { - workcase.value.roomId = roomId - } - } catch (error) { - console.error('读取用户信息失败:', error) - // 初始化空表单 - workcase.value = { - username: '', - phone: '', - device: '', - type: '', - address: '', - description: '', - emergency: 'normal', - imgs: [] - } - - // 如果有 roomId,添加到工单数据中 - if (options.roomId) { - workcase.value.roomId = options.roomId + const loginDomain = typeof loginDomainRaw === 'string' ? JSON.parse(loginDomainRaw) : loginDomainRaw + username = loginDomain?.userInfo?.username || '' + phone = loginDomain?.user?.phone || '' + userId = loginDomain?.userInfo?.userId || '' } + } catch (e) { + console.error('读取loginDomain失败:', e) + } + + workcase.value = { + username, + phone, + userId, + roomId, + device: '', + type: '', + address: '', + description: '', + emergency: 'normal', + imgs: [] } } else if (options.workcaseId) { - // 查看模式 - workcaseId.value = options.workcaseId - mode.value = 'view' - loadWorkcaseDetail(workcaseId.value) - } + // 查看模式 + workcaseId.value = options.workcaseId + mode.value = 'view' + loadWorkcaseDetail(workcaseId.value) + } }) onMounted(() => { @@ -413,8 +389,12 @@ function getTimelineDotClass(status: string): string { // 查看对话 function handleViewChat() { + if (!workcase.value.roomId) { + uni.showToast({ title: '未关联聊天室', icon: 'none' }) + return + } uni.navigateTo({ - url: `/pages/chatRoom/chatRoom/chatRoom?roomId=${workcase.value.workcaseId}` + url: `/pages/chatRoom/chatRoom/chatRoom?roomId=${workcase.value.roomId}` }) } @@ -616,9 +596,12 @@ async function submitWorkcase() { title: '工单创建成功', icon: 'success' }) + // 创建成功后直接回到该聊天室(闭环) setTimeout(() => { - uni.navigateBack() - }, 1500) + uni.redirectTo({ + url: `/pages/chatRoom/chatRoom/chatRoom?roomId=${workcase.value.roomId}&workcaseId=${res.data.workcaseId || ''}` + }) + }, 600) } else { uni.showToast({ title: res.message || '创建失败', diff --git a/urbanLifelineWeb/packages/workcase_wechat/unpackage/cache/.mp-weixin/.uts2js/cache/uts_9b1b54d07a7a4d66ee84f54872fe1ae86df34bb1/code/cache/75b9e4b3c6f8fcb3bb9e25a3b3c53af2a52efb4a b/urbanLifelineWeb/packages/workcase_wechat/unpackage/cache/.mp-weixin/.uts2js/cache/uts_9b1b54d07a7a4d66ee84f54872fe1ae86df34bb1/code/cache/75b9e4b3c6f8fcb3bb9e25a3b3c53af2a52efb4a deleted file mode 100644 index f6ab1c15..00000000 --- a/urbanLifelineWeb/packages/workcase_wechat/unpackage/cache/.mp-weixin/.uts2js/cache/uts_9b1b54d07a7a4d66ee84f54872fe1ae86df34bb1/code/cache/75b9e4b3c6f8fcb3bb9e25a3b3c53af2a52efb4a +++ /dev/null @@ -1 +0,0 @@ -{"code":"import {} from \"vue\";\nexport default defineComponent({\n onLaunch: function () {\n uni.__f__('log', 'at App.uvue:7', 'App Launch');\n // 检查是否已选择模式\n this.checkModeSelection();\n },\n onShow: function () {\n uni.__f__('log', 'at App.uvue:12', 'App Show');\n },\n onHide: function () {\n uni.__f__('log', 'at App.uvue:15', 'App Hide');\n },\n onExit: function () {\n uni.__f__('log', 'at App.uvue:36', 'App Exit');\n },\n methods: {\n // 检查并选择模式\n checkModeSelection() {\n const mode = uni.getStorageSync('userMode');\n if (!mode) {\n this.showModeSelector();\n }\n },\n // 显示模式选择器\n showModeSelector() {\n uni.showActionSheet({\n itemList: ['员工模式 (17857100375)', '访客模式 (17857100376)'],\n success: (res) => {\n let wechatId = '';\n let userMode = '';\n let phone = '';\n if (res.tapIndex === 0) {\n wechatId = '17857100375';\n phone = '17857100375';\n userMode = 'staff';\n }\n else {\n wechatId = '17857100376';\n phone = '17857100376';\n userMode = 'guest';\n }\n // 存储选择\n uni.setStorageSync('userMode', userMode);\n uni.setStorageSync('wechatId', wechatId);\n uni.setStorageSync('phone', phone);\n uni.__f__('log', 'at App.uvue:67', '已选择模式:', userMode, 'wechatId:', wechatId);\n uni.showToast({\n title: userMode === 'staff' ? '员工模式' : '访客模式',\n icon: 'success'\n });\n },\n fail: () => {\n // 用户取消,默认使用访客模式\n uni.setStorageSync('userMode', 'guest');\n uni.setStorageSync('wechatId', '17857100376');\n uni.__f__('log', 'at App.uvue:77', '默认使用访客模式');\n }\n });\n }\n }\n});\n//# sourceMappingURL=F:/Project/urbanLifeline/urbanLifelineWeb/packages/workcase_wechat/App.uvue?vue&type=script&lang.uts.js.map","references":[],"uniExtApis":["uni.__f__","uni.getStorageSync","uni.setStorageSync","uni.showToast","uni.showActionSheet"],"map":"{\"version\":3,\"file\":\"App.uvue?vue&type=script&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"App.uvue?vue&type=script&lang.uts\"],\"names\":[],\"mappings\":\";AAIC,+BAAe;IACd,QAAQ,EAAE;QACT,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,eAAe,EAAC,YAAY,CAAC,CAAA;QAC7C,YAAY;QACZ,IAAI,CAAC,kBAAkB,EAAE,CAAA;IAC1B,CAAC;IACD,MAAM,EAAE;QACP,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,EAAE;QACP,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;IAmBD,MAAM,EAAE;QACP,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,EAAE;QACR,UAAU;QACV,kBAAkB;YACjB,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;YAC3C,IAAI,CAAC,IAAI,EAAE;gBACV,IAAI,CAAC,gBAAgB,EAAE,CAAA;aACvB;QACF,CAAC;QACD,UAAU;QACV,gBAAgB;YACf,GAAG,CAAC,eAAe,CAAC;gBACnB,QAAQ,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;gBACtD,OAAO,EAAE,CAAC,GAAG;oBACZ,IAAI,QAAQ,GAAG,EAAE,CAAA;oBACjB,IAAI,QAAQ,GAAG,EAAE,CAAA;oBACjB,IAAI,KAAK,GAAG,EAAE,CAAA;oBACd,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE;wBACvB,QAAQ,GAAG,aAAa,CAAA;wBACxB,KAAK,GAAG,aAAa,CAAA;wBACrB,QAAQ,GAAG,OAAO,CAAA;qBAClB;yBAAM;wBACN,QAAQ,GAAG,aAAa,CAAA;wBACxB,KAAK,GAAG,aAAa,CAAA;wBACrB,QAAQ,GAAG,OAAO,CAAA;qBAClB;oBACD,OAAO;oBACP,GAAG,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;oBACxC,GAAG,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;oBACxC,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;oBAClC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;oBAC3E,GAAG,CAAC,SAAS,CAAC;wBACb,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBAC7C,IAAI,EAAE,SAAS;qBACf,CAAC,CAAA;gBACH,CAAC;gBACD,IAAI,EAAE;oBACL,gBAAgB;oBAChB,GAAG,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;oBACvC,GAAG,CAAC,cAAc,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;oBAC7C,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;gBAC7C,CAAC;aACD,CAAC,CAAA;QACH,CAAC;KACD;CACD,EAAA\"}"}