proposal.md 13 KB

Why

医院按 DRG 付费后,医院端分组结果与医保中心(地方医保局)最终下发的分组结果是否一致,直接决定结算收入与申诉依据。目前系统只能看到院内自分组结果(BS_DRGMedInsuMedicalRecord.DRG),无法回答「医保中心认定的 DRG 与我们分组的 DRG 是不是同一个」:

  • 各地医保中心下发的 DRG 分组结果表格格式不统一(列名、列序、有无结算号各不相同),系统侧没有统一入口,运营/医保办只能靠 Excel 手工 VLOOKUP 比对,效率低且易漏;
  • 系统内没有承接医保下发分组结果的数据表,无法留存、无法按批次复核、无法统计不一致率;
  • 现有「报表分析」模块(020106xx / src.DRG.Report)已承载病组费用比对、重复收费统计,但缺少分组结果一致性校验这一报表能力。

因此新增「医保DRG分组结果校验」菜单:先给一份标准数据模板(统一各地差异),导入医保下发的分组结果后,与病案首页信息表(BS_DRGMedInsuMedicalRecord)中的 DRG 分组结果逐条比对,判断 DRG 编码是否一致,输出一致/不一致/未匹配清单与一致率统计,支撑医保结算对账与特例单议申诉。

已确认的设计口径(用户确认):

  1. 比对基准仅看病案首页表 BS_DRGMedInsuMedicalRecord.DRG,不涉及 BS_DRGGroupRecord;
  2. 关联匹配:医保登记流水号优先(→ MR.MdtrtSn),未命中时用医保结算ID兜底(→ BS_DRGMedInsuSettleMentInfo.SetlId 反查 MdtrtId / HISAdmID),再未命中时用病案号兜底(MedcasNo + 入院日期定位病案),三者皆空或皆未命中记为「未匹配」;
  3. 关键值校验:医保登记流水号、医保结算ID、病案号 不能同时为空;
  4. 导入文件为 CSV 模板(UTF-8 BOM),与现有 ICD / DRG 目录 / DRG 核心算法导入完全一致(前端 Base64 上传、后端 ObjectScript 解析),不引入任何第三方解析库;
  5. 导入仅存原始医保数据,不落校验状态;查询时实时比对,列表刷新即最新;
  6. 医疗机构编码/医疗机构名称 严格必填,为空即异常行,不允许用当前登录机构补全;
  7. 不提供同义列名白名单,列名必须与标准模板完全一致(「结算流水号」「登记号」等一律视为缺列);
  8. 单次导入上限 20000 行;批次下拉不新增独立接口,由 02010609 附带返回 batchOptions;
  9. 查询日期支持日期类型切换:入院日期(缺省)/ 出院日期。

What Changes

1. 新增后端表类 User.BSDRGMedInsuGroupResult(SqlTableName = BS_DRGMedInsuGroupResult)

  • 按项目表类规范创建(Extends (%Persistent, %XML.Adaptor, src.util.DynamicObject.Adapter) + SqlRowIdName = ID + Parameter %JSONREFERENCE = "ID" + 完整 Storage 块,GLOBAL ^BSDRGMedInsuGroupResultD);
  • 保存地方医保中心下发的 DRG 分组结果原始数据,列与标准模板一一对应:
    • 导入必需列:DRG(必填)、DRGDesc(必填)、医疗机构编码(必填)、医疗机构名称(必填)、入院日期(必填)、出院日期(必填);
    • 关键值(不能同时为空):医保登记流水号、医保结算ID、病案号;
    • 其余列:患者姓名、医保个人编号、结算日期;
    • 导入管理列:BatchNo(导入批次号)、RowNum(源文件行号,便于报错定位)、ImportUser、ImportDate/ImportTime;
  • 不落校验结果字段(一致/不一致/未匹配在查询时实时计算)。

2. 新增 5 个接口(沿用报表服务类 src.DRG.Report,号段 02010606~02010610)

