From d06f6ceeb0a4fd9024c5f0dcacf7a1dfa96c6a81 Mon Sep 17 00:00:00 2001 From: guanyu Date: Mon, 18 May 2026 17:14:17 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#443:=20=E6=89=8B=E6=9C=AF=E8=AE=A1?= =?UTF-8?q?=E8=B4=B9=E7=AD=BE=E5=8F=91=E8=80=97=E6=9D=90=E6=97=B6=20dbOpTy?= =?UTF-8?q?pe=20=E9=94=99=E8=AF=AF=E5=92=8C=E5=85=B3=E9=94=AE=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=BC=BA=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:1) handleSave() 对所有记录统一使用 dbOpType='1'(INSERT),但已存在 的耗材记录(requestId不为空)应使用 '2'(UPDATE),导致后端 handDevice 语义 混乱;2) 签发时未从 item 顶层补充 quantity/unitCode/lotNumber/categoryEnum 等字段,若 contentJson 中缺失则后端无法正确处理;3) saveList 为空时未提前 校验,直接发送到后端触发"医嘱列表为空"错误。 修复:1) dbOpType 根据 requestId 是否存在动态选择 '2' 或 '1'; 2) map 中新增 quantity、unitCode、lotNumber、categoryEnum 从 item 顶层补充; 3) generateSourceEnum/sourceBillNo 增加 item 顶层作为第三层兜底; 4) 恢复 saveList.length==0 的空列表校验并给出友好提示。 Co-Authored-By: Claude Opus 4.7 --- .../bargain/component/prescriptionlist.vue | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/openhis-ui-vue3/src/views/clinicmanagement/bargain/component/prescriptionlist.vue b/openhis-ui-vue3/src/views/clinicmanagement/bargain/component/prescriptionlist.vue index 8a66146ee..4910dd2ec 100755 --- a/openhis-ui-vue3/src/views/clinicmanagement/bargain/component/prescriptionlist.vue +++ b/openhis-ui-vue3/src/views/clinicmanagement/bargain/component/prescriptionlist.vue @@ -1082,26 +1082,21 @@ function handleSave() { } return item.check && item.statusEnum == 1&&(Number(item.bizRequestFlag)==1||!item.bizRequestFlag) }); - // let saveList = prescriptionList.value - // .filter((item) => { - // return item.check; - // }).filter((item) => { - // return item.statusEnum == 1&&item.bizRequestFlag==1 - // }) - - // if (saveList.length == 0) { - // proxy.$modal.msgWarning('当前无可签发处方'); - // return; - // } + // 无可签发项目时提前返回,避免后端报"医嘱列表为空" + if (saveList.length == 0) { + proxy.$modal.msgWarning('当前无可签发处方'); + return; + } // 此处签发处方和单行保存处方传参相同,后台已经将传参存为JSON字符串,此处直接转换为JSON即可 let list = saveList.map((item) => { const parsedContent = item.contentJson ? JSON.parse(item.contentJson) : {}; return { ...parsedContent, requestId: item.requestId, - dbOpType: '1', + // 已有 requestId 的记录走 UPDATE 路径,新记录走 INSERT 路径 + dbOpType: item.requestId ? '2' : '1', groupId: item.groupId, - // 🔧 Bug #443: 补充顶层关键字段(这些不在 contentJson 中,需从 API 响应顶层提取) + // 补充顶层关键字段(这些可能不在 contentJson 中,需从 API 响应顶层提取) encounterId: item.encounterId, patientId: item.patientId, locationId: item.positionId, @@ -1109,9 +1104,14 @@ function handleSave() { adviceTableName: item.adviceTableName, adviceDefinitionId: item.adviceDefinitionId, chargeItemId: item.chargeItemId, - // 🔧 Bug Fix: 签发时显式设置手术计费关键字段,避免后端 prescription_no / generateSourceEnum 回退为默认值导致查询无法匹配 - generateSourceEnum: props.generateSourceEnum ?? parsedContent.generateSourceEnum, - sourceBillNo: props.sourceBillNo ?? parsedContent.sourceBillNo, + // 补充数量、单位、批号等字段(后端 handDevice 需要这些字段) + quantity: item.quantity, + unitCode: item.unitCode, + lotNumber: item.lotNumber, + categoryEnum: item.categoryEnum, + // 签发时显式设置手术计费关键字段,后端 generateSourceEnum 回退为默认值导致查询无法匹配 + generateSourceEnum: props.generateSourceEnum ?? parsedContent.generateSourceEnum ?? item.generateSourceEnum, + sourceBillNo: props.sourceBillNo ?? parsedContent.sourceBillNo ?? item.sourceBillNo, }; }); // 确保 organizationId 不为 undefined(手术计费场景下可能缺失 orgId)