现有报表分析模块仅提供「患者费用明细统计」这一单视角纵向分析能力(02010209/02010210),只能回答「某一批/某一个患者的钱花在哪些项目上」,无法回答「几例就诊之间的费用到底差在哪」:
BS_HISDiseInfo / BS_HISOprnInfo / BS_DRGGroupRecord),无法与费用差异联动呈现;src.DRG.Profit(020102xx),后续新增报表无处安放,需在 DRG 路径下新建与 Profit 同级的 src.DRG.Report 作为报表服务骨架。因此新增「病组费用比对」报表:先按条件检索出已完成首页分组的就诊,勾选多条(N≤5)并列比对,对费用信息做差异高亮,并输出文字比对分析报告。
src/src/DRG/Report.cls(与 src.DRG.Profit 同级)src.DRG.Profit 的通用方法风格(SetErrorResult / %GetPage / %Paginate / %HandleError),本类内自建 %BuildVisitWhere(检索条件)、%BuildDiffMatrix(差异矩阵)、%BuildReportText(报告拼装)。| Code | 方法 | 说明 |
|---|---|---|
| 02010601 | QueryComparableVisits |
检索已完成首页分组的就诊列表(分页),供勾选加入比对 |
| 02010602 | CompareDRGFee |
传入 2~5 个 admID,返回三维度费用比对矩阵 + 诊断/手术/支付标准比对 + 差异标记 + 中文分析报告 |
HIS/MedicalRecords.tsx、DRG/Workbench.tsx 的「普通区 + 高级搜索折叠区」既有交互):
BS_DRGMedInsuMedicalRecord(MR)存在记录(病案首页已入库,ImageURL<>'')且 BS_DRGGroupRecord(GR)存在有效分组记录(ActiveFlag='1' AND DRG<>'')。BS_DRGMedInsuMedicalRecord 的 27 项费用列 + MedfeeSumamt,行固定、逐列比对;BS_HISFeeDetail 按 MedinsListCodg 对齐(全外连接语义,单边存在的项目标记「仅某例有」);BS_HISFeeDetail.EcCode/EcDesc 聚合金额后比对。BS_DRGGroupRecord 的 DRG / DRGDesc / BenchmarkCost / Weight)。diffFlag(same / diff / onlyIn / missing)与 diffAmount / diffRate,前端仅按标记着色,不做业务判断。reportText: string[] 段落数组返回(结论摘要 / 费用总览 / 结构差异 Top N / 诊断手术差异 / 支付标准与盈亏 / 风险提示),前端直接渲染并提供「复制文本」。frontend/src/pages/Report/DRGFeeComparison.tsxrowSelection,最多 5 条)+ 已选比对篮(可移除);Tabs 三维度比对表(差异单元格高亮)+ 诊断/手术/支付标准信息卡 + 分析报告卡片;RangePicker(zhCN + dayjs.locale('zh-cn'))、CustomPagination、Table.Summary 合计行(金额列红色加粗 + 蓝色「合计」)、「导出Excel」(纯前端 CSV + BOM,showSaveFilePicker 回落 a.download,导出当前比对结果全量)。BS_HISDiseInfo / BS_HISOprnInfo / GR);src.DRG.Profit 及 020102xx 任何现有接口(行为完全不变);xlsx / exceljs / file-saver 等第三方导出库;drg-fee-comparison-visit-query:可比就诊检索能力 —— 按普通区/高级区条件检索「已完成首页分组」的就诊列表,输出列表与分页,供勾选加入比对。drg-fee-comparison-engine:病组费用比对引擎 —— 对 2~5 例就诊并行比对结算清单汇总列、HIS 明细项目、结算类别聚合三个维度的费用,附诊断/手术/DRG 支付标准比对与差异标记,并生成中文文字分析报告。(无。本次为纯新增能力,不修改任何现有 capability 的需求;openspec/specs/ 下现有 adrg-segmentation-rules-crud、drg-algorithm-multiplier-weight、his-data-sync-consolidation 均不受影响。)
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 章:病组费用比对) |
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 角色。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 切换时才渲染对应表格 |