spec.md 4.3 KB

ADDED Requirements

Requirement: 费用明细去重判定使用按就诊预加载的内存映射

系统 SHALL 在处理某个就诊的费用明细前,一次性查询该就诊在 BS_HISFeeDetail 中已有的 (FeedetlSn, ID) 并载入内存映射;对每一条明细 SHALL 通过该映射在内存中判定插入或更新,不得对每条明细发起独立的存在性 SQL 查询。

Scenario: 单行费用明细不产生存在性 SQL

  • WHEN 同步一个包含 N 条费用明细的就诊
  • THEN 系统应对该就诊执行恰好 1 次 (FeedetlSn, ID) 预加载查询
  • AND 对 N 条明细不得执行任何额外的存在性 SELECT

Scenario: 内存映射正确区分插入与更新

  • WHEN 某条明细的 feedetl_sn 已存在于映射中
  • THEN 系统应对该行执行更新
  • AND 当 feedetl_sn 不存在于映射中时,系统应执行插入并在映射中登记新 ID

Requirement: 费用明细落库使用预编译 SQL 替代逐行 ORM 调用

系统 SHALL 使用 %SQL.Statement 预编译参数化的 INSERT 与 UPDATE 语句,并在循环中重复 %Execute 完成落库;不得对每行费用明细调用 src.util.operatetable.Insert/Update。

Scenario: 语句仅编译一次

  • WHEN 处理一个包含 N 条费用明细的就诊
  • THEN INSERT 与 UPDATE 语句各应只 %Prepare 一次
  • AND 每行仅执行一次 %Execute

Scenario: 单行平均耗时达标

  • WHEN 在标准生产数据量(单任务数万行费用明细)下执行同步
  • THEN 单行费用明细平均落库耗时应低于 5ms(改造前约 50–100ms)

Requirement: 费用明细落库采用分段事务提交

系统 SHALL 将费用明细落库包裹在显式事务中,并按固定行数(默认 500 行,可配置)分段 TCOMMIT 与 TSTART,不得让每行成为独立事务。

Scenario: 按段提交

  • WHEN 处理 N 行费用明细
  • THEN 系统应每 500 行提交一次事务
  • AND journal 提交次数应为约 N/500,而非 N

Scenario: 单段失败仅回滚该段

  • WHEN 某个分段内的某行落库失败
  • THEN 系统应回滚该分段并记录错误
  • AND 已成功提交的分段数据不得被回滚

Requirement: FeeDetailJson 采用惰性序列化

系统 SHALL 仅在执行插入时序列化 feeItem.%ToJSON() 并写入 FeeDetailJson;执行更新时 SHALL 沿用库中已有的 FeeDetailJson 值,不得重复序列化。当序列化结果超过字段长度上限时 SHALL 截断并记录告警。

Scenario: 新增明细时写入原始 JSON

  • WHEN 某条费用明细为新插入
  • THEN 系统应将 feeItem.%ToJSON() 结果写入 FeeDetailJson

Scenario: 更新明细时不重复序列化

  • WHEN 某条费用明细为更新操作
  • THEN 系统不得执行 feeItem.%ToJSON()
  • AND 应保留该行原有的 FeeDetailJson 值

Scenario: 超长 JSON 截断并告警

  • WHEN 序列化结果超过字段长度上限
  • THEN 系统应截断后写入,并通过 LogSyncError 记录一条告警

Requirement: 批量化改造保持增量 Upsert 语义与返回字段兼容

系统 SHALL 保持以 (AdmDr, FeedetlSn) 为业务唯一键的增量 Upsert 语义:已存在则更新易变字段、不存在则插入,且不得对就诊做整体删除重建。SaveInpatientFeeData 的返回结构 SHALL 保持既有字段不变(admCount、totalCount、insertCount、updateCount、failedCount、skippedCount、details)。

Scenario: 重复同步同一就诊不产生重复数据

  • WHEN 对同一就诊的费用明细执行第二次同步
  • THEN 系统应对已存在的 (AdmDr, FeedetlSn) 执行更新
  • AND BS_HISFeeDetail 中该就诊的明细行数不得增加

Scenario: 返回字段与改造前一致

  • WHEN 调用 SaveInpatientFeeData
  • THEN 返回的 result 应包含 admCount、totalCount、insertCount、updateCount、failedCount、skippedCount、details
  • AND 02010068 与 02010067 的既有调用方无需修改

Scenario: 就诊主表不存在时跳过该就诊

  • WHEN BS_HISPatAdm 中不存在该 AdmID
  • THEN 系统应跳过该就诊的费用明细、累加 skippedCount 并通过 LogSyncError 记录
  • AND 不得产生孤儿费用明细