proposal.md 11 KB

Why

现有报表分析模块仅提供「患者费用明细统计」这一单视角纵向分析能力(02010209/02010210),只能回答「某一批/某一个患者的钱花在哪些项目上」,无法回答「几例就诊之间的费用到底差在哪」:

  • DRG 控费的核心诉求是横向可比:同一 DRG 病组下,为何 A 病例 3.2 万、B 病例 4.8 万?差异集中在药品、耗材还是检查?主诊断/主手术不一致是否构成合理差异?以及不同 DRG 病组之间支付标准与实际费用的结构性差异;
  • 现有能力下,运营/医保办只能逐例查询后导出到 Excel 手工比对,且诊断信息、手术信息、DRG 支付标准信息分散在多张表(BS_HISDiseInfo / BS_HISOprnInfo / BS_DRGGroupRecord),无法与费用差异联动呈现;
  • 系统内尚无「报表」这一后端服务层:盈亏相关接口全部堆在 src.DRG.Profit(020102xx),后续新增报表无处安放,需在 DRG 路径下新建与 Profit 同级的 src.DRG.Report 作为报表服务骨架。

因此新增「病组费用比对」报表:先按条件检索出已完成首页分组的就诊,勾选多条(N≤5)并列比对,对费用信息做差异高亮,并输出文字比对分析报告。

What Changes

1. 新建后端报表服务类 src/src/DRG/Report.cls(与 src.DRG.Profit 同级)

  • 归属新号段 020106xx(020100 分组 / 020101 预警 / 020102 盈亏 / 020103 质控 / 020104 系统 / 020105 特例单议,020106 未被占用);
  • 该类作为后续所有报表的承载类,本次仅落地病组费用比对相关方法,其余报表后续追加;
  • 沿用 src.DRG.Profit 的通用方法风格(SetErrorResult / %GetPage / %Paginate / %HandleError),本类内自建 %BuildVisitWhere(检索条件)、%BuildDiffMatrix(差异矩阵)、%BuildReportText(报告拼装)。

2. 新增 2 个接口

Code 方法 说明
02010601 QueryComparableVisits 检索已完成首页分组的就诊列表(分页),供勾选加入比对
02010602 CompareDRGFee 传入 2~5 个 admID,返回三维度费用比对矩阵 + 诊断/手术/支付标准比对 + 差异标记 + 中文分析报告
  • 检索条件分两区(沿用 HIS/MedicalRecords.tsx、DRG/Workbench.tsx 的「普通区 + 高级搜索折叠区」既有交互):
    • 普通区:医疗机构、日期类型(入院日期 / 出院日期)、开始日期、结束日期、DRG 编码;
    • 高级区(默认折叠):患者姓名、病案号、就诊号、医保登记流水号、医保个人编号、险种类型、主诊断编码、主诊断名称、主手术编码、主手术名称。
  • 「已完成首页分组」口径:BS_DRGMedInsuMedicalRecord(MR)存在记录(病案首页已入库,ImageURL<>'')且 BS_DRGGroupRecord(GR)存在有效分组记录(ActiveFlag='1' AND DRG<>'')。
  • 比对粒度三个 Tab(后端一次性算完,前端分 Tab 渲染):
    • Tab1 结算清单费用汇总列比对:BS_DRGMedInsuMedicalRecord 的 27 项费用列 + MedfeeSumamt,行固定、逐列比对;
    • Tab2 HIS 费用明细按项目比对:BS_HISFeeDetail 按 MedinsListCodg 对齐(全外连接语义,单边存在的项目标记「仅某例有」);
    • Tab3 结算类别聚合比对:按 BS_HISFeeDetail.EcCode/EcDesc 聚合金额后比对。
  • 比对对象:多选并列(无固定基准,最多 5 条);差异基准可切换「与首条对比」/「与平均值对比」。
  • 非费用比对内容:诊断信息(全部诊断,主诊断优先)、手术信息(全部手术,主手术优先)、DRG 支付标准信息(BS_DRGGroupRecord 的 DRG / DRGDesc / BenchmarkCost / Weight)。
  • 差异高亮:后端为每个单元格输出 diffFlag(same / diff / onlyIn / missing)与 diffAmount / diffRate,前端仅按标记着色,不做业务判断。
  • 文字分析报告:后端 ObjectScript 拼装,以 reportText: string[] 段落数组返回(结论摘要 / 费用总览 / 结构差异 Top N / 诊断手术差异 / 支付标准与盈亏 / 风险提示),前端直接渲染并提供「复制文本」。

