tasks.md 9.2 KB

实施任务清单:医保DRG分组结果校验(02010606~02010610)

变更目录:openspec/changes/report-drg-group-result-verify/ 后端:新增表类 src/User/BSDRGMedInsuGroupResult.cls(BS_DRGMedInsuGroupResult);在既有 src/src/DRG/Report.cls 追加 5 个方法(号段 02010606~02010610) 前端:新增 frontend/src/pages/DRG/DRGGroupResultVerify.tsx(菜单 key report-drg-group-verify,路由 /report/drg-group-verify) 参考实现:src.DRG.BasicData.ICDInfo(三接口导入)、pages/BasicData/ICDQuery.tsx(导入 Steps 弹窗)、src.DRG.Report(02010601~05)

已确认口径(用户确认,不可擅自更改)

  1. 比对基准仅 BS_DRGMedInsuMedicalRecord.DRG,不涉及 BS_DRGGroupRecord;
  2. 匹配三级兜底:登记流水号(MR.MdtrtSn)→ 结算ID(BS_DRGMedInsuSettleMentInfo.SetlId 反查)→ 病案号 + 入院日期(MR.MedcasNo);
  3. 关键值校验:医保登记流水号、医保结算ID、病案号 不能同时为空;
  4. 导入文件为 CSV(后端 ObjectScript 解析,无 Excel 库);
  5. 不落校验状态,查询时实时比对;
  6. 医疗机构编码/医疗机构名称 严格必填,禁止用当前登录机构补全;
  7. 不提供同义列名白名单;
  8. 单次导入上限 20000 行;批次下拉由 02010609 附带返回 batchOptions;
  9. 查询支持日期类型切换:入院日期(缺省)/ 出院日期。

1. 前置:字段与口径确认

  • 1.1 确认 MR.MdtrtSn 即医保登记流水号且生产库有值
  • 1.2 确认 BS_DRGMedInsuSettleMentInfo.SetlId 可反查 MdtrtId / HISAdmID
  • 1.3 确认 MR.ValiFlag 有效值域与重复流水号情况
  • 1.4 确认 CB_MapInterface 020106xx 记录的 ClassName='src.DRG.Report' 等取值
  • 1.5 确认 MR.MedcasNo(病案号)可用且与 AdmDate 组合可唯一定位
  • 1.6 确认前端 useHospitalOptions / getSession().hospYBCode 可用

2. 新增表类 src/User/BSDRGMedInsuGroupResult.cls

  • 2.1 类声明(Extends (%Persistent, %XML.Adaptor, src.util.DynamicObject.Adapter) + SqlRowIdName = ID + SqlTableName = BS_DRGMedInsuGroupResult)
  • 2.2 加 Parameter %JSONREFERENCE = "ID";
  • 2.3 属性:DRG、DRGDesc、PsnName、PsnNo、MedcasNo(18)、MdtrtSn、SetlId、FixmedinsCode、FixmedinsName、AdmDate、DscgDate、SetlDate、BatchNo、RowNum、ImportUser、ImportDate、ImportTime
  • 2.4 索引:BatchNo(bitmap)、MdtrtSn、SetlId、MedcasNo、FixmedinsCode(bitmap)、DupIdx(BatchNo, MdtrtSn, SetlId)
  • 2.5 完整 Storage Default 块(^BSDRGMedInsuGroupResultD/I/S,Data 含 %%CLASSNAME 与全部字段)
  • 2.6 编译:Do $SYSTEM.OBJ.Compile("User.BSDRGMedInsuGroupResult","ck") 无错误
  • 2.7 写入后延时复查文件(LF、无 BOM、括号配对)

3. 私有辅助方法(src/src/DRG/Report.cls)

  • 3.1 %GrColumnList():模板 12 列(含 病案号)
  • 3.2 %GrTrim / %GrNormDrg($ZCVT($TRIM(v),"U"))
  • 3.3 %GrNormDate(v):日期归一;try/catch 内禁止带参 QUIT,用标志位在块外返回
  • 3.4 %GrDecodeFile:Base64 三级解码 + 剥离 BOM + 换行统一 + 双引号状态机解析
  • 3.5 %GrBuildHeaderMap:按列名映射(不做同义别名),缺列写入 missing
  • 3.6 %GrParseRows:逐行解析 + 校验(必填 6 列、三关键值不能同空、日期、出院≥入院、文件内重复)
  • 3.7 %GrLoadMr / %GrLoadSetl / %GrLoadMrByCas(缓存键 MedcasNo|AdmDate)
  • 3.8 %GrPrefetch:登记流水号 / 结算ID / 病案号 批量预取(IN 每批 500)
  • 3.9 %GrCompareOne:三级判定 + 输出 matchBy / 系统侧字段
  • 3.10 %GrBuildVerifyWhere:机构 / 批次 / DRG / 姓名 / 病案号 / 日期类型(adm|discharge) + 区间
  • 3.11 全部方法遵循取值规范:禁止 $G() / %Get("xxx")

4. 接口 02010606 DownloadDRGGroupResultTemplate

  • 4.1 四行头注释(Code: 02010606)
  • 4.2 拼 CSV:12 列表头 + 1 行示例(含病案号),Base64Encode(UTF-8 BOM)
  • 4.3 catch → ..%HandleError(...)

5. 接口 02010607 PreviewDRGGroupResultImport

  • 5.1~5.3 入参校验 + 解析 + 缺列报错
  • 5.4 逐行校验(6 必填 + 三关键值不能同空 + 日期 + 出院≥入院 + 重复)
  • 5.5 机构列为空 → invalid(不补全)
  • 5.6 统计 + 预览最多 200 行

