diff --git a/healthlink-his-server/core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java b/healthlink-his-server/core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java index 1f0709d21..322d7f647 100755 --- a/healthlink-his-server/core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java +++ b/healthlink-his-server/core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java @@ -1,5 +1,6 @@ package com.core.framework.config; + import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; @@ -14,6 +15,9 @@ import tools.jackson.databind.ValueDeserializer; import tools.jackson.databind.ValueSerializer; import tools.jackson.databind.module.SimpleModule; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.TimeZone; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -55,9 +59,18 @@ public class ApplicationConfig { @Bean public JsonMapperBuilderCustomizer jacksonObjectMapperCustomization() { return builder -> { + builder.defaultTimeZone(TimeZone.getDefault()); + builder.defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); SimpleModule module = new SimpleModule("HealthLinkLocalDateTime"); module.addDeserializer(LocalDateTime.class, LOCAL_DATE_TIME_DESERIALIZER); module.addSerializer(LocalDateTime.class, LOCAL_DATE_TIME_SERIALIZER); + module.addSerializer(java.sql.Date.class, new ValueSerializer() { + private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @Override + public void serialize(java.sql.Date value, JsonGenerator gen, SerializationContext ctx) throws JacksonException { + gen.writeString(sdf.format(value)); + } + }); builder.addModule(module); }; } diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java index 51b406aa3..43a75a658 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java @@ -378,10 +378,21 @@ public class ATDManageAppServiceImpl implements IATDManageAppService { */ @Override public R getInPatientPendingList(InpatientAdviceParam inpatientAdviceParam, Integer pageNo, Integer pageSize) { + // 提取deadline手动处理,防止自动拼接列名不存在的错误 + String deadline = inpatientAdviceParam.getDeadline(); + inpatientAdviceParam.setDeadline(null); // 构建查询条件 QueryWrapper queryWrapper = HisQueryUtils.buildQueryWrapper(inpatientAdviceParam, null, null, null); + // 手动拼接截止时间条件:request_time <= deadline + if (StringUtils.isNotEmpty(deadline)) { + Date deadlineDate = DateUtils.parseDate(deadline); + if (deadlineDate != null) { + queryWrapper.le("request_time", deadlineDate); + } + } + // 患者医嘱分页列表 Page inpatientAdvicePage = atdManageAppMapper.selectInpatientAdvicePage( new Page<>(pageNo, pageSize), queryWrapper, CommonConstants.TableName.MED_MEDICATION_REQUEST, diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java index 2fd45421a..8f34ab4a8 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java @@ -191,6 +191,14 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService { QueryWrapper queryWrapper = HisQueryUtils.buildQueryWrapper(inpatientAdviceParam, null, null, null); + // 手动拼接截止时间条件:request_time <= deadline + if (StringUtils.isNotEmpty(deadline)) { + Date deadlineDate = DateUtils.parseDate(deadline); + if (deadlineDate != null) { + queryWrapper.le("request_time", deadlineDate); + } + } + // 手动拼接requestStatus条件:COMPLETED(3)时同时包含CHECK_VERIFIED(10)和PENDING_RECEIVE(11) // UNION查询外层列名为request_status(T1.status_enum AS request_status),不是status_enum if (requestStatus != null) { diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/NurseBillingAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/NurseBillingAppService.java index a003b5bf6..8fff41b4c 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/NurseBillingAppService.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/NurseBillingAppService.java @@ -235,10 +235,21 @@ public class NurseBillingAppService implements INurseBillingAppService { inpatientAdviceParam.setEncounterIds(null); Integer exeStatus = inpatientAdviceParam.getExeStatus(); inpatientAdviceParam.setExeStatus(null); + // 提取deadline手动处理,防止自动拼接列名不存在的错误 + String deadline = inpatientAdviceParam.getDeadline(); + inpatientAdviceParam.setDeadline(null); // 构建查询条件 QueryWrapper queryWrapper = HisQueryUtils.buildQueryWrapper(inpatientAdviceParam, null, null, null); + // 手动拼接截止时间条件:request_time <= deadline + if (StringUtils.isNotEmpty(deadline)) { + Date deadlineDate = DateUtils.parseDate(deadline); + if (deadlineDate != null) { + queryWrapper.le("request_time", deadlineDate); + } + } + // 手动拼接住院患者id条件 if (encounterIds != null && !encounterIds.isEmpty()) { List encounterIdList diff --git a/healthlink-his-ui/src/utils/printUtils.js b/healthlink-his-ui/src/utils/printUtils.js index efaf85ff9..f5f07e418 100755 --- a/healthlink-his-ui/src/utils/printUtils.js +++ b/healthlink-his-ui/src/utils/printUtils.js @@ -4,11 +4,11 @@ */ import {hiprint} from 'vue-plugin-hiprint'; -import useUserStore from '@/store/modules/user'; -import {ElMessage} from 'element-plus'; // 打印模板映射表 . const TEMPLATE_MAP = { + // CLINIC_CHARGE: () => import('@/views/charge/cliniccharge/components/template.json'), + // DISPOSAL: () => import('@/views/clinicmanagement/disposal/components/disposalTemplate.json'), //处方签 PRESCRIPTION: () => import('@/components/Print/Prescription.json'), //处置单 @@ -137,29 +137,53 @@ export async function simplePrintWithDialog( // 导出模板名称常量 export const PRINT_TEMPLATE = { + // CLINIC_CHARGE: 'CLINIC_CHARGE', DAY_END: 'DAY_END', WESTERN_MEDICINE: 'WESTERN_MEDICINE', IN_HOSPITAL_DISPENSING: 'IN_HOSPITAL_DISPENSING', + //门诊挂号 OUTPATIENT_REGISTRATION: 'OUTPATIENT_REGISTRATION', + // 门诊手术计费 OUTPATIENT_SURGERY_CHARGE: 'OUTPATIENT_SURGERY_CHARGE', + //门诊收费 OUTPATIENT_CHARGE: 'OUTPATIENT_CHARGE', + //处方签 PRESCRIPTION: 'PRESCRIPTION', + //处置单 DISPOSAL: 'DISPOSAL', + //门诊病历 OUTPATIENT_MEDICAL_RECORD: 'OUTPATIENT_MEDICAL_RECORD', + //门诊输液贴 OUTPATIENT_INFUSION: 'OUTPATIENT_INFUSION', + //手术记录 OPERATIVE_RECORD: 'OPERATIVE_RECORD', + //红旗门诊病历 HQOUTPATIENT_MEDICAL_RECORD: 'HQOUTPATIENT_MEDICAL_RECORD', + //预交金 ADVANCE_PAYMENT: 'ADVANCE_PAYMENT', + //中药处方单 CHINESE_MEDICINE_PRESCRIPTION: 'CHINESE_MEDICINE_PRESCRIPTION', + //药房处方单 PHARMACY_PRESCRIPTION: 'PHARMACY_PRESCRIPTION', + //中药医生处方单 DOC_CHINESE_MEDICINE_PRESCRIPTION: 'DOC_CHINESE_MEDICINE_PRESCRIPTION', + + // ========== 新增模板(原LODOP迁移)========== + //腕带 WRIST_BAND: 'WRIST_BAND', + //分诊条 TRIAGE_TICKET: 'TRIAGE_TICKET', + //输液标签 INJECT_LABEL: 'INJECT_LABEL', + //床头卡 BED_CARD: 'BED_CARD', + //护理交接班 CHANGE_SHIFT_BILL: 'CHANGE_SHIFT_BILL', + //医嘱执行单 EXE_ORDER_SHEET: 'EXE_ORDER_SHEET', + //体温单 TEMPERATURE_SHEET: 'TEMPERATURE_SHEET', + //会诊申请单 CONSULTATION: 'CONSULTATION', }; @@ -182,20 +206,28 @@ export function getPrinterList() { } } +import useUserStore from '@/store/modules/user'; +import {ElMessage} from 'element-plus'; + /** * 获取当前登录用户ID + * @returns {string} 用户ID */ function getCurrentUserId() { try { + // 从Pinia store中获取当前用户ID const userStore = useUserStore(); return userStore.id || ''; } catch (e) { + console.error('获取用户ID失败:', e); return ''; } } /** * 生成打印机缓存键 + * @param {string} businessName 打印业务名称 + * @returns {string} 缓存键 */ function getPrinterCacheKey(businessName) { const userId = getCurrentUserId(); @@ -204,6 +236,8 @@ function getPrinterCacheKey(businessName) { /** * 从缓存获取上次选择的打印机 + * @param {string} businessName 打印业务名称 + * @returns {string} 打印机名称 */ export function getCachedPrinter(businessName = 'default') { const cacheKey = getPrinterCacheKey(businessName); @@ -212,6 +246,8 @@ export function getCachedPrinter(businessName = 'default') { /** * 保存打印机选择到缓存 + * @param {string} printerName 打印机名称 + * @param {string} businessName 打印业务名称 */ export function savePrinterToCache(printerName, businessName = 'default') { if (printerName) { @@ -221,7 +257,13 @@ export function savePrinterToCache(printerName, businessName = 'default') { } /** - * 执行打印操作 (带自动二维码生成逻辑) + * 执行打印操作 + * @param {Array} data 打印数据 + * @param {Object} template 打印模板 + * @param {string} printerName 打印机名称(可选) + * @param {Object} options 打印选项(可选) + * @param {string} businessName 打印业务名称(可选) + * @returns {Promise} 打印结果Promise */ export function executePrint(data, template, printerName, options = {}, businessName = 'default') { return new Promise((resolve, reject) => { @@ -286,6 +328,12 @@ export function executePrint(data, template, printerName, options = {}, business /** * 选择打印机并执行打印 + * @param {Array} data 打印数据 + * @param {Object} template 打印模板 + * @param {Function} showPrinterDialog 显示打印机选择对话框的函数 + * @param {Object} modal 消息提示对象 + * @param {Function} callback 打印完成后的回调函数 + * @param {string} businessName 打印业务名称(可选) */ export async function selectPrinterAndPrint( data, @@ -296,24 +344,29 @@ export async function selectPrinterAndPrint( businessName = 'default' ) { try { + // 获取打印机列表 const printerList = getPrinterList(); + if (printerList.length === 0) { modal.msgWarning('未检测到可用打印机'); return; } + // 获取缓存的打印机 const cachedPrinter = getCachedPrinter(businessName); let selectedPrinter = ''; + // 判断打印机选择逻辑 if (printerList.length === 1) { selectedPrinter = printerList[0].name; await executePrint(data, template, selectedPrinter, {}, businessName); if (callback) callback(); - } else if (cachedPrinter && printerList.some((p) => p.name === cachedPrinter)) { + } else if (cachedPrinter && printerList.some((printer) => printer.name === cachedPrinter)) { selectedPrinter = cachedPrinter; await executePrint(data, template, selectedPrinter, {}, businessName); if (callback) callback(); } else { + // 调用显示打印机选择对话框的函数 showPrinterDialog(printerList, async (chosenPrinter) => { try { await executePrint(data, template, chosenPrinter, {}, businessName); @@ -324,40 +377,375 @@ export async function selectPrinterAndPrint( }); } } catch (error) { - modal.msgError(error.message || '获取打印机失败'); + modal.msgError(error.message || '获取打印机列表失败'); } } -/** - * 预览打印 - */ +// 预览打印 export function previewPrint(elementDom) { if (elementDom) { + // 初始化已在 main.js 中完成,无需重复调用 + // hiprint.init(); const hiprintTemplate = new hiprint.PrintTemplate(); + // printByHtml为预览打印 hiprintTemplate.printByHtml(elementDom, {}); } else { - ElMessage.error('加载模版失败'); + ElMessage({ + type: 'error', + message: '加载模版失败', + }); } } + /** - * 打印门诊挂号收据 + * 打印门诊挂号收据(使用浏览器打印,模板与补打挂号一致) + * @param {Object} data 打印数据 + * @param {Object} options 打印选项 + * @returns {Promise} 打印结果 Promise */ export function printRegistrationReceipt(data, options = {}) { - // 此处保持原有的 HTML 拼接逻辑(略) - return Promise.resolve({ success: true, message: '打印窗口已打开' }); + return new Promise((resolve, reject) => { + try { + // 构建打印内容的 HTML + const printContent = ` + + + + + + + + + +
+ 流水号: + ${data.serialNo || data.encounterId || '-'} +
+ + + + +
+
+
+
扫码查看挂号信息
+
+
+ `; + + // 创建新窗口用于打印 + const printWindow = window.open('', '_blank'); + if (!printWindow) { + reject(new Error('无法打开打印窗口,请检查浏览器弹窗设置')); + return; + } + + // 写入打印内容 + printWindow.document.write(` + + + + + 门诊预约挂号凭条 + + + + + + + `); + + printWindow.document.close(); + printWindow.onload = function() { + setTimeout(() => { + printWindow.print(); + resolve({ success: true, message: '打印窗口已打开' }); + }, 250); + }; + } catch (error) { + console.error('打印门诊挂号收据失败:', error); + reject(error); + } + }); +} + +/** + * 脱敏身份证号 + * @param {string} idCard 身份证号 + * @returns {string} 脱敏后的身份证号 + */ +function maskIdCard(idCard) { + if (!idCard) return ''; + if (idCard.length >= 10) { + const prefix = idCard.substring(0, 6); + const suffix = idCard.substring(idCard.length - 4); + const stars = '*'.repeat(Math.max(0, idCard.length - 10)); + return prefix + stars + suffix; + } else if (idCard.length >= 6) { + const prefix = idCard.substring(0, 3); + const suffix = idCard.substring(idCard.length - 1); + return prefix + '*'.repeat(idCard.length - 4) + suffix; + } + return idCard; } /** * 打印入院证 + * @param {Object} data 入院证数据 + * @returns {Promise} */ export function printAdmissionCertificate(data) { - // 此处保持原有的 HTML 拼接逻辑(略) - return Promise.resolve({ success: true, message: '打印窗口已打开' }); + return new Promise((resolve, reject) => { + try { + const printContent = ` +
+
${data.hospitalName || '医院'}
+
入 院 证
+ +
+ 门诊号:${data.outpatientNo || '—'} + 住院号:${data.inpatientNo || '—'} +
+ +
+
姓名:${data.patientName || '—'}
+
性别:${data.gender || '—'}
+
年龄:${data.age || '—'}
+
费用类型:${data.feeType || '—'}
+
+ +
+
身份证号:${data.idCard || '—'}
+
电话:${data.phone || '—'}
+
+ +
+
住址:${data.address || '—'}
+
+ +
+
联系人:${data.contactPerson || '—'}${data.contactRelation ? '(' + data.contactRelation + ')' : ''} ${data.contactPhone || ''}
+
+ +
+ +
+
入院科室:${data.department || '—'}
+
入院类型:${data.admissionType || '—'}
+
入院病区:${data.ward || '—'}
+
+ +
+
入院方式:${data.admissionMethod || '—'}
+
患者病情:${data.patientCondition || '—'}
+
+ +
+ +
+
入院诊断:
+
1. ${data.westernDiagnosis || '—'}(西医)
+
2. ${data.tcmDiagnosis || '—'}(中医)
+
+ +
+ +
+
开单医生:${data.doctor || '—'}(签名)
+
交款金额:¥${data.paymentAmount || '0.00'} 元(盖章有效)
+
+ +
+
申请日期:${data.applicationDate || '—'}
+
登记人员:${data.registrar || '—'}(签章)
+
+ +
+ +
+
【温馨提示】
+
1. 医保患者请于24小时内持医保卡至住院窗口办理联网,逾期无法报销。
+
2. 住院期间请勿随身携带贵重物品,请携带必要洗漱用具。
+
3. 本证3日内有效。
+
+
+ `; + + const printWindow = window.open('', '_blank'); + if (!printWindow) { + reject(new Error('无法打开打印窗口,请检查浏览器弹窗设置')); + return; + } + + printWindow.document.write(` + + + + + 入院证 + + + + ${printContent} + + + `); + + printWindow.document.close(); + printWindow.onload = function () { + setTimeout(() => { + printWindow.print(); + resolve({ success: true, message: '打印窗口已打开' }); + }, 300); + }; + } catch (error) { + console.error('打印入院证失败:', error); + reject(error); + } + }); } /** * 格式化日期 + * @param {string|Date} date 日期 + * @returns {string} 格式化后的日期字符串 */ export function formatDate(date) { if (!date) return ''; @@ -372,7 +760,7 @@ export function formatDate(date) { return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } -// 默认导出 +// 默认导出简化的打印方法 export default { print: simplePrint, printWithDialog: simplePrintWithDialog, diff --git a/healthlink-his-ui/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue b/healthlink-his-ui/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue index 981eb0c5d..e5147482d 100755 --- a/healthlink-his-ui/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue +++ b/healthlink-his-ui/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue @@ -487,6 +487,33 @@ function getList() { return; } + // 格式化工具:将后端返回的日期字符串转为可读格式 + // 当时间为 00:00:00 时(历史数据 date 列迁移),只显示日期部分 + function formatDisplayDate(val) { + if (!val) return ''; + const pad = (n) => String(n).padStart(2, '0'); + function formatFull(d) { + const datePart = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; + const h = d.getHours(), m = d.getMinutes(), s = d.getSeconds(); + if (h === 0 && m === 0 && s === 0) return datePart; + return `${datePart} ${pad(h)}:${pad(m)}:${pad(s)}`; + } + if (typeof val === 'string') { + if (val.includes('T')) { + const d = new Date(val); + if (!isNaN(d.getTime())) return formatFull(d); + } + // yyyy-MM-dd HH:mm:ss 或 yyyy/MM/dd HH:mm:ss + const m = val.match(/^(\d{4}[-/]\d{1,2}[-/]\d{1,2})(?:\s+(\d{1,2}:\d{2}(?::\d{2})?))?/); + if (m) { + if (m[2] && m[2] !== '00:00:00' && m[2] !== '00:00') return val; + return m[1]; + } + } + if (val instanceof Date && !isNaN(val.getTime())) return formatFull(val); + return val; + } + // 先加载西医诊断,再加载中医诊断(避免竞态覆盖) getEncounterDiagnosis(props.patientInfo.encounterId).then((res) => { if (res.code == 200) { @@ -502,6 +529,7 @@ function getList() { syndromeDefinitionId: '', syndromeGroupNo: '', showPopover: false, + diagnosisTime: formatDisplayDate(item.diagnosisTime), }; if (obj.diagSrtNo == null) { obj.diagSrtNo = 1; @@ -540,11 +568,16 @@ function getList() { iptDiseTypeCode: item.iptDiseTypeCode, showPopover: false, diagnosisDoctor: item.diagnosisDoctor || props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name, - diagnosisTime: item.diagnosisTime || new Date().toLocaleString('zh-CN') + diagnosisTime: formatDisplayDate(item.diagnosisTime) || new Date().toLocaleString('zh-CN') }); }); - // 将新数据添加到现有列表现有列表 + // 先移除已有的中医诊断,防止重复追加(getList 可能被多次调用) + form.value.diagnosisList = form.value.diagnosisList.filter( + (item) => item.diagnosisSystem !== '中医' + ); + + // 将新数据添加到现有列表 form.value.diagnosisList.push(...newList); // 重新排序整个列表 @@ -899,80 +932,109 @@ function handleSaveDiagnosis() { item.diagSrtNo = index + 1; }); + // 日期格式化工具:将 Date 对象或 ISO 字符串转为后端期望的 yyyy/M/d HH:mm:ss 格式 + function formatDateForBackend(val) { + if (!val) return ''; + if (typeof val === 'string') { + // 已经是字符串且符合 yyyy/M/d HH:mm:ss 格式则直接返回 + if (/^\d{4}\/\d{1,2}\/\d{1,2} \d{1,2}:\d{2}:\d{2}$/.test(val)) return val; + // 已经是 yyyy-MM-dd HH:mm:ss 格式则转换为 yyyy/M/d HH:mm:ss + const m = val.match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2})$/); + if (m) return `${m[1]}/${parseInt(m[2])}/${parseInt(m[3])} ${m[4]}`; + // ISO 或其他格式则解析为 Date + val = new Date(val); + } + if (val instanceof Date && !isNaN(val.getTime())) { + const y = val.getFullYear(); + const M = val.getMonth() + 1; + const d = val.getDate(); + const hh = String(val.getHours()).padStart(2, '0'); + const mm = String(val.getMinutes()).padStart(2, '0'); + const ss = String(val.getSeconds()).padStart(2, '0'); + return `${y}/${M}/${d} ${hh}:${mm}:${ss}`; + } + return ''; + } + // 步骤3:拆分为西医诊断和中医诊断 const westernList = sortedList.filter((item) => item.diagnosisSystem !== '中医'); const tcmList = sortedList.filter((item) => item.diagnosisSystem === '中医'); - const savePromises = []; + // 顺序执行保存,避免并行竞态: + // saveDoctorDiagnosis(西医)会 deleteEncounterDiagnosisInfos 删除全部诊断, + // saveTcmDiagnosis(中医)只追加不删除,必须等西医保存完成后再保存中医 + (async () => { + try { + // 先保存西医诊断(会先清空再插入) + if (westernList.length > 0) { + await saveDiagnosis({ + patientId: props.patientInfo.patientId, + encounterId: props.patientInfo.encounterId, + diagnosisChildList: westernList.map(item => ({ + ...item, + diagnosisTime: formatDateForBackend(item.diagnosisTime), + onsetDate: formatDateForBackend(item.onsetDate), + })), + }); + } - // 保存西医诊断 - if (westernList.length > 0) { - savePromises.push( - saveDiagnosis({ - patientId: props.patientInfo.patientId, - encounterId: props.patientInfo.encounterId, - diagnosisChildList: westernList, - }) - ); - } + // 再逐个保存中医诊断(只追加,不清空) + for (const item of tcmList) { + const syndromeGroupNo = item.conditionId + ? `${item.conditionId}-${item.tcmSyndromeCode || Date.now()}` + : `${Date.now()}-${item.tcmSyndromeCode || '0'}`; + await saveTcmDiagnosis({ + patientId: props.patientInfo.patientId, + encounterId: props.patientInfo.encounterId, + diagnosisChildList: [ + // 病(illness) + { + conditionId: item.conditionId || null, + name: item.name, + ybNo: item.ybNo, + definitionId: item.definitionId || null, + diagSrtNo: item.diagSrtNo, + medTypeCode: item.medTypeCode, + maindiseFlag: item.maindiseFlag, + verificationStatusEnum: item.verificationStatusEnum, + diagnosisDesc: item.diagnosisDesc || '', + diagnosisDoctor: item.diagnosisDoctor || '', + diagnosisTime: formatDateForBackend(item.diagnosisTime), + iptDiseTypeCode: item.iptDiseTypeCode, + syndromeGroupNo: syndromeGroupNo, + }, + // 证(syndrome) + { + name: item.tcmSyndromeName, + ybNo: item.tcmSyndromeCode, + definitionId: item.syndromeDefinitionId || null, + diagSrtNo: null, + syndromeGroupNo: syndromeGroupNo, + }, + ], + }); + } - // 保存中医诊断 - tcmList.forEach((item) => { - const syndromeGroupNo = item.conditionId - ? `${item.conditionId}-${item.tcmSyndromeCode || Date.now()}` - : `${Date.now()}-${item.tcmSyndromeCode || '0'}`; - savePromises.push( - saveTcmDiagnosis({ - patientId: props.patientInfo.patientId, - encounterId: props.patientInfo.encounterId, - diagnosisChildList: [ - // 病(illness) - { - conditionId: item.conditionId || null, - name: item.name, - ybNo: item.ybNo, - definitionId: item.definitionId || null, - diagSrtNo: item.diagSrtNo, - medTypeCode: item.medTypeCode, - maindiseFlag: item.maindiseFlag, - verificationStatusEnum: item.verificationStatusEnum, - diagnosisDesc: item.diagnosisDesc || '', - diagnosisDoctor: item.diagnosisDoctor || '', - diagnosisTime: item.diagnosisTime || '', - iptDiseTypeCode: item.iptDiseTypeCode, - syndromeGroupNo: syndromeGroupNo, - }, - // 证(syndrome) - { - name: item.tcmSyndromeName, - ybNo: item.tcmSyndromeCode, - definitionId: item.syndromeDefinitionId || null, - diagSrtNo: null, - syndromeGroupNo: syndromeGroupNo, - }, - ], - }) - ); - }); + // 所有保存完成后刷新 + emits('diagnosisSave', false); + proxy.$modal.msgSuccess('诊断已保存'); + getList(); - Promise.all(savePromises).then(() => { - emits('diagnosisSave', false); - proxy.$modal.msgSuccess('诊断已保存'); - - // 保存成功后从服务器重新加载数据,确保前后端数据一致 - getList(); - - // 食源性疾病逻辑 - isFoodDiseasesNew({ encounterId: props.patientInfo.encounterId }).then((res2) => { + // 食源性疾病逻辑 + isFoodDiseasesNew({ encounterId: props.patientInfo.encounterId }).then((res2) => { if (res2.code === 20 && res2.data) { window.open(res2.data, '_blank'); } }); - }).finally(() => { - setTimeout(() => { - isSaving.value = false; - }, 100); - }); + } catch (e) { + console.error('保存诊断失败', e); + proxy.$modal.msgError('保存诊断失败'); + } finally { + setTimeout(() => { + isSaving.value = false; + }, 100); + } + })(); } }); } diff --git a/healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue b/healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue index e7e184d00..95d051fc6 100755 --- a/healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue +++ b/healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue @@ -1,4 +1,4 @@ -