PB9 对接医保DIP接口:巧用预留列实现数据补全与分页导出(实战笔记)

一、业务背景

在医院HIS系统医保模块开发中,需要对接医保DIP分组结果查询接口。医保平台返回的JSON接口数据仅包含医保结算核心字段,缺少医保办对账、归档、导出所需的住院号、患者姓名等基础业务字段,无法直接落地使用,必须在本地完成二次数据加工。

本次开发基于 PowerBuilder 9 老旧架构,依托项目封装的 dwImportJson 组件实现 JSON 数据批量导入数据窗口,业务支持多页分页查询、数据追加展示、Excel一键导出,整体开发要求不改动底层接口逻辑、稳定兼容医保风控规则、零人工二次加工

核心业务需求整理如下:

  1. 调用医保HTTP接口,支持分页查询、多页数据连续追加加载;
  1. 补齐医保接口缺失的住院号、患者姓名字段,满足医保办导出对账刚需;
  1. 最终数据完整可直接导出,无需人工匹配加工,提升办公效率;
  1. 兼容原有医保接口封装,不修改底层导入核心语法,保障系统稳定性。

二、方案迭代与实战踩坑

针对「接口字段不全、需要本地补全、支持分页追加」的业务场景,我先后迭代两套常规方案,均存在明显短板,最终优化出适配PB9+医保场景的最优落地方案。

2.1 方案一:运行时动态新增数据窗口列(弃用)

初期尝试通过 PB 原生 Modify 语法动态创建列,运行时新增住院号、患者姓名字段。该方案无需修改数据窗口设计,看似灵活,却存在致命适配问题:

本业务支持多页分页、分批追加数据 ,每次执行 dwImportJson 导入、数据刷新都会清空动态创建的列,导致补全的字段数据直接丢失,无法持久化。同时动态建列需要手动维护控件ID、坐标、标题,代码冗余度高,且PB9环境存在偶发兼容异常,完全不适合分页迭代场景,最终直接弃用。

2.2 方案二:双数据窗口隔离加工(传统折中方案)

这是老旧PB项目对接第三方接口的通用稳妥过渡方案。由于 dwImportJson自动映射规则固定,早期担心自定义字段、计算列会打乱JSON映射逻辑,导致原生医保数据错乱、丢失、导入报错。为规避语法兼容风险,采用双窗口隔离处理:

使用独立空白数据窗口接收医保原始JSON数据,保障导入逻辑零异常;再通过业务数据窗口复制原始数据、手动补全患者信息、二次加工后展示导出。

该方案虽能规避报错风险,但短板突出:双窗口数据同步繁琐、重复代码多,多页分页追加数据时极易出现遗漏、错位;同时需要维护两套数据窗口结构,迭代、排查、运维成本极高,仅适合临时过渡,无法长期稳定使用。

2.3 最终最优方案:数据窗口预定义原生预留列

结合PB9老旧系统实战经验,最终敲定极简、零风险、高稳定的落地方案:提前在数据窗口原生结构中固化业务预留字段,不改动底层导入逻辑,JSON导入完成后批量补值

实测验证:数据窗口原生预设字段不会被 dwImportJson 覆盖、清空,完美兼容多页分页、数据追加、多次刷新、批量导出场景,彻底解决前两套方案的所有痛点,契合医保系统"稳定优先、零故障、可追溯"的核心要求。

三、整体实现思路

核心设计思路:原生预留字段 + 循环分页查接口 + 结算ID关联补全业务数据

  1. 在展示数据窗口 dw_list 前端,预定义住院号、患者姓名两个原生字符字段,固化窗口结构;
  1. 循环调用医保DIP分页接口,分批拉取数据,通过原生导入组件正常追加数据,不改动任何底层语法;
  1. 全部分页数据加载完成后,以唯一关联键 setl_id(结算ID)匹配本地住院业务表;
  1. 批量补全缺失的患者信息,最终数据完整展示,支持直接导出Excel,无需人工二次加工。

|-----------------------------------------------------------------------------------------|
| 方案优势总结 :无需动态建列、完美兼容分页追加、零导入报错、PB9原生适配、代码简洁易维护、导出格式规范,是老旧PB系统对接第三方接口、补全业务字段的标准化实战方案。 |

四、分步落地配置与完整代码

4.1 数据窗口结构预配置

在展示数据窗口 dw_list 最前端,新增两个原生普通字符列(非计算列、非动态列),提前固化结构,适配后续数据补全与导出:

|------|--------|------|----------------|
| 列名 | 字段类型 | 显示标题 | 字段用途 |
| zyhm | String | 住院号 | 预留字段,接口导入后批量赋值 |
| brxm | String | 患者姓名 | 预留字段,接口导入后批量赋值 |

核心关键说明

  • 原生预留字段不受JSON导入逻辑影响,dwImportJson 仅匹配覆盖医保原生字段,不会清空、篡改自定义预留列;
  • 无需隐藏、无需特殊属性配置,多次分页追加、数据刷新结构始终稳定;
  • 前置布局字段,贴合医保办查看、对账、导出的使用习惯。

4.2 医保DIP接口分页查询逻辑