6. 接口 02010608 ConfirmDRGGroupResultImport

  • 6.1~6.3 重新解析校验、生成 BatchNo、写入导入人/时间/行号
  • 6.4 机构列原样入库(禁止补全)
  • 6.5 逐行 %Save(),上限 20000 行
  • 6.6 返回 batchNo / totalCount / successCount / failCount / failedRows[]

7. 接口 02010609 QueryDRGGroupResultVerify

  • 7.1~7.2 入参校验 + 按条件查询导入表(ORDER BY ID,上限 20000)
  • 7.3 批量预取(含病案号)
  • 7.4 逐行三级匹配 + TRIM+大写 比 DRG
  • 7.5 应用层按 verifyFlag 过滤
  • 7.6 全量统计 + %Paginate 分页
  • 7.7 输出 medcasNo、matchBy 与 batchOptions

8. 接口 02010610 DeleteDRGGroupResultBatch

  • 8.1~8.3 按批次删除(空=全部),返回 deletedCount

9. 编译与路由注册

  • 9.1 确认 Report.cls 末尾成员仍为 Parameter
  • 9.2 编译:Do $SYSTEM.OBJ.Compile("src.DRG.Report","ck") 无错误
  • 9.3 写 db/register_interface_0201060{6,7,8,9,10}.sql(S/S/A/S/D,幂等 + 校验 + 回滚)
  • 9.4 执行 5 个脚本并验证幂等

10. 后端自测

  • 10.1 02010606 模板 Base64 可解码,表头 12 列(含病案号)
  • 10.2 02010607:缺列报错、6 必填逐个为空、2026/01/05 / 20260105 归一、出院<入院、重复行
  • 10.2.1 三关键值全空 → invalid;仅病案号有值 → valid
  • 10.2.2 别名列名 → 按缺列报错
  • 10.3 列序打乱、含逗号字段、GBK 文件解析正确
  • 10.4 02010608:500 行全 valid 入库;3 行 invalid 跳过;>20000 行超限提示
  • 10.5 02010609:登记流水号命中;结算ID兜底;病案号+入院日期兜底;日期不符不命中
  • 10.6 大小写/空格噪声一致;DRGDesc 不同不影响
  • 10.7 KPI 全量口径;verifyFlag、medcasNo、dateType 筛选生效;分页正确
  • 10.8 02010610 按批次删除生效
  • 10.9 回归 02010601~02010605

11. 前端 API 层 frontend/src/api/report.ts

  • 11.1 类型:GroupResultVerifyItem(含 medcasNo、matchBy)、GroupResultPreviewItem.medcasNo、统计与批次类型
  • 11.2 VERIFY_FLAG_OPTIONS / VERIFY_FLAG_META,复用 VISIT_DATE_TYPE_OPTIONS
  • 11.3~11.7 五个接口封装(downloadGroupResultTemplate / previewGroupResultImport / confirmGroupResultImport / queryGroupResultVerify / deleteGroupResultBatch)

12. 前端页面 frontend/src/pages/DRG/DRGGroupResultVerify.tsx

  • 12.1 页面骨架:工具栏 Card + KPI 卡区 + 明细表 Card
  • 12.2 工具栏:医疗机构、导入批次、日期类型 + 日期区间(中文 RangePicker)、校验结果、患者姓名、病案号、DRG 编码 → 查询/重置
  • 12.3 按钮布局:查询 重置 导入 导出Excel 同一行,行尾右对齐 清空数据;第二行左侧口径说明
  • 12.4 导入 Steps 弹窗(上传 → 预览校验 → 结果,含下载模板)
  • 12.5 KPI 卡:总记录 / 一致 / 不一致 / 未匹配 / 一致率
  • 12.6 明细列:含病案号、系统病案号、匹配方式、校验结果
  • 12.7 不一致行浅红底 + 红 Tag
  • 12.8 导出 Excel(当前条件全量,含病案号与匹配方式)
  • 12.9 CustomPagination,无金额列不加合计行
  • 12.10 tsc --noEmit / lint 无错误

13. 前端路由与菜单注册

  • 13.1 routes/menuRoutes.ts:keyToPath / menuTitleMap
  • 13.2 routes/menuRouteRegistry.tsx:注册 report-drg-group-verify(路径 pages/DRG/DRGGroupResultVerify)
  • 13.3 context/MenuContext.tsx:「报表分析」children 兜底
  • 13.4 db/insert_drg_group_verify_menu.sql(Component='pages/DRG/DRGGroupResultVerify',SeqNo=40,图标 CheckCircleOutlined)

14. 部署与验收

  • 14.1 执行菜单 SQL,校验父级为「报表分析」
  • 14.2 角色授权,登录后可见
  • 14.3 部署 dist 到 E:\DRG\dist(nginx 8082),验证 /report/drg-group-verify
  • 14.4 端到端验收:下载模板(12 列)→ 造数据(含病案号)→ 导入 → 预览 → 确认 → 查询 → 切换日期类型 → 按不一致筛选 → 导出 → 清空批次

15. 文档与归档

  • 15.1 接口服务说明/09-报表服务.md 追加 02010606~02010610(含病案号、三关键值规则、dateType、medcasNo、matchBy)
  • 15.2 接口服务说明/00-接口总览.md 清单追加 5 条
  • 15.3 系统设计/09-报表模块设计.md 追加章节(表结构含 MedcasNo、三级匹配算法、病案号组合键说明)
  • 15.4 归档:/opsx:archive,确认两个 capability spec 落位