Code 方法 说明
02010606 DownloadDRGGroupResultTemplate 下载标准导入模板(CSV 内容 Base64 + 文件名,含表头与示例行)
02010607 PreviewDRGGroupResultImport 解析上传 CSV → 逐行校验(必填、日期格式、三个关键值不能同空、行内重复)→ 返回总数/有效数/无效数 + 预览行(含行号与错误原因)
02010608 ConfirmDRGGroupResultImport 校验通过后写入 BS_DRGMedInsuGroupResult,返回批次号与成功/失败数
02010609 QueryDRGGroupResultVerify 实时比对查询(分页):医保数据 LEFT 病案首页表,输出校验结果 + KPI 统计
02010610 DeleteDRGGroupResultBatch 按批次(或全部)删除导入数据,支持重导清理
  • 比对判定(02010609,后端实时算):
    • 匹配顺序(输出 matchBy 便于溯源):
    • MR.MdtrtSn = 医保登记流水号 → matchBy='mdtrtSn'
    • 未命中且结算ID非空 → BS_DRGMedInsuSettleMentInfo.SetlId 取 MdtrtId / HISAdmID → MR.MdtrtId / MR.HISAdmID → matchBy='setlId'
    • 仍未命中且病案号非空 → MedcasNo + 入院日期 定位病案(病案号可跨多次住院,必须与入院日期组合,避免串号)→ matchBy='medcasNo'
    • 皆空或皆未命中 → 未匹配(matchBy='')
    • 状态:一致(命中且 MR.DRG 与导入 DRG 相同,去空格 + 统一大写比较)/ 不一致(命中但 DRG 不同)/ 未匹配
    • 同一键命中多条病案时取 MR.ID 最大的一条(有效记录优先:ValiFlag IS NULL OR ValiFlag='1')
    • 输出系统侧 DRG / DRGDesc / MedcasNo / HISAdmID / PsnName 供人工核对
    • 同时返回 KPI:总记录数、一致数、不一致数、未匹配数、一致率(当前查询条件下的全量统计,非仅本页)

3. 前端新增页面 frontend/src/pages/DRG/DRGGroupResultVerify.tsx

  • 菜单 key report-drg-group-verify,路由 /report/drg-group-verify,菜单名「医保DRG分组结果校验」,挂在「报表分析」下;
  • 工具栏:医疗机构、导入批次、日期类型(入院日期/出院日期)+ 日期区间、校验结果(全部/一致/不一致/未匹配)、患者姓名、病案号、DRG 编码 → 查询 / 重置;
  • 操作按钮(与查询/重置同一行):查询 重置 导 入 导出Excel …(行尾右对齐)清空数据;第二行左侧展示比对口径说明;
  • KPI 卡:总记录 / 一致 / 不一致 / 未匹配 / 一致率;
  • 明细表:医保 DRG 与名称、患者姓名、病案号、医保个人编号、登记流水号、结算ID、医疗机构、入院/出院/结算日期 + 系统 DRG 与名称、系统病案号、就诊号、匹配方式、校验结果(一致绿 Tag / 不一致红 Tag / 未匹配灰 Tag,不一致行整行浅红底);
  • 沿用项目既有规范:中文 RangePicker(zhCN + dayjs.locale('zh-cn'))、CustomPagination、导出规范(文件名 sanitize、showSaveFilePicker 回落 a.download)。

明确不包含

  • 不做校验结果落库/历史留存(BS_DRGMedInsuGroupResult 不新增校验状态字段,每次查询实时比对);
  • 不与 BS_DRGGroupRecord(分组记录表)比对,也不展示其 DRG;
  • 不做不一致记录的申诉/处置流程(仅输出清单,不写预警记录);
  • 不做金额/支付标准/权重比对(本次只判 DRG 编码是否一致);
  • 不做列名同义别名兼容:列名必须与标准模板完全一致(「结算流水号」「登记号」等一律视为缺列);
  • 不做机构字段自动补全:医疗机构编码/医疗机构名称 为空即判为异常行,不回填当前登录机构;
  • 不引入 xlsx / exceljs / file-saver 等第三方库;
  • 不修改任何现有接口(02010601~02010605 行为不变)。

Capabilities

New Capabilities

  • drg-insurance-group-result-import:医保 DRG 分组结果导入能力 —— 提供标准 CSV 数据模板下载、上传文件的后端解析与逐行校验(必填/日期/三个关键值不能同空/行内重复)、预览确认后写入 BS_DRGMedInsuGroupResult,并按批次管理(批次号、清空重导)。
  • drg-insurance-group-result-verify:医保 DRG 分组结果一致性校验能力 —— 查询时将导入的医保分组结果与病案首页表 BS_DRGMedInsuMedicalRecord.DRG 按「登记流水号 → 结算ID → 病案号+入院日期」实时匹配并比对 DRG 编码,输出一致/不一致/未匹配状态、匹配方式、系统侧分组信息、分页清单与一致率统计,支持导出。

Modified Capabilities

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

Impact

受影响的规格

  • 新增 drg-insurance-group-result-import、drg-insurance-group-result-verify 两个 capability;
  • 现有报表分析(病组费用比对、重复收费统计)与盈亏分析能力不受影响。

