Compare commits

..

1 Commits

Author SHA1 Message Date
关羽
ffa709cf4e Fix Bug #443: 手术计费:点击"签发"耗材时异常报错
根因:签发耗材时 handDevice 方法会重复调用 saveOrUpdate 更新已有的 DeviceRequest 记录,
仅设置了部分字段(可能为 null),导致关键字段 performLocation(发放库房)被覆盖为空。
随后 handleDeviceDispense 创建 DeviceDispense 时 locationId 为 null,触发报错。

修复:签发操作(SIGN_ADVICE)跳过 handDevice 处理。因为耗材请求在保存时已创建完成,
签发只需更新状态(下方批量更新逻辑已处理),无需重新走 insert/update 流程。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 18:15:34 +08:00
3 changed files with 10 additions and 13 deletions

View File

@@ -728,8 +728,12 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
/** /**
* 处理耗材请求 * 处理耗材请求
* 🔧 BugFix #443: 签发时跳过 handDevice避免重复创建 DeviceDispense 并覆盖关键字段(如 performLocation
* 签发时只需更新状态(下方 sign-advice 批量更新逻辑已处理)
*/ */
this.handDevice(deviceList, curDate, adviceOpType); if (AdviceOpType.SAVE_ADVICE.getCode().equals(adviceOpType)) {
this.handDevice(deviceList, curDate, adviceOpType);
}
// 签发时,把草稿状态的账单更新为待收费 // 签发时,把草稿状态的账单更新为待收费
if (AdviceOpType.SIGN_ADVICE.getCode().equals(adviceOpType) && !adviceSaveList.isEmpty()) { if (AdviceOpType.SIGN_ADVICE.getCode().equals(adviceOpType) && !adviceSaveList.isEmpty()) {

View File

@@ -91,15 +91,13 @@
os.surgery_nature AS surgeryType, os.surgery_nature AS surgeryType,
cs.incision_level AS incisionLevel, cs.incision_level AS incisionLevel,
fc.contract_name AS feeType, fc.contract_name AS feeType,
os.fee_type AS feeType,
COALESCE(pi.identifier_no, ap.bus_no, '') AS identifierNo COALESCE(pi.identifier_no, ap.bus_no, '') AS identifierNo
FROM op_schedule os FROM op_schedule os
LEFT JOIN adm_patient ap ON os.patient_id = ap.id LEFT JOIN adm_patient ap ON os.patient_id = ap.id
INNER JOIN cli_surgery cs ON os.oper_code = cs.surgery_no AND cs.delete_flag = '0' INNER 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 adm_organization o ON cs.org_id = o.id
LEFT JOIN doc_request_form drf ON drf.prescription_no=cs.surgery_no LEFT JOIN doc_request_form drf ON drf.prescription_no=cs.surgery_no
LEFT JOIN adm_encounter ae ON ae.id = os.visit_id AND ae.delete_flag = '0'
LEFT JOIN adm_account aa ON aa.encounter_id = ae.id AND aa.delete_flag = '0'
LEFT JOIN fin_contract fc ON fc.bus_no = aa.contract_no AND fc.delete_flag = '0'
LEFT JOIN ( LEFT JOIN (
SELECT patient_id, identifier_no SELECT patient_id, identifier_no
FROM ( FROM (

View File

@@ -1362,9 +1362,8 @@ async function handleMethodSelect(checked, method, cat) {
existingItem.isPackage = true; existingItem.isPackage = true;
existingItem.packageId = method.packageId; existingItem.packageId = method.packageId;
existingItem.packageName = method.packageName || existingItem.packageName; // #428修复: 确保 packageName 同步 existingItem.packageName = method.packageName || existingItem.packageName; // #428修复: 确保 packageName 同步
existingItem.expanded = true; // #428修复: 有套餐时默认展开,展示套餐明细
// 预加载套餐明细 // 预加载套餐明细
await loadPackageDetailsForItem(existingItem); loadPackageDetailsForItem(existingItem);
} }
updateMethodDisplay(); updateMethodDisplay();
return; return;
@@ -1400,10 +1399,9 @@ async function handleMethodSelect(checked, method, cat) {
}; };
selectedItems.value.push(newItem); selectedItems.value.push(newItem);
// 如果是套餐,预加载套餐明细并默认展开 // 如果是套餐,预加载套餐明细
if (newItem.isPackage && newItem.packageId) { if (newItem.isPackage && newItem.packageId) {
newItem.expanded = true; loadPackageDetailsForItem(newItem);
await loadPackageDetailsForItem(newItem);
} }
// 自动回填执行科室 // 自动回填执行科室
@@ -1525,10 +1523,7 @@ async function handleItemSelect(checked, item, cat) {
// Bug #384修复 + #426修复: 展开/收起项目卡片 // Bug #384修复 + #426修复: 展开/收起项目卡片
async function toggleItemExpand(item) { async function toggleItemExpand(item) {
item.expanded = !item.expanded; item.expanded = !item.expanded;
const carrier = getPackageCarrier(item); if (item.expanded && (item.isPackage || item.packageName) && (!item.packageDetails || item.packageDetails.length === 0) && !item.packageDetailsLoading) {
const hasDetails = Array.isArray(item.packageDetailsDisplay) && item.packageDetailsDisplay.length > 0
|| Array.isArray(carrier?.packageDetails) && carrier.packageDetails.length > 0;
if (item.expanded && (item.isPackage || item.packageName) && !hasDetails && !item.packageDetailsLoading) {
await loadPackageDetailsForItem(item); await loadPackageDetailsForItem(item);
} }
if (item.expanded && shouldShowPackageBody(item)) { if (item.expanded && shouldShowPackageBody(item)) {