From 5eec8b370ef3f485a9dbd58162c67dc7175b9097 Mon Sep 17 00:00:00 2001 From: lq Date: Wed, 7 Jan 2026 14:22:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B8=B8=E7=94=A8=E6=96=B9=E3=80=81?= =?UTF-8?q?=E6=82=A3=E8=80=85=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/store/prescription.ts | 7 - .../business/chat/components/ChatArea.vue | 11 +- .../chat/components/MessageBubble.vue | 71 ++++ .../business/chat/components/MessageInput.vue | 17 +- .../chat/components/PrescriptionModal.vue | 4 +- .../src/views/business/chat/stores/chat.ts | 13 + .../src/views/business/chat/utils/request.ts | 16 + .../order/prescription/config/table.ts | 6 + .../business/order/prescription/index.vue | 5 + .../business/order/product-order/api/index.ts | 8 + .../order/product-order/config/table.ts | 14 +- .../business/order/product-order/index.vue | 29 +- .../views/business/order/register/index.vue | 6 +- .../product/china-medicine/config/form.ts | 2 - .../business/product/china-medicine/index.vue | 22 +- .../product/drug-categories/api/index.ts | 59 ++++ .../drug-categories/components/modal.vue | 203 ++++++++++++ .../product/drug-categories/config/form.ts | 78 +++++ .../product/drug-categories/config/search.ts | 54 ++++ .../product/drug-categories/config/table.ts | 88 +++++ .../product/drug-categories/index.vue | 159 +++++++++ .../business/product/health-food/api/index.ts | 9 + .../health-food/components/CategoryModal.vue | 138 ++++++++ .../product/health-food/config/form.ts | 51 +++ .../product/health-food/config/table.ts | 16 + .../business/product/health-food/index.vue | 30 ++ .../product/medical-device/api/index.ts | 78 +++++ .../components/CategoryModal.vue | 138 ++++++++ .../medical-device/components/ExcelUpload.vue | 167 ++++++++++ .../medical-device/components/modal.vue | 107 ++++++ .../product/medical-device/config/form.ts | 240 ++++++++++++++ .../product/medical-device/config/search.ts | 26 ++ .../product/medical-device/config/table.ts | 93 ++++++ .../business/product/medical-device/index.vue | 196 +++++++++++ .../business/product/non-drug/api/index.ts | 78 +++++ .../non-drug/components/CategoryModal.vue | 138 ++++++++ .../non-drug/components/ExcelUpload.vue | 167 ++++++++++ .../product/non-drug/components/modal.vue | 107 ++++++ .../business/product/non-drug/config/form.ts | 240 ++++++++++++++ .../product/non-drug/config/search.ts | 26 ++ .../business/product/non-drug/config/table.ts | 93 ++++++ .../views/business/product/non-drug/index.vue | 196 +++++++++++ .../product/service-pack/api/index.ts | 8 + .../components/ZoneCategoryModal.vue | 138 ++++++++ .../product/service-pack/config/form.ts | 48 +++ .../product/service-pack/config/table.ts | 16 + .../business/product/service-pack/index.vue | 24 ++ .../product/western-medicine/api/index.ts | 8 + .../components/CategoryModal.vue | 138 ++++++++ .../product/western-medicine/config/form.ts | 48 +++ .../product/western-medicine/config/table.ts | 22 ++ .../product/western-medicine/index.vue | 29 ++ .../components/ConfirmModal.vue | 45 +++ .../components/WesternModal.vue | 22 +- .../views/doctor/doctor-reception/index.vue | 72 ++--- .../components/PatientExperienceCard.vue | 306 ++++++++++++++---- .../components/PatientInfoPanel.vue | 6 - .../components/PatientList.vue | 24 +- .../doctor/online-consultation/index.vue | 35 +- .../system/home-zones/components/modal.vue | 2 + .../views/system/home-zones/config/form.ts | 19 ++ .../views/system/home-zones/config/table.ts | 10 + 62 files changed, 4061 insertions(+), 165 deletions(-) create mode 100644 apps/web-antd/src/views/business/product/drug-categories/api/index.ts create mode 100644 apps/web-antd/src/views/business/product/drug-categories/components/modal.vue create mode 100644 apps/web-antd/src/views/business/product/drug-categories/config/form.ts create mode 100644 apps/web-antd/src/views/business/product/drug-categories/config/search.ts create mode 100644 apps/web-antd/src/views/business/product/drug-categories/config/table.ts create mode 100644 apps/web-antd/src/views/business/product/drug-categories/index.vue create mode 100644 apps/web-antd/src/views/business/product/health-food/components/CategoryModal.vue create mode 100644 apps/web-antd/src/views/business/product/medical-device/api/index.ts create mode 100644 apps/web-antd/src/views/business/product/medical-device/components/CategoryModal.vue create mode 100644 apps/web-antd/src/views/business/product/medical-device/components/ExcelUpload.vue create mode 100644 apps/web-antd/src/views/business/product/medical-device/components/modal.vue create mode 100644 apps/web-antd/src/views/business/product/medical-device/config/form.ts create mode 100644 apps/web-antd/src/views/business/product/medical-device/config/search.ts create mode 100644 apps/web-antd/src/views/business/product/medical-device/config/table.ts create mode 100644 apps/web-antd/src/views/business/product/medical-device/index.vue create mode 100644 apps/web-antd/src/views/business/product/non-drug/api/index.ts create mode 100644 apps/web-antd/src/views/business/product/non-drug/components/CategoryModal.vue create mode 100644 apps/web-antd/src/views/business/product/non-drug/components/ExcelUpload.vue create mode 100644 apps/web-antd/src/views/business/product/non-drug/components/modal.vue create mode 100644 apps/web-antd/src/views/business/product/non-drug/config/form.ts create mode 100644 apps/web-antd/src/views/business/product/non-drug/config/search.ts create mode 100644 apps/web-antd/src/views/business/product/non-drug/config/table.ts create mode 100644 apps/web-antd/src/views/business/product/non-drug/index.vue create mode 100644 apps/web-antd/src/views/business/product/service-pack/components/ZoneCategoryModal.vue create mode 100644 apps/web-antd/src/views/business/product/western-medicine/components/CategoryModal.vue create mode 100644 apps/web-antd/src/views/doctor/doctor-reception/components/ConfirmModal.vue diff --git a/apps/web-antd/src/store/prescription.ts b/apps/web-antd/src/store/prescription.ts index 29c8b214..891682e3 100644 --- a/apps/web-antd/src/store/prescription.ts +++ b/apps/web-antd/src/store/prescription.ts @@ -742,10 +742,6 @@ export const usePrescriptionStore = defineStore('prescription', () => { customSendMode: number = 0, customStoreId: number | null = null, ) => { - // #region agent log - fetch('http://127.0.0.1:7242/ingest/3cda25fa-2f46-4a02-889c-2ffb76bc49fe',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'prescription.ts:sendPrescription:entry',message:'sendPrescription接收的参数',data:{customSendMode:customSendMode,customStoreId:customStoreId,doctorSecondSignValue:doctorSecondSignValue},timestamp:Date.now(),sessionId:'debug-session',hypothesisId:'D'})}).catch(()=>{}); - // #endregion - if (currentDrugs.value.length === 0) { message.error('请选择药品'); return false; @@ -810,9 +806,6 @@ export const usePrescriptionStore = defineStore('prescription', () => { send_mode: customSendMode, custom_store_id: customSendMode === 1 ? customStoreId : null, }).then((res) => { - // #region agent log - fetch('http://127.0.0.1:7242/ingest/3cda25fa-2f46-4a02-889c-2ffb76bc49fe',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'prescription.ts:sendPrescription:afterAPI',message:'API请求成功后',data:{send_mode:customSendMode,custom_store_id:customSendMode === 1 ? customStoreId : null,res:res},timestamp:Date.now(),sessionId:'debug-session',hypothesisId:'D'})}).catch(()=>{}); - // #endregion message.success('处方已发送'); sendMessage({ roomId: chatStore.currentFriend.room_id, diff --git a/apps/web-antd/src/views/business/chat/components/ChatArea.vue b/apps/web-antd/src/views/business/chat/components/ChatArea.vue index f848c3b5..4a48f7e1 100644 --- a/apps/web-antd/src/views/business/chat/components/ChatArea.vue +++ b/apps/web-antd/src/views/business/chat/components/ChatArea.vue @@ -13,6 +13,7 @@ const props = defineProps({ const emit = defineEmits([ // ... existing emits 'openPrescription', + 'end-consultation-success', ]); // 开方功能触发函数 @@ -20,6 +21,11 @@ const handleOpenPrescription = (registerId) => { emit('openPrescription', registerId); }; +// 结束接诊成功处理函数 +const handleEndConsultationSuccess = () => { + emit('end-consultation-success'); +}; + // ... rest of the component @@ -32,6 +38,9 @@ const handleOpenPrescription = (registerId) => { - + diff --git a/apps/web-antd/src/views/business/chat/components/MessageBubble.vue b/apps/web-antd/src/views/business/chat/components/MessageBubble.vue index a4013a11..46900cc4 100644 --- a/apps/web-antd/src/views/business/chat/components/MessageBubble.vue +++ b/apps/web-antd/src/views/business/chat/components/MessageBubble.vue @@ -742,6 +742,32 @@ if (props.message.message_type === 10) { + +
+
+
+ + 订单价格更新 +
+
+

{{ parsedContent.message }}

+
+ 订单号:{{ parsedContent.order_no }} + ¥{{ parsedContent.total_pay_price }} +
+
+
+
+ {{ typeof parsedContent === 'string' ? parsedContent : '系统消息' }} +
+
+ diff --git a/apps/web-antd/src/views/business/chat/components/MessageInput.vue b/apps/web-antd/src/views/business/chat/components/MessageInput.vue index 654a029f..0e75a39f 100644 --- a/apps/web-antd/src/views/business/chat/components/MessageInput.vue +++ b/apps/web-antd/src/views/business/chat/components/MessageInput.vue @@ -300,7 +300,8 @@ onUnmounted(() => { // 定义 emits const emit = defineEmits([ 'sendMessage', - 'openPrescription' // 添加开方事件 + 'openPrescription', // 添加开方事件 + 'end-consultation-success' // 结束接诊成功事件 ]); // 开方功能触发函数 @@ -453,7 +454,21 @@ const handleEndConsultation = () => { reason: '医生主动结束' }); + // 发送结束问诊消息卡片 + const endTime = new Date().toLocaleString('zh-CN'); + await sendMessage({ + roomId: chatStore.currentFriend?.room_id, + senderId: userStore.currentUser?.doctor_id, + receiverId: chatStore.currentFriend?.id, + type: 'end-consultation', + content: JSON.stringify({ + end_reason: '医生主动结束', + end_time: endTime + }) + }); + message.success('结束接诊成功'); + emit('end-consultation-success'); } catch (error) { console.error('结束接诊失败:', error); message.error('结束接诊失败,请重试'); diff --git a/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue b/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue index 11b2a80f..7958ff5c 100644 --- a/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue +++ b/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue @@ -113,7 +113,7 @@ const [Modal, modalApi] = useVbenModal({ watch( () => prescriptionStore.currentDrugs, (newValue) => { - console.log('currentDrugs updated:', newValue); + // currentDrugs 更新 }, { deep: true }, ); @@ -265,8 +265,8 @@ const openWesternModal = () => { activePatient_id: prescriptionStore.currentRegisterId, getCurrentDrugs: () => { // 这里可以添加获取当前药品的逻辑 - console.log('getCurrentDrugs called from WesternModal'); }, + storagePrefix: 'onlineConsultation', // 在线复诊加前缀 }); WesternDrugModalApi.open(); }; diff --git a/apps/web-antd/src/views/business/chat/stores/chat.ts b/apps/web-antd/src/views/business/chat/stores/chat.ts index 479b9b97..bad7b432 100644 --- a/apps/web-antd/src/views/business/chat/stores/chat.ts +++ b/apps/web-antd/src/views/business/chat/stores/chat.ts @@ -29,6 +29,9 @@ export const useChatStore = defineStore('chat', () => { const callTimeout = ref(null); const hasMore = ref(true); + // 新挂号通知 - 当收到 message_type=10 时更新,用于触发患者列表刷新 + const newRegisterNotification = ref<{ timestamp: number; data: any } | null>(null); + const webrtc = useWebRTC(); const userStore = useUserStore(); @@ -390,6 +393,15 @@ export const useChatStore = defineStore('chat', () => { isSent: isSent, }; + // 检测挂号消息(message_type=10)或患者就诊经历消息(message_type=11),触发患者列表刷新通知 + if (messageData.message_type === 10 || messageData.message_type === 11) { + newRegisterNotification.value = { + timestamp: Date.now(), + data: messageData, + }; + logWithTime('log', `收到新消息(type=${messageData.message_type}),触发患者列表刷新通知`); + } + try { // 不再需要手动解析,getParsedContent 会在组件中按需解析 // await chatDB.saveMessage(newMessage, currentUserId, senderId); @@ -1620,6 +1632,7 @@ export const useChatStore = defineStore('chat', () => { callStatus, callError, callConnectionStatus, + newRegisterNotification, isConnected, isInCall, isCalling, diff --git a/apps/web-antd/src/views/business/chat/utils/request.ts b/apps/web-antd/src/views/business/chat/utils/request.ts index af2da578..e7cb1642 100644 --- a/apps/web-antd/src/views/business/chat/utils/request.ts +++ b/apps/web-antd/src/views/business/chat/utils/request.ts @@ -1,6 +1,8 @@ import { message } from 'ant-design-vue'; import axios from 'axios'; +import { useAccessStore } from '@vben/stores'; + // 创建 Axios 实例 const service = axios.create({ baseURL: '/im-api/', @@ -122,6 +124,10 @@ export const sendMessage = (data) => { 'video-call': 6, 'audio-call': 7, file: 8, + register: 10, + 'patient-experience': 11, + 'product-card': 12, + 'end-consultation': 13, }; // 确保 receiver_user_id 有 user- 前缀(如果是患者端) @@ -149,10 +155,15 @@ export const sendMessage = (data) => { requestData.call_status = data.callStatus; } + // 从 accessStore 获取 Token + const accessStore = useAccessStore(); + const token = accessStore.accessToken; + return axios .post(apiUrl, requestData, { headers: { 'Content-Type': 'application/json', + 'Authorization': token ? (token.startsWith('Bearer ') ? token : `Bearer ${token}`) : '', }, timeout: 15_000, withCredentials: false, @@ -206,10 +217,15 @@ export const sendCallSignal = (signalData) => { console.log('发送通话信令到API:', apiUrl, requestData); + // 从 accessStore 获取 Token + const accessStore = useAccessStore(); + const token = accessStore.accessToken; + return axios .post(apiUrl, requestData, { headers: { 'Content-Type': 'application/json', + 'Authorization': token ? (token.startsWith('Bearer ') ? token : `Bearer ${token}`) : '', }, timeout: 15_000, withCredentials: false, diff --git a/apps/web-antd/src/views/business/order/prescription/config/table.ts b/apps/web-antd/src/views/business/order/prescription/config/table.ts index 13b1afd6..992b0125 100644 --- a/apps/web-antd/src/views/business/order/prescription/config/table.ts +++ b/apps/web-antd/src/views/business/order/prescription/config/table.ts @@ -23,6 +23,12 @@ export const gridOptions: VxeGridProps = { { field: 'user_patient.name', align: 'left', title: '就诊人名称' }, { field: 'store.name', align: 'left', title: '开方诊所' }, { field: 'status', title: '状态', slots: { default: 'status' } }, + { + field: 'is_online', + title: '处方来源', + width: 100, + slots: { default: 'is-online' }, + }, { field: 'created_at', title: '创建时间' }, { type: 'html', diff --git a/apps/web-antd/src/views/business/order/prescription/index.vue b/apps/web-antd/src/views/business/order/prescription/index.vue index 0fd11220..5182f6ac 100644 --- a/apps/web-antd/src/views/business/order/prescription/index.vue +++ b/apps/web-antd/src/views/business/order/prescription/index.vue @@ -105,6 +105,11 @@ const openPrescriptionSourceModal = (id) => { +