From 704a1105cf5ce28c61759e2129cfa36a8a37bd63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= Date: Wed, 10 Jun 2026 17:40:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(#668):=20=E3=80=90=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=8F=8D=E9=A6=88=E3=80=91Bug=20#668=20?= =?UTF-8?q?=E4=B8=8A=E6=AC=A1=E4=BF=AE=E5=A4=8D=E6=9C=AA=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=85=A8=E9=93=BE=E8=B7=AF=E9=AA=8C=E8=AF=81=EF=BC=8C=E8=AF=B7?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BB=A5=E4=B8=8B=E5=A4=B1=E8=B4=A5=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E9=87=8D=E6=96=B0=E4=BF=AE=E5=A4=8D=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 失败原因: - 编译验证(mvn compile) ❌: [ERROR] [ERROR] Could not find the selected project in the reactor: openhis-application @ 总耗时: 1501ms 请针对上述失败项重新修复,确保: 1. 编译通过(vite build / mvn compile) 2. 单元测试通过(vitest / mvn test) 3. Playwright 回归测试通过 4. 数据库表可访问 5. 后端服务可达 由 AI Agent (guanyu) 自动修复,请查看 diff 确认变更内容。 --- ...orStationChineseMedicalAppServiceImpl.java | 81 +++++++++++-------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/doctorstation/appservice/impl/DoctorStationChineseMedicalAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/doctorstation/appservice/impl/DoctorStationChineseMedicalAppServiceImpl.java index c41c6a5d9..30e69da75 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/doctorstation/appservice/impl/DoctorStationChineseMedicalAppServiceImpl.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/doctorstation/appservice/impl/DoctorStationChineseMedicalAppServiceImpl.java @@ -614,8 +614,12 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation Long encounterDiagnosisId = medicineList.get(0).getEncounterDiagnosisId(); // 中药付数 BigDecimal chineseHerbsDoseQuantity = medicineList.get(0).getChineseHerbsDoseQuantity(); - // 处方号 - String prescriptionNo = insertOrUpdateList.get(0).getPrescriptionNo(); + // 🔧 Bug Fix #668: 收集所有处方号(不同分组可能有不同处方号) + List prescriptionNos = insertOrUpdateList.stream() + .map(AdviceSaveDto::getPrescriptionNo) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); // 签发时,生成中药代煎的账单 if (Whether.YES.getValue().equals(sufferingFlag) && is_sign) { @@ -624,9 +628,12 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation AdviceBaseDto adviceBaseDto = new AdviceBaseDto(); adviceBaseDto.setAdviceDefinitionId(sufferingDefinitionId); // 医嘱定义id - // 先删除中药代煎的账单 - iChargeItemService.remove(new LambdaQueryWrapper() - .eq(ChargeItem::getPrescriptionNo, prescriptionNo).eq(ChargeItem::getProductId, sufferingDefinitionId)); + // 🔧 Bug Fix #668: 先删除所有处方号关联的中药代煎账单 + if (!prescriptionNos.isEmpty()) { + iChargeItemService.remove(new LambdaQueryWrapper() + .in(ChargeItem::getPrescriptionNo, prescriptionNos) + .eq(ChargeItem::getProductId, sufferingDefinitionId)); + } // 对应的诊疗医嘱信息 AdviceBaseDto activityAdviceBaseDto = iDoctorStationAdviceAppService.getAdviceBaseInfo(adviceBaseDto, null, @@ -635,40 +642,44 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation // 费用定价 AdvicePriceDto advicePriceDto = activityAdviceBaseDto.getPriceList().get(0); if (advicePriceDto != null) { - // 生成账单 - chargeItem = new ChargeItem(); - chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 - chargeItem.setPrescriptionNo(prescriptionNo); // 处方号 - chargeItem.setStatusEnum(ChargeItemStatus.PLANNED.getValue()); // 收费状态 - chargeItem.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix(), 4)); - chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 - chargeItem.setPatientId(patientId); // 患者 - chargeItem.setContextEnum(ChargeItemContext.ACTIVITY.getValue()); // 类型 - chargeItem.setEncounterId(encounterId); // 就诊id - chargeItem.setDefinitionId(advicePriceDto.getDefinitionId()); // 费用定价ID - chargeItem.setEntererId(SecurityUtils.getLoginUser().getPractitionerId());// 开立人ID - chargeItem.setRequestingOrgId(orgId); // 开立科室 - chargeItem.setEnteredDate(curDate); // 开立时间 - chargeItem.setProductTable(activityAdviceBaseDto.getAdviceTableName());// 产品所在表 - chargeItem.setProductId(activityAdviceBaseDto.getAdviceDefinitionId());// 收费项id - chargeItem.setAccountId(accountId);// 关联账户ID - chargeItem.setConditionId(conditionId); // 诊断id - chargeItem.setEncounterDiagnosisId(encounterDiagnosisId); // 就诊诊断id + // 🔧 Bug Fix #668: 为每个处方号分别生成代煎账单 + for (String prescriptionNo : prescriptionNos) { + chargeItem = new ChargeItem(); + chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 + chargeItem.setPrescriptionNo(prescriptionNo); // 处方号 + chargeItem.setStatusEnum(ChargeItemStatus.PLANNED.getValue()); // 收费状态 + chargeItem.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix(), 4)); + chargeItem.setPatientId(patientId); // 患者 + chargeItem.setContextEnum(ChargeItemContext.ACTIVITY.getValue()); // 类型 + chargeItem.setEncounterId(encounterId); // 就诊id + chargeItem.setDefinitionId(advicePriceDto.getDefinitionId()); // 费用定价ID + chargeItem.setEntererId(SecurityUtils.getLoginUser().getPractitionerId());// 开立人ID + chargeItem.setRequestingOrgId(orgId); // 开立科室 + chargeItem.setEnteredDate(curDate); // 开立时间 + chargeItem.setProductTable(activityAdviceBaseDto.getAdviceTableName());// 产品所在表 + chargeItem.setProductId(activityAdviceBaseDto.getAdviceDefinitionId());// 收费项id + chargeItem.setAccountId(accountId);// 关联账户ID + chargeItem.setConditionId(conditionId); // 诊断id + chargeItem.setEncounterDiagnosisId(encounterDiagnosisId); // 就诊诊断id - chargeItem.setQuantityValue(quantity); // 数量 - chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位 - chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价 - // 计算总价,保留6位小数 - BigDecimal qty = quantity; - chargeItem.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(6, RoundingMode.HALF_UP)); // 总价 - chargeItem.setTcmFlag(Whether.YES.getValue());// 中医标识 - iChargeItemService.save(chargeItem); + chargeItem.setQuantityValue(quantity); // 数量 + chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位 + chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价 + // 计算总价,保留6位小数 + BigDecimal qty = quantity; + chargeItem.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(6, RoundingMode.HALF_UP)); // 总价 + chargeItem.setTcmFlag(Whether.YES.getValue());// 中医标识 + iChargeItemService.save(chargeItem); + } } } } else if (Whether.NO.getValue().equals(sufferingFlag)) { - // 删除中药代煎的账单 - iChargeItemService.remove(new LambdaQueryWrapper() - .eq(ChargeItem::getPrescriptionNo, prescriptionNo).eq(ChargeItem::getProductId, sufferingDefinitionId)); + // 🔧 Bug Fix #668: 删除所有处方号关联的中药代煎账单 + if (!prescriptionNos.isEmpty()) { + iChargeItemService.remove(new LambdaQueryWrapper() + .in(ChargeItem::getPrescriptionNo, prescriptionNos) + .eq(ChargeItem::getProductId, sufferingDefinitionId)); + } } // 签发时,把草稿状态的账单更新为待收费[中医]