3. 前端新增报表页面 frontend/src/pages/Report/DRGFeeComparison.tsx

  • 工具栏:普通区筛选 + 「高级搜索」折叠区 + 查询/重置 + 「加入比对」;
  • 主区:待比对就诊列表(多选 rowSelection,最多 5 条)+ 已选比对篮(可移除);
  • 比对区:Tabs 三维度比对表(差异单元格高亮)+ 诊断/手术/支付标准信息卡 + 分析报告卡片;
  • 沿用项目既有规范:中文 RangePicker(zhCN + dayjs.locale('zh-cn'))、CustomPagination、Table.Summary 合计行(金额列红色加粗 + 蓝色「合计」)、「导出Excel」(纯前端 CSV + BOM,showSaveFilePicker 回落 a.download,导出当前比对结果全量)。

明确不包含

  • 不新增/修改任何数据库表(纯读取 MR / PA / FD / BS_HISDiseInfo / BS_HISOprnInfo / GR);
  • 不修改 src.DRG.Profit 及 020102xx 任何现有接口(行为完全不变);
  • 不引入 xlsx / exceljs / file-saver 等第三方导出库;
  • 不做对比结果的持久化存储(无「保存比对方案」);
  • 不涉及 DIP 付费口径(本报表仅 DRG)。

Capabilities

New Capabilities

  • drg-fee-comparison-visit-query:可比就诊检索能力 —— 按普通区/高级区条件检索「已完成首页分组」的就诊列表,输出列表与分页,供勾选加入比对。
  • drg-fee-comparison-engine:病组费用比对引擎 —— 对 2~5 例就诊并行比对结算清单汇总列、HIS 明细项目、结算类别聚合三个维度的费用,附诊断/手术/DRG 支付标准比对与差异标记,并生成中文文字分析报告。

Modified Capabilities

(无。本次为纯新增能力,不修改任何现有 capability 的需求;openspec/specs/ 下现有 adrg-segmentation-rules-crud、drg-algorithm-multiplier-weight、his-data-sync-consolidation 均不受影响。)

Impact

受影响的规格

  • 新增 drg-fee-comparison-visit-query、drg-fee-comparison-engine 两个 capability;
  • 现有盈亏分析相关能力不受影响。

受影响的代码

类型 文件 说明
新增 src/src/DRG/Report.cls 报表服务类骨架 + QueryComparableVisits(02010601) + CompareDRGFee(02010602) + 私有辅助 %BuildVisitWhere / %BuildDiffMatrix / %BuildReportText
新增 frontend/src/api/report.ts 报表模块 API 封装(类型定义 + queryComparableVisits / compareDRGFee)
新增 frontend/src/pages/Report/DRGFeeComparison.tsx 病组费用比对页面(普通区/高级区筛选 + 待比对列表 + 比对篮 + 三 Tab 比对 + 分析报告 + 导出Excel)
修改 frontend/src/routes/menuRoutes.ts keyToPath 加 'report-fee-comparison': '/report/fee-comparison';menuTitleMap 加标题
修改 frontend/src/routes/menuRouteRegistry.tsx import DRGFeeComparison 并注册 'report-fee-comparison'
修改 frontend/src/context/MenuContext.tsx 「报表分析」分组下追加静态兜底菜单项
新增 db/register_interface_02010601.sql、db/register_interface_02010602.sql CB_MapInterface 路由注册(幂等 INSERT + 校验 SELECT)
新增 db/insert_fee_comparison_menu.sql CB_MenuDetail 菜单初始化 + Admin 角色授权 + 回滚语句
新增 接口服务说明/09-报表服务.md 02010601 / 02010602 接口文档
修改 接口服务说明/00-接口总览.md 接口清单追加「2.8 报表服务 (src.DRG.Report)」
新增 系统设计/09-报表模块设计.md 报表模块设计文档(第 1 章:病组费用比对)

