diff --git a/md/bug-analysis/bug444-analysis.md b/md/bug-analysis/bug444-analysis.md new file mode 100644 index 000000000..36265ee6a --- /dev/null +++ b/md/bug-analysis/bug444-analysis.md @@ -0,0 +1,30 @@ +# Bug #444 分析报告 + +## Bug 描述 +生成临时医嘱界面,"已引用计费药品"列表未正常显示药品详细名称信息。具体表现为: +- 列表中出现了"小腿烧伤扩创交腿皮瓣修复术"(属于手术诊疗项目) +- 列表中出现了"心脏彩色多普勒超声"(属于检查/诊疗项目) +- 非药品类计费信息错误地混入"已引用计费药品"列表 + +## 根因定位 +**文件**: `openhis-ui-vue3/src/views/surgicalschedule/index.vue` +**行号**: 1580 (handleMedicalAdvice), 1864 (handleQuoteBilling), 1850 (handleTemporaryMedicalRefresh) + +三处过滤逻辑均使用: +```javascript +if (item.adviceType !== 1) return false; +``` + +**问题1(主因)**: `adviceType` 字段命名兼容不完整。代码在 `insuranceType`、`contentJson` 等字段上做了 camelCase + snake_case 双兼容(如 `item.insuranceType || item.insurance_type`),但 `adviceType` 只检查了 camelCase。若后端返回 snake_case 数据(`advice_type`),`item.adviceType` 为 `undefined`,`undefined !== 1` 为 `true`,导致所有非药品项目全部放行。 + +**问题2(次因)**: 即使 `adviceType` 正确返回,后端可能存在数据标注错误的情况(非药品项目被标为 adviceType=1),缺乏基于药品名称的二次验证。 + +## 修复方案 +1. `adviceType` 检查增加 snake_case 回退:`const at = item.adviceType ?? item.advice_type; if (at !== 1) return false;` +2. 增加药品名称关键字二次过滤:排除名称中包含"术"、"检查"、"超声"、"多普勒"等关键词的非药品项目 + +## 验收标准 +1. "已引用计费药品"列表中只显示药品类项目 +2. 不显示手术诊疗项目(如"小腿烧伤扩创交腿皮瓣修复术") +3. 不显示检查项目(如"心脏彩色多普勒超声") +4. 药品名称正常显示 diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/basedatamanage/appservice/impl/OrganizationLocationAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/basedatamanage/appservice/impl/OrganizationLocationAppServiceImpl.java index 3bf2ac301..b207decf1 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/basedatamanage/appservice/impl/OrganizationLocationAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/basedatamanage/appservice/impl/OrganizationLocationAppServiceImpl.java @@ -159,7 +159,7 @@ public class OrganizationLocationAppServiceImpl implements IOrganizationLocation String activityName = activityDef != null ? activityDef.getName() : ""; List organizationLocationList = - organizationLocationService.getOrgLocListByOrgIdAndActivityDefinitionId(orgLoc.getActivityDefinitionId()); + organizationLocationService.getOrgLocListByOrgIdAndActivityDefinitionId(orgLoc.getOrganizationId(), orgLoc.getActivityDefinitionId()); organizationLocationList = (orgLoc.getId() != null) ? organizationLocationList.stream().filter(item -> !orgLoc.getId().equals(item.getId())).toList() : organizationLocationList; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationLocationServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationLocationServiceImpl.java index c9e680fae..0212232e1 100755 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationLocationServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationLocationServiceImpl.java @@ -53,12 +53,14 @@ public class OrganizationLocationServiceImpl extends ServiceImpl getOrgLocListByOrgIdAndActivityDefinitionId(Long activityDefinitionId) { + public List getOrgLocListByOrgIdAndActivityDefinitionId(Long organizationId, Long activityDefinitionId) { return baseMapper.selectList(new LambdaQueryWrapper() + .eq(OrganizationLocation::getOrganizationId, organizationId) .eq(OrganizationLocation::getActivityDefinitionId, activityDefinitionId)); }