fix: Bug #407 #385 检查申请医嘱分类错误及预结算账户验证修复

主要修复:
  - 检查申请医嘱类型正确设置为诊疗(3),避免被错误归类为药品
  - 检查申请收费项获取真实自费账户,预结算验证accountId必须有效存在
  - 签发时补充诊疗费用项诊断关联信息变更模块:
  - ExamApplyController:使用ItemType枚举,获取真实账户替代占位值0
-DoctorStationAdviceAppService:按枚举标准分类医嘱,验证accountId有效性
  - IChargeBillService:productId=0时从ServiceRequest.contentJson获取项目名称
  - PaymentRecService:预结算自动修复账户不存在的历史数据
  - Mapper:排除衍生执行记录,productId=0时补充查询逻辑
  - ServiceRequest实体:activityId字段添加ALWAYS插入策略
This commit is contained in:
wangjian963
2026-04-23 17:17:04 +08:00
parent 2a8e662b44
commit 95e379e5a5
7 changed files with 293 additions and 47 deletions

View File

@@ -5,9 +5,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.core.common.core.controller.BaseController;
import com.core.common.core.domain.AjaxResult;
import com.core.common.core.page.TableDataInfo;
import com.core.common.exception.ServiceException;
import com.core.common.utils.AssignSeqUtil;
import com.core.common.utils.SecurityUtils;
import com.openhis.administration.domain.Account;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.administration.service.IAccountService;
import com.openhis.administration.service.IChargeItemService;
import com.openhis.check.domain.ExamApply;
import com.openhis.check.domain.ExamApplyItem;
@@ -17,8 +20,8 @@ import com.openhis.common.constant.CommonConstants;
import com.openhis.common.enums.AssignSeqEnum;
import com.openhis.common.enums.ChargeItemStatus;
import com.openhis.common.enums.GenerateSource;
import com.openhis.common.enums.ItemType;
import com.openhis.common.enums.RequestStatus;
import com.openhis.common.enums.EncounterClass;
import com.openhis.web.check.dto.ExamApplyDto;
import com.openhis.web.check.dto.ExamApplyItemDto;
import com.openhis.workflow.domain.ServiceRequest;
@@ -58,6 +61,9 @@ public class ExamApplyController extends BaseController {
@Autowired
private IChargeItemService chargeItemService;
@Autowired
private IAccountService accountService;
@Autowired
private AssignSeqUtil assignSeqUtil;
@@ -213,8 +219,9 @@ public class ExamApplyController extends BaseController {
// 检查申请不走诊疗定义设置为0占位数据库有NOT NULL约束
serviceRequest.setActivityId(0L);
// 🔧 Bug #407修复设置医嘱类型为诊疗(3)避免被错误识别为中成药
serviceRequest.setCategoryEnum(3);
// 🔧 Bug Fix: 设置医嘱类型为诊疗(3)与检验申请保持一致
// categoryEnum=3 → SQL查询返回 adviceType=3诊疗避免被错误归类为药品
serviceRequest.setCategoryEnum(ItemType.ACTIVITY.getValue());
// 患者和就诊信息 —— 使用前端传递的数字型ID
if (dto.getPatientIdNum() != null) {
@@ -227,7 +234,8 @@ public class ExamApplyController extends BaseController {
serviceRequest.setRequesterId(currentUserId); // 开单医生
serviceRequest.setOrgId(currentOrgId); // 执行科室
serviceRequest.setAuthoredTime(now); // 签发时间
serviceRequest.setCategoryEnum(EncounterClass.AMB.getValue()); // 请求类型:门诊
// 🔧 Bug Fix: 不设置门诊类型,保留上面已设置的 categoryEnum=3诊疗类型
// EncounterClass.AMB.getValue()=2 表示门诊类型,会覆盖诊疗类型导致医嘱被错误归类
serviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 来源=医生开立
// 将项目名称存入 contentJson使医嘱列表能通过 JSON 字段回显 adviceName
@@ -268,10 +276,17 @@ public class ExamApplyController extends BaseController {
chargeItem.setRequestingOrgId(currentOrgId); // 开立科室
chargeItem.setEnteredDate(now); // 开立时间
// 以下字段均有 NOT NULL 约束,检查申请不走定价/账户体系用0占位
// 以下字段均有 NOT NULL 约束检查申请不走定价体系用0占位
chargeItem.setDefinitionId(0L); // 费用定价ID
chargeItem.setAccountId(0L); // 关联账户ID
chargeItem.setContextEnum(2); // 类型2=诊疗
// 🔧 BugFix#385: 获取患者真实的自费账户预结算验证要求accountId必须真实存在
Account selfAccount = accountService.getSelfAccount(dto.getEncounterId());
if (selfAccount == null) {
throw new ServiceException("患者自费账户不存在无法创建检查收费项encounterId=" + dto.getEncounterId());
}
chargeItem.setAccountId(selfAccount.getId());
// 🔧 BugFix#385: 使用 ItemType.ACTIVITY.getValue()=3 表示诊疗而不是硬编码的2
// ItemType 枚举定义MEDICINE=1, DEVICE=2(耗材), ACTIVITY=3(诊疗)
chargeItem.setContextEnum(ItemType.ACTIVITY.getValue()); // 类型3=诊疗
chargeItem.setProductTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION); // 产品来源表
chargeItem.setProductId(0L); // 产品ID
@@ -393,8 +408,9 @@ public class ExamApplyController extends BaseController {
serviceRequest.setBasedOnTable("exam_apply");
serviceRequest.setBasedOnId(examApply.getId());
serviceRequest.setActivityId(0L);
// 🔧 Bug #407修复设置医嘱类型为诊疗(3)避免被错误识别为中成药
serviceRequest.setCategoryEnum(3);
// 🔧 Bug Fix: 设置医嘱类型为诊疗(3)与检验申请保持一致
// categoryEnum=3 → SQL查询返回 adviceType=3诊疗避免被错误归类为药品
serviceRequest.setCategoryEnum(ItemType.ACTIVITY.getValue());
if (dto.getPatientIdNum() != null) {
serviceRequest.setPatientId(dto.getPatientIdNum());
@@ -405,7 +421,8 @@ public class ExamApplyController extends BaseController {
serviceRequest.setRequesterId(currentUserId);
serviceRequest.setOrgId(currentOrgId);
serviceRequest.setAuthoredTime(now);
serviceRequest.setCategoryEnum(EncounterClass.AMB.getValue()); // 请求类型:门诊
// 🔧 Bug Fix: 不设置门诊类型,保留上面已设置的 categoryEnum=3诊疗类型
// EncounterClass.AMB.getValue()=2 表示门诊类型,会覆盖诊疗类型导致医嘱被错误归类
serviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue());
// 将项目名称存入 contentJson使医嘱列表能通过 JSON 字段回显 adviceName
@@ -440,8 +457,14 @@ public class ExamApplyController extends BaseController {
chargeItem.setRequestingOrgId(currentOrgId);
chargeItem.setEnteredDate(now);
chargeItem.setDefinitionId(0L);
chargeItem.setAccountId(0L);
chargeItem.setContextEnum(2);
// 🔧 BugFix#385: 获取患者真实的自费账户预结算验证要求accountId必须真实存在
Account selfAccount = accountService.getSelfAccount(dto.getEncounterId());
if (selfAccount == null) {
throw new ServiceException("患者自费账户不存在无法创建检查收费项encounterId=" + dto.getEncounterId());
}
chargeItem.setAccountId(selfAccount.getId());
// 🔧 BugFix#385: 使用 ItemType.ACTIVITY.getValue()=3 表示诊疗
chargeItem.setContextEnum(ItemType.ACTIVITY.getValue());
chargeItem.setProductTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION);
chargeItem.setProductId(0L);