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) => { +