design.md 7.6 KB

Context

背景

  • HisPopup.tsx(HIS 弹框)已上线,主表通过 02010108 QueryLatestWarningByPatient 聚合展示"每患者每类型最新一条"预警;
  • 处理提交当前复用 02010104 ProcessWarning,仅更新单条 warningId;
  • BS_DRGWarningRecord 表字段:FixmedinsCode / HISAdmID / PatientName / WarningType / WarningDate / WarningTime / WarningStatus / ProcessUser_Dr / ProcessDate / ProcessTime / ProcessRemark,已具备按"机构+就诊+类型+日期"批量定位的数据基础。

现状

  • 02010104 处理逻辑(第 736–797 行):按 warningId 打开对象 → 状态映射(processed→02 已确认、ignored→03 已忽略)→ 写入处理人/日期/时间/原因 → %Save;
  • 同一患者同一天同一类型可能有多条记录(如窗口反复触发),聚合视图只展示最新一条,但历史记录仍待处理。

约束条件

  • 必须遵循 CB_MapInterface 接口注册规范;
  • 入参结构尽量沿用 02010104(warningId / processStatus / processRemark),友好兼容;
  • 复用 02010104 的状态映射与处理字段;
  • 批量更新需在同一事务内,任一条失败整体回滚;
  • 仅更新"待处理(01)"记录,避免覆盖已处理数据。

利益相关方

  • HIS 端医生/护士:处理后不再被当日同类预警重复打扰;
  • 医保办:监控中心 Center.tsx 行为不变;
  • 系统管理员:新接口按规范注册、可在接口管理检索。

Goals / Non-Goals

Goals:

  • 新增 02010109,以被处理记录为锚点,批量更新"当日 + 同机构 + 同就诊(HISAdmID) + 同类型(WarningType)"的全部待处理记录;
  • 返回成功条数 result.updatedCount,供前端提示;
  • 前端 HisPopup 处理提交切换至 02010109,刷新主表并提示同步条数。

Non-Goals:

  • 不修改 BS_DRGWarningRecord 表结构;
  • 不修改 02010104 既有逻辑(Center.tsx 仍可用);
  • 不跨日期、不跨类型、不跨就诊批量(严格"当日同患者同类型");
  • 不实现跨患者批量。

Decisions

1. 后端接口设计(02010109)

  • 接口 Code:02010109
  • 方法名:BatchProcessWarningByDay
  • 入参(与 02010104 对齐):{"params":[{"warningId":"<锚点ID>","processStatus":"processed|ignored","processRemark":""}], "session":[{...}]}
  • 处理流程:

    1. 校验 warningId 非空,打开锚点记录;不存在则返回 -2;
    2. 读取锚点的 FixmedinsCode、HISAdmID、WarningType、WarningDate;
    3. 状态映射(同 02010104):processed→02、ignored→03,兼容中文"已确认/已忽略"及原始码;
    4. 开启事务 %SYS.Transaction;
    5. 执行批量更新 SQL:

      UPDATE BS_DRGWarningRecord
      SET WarningStatus   = :targetStatus,
       ProcessUser_Dr  = :userID,
       ProcessDate     = :procDate,
       ProcessTime     = :procTime,
       ProcessRemark   = :processRemark
      WHERE FixmedinsCode = :fixmedinsCode
      AND HISAdmID      = :hisAdmId
      AND WarningType   = :warningType
      AND WarningDate   = :warningDate
      AND WarningStatus = '01'        -- 仅更新待处理,保护已处理记录
      
      1. 用 %ROWCOUNT 取影响行数 → result.updatedCount;
      2. 事务提交;异常则回滚并返回 -3。
      3. 出参:{errorCode:"0", errorMessage:"处理成功", result:{updatedCount:N}}

      2. 为何不修改 02010104

      • 02010104 被 Center.tsx 监控中心使用,需保留单条处理语义;
      • 新增 02010109 复用同一状态映射与写库字段,逻辑不重复、行为可控。

      3. 前端改动

      • frontend/src/api/warning.ts: ts export const batchProcessWarningByDay = ( id: string | number, processType: 'processed' | 'ignored', processRemark: string, ) => invoke('02010109', [{ warningId: id, processStatus: processType, processRemark }]);
  • HisPopup.tsx:handleSubmitEdit 中将 processWarning(record.id, processType, processRemark) 替换为 batchProcessWarningByDay(record.id, processType, processRemark);成功提示改为 已处理,当日同类共同步 N 条;其余(关闭 Drawer、loadData 刷新、失败保留)逻辑不变。

  • request.ts getMockResponse 追加 02010109 分支:{errorCode:"0", errorMessage:"(dev) 处理成功", result:{updatedCount:2}}。

