医院按 DRG 付费后,医院端分组结果与医保中心(地方医保局)最终下发的分组结果是否一致,直接决定结算收入与申诉依据。目前系统只能看到院内自分组结果(BS_DRGMedInsuMedicalRecord.DRG),无法回答「医保中心认定的 DRG 与我们分组的 DRG 是不是同一个」:
src.DRG.Report)已承载病组费用比对、重复收费统计,但缺少分组结果一致性校验这一报表能力。因此新增「医保DRG分组结果校验」菜单:先给一份标准数据模板(统一各地差异),导入医保下发的分组结果后,与病案首页信息表(BS_DRGMedInsuMedicalRecord)中的 DRG 分组结果逐条比对,判断 DRG 编码是否一致,输出一致/不一致/未匹配清单与一致率统计,支撑医保结算对账与特例单议申诉。
已确认的设计口径(用户确认):
BS_DRGMedInsuMedicalRecord.DRG,不涉及 BS_DRGGroupRecord;MR.MdtrtSn),未命中时用医保结算ID兜底(→ BS_DRGMedInsuSettleMentInfo.SetlId 反查 MdtrtId / HISAdmID),再未命中时用病案号兜底(MedcasNo + 入院日期定位病案),三者皆空或皆未命中记为「未匹配」;医保登记流水号、医保结算ID、病案号 不能同时为空;医疗机构编码/医疗机构名称 严格必填,为空即异常行,不允许用当前登录机构补全;batchOptions;入院日期(缺省)/ 出院日期。User.BSDRGMedInsuGroupResult(SqlTableName = BS_DRGMedInsuGroupResult)Extends (%Persistent, %XML.Adaptor, src.util.DynamicObject.Adapter) + SqlRowIdName = ID + Parameter %JSONREFERENCE = "ID" + 完整 Storage 块,GLOBAL ^BSDRGMedInsuGroupResultD);DRG(必填)、DRGDesc(必填)、医疗机构编码(必填)、医疗机构名称(必填)、入院日期(必填)、出院日期(必填);医保登记流水号、医保结算ID、病案号;患者姓名、医保个人编号、结算日期;BatchNo(导入批次号)、RowNum(源文件行号,便于报错定位)、ImportUser、ImportDate/ImportTime;src.DRG.Report,号段 02010606~02010610)| Code | 方法 | 说明 |
|---|---|---|
| 02010606 | DownloadDRGGroupResultTemplate |
下载标准导入模板(CSV 内容 Base64 + 文件名,含表头与示例行) |
| 02010607 | PreviewDRGGroupResultImport |
解析上传 CSV → 逐行校验(必填、日期格式、三个关键值不能同空、行内重复)→ 返回总数/有效数/无效数 + 预览行(含行号与错误原因) |
| 02010608 | ConfirmDRGGroupResultImport |
校验通过后写入 BS_DRGMedInsuGroupResult,返回批次号与成功/失败数 |
| 02010609 | QueryDRGGroupResultVerify |
实时比对查询(分页):医保数据 LEFT 病案首页表,输出校验结果 + KPI 统计 |
| 02010610 | DeleteDRGGroupResultBatch |
按批次(或全部)删除导入数据,支持重导清理 |
matchBy 便于溯源):MR.MdtrtSn = 医保登记流水号 → matchBy='mdtrtSn'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 供人工核对frontend/src/pages/DRG/DRGGroupResultVerify.tsxreport-drg-group-verify,路由 /report/drg-group-verify,菜单名「医保DRG分组结果校验」,挂在「报表分析」下;查询 重置 导 入 导出Excel …(行尾右对齐)清空数据;第二行左侧展示比对口径说明;RangePicker(zhCN + dayjs.locale('zh-cn'))、CustomPagination、导出规范(文件名 sanitize、showSaveFilePicker 回落 a.download)。BS_DRGMedInsuGroupResult 不新增校验状态字段,每次查询实时比对);BS_DRGGroupRecord(分组记录表)比对,也不展示其 DRG;医疗机构编码/医疗机构名称 为空即判为异常行,不回填当前登录机构;xlsx / exceljs / file-saver 等第三方库;drg-insurance-group-result-import:医保 DRG 分组结果导入能力 —— 提供标准 CSV 数据模板下载、上传文件的后端解析与逐行校验(必填/日期/三个关键值不能同空/行内重复)、预览确认后写入 BS_DRGMedInsuGroupResult,并按批次管理(批次号、清空重导)。drg-insurance-group-result-verify:医保 DRG 分组结果一致性校验能力 —— 查询时将导入的医保分组结果与病案首页表 BS_DRGMedInsuMedicalRecord.DRG 按「登记流水号 → 结算ID → 病案号+入院日期」实时匹配并比对 DRG 编码,输出一致/不一致/未匹配状态、匹配方式、系统侧分组信息、分页清单与一致率统计,支持导出。(无。本次为纯新增能力,不修改任何现有 capability 的需求;openspec/specs/ 下现有 adrg-segmentation-rules-crud、drg-algorithm-multiplier-weight、his-data-sync-consolidation 均不受影响。)
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分组结果校验」章节 |
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 角色。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 后上传」 |