数据库

  • 无 DDL 变更,仅读取现有表:
    • BS_DRGMedInsuMedicalRecord (MR):27 项费用汇总列、MedfeeSumamt、DRG/DRGDesc、MdtrtId、PsnNo、InsuType、AdmDate/DscgDate、PsnName、MedcasNo、HISAdmID、FixmedinsCode、ImageURL;
    • BS_HISPatAdm (PA):AdmID、PatName、PatMedicalNo、InLocCode/InLocDesc、AdmDocCode/AdmDocDesc、AdmDateTime/DisDateTime;
    • BS_HISFeeDetail (FD):MedinsListCodg/MedinsListDesc、EcCode/EcDesc、Pric、Cnt、DetItemFeeSumamt、FeeOcurTime、Deleted、ValidFlag;
    • BS_HISDiseInfo:DiagCode/DiagName/MainFlag/DiagSn;
    • BS_HISOprnInfo:OprnCode/OprnName/MainFlag/OprnSn;
    • BS_DRGGroupRecord (GR):DRG/DRGDesc/BenchmarkCost/Weight/GroupStage/ActiveFlag。
  • 需在 CB_MapInterface 新增 2 条路由记录:Code 为 02010601 / 02010602,ClassName='src.DRG.Report'、ServiceType='S'、SessionFlag='Y'、TokenFlag='N';
  • 需在 CB_MenuDetail 新增 1 条菜单记录(Code='report-fee-comparison',父级「报表分析」,LinkAddress='/report/fee-comparison')并授权 Admin 角色。

兼容性

  • 向后兼容:新增号段 020106xx,不与 020100xx~020105xx 冲突;不修改任何现有接口入参/出参;
  • 前端未接入前,两个新接口不影响任何现有页面;
  • src.DRG.Report 为全新类,与 src.DRG.Profit 无继承/依赖关系,编译互不影响。

风险

风险 影响 缓解措施
BS_HISFeeDetail 单次就诊可达数千条,5 例并行比对数据量大 接口超时 Tab2 按项目编码聚合后再比对(同编码合并数量/金额),并限制单次最多 5 例;明细行超过阈值时按金额 Top N 截断并提示
本环境 IRIS 不支持 WITH(CTE)、ORDER BY 聚合表达式与列序号(02010209 实测结论) SQL 准备失败 Tab3 聚合排序在 ObjectScript 侧用下标数组($ORDER(...,-1))完成,SQL 不带 ORDER BY;禁止使用 CTE 与派生表 JOIN
不同 DRG 病组的费用结构天然不可比 报告结论误导 报告首段明确标注各例 DRG 编码/名称;DRG 不一致时插入「跨病组比对」提示段,仅作结构参考
多例间同一收费项目编码缺失(某例未做该项目) 差异矩阵出现空洞 以各例项目编码并集为行,diffFlag='missing' 表示该例无此项目,金额按 0 参与差异计算
Deleted=1 / ValidFlag='N' 的作废明细混入 比对金额偏大 Tab2/Tab3 统一过滤 FD.Deleted=0 AND (FD.ValidFlag IS NULL OR FD.ValidFlag<>'N')
前端一次性渲染 5 列 × 数百行差异矩阵 页面卡顿 表格 size="small" + scroll.x 横向滚动 + virtual 关(行数可控);Tab 切换时才渲染对应表格