受影响的代码

类型 文件 说明
新增 src/User/BSDRGMedInsuGroupResult.cls 医保 DRG 分组结果表类(含 MedcasNo 与完整 Storage 块)
修改 src/src/DRG/Report.cls 追加 5 个方法(02010606~02010610)+ 私有辅助(CSV 解析、日期归一、批量预取、病案号缓存、匹配比对、统计)
修改 frontend/src/api/report.ts 追加 5 个接口封装与类型定义(含 medcasNo、matchBy、dateType)
新增 frontend/src/pages/DRG/DRGGroupResultVerify.tsx 校验页面(导入弹窗 + KPI + 明细表 + 导出Excel)
修改 frontend/src/routes/menuRoutes.ts keyToPath / menuTitleMap 追加 report-drg-group-verify
修改 frontend/src/routes/menuRouteRegistry.tsx 注册 report-drg-group-verify → DRGGroupResultVerify
修改 frontend/src/context/MenuContext.tsx 「报表分析」分组追加静态兜底菜单项
新增 openspec/changes/report-drg-group-result-verify/db/register_interface_0201060X.sql ×5 CB_MapInterface 路由注册(幂等)
新增 openspec/changes/report-drg-group-result-verify/db/insert_drg_group_verify_menu.sql BS_DrgSystemMenu 菜单初始化 + 角色授权 + 校验 SELECT
修改 接口服务说明/09-报表服务.md 追加 02010606~02010610 接口文档
修改 接口服务说明/00-接口总览.md 报表服务接口清单追加
修改 系统设计/09-报表模块设计.md 追加「医保DRG分组结果校验」章节

数据库

  • 新增 1 张表:BS_DRGMedInsuGroupResult(医保 DRG 分组结果导入表),字段见「What Changes」第 1 节 + MedcasNo;
  • 读取现有表(只读,不改结构):
    • BS_DRGMedInsuMedicalRecord (MR):MdtrtSn / MdtrtId / HISAdmID / MedcasNo / DRG / DRGDesc / PsnName / AdmDate / DscgDate / ValiFlag / FixmedinsCode;
    • BS_DRGMedInsuSettleMentInfo:SetlId / MdtrtId / HISAdmID(结算ID 兜底匹配用);
  • CB_MapInterface 新增 5 条路由:Code 02010606~02010610,ClassName='src.DRG.Report',ServiceType:02010606/02010607/02010609 = S,02010608 = A,02010610 = D;
  • BS_DrgSystemMenu 新增 1 条菜单记录(MenuCode='report-drg-group-verify',父级 report,MenuPath='/report/drg-group-verify',Component='pages/DRG/DRGGroupResultVerify')并授权 Admin 角色。

兼容性

  • 新增号段 02010606~02010610,不与 020100xx~020105xx 及 02010601~02010605 冲突;
  • 新增表与新增页面均为纯新增,不修改任何现有接口入参/出参;
  • src.DRG.Report 已有方法不受影响(仅在类内追加方法,类末尾仍以 Parameter 收尾规避 IDE 重写问题)。

风险

风险 影响 缓解措施
各地医保表格列名/列序/编码与标准模板不一致 导入失败或错位 后端以表头列名映射(不依赖列序),缺列在预览阶段明确报错;提供「下载模板」强制统一口径;不做同义列名兜底
CSV 中文乱码(UTF-8 / GBK 混杂) 解析出乱码,匹配失败 模板固定 UTF-8 BOM;后端解码后剥离 BOM 并做编码兜底,预览阶段即暴露乱码行
三个关键值与院内不一致或缺失 大量「未匹配」 三级兜底(登记流水号 → 结算ID → 病案号+入院日期)+ 输出 matchBy;明确统计未匹配数,支持按「未匹配」筛选
同一病案号多次住院 病案号匹配串号 病案号必须与入院日期组合定位(`MedcasNo
同一流水号命中多条病案 结果不稳定 取 MR.ID 最大的有效记录,并回带 HISAdmID / MedcasNo 供核对
单次导入数据量极大 接口超时 预览只返回前 200 行;入库上限 20000 行;批量预取 IN 列表每批 500
重复导入同一批数据 统计虚高 批次号隔离 + 按批次清空 + 文件内重复行标记跳过
后端 ObjectScript 无 Excel 解析库 无法读取 .xlsx 明确只用 CSV;前端 beforeUpload 限制扩展名并提示「请另存为 CSV 后上传」