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 3ea899b35..7c20435e5 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 @@ -451,10 +451,12 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation // 删除费用项 iChargeItemService.deleteByServiceTableAndId(CommonConstants.TableName.MED_MEDICATION_REQUEST, adviceSaveDto.getRequestId()); - // 删除代煎费 - iChargeItemService.remove(new LambdaQueryWrapper() - .eq(ChargeItem::getPrescriptionNo, adviceSaveDto.getPrescriptionNo()) - .eq(ChargeItem::getProductId, sufferingDefinitionId)); + // 删除代煎费(按处方号精确清理) + if (adviceSaveDto.getPrescriptionNo() != null) { + iChargeItemService.remove(new LambdaQueryWrapper() + .eq(ChargeItem::getPrescriptionNo, adviceSaveDto.getPrescriptionNo()) + .eq(ChargeItem::getProductId, sufferingDefinitionId)); + } } @@ -464,6 +466,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation .filter(e -> e.getGroupId() != null) .collect(Collectors.groupingBy(AdviceSaveDto::getGroupId)) .forEach((groupId, groupList) -> { + // 先查询当前groupId是否已经被签发生成过处方号 List list = iMedicationRequestService .list(new LambdaQueryWrapper() .eq(MedicationRequest::getGroupId, groupId)); @@ -613,8 +616,12 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation Long encounterDiagnosisId = medicineList.get(0).getEncounterDiagnosisId(); // 中药付数 BigDecimal chineseHerbsDoseQuantity = medicineList.get(0).getChineseHerbsDoseQuantity(); - // 处方号 - String prescriptionNo = insertOrUpdateList.get(0).getPrescriptionNo(); + // 收集所有处方号(不同分组可能有不同处方号) + List prescriptionNos = insertOrUpdateList.stream() + .map(AdviceSaveDto::getPrescriptionNo) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); // 签发时,生成中药代煎的账单 if (Whether.YES.getValue().equals(sufferingFlag) && is_sign) { @@ -623,9 +630,10 @@ 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)); + .eq(ChargeItem::getEncounterId, encounterId) + .eq(ChargeItem::getProductId, sufferingDefinitionId)); // 对应的诊疗医嘱信息 AdviceBaseDto activityAdviceBaseDto = iDoctorStationAdviceAppService.getAdviceBaseInfo(adviceBaseDto, null, @@ -634,40 +642,42 @@ 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 + // 为每个处方号分别生成代煎账单 + 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)); + .eq(ChargeItem::getEncounterId, encounterId) + .eq(ChargeItem::getProductId, sufferingDefinitionId)); } // 签发时,把草稿状态的账单更新为待收费[中医] diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V41__bug735_add_stopper_id_to_requests.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V41__bug735_add_stopper_id_to_requests.sql new file mode 100644 index 000000000..da7e0dd0f --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V41__bug735_add_stopper_id_to_requests.sql @@ -0,0 +1,9 @@ +-- Bug #735: 新医嘱签发后"停嘱医生"字段错误生成数据 +-- 原因:stopper_name 映射到 update_by 字段,签发时 MyBatis-Plus 自动填充导致错误赋值 +-- 修复:添加专用 stopper_id 字段,仅在停嘱操作时设置 + +-- 药品请求表添加停嘱医生ID字段 +ALTER TABLE med_medication_request ADD COLUMN IF NOT EXISTS stopper_id BIGINT; + +-- 服务请求表添加停嘱医生ID字段 +ALTER TABLE wor_service_request ADD COLUMN IF NOT EXISTS stopper_id BIGINT; diff --git a/healthlink-his-ui/src/views/charge/outpatientregistration/index.vue b/healthlink-his-ui/src/views/charge/outpatientregistration/index.vue index 81e03385f..7064ff86f 100755 --- a/healthlink-his-ui/src/views/charge/outpatientregistration/index.vue +++ b/healthlink-his-ui/src/views/charge/outpatientregistration/index.vue @@ -1,4 +1,4 @@ -