4. 预警监控中心(Center.tsx)处理弹框改造

  • 在"确认预警/忽略预警" Modal 内、处理备注上方,新增「处理方式范围」单选组(Radio.Group),选项:
    • single:仅处理当前这一条预警(默认选中),走 02010104 ProcessWarning;
    • batch:批量处理当日同患者同类型预警,走 02010109 BatchProcessWarningByDay。
  • 状态:const [processScope, setProcessScope] = useState<'single' | 'batch'>('single');打开弹框 handleProcess 时重置为 'single'。
  • 当选择 batch 时,调用 queryLatestWarningByPatient 或 queryWarningRecords 以锚点记录的 fixmedinsCode / hisAdmId / warningType / warningDate + warningStatus='01' 预查,展示 Alert 提示"将同步处理当日同类 N 条预警(含本条)";预查失败不阻断提交,仅不显示条数。
  • submitProcess 改造: ```ts const api = processScope === 'batch' ? batchProcessWarningByDay(currentRecord.id, processType, values.processRemarks || '')

    : processWarning(currentRecord.id, processType, values.processRemarks || ''); const res: any = await api; if (res.errorCode === '0') { const cnt = res.result?.updatedCount; const extra = processScope === 'batch' && cnt ? ,当日同类共同步 ${cnt} 条 : ''; message.success((processType === 'processed' ? '已确认处理' : '已忽略该预警') + extra); setProcessModalVisible(false); loadData(); } else { message.error(res.errorMessage || '处理失败'); } ```

    • 单条场景行为完全保持现状(兼容 Center.tsx 既有监控中心用法)。

    5. 接口注册

    • CB_MapInterface 新增:Code='02010109'、ClassName='src.DRG.Warning'、MethodName='BatchProcessWarningByDay'、InterfaceName='当日同患者同类型预警批量处理'、IsActive='Y'。

    Risks / Trade-offs

    风险 缓解措施
    事务内批量更新失败导致部分写库 %SYS.Transaction + 异常回滚,返回 -3 不刷新主表
    误更新非当日/非同类记录 WHERE 精确锁定 4 个维度(fixmedinsCode+HISAdmID+WarningType+WarningDate)
    覆盖已处理记录 仅 WarningStatus='01' 待处理参与更新
    锚点记录本身已非待处理 即便锚点已处理,WHERE 条件仍会正确更新其余待处理同类记录,updatedCount 如实反映
    HIS 端调用无感 仅前端提交入口切换,HIS 调用方无需改动

    Migration Plan

    部署步骤

    1. 后端 IRIS 部署:编译 src.DRG.Warning.cls 与 src.DRG.Warning/1.int;执行 SQL 插入 CB_MapInterface 02010109。
    2. 前端构建:更新 warning.ts、HisPopup.tsx、request.ts;npm run build 部署到 Nginx。
    3. 联调验证:构造同一患者同一天同类型多条预警,经 HIS 弹框处理最新一条,验证其余记录状态同步更新。

    回滚策略

    • 移除 CB_MapInterface 02010109 记录可停用接口;前端回退 HisPopup 提交至 processWarning 即可恢复单条模式。

    Open Questions

    1. 锚点记录读取的 WarningDate 使用"锚点记录本身的预警日期"作为当日判定基准(推荐),无需前端额外传日期;
    2. 是否需要 HIS 端确认弹窗提示"将同步处理 N 条"?(当前版本处理前不预知条数,处理成功后再提示,作为后续优化可先查后更)