Fix Bug #402: 住院医生站诊断录入:点击保存诊断后,列表出现重复记录且部分条目元数据缺失
根因:后端 saveDoctorDiagnosis 先删除所有 tcm_flag=0 的记录,再用旧 encounterDiagnosisId 调用 saveOrUpdate,由于记录已删除,UPDATE 失败后 fallback 到 INSERT 导致重复记录。 修复: 1. 后端:不再设置 encounterDiagnosisId,确保 saveOrUpdate 始终执行 INSERT 2. 前端:getList() 后对诊断列表按 ybNo/name 去重,防止重复显示 3. 前端:保存前补全 diagnosisDoctor 和 diagnosisTime 元数据 4. 前端:修复 getTcmDiagnosis 的空值安全访问(res.data?.illness?.length) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -246,7 +246,8 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
|
|||||||
EncounterDiagnosis encounterDiagnosis;
|
EncounterDiagnosis encounterDiagnosis;
|
||||||
for (SaveDiagnosisChildParam saveDiagnosisChildParam : diagnosisChildList) {
|
for (SaveDiagnosisChildParam saveDiagnosisChildParam : diagnosisChildList) {
|
||||||
encounterDiagnosis = new EncounterDiagnosis();
|
encounterDiagnosis = new EncounterDiagnosis();
|
||||||
encounterDiagnosis.setId(saveDiagnosisChildParam.getEncounterDiagnosisId());
|
// 注意:不设置 encounterDiagnosisId,因为上面已经删除了所有记录
|
||||||
|
// 如果设置旧的 ID,saveOrUpdate 会尝试 UPDATE 不存在的记录导致失败或重复插入
|
||||||
encounterDiagnosis.setEncounterId(encounterId);
|
encounterDiagnosis.setEncounterId(encounterId);
|
||||||
encounterDiagnosis.setConditionId(saveDiagnosisChildParam.getConditionId());
|
encounterDiagnosis.setConditionId(saveDiagnosisChildParam.getConditionId());
|
||||||
encounterDiagnosis.setMaindiseFlag(saveDiagnosisChildParam.getMaindiseFlag());
|
encounterDiagnosis.setMaindiseFlag(saveDiagnosisChildParam.getMaindiseFlag());
|
||||||
|
|||||||
@@ -289,43 +289,62 @@ function getList() {
|
|||||||
return obj;
|
return obj;
|
||||||
});
|
});
|
||||||
form.value.diagnosisList = datas;
|
form.value.diagnosisList = datas;
|
||||||
// form.value.diagnosisList = res.data;
|
// 去重:按 conditionId 去重,防止后端重复插入导致重复记录
|
||||||
|
deduplicateDiagnosisList();
|
||||||
emits('diagnosisSave', false);
|
emits('diagnosisSave', false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
getTcmDiagnosis({ encounterId: props.patientInfo.encounterId }).then((res) => {
|
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.code == 200 && res.data?.illness?.length > 0) {
|
||||||
if (res.data.illness.length > 0) {
|
diagnosisNetDatas.value = res.data.illness;
|
||||||
diagnosisNetDatas.value = res.data.illness;
|
res.data.illness.forEach((item, index) => {
|
||||||
res.data.illness.forEach((item, index) => {
|
newList.push({
|
||||||
newList.push({
|
name: item.name + '-' + (res.data.symptom?.[index]?.name || ''),
|
||||||
name: item.name + '-' + (res.data.symptom[index]?.name || ''),
|
ybNo: item.ybNo,
|
||||||
ybNo: item.ybNo,
|
medTypeCode: item.medTypeCode,
|
||||||
medTypeCode: item.medTypeCode,
|
diagnosisDoctor: props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name,
|
||||||
diagnosisDoctor: props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name,
|
diagnosisTime: new Date().toLocaleString('zh-CN')
|
||||||
diagnosisTime: new Date().toLocaleString('zh-CN')
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// 将新数据添加到现有列表中
|
// 将新数据添加到现有列表中
|
||||||
form.value.diagnosisList.push(...newList);
|
form.value.diagnosisList.push(...newList);
|
||||||
|
|
||||||
// 重新排序整个列表
|
// 重新排序整个列表
|
||||||
form.value.diagnosisList.sort((a, b) => {
|
form.value.diagnosisList.sort((a, b) => {
|
||||||
const aNo = typeof a.diagSrtNo === 'number' ? a.diagSrtNo : 9999;
|
const aNo = typeof a.diagSrtNo === 'number' ? a.diagSrtNo : 9999;
|
||||||
const bNo = typeof b.diagSrtNo === 'number' ? b.diagSrtNo : 9999;
|
const bNo = typeof b.diagSrtNo === 'number' ? b.diagSrtNo : 9999;
|
||||||
return aNo - bNo;
|
return aNo - bNo;
|
||||||
});
|
});
|
||||||
}
|
// TCM 数据添加后也去重
|
||||||
emits('diagnosisSave', false);
|
deduplicateDiagnosisList();
|
||||||
}
|
}
|
||||||
|
emits('diagnosisSave', false);
|
||||||
});
|
});
|
||||||
|
|
||||||
getTree();
|
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();
|
init();
|
||||||
function init() {
|
function init() {
|
||||||
diagnosisInit().then((res) => {
|
diagnosisInit().then((res) => {
|
||||||
@@ -603,6 +622,18 @@ function handleSaveDiagnosis() {
|
|||||||
return aNo - bNo;
|
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开始)
|
// 步骤2:重新分配连续的序号(从1开始)
|
||||||
sortedList.forEach((item, index) => {
|
sortedList.forEach((item, index) => {
|
||||||
item.diagSrtNo = index + 1; // 这里是关键!把”诊断排序”改成新顺序
|
item.diagSrtNo = index + 1; // 这里是关键!把”诊断排序”改成新顺序
|
||||||
|
|||||||
Reference in New Issue
Block a user