fix(#697): 请修复 Bug #697

由 AI Agent (guanyu) 自动修复,请查看 diff 确认变更内容。
This commit is contained in:
2026-06-11 00:40:16 +08:00
parent d64e1c753a
commit f54a7ff825
3 changed files with 59 additions and 39 deletions

View File

@@ -451,10 +451,12 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(CommonConstants.TableName.MED_MEDICATION_REQUEST,
adviceSaveDto.getRequestId());
// 删除代煎费
iChargeItemService.remove(new LambdaQueryWrapper<ChargeItem>()
.eq(ChargeItem::getPrescriptionNo, adviceSaveDto.getPrescriptionNo())
.eq(ChargeItem::getProductId, sufferingDefinitionId));
// 删除代煎费(按处方号精确清理)
if (adviceSaveDto.getPrescriptionNo() != null) {
iChargeItemService.remove(new LambdaQueryWrapper<ChargeItem>()
.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<MedicationRequest> list = iMedicationRequestService
.list(new LambdaQueryWrapper<MedicationRequest>()
.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<String> 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<ChargeItem>()
.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<ChargeItem>()
.eq(ChargeItem::getPrescriptionNo, prescriptionNo).eq(ChargeItem::getProductId, sufferingDefinitionId));
.eq(ChargeItem::getEncounterId, encounterId)
.eq(ChargeItem::getProductId, sufferingDefinitionId));
}
// 签发时,把草稿状态的账单更新为待收费[中医]

View File

@@ -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;

View File

@@ -1,4 +1,4 @@
<template>
<template>
<div
v-loading="readCardLoading"
class="app-container"
@@ -122,6 +122,7 @@
<patientList
:searchkey="patientSearchKey"
@selsect-patient="selsectPatient"
@mousedown.prevent
/>
<template #reference>
<el-input
@@ -2215,7 +2216,7 @@ async function confirmCheckIn() {
* 点击患者列表给表单赋值
*/
function selsectPatient(row) {
form.value = { ...form.value, ...row };
Object.assign(form.value, row);
form.value.patientId = row.id;
form.value.searchKey = row.name;
form.value.name = row.name;