From 3c35ab67cd6d4f1c1a4783aca33049fcdaccf358 Mon Sep 17 00:00:00 2001 From: long <452591453@qq.com> Date: Mon, 1 Jun 2026 17:00:38 +0800 Subject: [PATCH] update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit h5 :问诊列表 add 完成诊单 +医生备注 --- admin/src/views/tcm/appointment/list.vue | 78 + admin/src/views/tcm/appointment/list_h5.vue | 1830 +++++++++++++++++ .../add_qywx_appointment_h5_menu.sql | 71 + 3 files changed, 1979 insertions(+) create mode 100644 admin/src/views/tcm/appointment/list_h5.vue create mode 100644 server/sql/1.9.20260601/add_qywx_appointment_h5_menu.sql diff --git a/admin/src/views/tcm/appointment/list.vue b/admin/src/views/tcm/appointment/list.vue index eeab2946..6b33cf10 100644 --- a/admin/src/views/tcm/appointment/list.vue +++ b/admin/src/views/tcm/appointment/list.vue @@ -509,6 +509,32 @@ + + +
+

是否添加医生备注?

+ +
+ +
@@ -518,7 +544,9 @@ import { defineAsyncComponent, onMounted, onUnmounted, watch } from 'vue' import { appointmentLists, cancelAppointment, completeAppointment, appointmentDetail } from '@/api/doctor' import { getCallSignature, generateMiniProgramQrcode, tcmDiagnosisDetail, prescriptionGetByAppointment } from '@/api/tcm' import { getDictData } from '@/api/app' +import { addDoctorNote } from '@/api/patient' import feedback from '@/utils/feedback' +import { hasPermission } from '@/utils/perm' import { formatDiabetesDiscoveryDisplay, isDiabetesDiscoveryFilled @@ -797,6 +825,12 @@ const ensureDetailDictOptions = async () => { const editRef = ref() const prescriptionRef = ref() const chatDialogRef = ref() +const COMPLETE_NOTE_PERMISSION = ['doctor.appointment/addDoctorNote'] +const completeDialogVisible = ref(false) +const completeSubmitting = ref(false) +const completeNoteContent = ref('') +const completeRow = ref(null) +const canAddCompleteNote = computed(() => hasPermission(COMPLETE_NOTE_PERMISSION)) // 小程序二维码相关 const qrcodeDialogVisible = ref(false) @@ -866,6 +900,12 @@ const handleCancel = async (row: any) => { // 完成挂号 const handleComplete = async (row: any) => { + completeRow.value = row + completeNoteContent.value = '' + if (canAddCompleteNote.value) { + completeDialogVisible.value = true + return + } try { await feedback.confirm('确认患者已就诊完成?') await completeAppointment({ id: row.id }) @@ -875,6 +915,37 @@ const handleComplete = async (row: any) => { // 用户取消操作 } } +const submitComplete = async () => { + const row = completeRow.value + if (!row?.id || completeSubmitting.value) return + completeSubmitting.value = true + try { + const note = completeNoteContent.value.trim() + await completeAppointment({ id: row.id }) + let noteFailureMsg = '' + if (canAddCompleteNote.value && note) { + const diagnosisId = row.patient_id || row.diagnosis_id + if (diagnosisId) { + try { + await addDoctorNote({ diagnosis_id: Number(diagnosisId), content: note }) + } catch (e) { + noteFailureMsg = '问诊已完成,但备注未保存' + } + } else { + noteFailureMsg = '问诊已完成,但该预约没有关联诊单,备注未保存' + } + } + noteFailureMsg ? feedback.msgWarning(noteFailureMsg) : feedback.msgSuccess('操作成功') + completeDialogVisible.value = false + completeNoteContent.value = '' + completeRow.value = null + loadData() + } catch (e: any) { + feedback.msgError(e?.msg || e?.message || '操作失败') + } finally { + completeSubmitting.value = false + } +} // 编辑患者资料 const handleEditPatient = (row: any) => { @@ -1330,6 +1401,13 @@ onUnmounted(() => { color: var(--el-color-danger); } +.complete-dialog-tip { + margin: 0 0 12px; + color: var(--el-text-color-primary); + font-size: 14px; + line-height: 22px; +} + .qrcode-content { padding: 16px 0; min-height: 200px; diff --git a/admin/src/views/tcm/appointment/list_h5.vue b/admin/src/views/tcm/appointment/list_h5.vue new file mode 100644 index 00000000..a15179e8 --- /dev/null +++ b/admin/src/views/tcm/appointment/list_h5.vue @@ -0,0 +1,1830 @@ + + + + + + + diff --git a/server/sql/1.9.20260601/add_qywx_appointment_h5_menu.sql b/server/sql/1.9.20260601/add_qywx_appointment_h5_menu.sql new file mode 100644 index 00000000..6b285cbd --- /dev/null +++ b/server/sql/1.9.20260601/add_qywx_appointment_h5_menu.sql @@ -0,0 +1,71 @@ +-- 企业微信菜单:新增「问诊列表」H5 页面 +-- 位置:企业微信 > 问诊列表,与「诊单」「业务订单」同级 +-- 前端地址:/admin/wx/appointment? + +SET @qywx_pid := ( + SELECT zhend.`pid` + FROM `zyt_system_menu` zhend + WHERE zhend.`name` = '诊单' + AND zhend.`pid` > 0 + AND EXISTS ( + SELECT 1 + FROM `zyt_system_menu` orders + WHERE orders.`pid` = zhend.`pid` + AND orders.`name` = '业务订单' + ) + ORDER BY id ASC + LIMIT 1 +); + +SET @sort_no := ( + SELECT IFNULL(MAX(`sort`), 0) + 1 + FROM `zyt_system_menu` + WHERE `pid` = @qywx_pid +); + +-- 若之前执行过旧版 SQL(如 paths = wenzhen / patient),先修正为当前内部路由。 +UPDATE `zyt_system_menu` +SET + `name` = '问诊列表', + `perms` = 'doctor.appointment/lists', + `paths` = 'appointment', + `component` = 'tcm/appointment/list_h5', + `is_show` = 1, + `is_disable` = 0, + `update_time` = UNIX_TIMESTAMP() +WHERE @qywx_pid IS NOT NULL + AND `pid` = @qywx_pid + AND ( + `component` = 'tcm/appointment/list_h5' + OR `paths` IN ('wenzhen', 'patient', 'appointment') + OR `name` IN ('患者列表', '问诊列表') + ); + +INSERT INTO `zyt_system_menu` ( + `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, + `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time` +) +SELECT + @qywx_pid, + 'C', + '问诊列表', + '', + @sort_no, + 'doctor.appointment/lists', + 'appointment', + 'tcm/appointment/list_h5', + '', + '', + 0, + 1, + 0, + UNIX_TIMESTAMP(), + UNIX_TIMESTAMP() +FROM DUAL +WHERE @qywx_pid IS NOT NULL + AND NOT EXISTS ( + SELECT 1 + FROM `zyt_system_menu` + WHERE `pid` = @qywx_pid + AND (`paths` = 'appointment' OR `component` = 'tcm/appointment/list_h5') + );