封装稳定的分页查询逻辑,增加参数边界校验、最大页数防护,循环拉取多页数据,避免接口报错与医保平台限流风险。

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| powerbuilder // 变量定义 String ls_month // 结算年月 yyyymm格式 Dec{0} li_page, li_pagesize uo_json lu_outdata Long ll_last_row, ll_current_page Boolean lb_continue = True // 1. 获取界面筛选条件 em_month.GetData(ls_month) em_page.GetData(li_page) em_pagesize.GetData(li_pagesize) // 2. 初始化数据窗口与对象 dw_list.Reset() lu_outdata = Create uo_json ll_current_page = li_page // 3. 循环分页查询医保3606 DIP分组接口 Do While lb_continue // 调用系统封装医保交易接口 If NOT iu_ybjk.uf_trade_3606(ls_month, Ref lu_outdata, Ref dw_list, ll_current_page, li_pagesize) Then MessageBox("接口提示", iu_ybjk.errorinfo) lb_continue = False Exit End If // 判断是否存在下一页:当前新增行数小于页大小,即为无更多数据 If dw_list.RowCount() - ll_last_row < li_pagesize Then lb_continue = False End If ll_last_row = dw_list.RowCount() ll_current_page ++ // 最大200页防护,防止死循环、规避医保平台风控限流 If ll_current_page > 200 Then lb_continue = False Loop |

4.3 批量遍历补全患者信息

分页数据全部加载完成后,遍历数据窗口所有行,通过唯一结算ID关联本地住院业务表,批量为预留字段赋值,完成数据二次加工。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| powerbuilder // 遍历数据窗口,批量补全住院号、患者姓名 Long ll_rows, ll_i String ls_setlid, ls_zyhm, ls_brxm ll_rows = dw_list.RowCount() If ll_rows = 0 Then Destroy lu_outdata Return End If // 逐行根据结算ID匹配本地住院业务数据 For ll_i = 1 To ll_rows ls_setlid = dw_list.GetItemString(ll_i, "setl_id") // 关联住院主表、结算记录表查询患者基础信息 SELECT zyhm, brxm INTO :ls_zyhm, :ls_brxm FROM zy_brry, zy_zyjs WHERE zy_zyjs.fsfjylsh = :ls_setlid AND zy_brry.zyh = zy_zyjs.zyh USING sqlhis; // 查询成功赋值,无匹配数据则置空兜底,避免脏数据 If sqlhis.sqlcode = 0 Then dw_list.Object.zyhmll_i = ls_zyhm dw_list.Object.brxmll_i = ls_brxm Else dw_list.Object.zyhmll_i = "" dw_list.Object.brxmll_i = "" End If Next // 释放内存对象 Destroy lu_outdata MessageBox("提示","数据查询、字段补全完成!") |

五、三套方案横向对比复盘

5.1 动态Create列方案

  • 优点:无需修改数据窗口设计,使用灵活;
  • 缺点:分页追加数据会清空动态列、代码冗余、PB9兼容性差、维护成本高;
  • 适用场景:单次加载、无分页、无数据追加的简单查询场景。

5.2 双数据窗口隔离加工方案

  • 优点:完全隔离原始数据,零JSON导入报错风险;
  • 缺点:双窗口数据同步繁琐、冗余代码多、易出现数据遗漏错位、长期维护成本高;
  • 适用场景:临时过渡开发、对导入语法兼容性极度敏感的场景。

5.3 预定义预留列方案(最终最优解)

  • 优点:完美兼容JSON分页导入、结构永久稳定、无需改动底层逻辑、零异常、代码极简、导出格式规范;
  • 缺点:需要提前维护数据窗口结构;
  • 适用场景:所有分页查询、多批次数据追加、需要导出对账的第三方接口对接场景。

六、项目优化与运维小贴士

  1. 批量查询优化 :数据量大时,可拼接全部 setl_id 通过 IN 语句批量查询,内存匹配赋值,减少循环数据库交互,提升加载效率;
  1. 数据容错优化:无匹配业务数据时自动置空字段,杜绝NULL值、乱码问题,保证导出数据整洁规范;
  1. 医保风控优化:设置最大分页上限,杜绝接口异常死循环请求,保护医院医保账号权限,规避平台限流拦截;
  1. 通用复用优化:该预留列补字段思路可通用所有第三方接口字段不全场景,是老旧PB系统接口二次加工的标准化落地方式。

七、总结

老旧PB系统对接医保、第三方JSON接口,无需盲目追求动态化、高封装的复杂写法,朴素、原生、稳定的方案才是最适合医疗医保系统的最优解

本次功能落地历经动态列踩坑、双窗口过渡优化,最终沉淀出「数据窗口预定义预留字段」的成熟方案。在完全不改动原有医保接口、导入逻辑的前提下,完美补齐业务必填字段,解决了分页数据追加、字段丢失、导出不全等核心问题,实现查询、展示、导出一站式落地。该方案稳定性强、维护成本低、适配性广,可作为PB医院HIS系统医保接口二次开发的标准参考。

博文标签(适配CSDN发布)

标签:#PowerBuilder9 #PB实战 #医院HIS开发 #医保接口对接 #DIP结算 #数据窗口技巧

适用场景:医院HIS系统医保模块开发、PB老旧系统接口改造、第三方接口数据二次加工落地