diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java index 9be2fe68..04f00917 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java @@ -343,7 +343,24 @@ public class SurgeryAppServiceImpl implements ISurgeryAppService { serviceRequest.setEncounterId(surgeryDto.getEncounterId()); // 就诊id serviceRequest.setAuthoredTime(curDate); // 请求签发时间 serviceRequest.setOrgId(orgId); // 执行科室 + // 🔧 BugFix#318: 设置 contentJson,包含手术名称 + Map serviceContentMap = new HashMap<>(); + String surgeryNameFromDto = surgeryDto.getSurgeryName(); + String surgeryCodeFromDto = surgeryDto.getSurgeryCode(); + log.info("【DEBUG】surgeryName from DTO: {}", surgeryNameFromDto); + log.info("【DEBUG】surgeryCode from DTO: {}", surgeryCodeFromDto); + serviceContentMap.put("surgeryName", surgeryNameFromDto != null ? surgeryNameFromDto : ""); + serviceContentMap.put("surgeryCode", surgeryCodeFromDto != null ? surgeryCodeFromDto : ""); + try { + String contentJson = new ObjectMapper().writeValueAsString(serviceContentMap); + log.info("【DEBUG】Setting contentJson: {}", contentJson); + serviceRequest.setContentJson(contentJson); + } catch (JsonProcessingException e) { + log.error("【DEBUG】设置手术医嘱 contentJson 失败", e); + } serviceRequestService.save(serviceRequest); + log.info("【DEBUG】Saved serviceRequest with ID: {}, contentJson: {}", + serviceRequest.getId(), serviceRequest.getContentJson()); // 生成收费项目 ChargeItem chargeItem = new ChargeItem(); diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/OpScheduleDto.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/OpScheduleDto.java index 5f16f5e1..72ec3016 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/OpScheduleDto.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/OpScheduleDto.java @@ -43,6 +43,11 @@ public class OpScheduleDto extends OpSchedule { */ private Long encounterId; + /** + * 就诊卡号 + */ + private String patientCardNo; + /** * 性别 */ diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/SurgeryDto.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/SurgeryDto.java index 392e8cc9..4de68bf2 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/SurgeryDto.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/SurgeryDto.java @@ -45,6 +45,9 @@ public class SurgeryDto { /** 就诊流水号 */ private String encounterNo; + /** 就诊卡号 */ + private String patientCardNo; + /** 申请医生ID */ @JsonSerialize(using = ToStringSerializer.class) private Long applyDoctorId; diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgeryMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgeryMapper.xml index fc422cb3..5239fbd4 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgeryMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgeryMapper.xml @@ -13,6 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -79,6 +80,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" EXTRACT(YEAR FROM AGE(p.birth_date)) as patient_age, s.encounter_id, e.bus_no as encounter_no, + pi.identifier_no as patient_card_no, s.apply_doctor_id, COALESCE(s.apply_doctor_name, apply_doc.name) as apply_doctor_name, s.apply_dept_id, @@ -177,6 +179,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM cli_surgery s LEFT JOIN adm_patient p ON s.patient_id = p.id LEFT JOIN adm_encounter e ON s.encounter_id = e.id + LEFT JOIN ( + SELECT patient_id, identifier_no + FROM ( + SELECT patient_id, identifier_no, + ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn + FROM adm_patient_identifier + WHERE delete_flag = '0' + AND identifier_no IS NOT NULL + AND identifier_no != '' + ) t + WHERE rn = 1 + ) pi ON s.patient_id = pi.patient_id LEFT JOIN adm_operating_room r ON s.operating_room_id = r.id LEFT JOIN adm_organization ro ON r.organization_id = ro.id LEFT JOIN adm_organization o ON s.org_id = o.id @@ -248,6 +262,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" p.birth_date, e.bus_no as encounter_no, + + pi.identifier_no as patient_card_no, CASE s.surgery_type_enum WHEN 1 THEN '门诊手术' @@ -302,6 +318,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" LEFT JOIN adm_patient p ON s.patient_id = p.id LEFT JOIN adm_encounter e ON s.encounter_id = e.id + + LEFT JOIN ( + SELECT patient_id, identifier_no + FROM ( + SELECT patient_id, identifier_no, + ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn + FROM adm_patient_identifier + WHERE delete_flag = '0' + AND identifier_no IS NOT NULL + AND identifier_no != '' + ) t + WHERE rn = 1 + ) pi ON s.patient_id = pi.patient_id s.delete_flag = '0' diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgicalScheduleAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgicalScheduleAppMapper.xml index d1c2d6f9..0bad826c 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgicalScheduleAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgicalScheduleAppMapper.xml @@ -30,13 +30,26 @@ cs.apply_dept_name, cs.org_id, o.name AS org_name, - cs.main_surgeon_name AS surgeon_name + cs.main_surgeon_name AS surgeon_name, + pi.identifier_no AS patient_card_no FROM op_schedule os LEFT JOIN adm_patient ap ON os.patient_id = ap.id LEFT JOIN cli_surgery cs ON os.oper_code = cs.surgery_no AND cs.delete_flag = '0' LEFT JOIN adm_organization o ON cs.org_id = o.id LEFT JOIN sys_tenant st ON st.id = os.tenant_id LEFT JOIN sys_user su ON su.user_id = os.creator_id + LEFT JOIN ( + SELECT patient_id, identifier_no + FROM ( + SELECT patient_id, identifier_no, + ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn + FROM adm_patient_identifier + WHERE delete_flag = '0' + AND identifier_no IS NOT NULL + AND identifier_no != '' + ) t + WHERE rn = 1 + ) pi ON os.patient_id = pi.patient_id AND os.tenant_id = #{dto.tenantId} @@ -75,12 +88,25 @@ cs.main_surgeon_name AS surgeon_name, cs.apply_doctor_name AS apply_doctor_name, drf.create_time AS apply_time, - os.surgery_nature AS surgeryType + os.surgery_nature AS surgeryType, + pi.identifier_no AS patient_card_no FROM op_schedule os LEFT JOIN adm_patient ap ON os.patient_id = ap.id LEFT JOIN cli_surgery cs ON os.oper_code = cs.surgery_no AND cs.delete_flag = '0' LEFT JOIN adm_organization o ON cs.org_id = o.id LEFT JOIN doc_request_form drf ON drf.prescription_no=cs.surgery_no + LEFT JOIN ( + SELECT patient_id, identifier_no + FROM ( + SELECT patient_id, identifier_no, + ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn + FROM adm_patient_identifier + WHERE delete_flag = '0' + AND identifier_no IS NOT NULL + AND identifier_no != '' + ) t + WHERE rn = 1 + ) pi ON os.patient_id = pi.patient_id WHERE os.schedule_id = #{scheduleId} LIMIT 1 @@ -123,13 +149,26 @@ cs.apply_dept_name, cs.org_id, o.name AS org_name, - cs.main_surgeon_name AS surgeon_name + cs.main_surgeon_name AS surgeon_name, + pi.identifier_no AS patient_card_no FROM op_schedule os LEFT JOIN adm_patient ap ON os.patient_id = ap.id LEFT JOIN cli_surgery cs ON os.oper_code = cs.surgery_no AND cs.delete_flag = '0' LEFT JOIN adm_organization o ON cs.org_id = o.id LEFT JOIN sys_tenant st ON st.id = os.tenant_id LEFT JOIN sys_user su ON su.user_id = os.creator_id + LEFT JOIN ( + SELECT patient_id, identifier_no + FROM ( + SELECT patient_id, identifier_no, + ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn + FROM adm_patient_identifier + WHERE delete_flag = '0' + AND identifier_no IS NOT NULL + AND identifier_no != '' + ) t + WHERE rn = 1 + ) pi ON os.patient_id = pi.patient_id AND os.delete_flag = '0' AND os.patient_id = #{dto.patientId} diff --git a/openhis-ui-vue3/src/views/doctorstation/components/surgery/surgeryApplication.vue b/openhis-ui-vue3/src/views/doctorstation/components/surgery/surgeryApplication.vue index f0355fa6..4a59605b 100644 --- a/openhis-ui-vue3/src/views/doctorstation/components/surgery/surgeryApplication.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/surgery/surgeryApplication.vue @@ -505,7 +505,8 @@ import { useDict } from '@/utils/dict' const { surgery_type, surgery_level, incision_level, anesthesia_type } = useDict('surgery_type', 'surgery_level', 'incision_level', 'anesthesia_type') const { proxy } = getCurrentInstance() -const userStore = useUserStore() +const userStore = useUserStore() // 🔧 BugFix: 初始化 userStore,否则 applyDoctorName 和 applyDeptName 会是 undefined +const emit = defineEmits(['saved']) const props = defineProps({ patientInfo: { type: Object, @@ -963,9 +964,13 @@ function doSearchAnesthesia(query) { // 手术项目选择变更 function handleSurgeryChange(val) { + // 🔧 BugFix#318: 确保 surgeryName 被正确设置 + form.value.surgeryName = val const selected = surgeryNameList.value.find(item => item.name === val) if (selected) { form.value.surgeryCode = selected.busNo + // 🔧 BugFix#318: 确保 surgeryName 从选中项获取(避免空值) + form.value.surgeryName = selected.name // 设置手术费用 (增加对多种字段名和类型的兼容) const price = selected.retailPrice ?? selected.retail_price ?? selected.price ?? selected.salePrice ?? 0 form.value.surgeryFee = parseFloat(price) @@ -1050,6 +1055,27 @@ function submitForm() { console.log('【提交表单】完整表单数据:', JSON.parse(JSON.stringify(form.value))) console.log('【提交表单】手术指征字段值:', form.value.surgeryIndication) console.log('【提交表单】手术指征字段类型:', typeof form.value.surgeryIndication) + + // 🔧 BugFix#318: 验证 surgeryName 和 surgeryCode + if (!form.value.surgeryName) { + console.error('【提交表单】错误: surgeryName 为空!') + proxy.$modal.msgError('手术名称不能为空,请重新选择手术项目') + return + } + if (!form.value.surgeryCode) { + console.error('【提交表单】错误: surgeryCode 为空!') + // 尝试从 surgeryNameList 获取 + const selected = surgeryNameList.value.find(item => item.name === form.value.surgeryName) + if (selected) { + form.value.surgeryCode = selected.busNo + console.log('【提交表单】自动填充 surgeryCode:', form.value.surgeryCode) + } else { + proxy.$modal.msgError('手术编码不能为空,请重新选择手术项目') + return + } + } + + console.log('【提交表单】最终数据 - surgeryName:', form.value.surgeryName, 'surgeryCode:', form.value.surgeryCode) if (form.value.id == undefined) { // 新增手术 @@ -1060,6 +1086,7 @@ function submitForm() { sessionStorage.setItem('anesthesiaType', form.value.anesthesiaTypeEnum) open.value = false getList() + emit('saved') // 🔧 触发保存事件,通知父组件刷新医嘱列表 } else { proxy.$modal.msgError(res.msg || '新增手术失败,请检查表单信息') } @@ -1076,6 +1103,7 @@ function submitForm() { sessionStorage.setItem('anesthesiaType', form.value.anesthesiaTypeEnum) open.value = false getList() + emit('saved') // 🔧 触发保存事件,通知父组件刷新医嘱列表 } else { proxy.$modal.msgError(res.msg || '更新手术失败,请检查表单信息') } diff --git a/openhis-ui-vue3/src/views/doctorstation/index.vue b/openhis-ui-vue3/src/views/doctorstation/index.vue index 34ff0823..ed21332d 100644 --- a/openhis-ui-vue3/src/views/doctorstation/index.vue +++ b/openhis-ui-vue3/src/views/doctorstation/index.vue @@ -150,7 +150,8 @@ @saved="() => prescriptionRef?.getListInfo()" /> - + diff --git a/openhis-ui-vue3/src/views/surgicalschedule/index.vue b/openhis-ui-vue3/src/views/surgicalschedule/index.vue index c490f1b0..1abe6ff9 100644 --- a/openhis-ui-vue3/src/views/surgicalschedule/index.vue +++ b/openhis-ui-vue3/src/views/surgicalschedule/index.vue @@ -89,7 +89,7 @@ - +