diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationDiagnosisAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationDiagnosisAppServiceImpl.java index 2a1fd9356..73a865a3c 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationDiagnosisAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationDiagnosisAppServiceImpl.java @@ -246,7 +246,8 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn EncounterDiagnosis encounterDiagnosis; for (SaveDiagnosisChildParam saveDiagnosisChildParam : diagnosisChildList) { encounterDiagnosis = new EncounterDiagnosis(); - encounterDiagnosis.setId(saveDiagnosisChildParam.getEncounterDiagnosisId()); + // 注意:不设置 encounterDiagnosisId,因为上面已经删除了所有记录 + // 如果设置旧的 ID,saveOrUpdate 会尝试 UPDATE 不存在的记录导致失败或重复插入 encounterDiagnosis.setEncounterId(encounterId); encounterDiagnosis.setConditionId(saveDiagnosisChildParam.getConditionId()); encounterDiagnosis.setMaindiseFlag(saveDiagnosisChildParam.getMaindiseFlag()); diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue index e50513b32..8cda4020b 100755 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue @@ -289,43 +289,62 @@ function getList() { return obj; }); form.value.diagnosisList = datas; - // form.value.diagnosisList = res.data; + // 去重:按 conditionId 去重,防止后端重复插入导致重复记录 + deduplicateDiagnosisList(); emits('diagnosisSave', false); } }); getTcmDiagnosis({ encounterId: props.patientInfo.encounterId }).then((res) => { - console.log('getTcmDiagnosis=======>', JSON.stringify(res.data.illness)); + console.log('getTcmDiagnosis=======>', JSON.stringify(res.data?.illness)); - if (res.code == 200) { - if (res.data.illness.length > 0) { - diagnosisNetDatas.value = res.data.illness; - res.data.illness.forEach((item, index) => { - newList.push({ - name: item.name + '-' + (res.data.symptom[index]?.name || ''), - ybNo: item.ybNo, - medTypeCode: item.medTypeCode, - diagnosisDoctor: props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name, - diagnosisTime: new Date().toLocaleString('zh-CN') - }); + if (res.code == 200 && res.data?.illness?.length > 0) { + diagnosisNetDatas.value = res.data.illness; + res.data.illness.forEach((item, index) => { + newList.push({ + name: item.name + '-' + (res.data.symptom?.[index]?.name || ''), + ybNo: item.ybNo, + medTypeCode: item.medTypeCode, + diagnosisDoctor: props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name, + diagnosisTime: new Date().toLocaleString('zh-CN') }); - - // 将新数据添加到现有列表中 - form.value.diagnosisList.push(...newList); - - // 重新排序整个列表 - form.value.diagnosisList.sort((a, b) => { - const aNo = typeof a.diagSrtNo === 'number' ? a.diagSrtNo : 9999; - const bNo = typeof b.diagSrtNo === 'number' ? b.diagSrtNo : 9999; - return aNo - bNo; - }); - } - emits('diagnosisSave', false); + }); + + // 将新数据添加到现有列表中 + form.value.diagnosisList.push(...newList); + + // 重新排序整个列表 + form.value.diagnosisList.sort((a, b) => { + const aNo = typeof a.diagSrtNo === 'number' ? a.diagSrtNo : 9999; + const bNo = typeof b.diagSrtNo === 'number' ? b.diagSrtNo : 9999; + return aNo - bNo; + }); + // TCM 数据添加后也去重 + deduplicateDiagnosisList(); } + emits('diagnosisSave', false); }); - + getTree(); } +/** + * 诊断列表去重:按 ybNo + name 组合去重,保留第一条记录 + * 防止后端 saveOrUpdate 在删除后误 INSERT 导致重复 + */ +function deduplicateDiagnosisList() { + const seen = new Set(); + const dedupedList = []; + for (const item of form.value.diagnosisList) { + // 使用 ybNo 和 name 组合作为唯一标识(中医诊断没有 ybNo,用 name 去重) + const key = item.ybNo ? `${item.ybNo}` : `name_${item.name}`; + if (!seen.has(key)) { + seen.add(key); + dedupedList.push(item); + } + } + form.value.diagnosisList = dedupedList; +} + init(); function init() { diagnosisInit().then((res) => { @@ -603,6 +622,18 @@ function handleSaveDiagnosis() { return aNo - bNo; }); + // 步骤1.5:确保每条诊断都有诊断医生和诊断时间(元数据补全) + const doctorName = props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name; + const now = new Date().toLocaleString('zh-CN'); + sortedList.forEach((item) => { + if (!item.diagnosisDoctor) { + item.diagnosisDoctor = doctorName; + } + if (!item.diagnosisTime) { + item.diagnosisTime = now; + } + }); + // 步骤2:重新分配连续的序号(从1开始) sortedList.forEach((item, index) => { item.diagSrtNo = index + 1; // 这里是关键!把”诊断排序”改成新顺序