HisDataService.SaveInpatientFeeData 原实现复制为 SaveInpatientFeeDataLegacy,作为回滚基线SaveInpatientFeeData:按就诊一次性预加载 (FeedetlSn → ID) 到内存映射,替换逐行 &sql(SELECT ID ...) 存在性查询%SQL.Statement 预编译参数化 INSERT 与 UPDATE(各 %Prepare 一次),循环 %Execute 替换逐行 src.util.operatetable.Insert/UpdateTCOMMIT + TSTART,段大小可配置,失败仅回滚当前段FeeDetailJson 惰性序列化:仅插入时执行 %ToJSON(),更新时沿用原值;超长截断并 LogSyncError 告警admCount/totalCount/insertCount/updateCount/failedCount/skippedCount/details)与 (AdmDr, FeedetlSn) 增量 Upsert 语义$G() 包裹入参,统一 set xxx= params.xxx 形式(%Get(0) 取数组首元素、rs.%Get("Col") 取结果集列除外)src.DRG.HISData.HisDataService 并校验无语法/括号配对错误HisDataService.GetInpatientData 中第 446 行的无条件 DeviceFeeWarning 重复调用,保留 if (policyType="DRG") / elseif (policyType="DIP") 分支结果GetDIPGroupScoreFeeWarning 结果,不再被覆盖GetMedicalRecord 每人次调用失败不中断主循环,纳入后续异步阶段02010067 同步模式(DRG 与 DIP 各验证一次)BS_HISSyncConfig 实际列结构,确认 FeeFlag 等既有字段状态src/src/User/BSHISSyncTask.cls(SqlTableName = BS_HISSyncTask):按项目表类规范声明 Extends (%Persistent, %XML.Adaptor, src.util.DynamicObject.Adapter)、SqlRowIdName = ID、Parameter %JSONREFERENCE = "ID" 与完整 Storage 块TaskID/HospCode/HospName/SyncType/StDate/EndDate/AdmID/Status/Phase/AdmTotal/AdmProcessed/FeeTotal/FeeProcessed/SuccessCount/FailedCount/SkippedCount/StartTime/EndTime/ErrorMessage 及公共字段TaskIDIndex On TaskID [Unique]、HospStatusIndex On (HospCode, Status)、CreateDateIndex On CreateDate{ 与 } 数量校验括号配对(写入后延时 20 秒复查,规避 IDE 自动重写)GetInpatientData 增加 asyncFlag 解析(依次取 params.asyncFlag → BS_HISSyncConfig.AsyncFlag → 'N')(HospCode, StDate, EndDate, AdmID) 存在 pending/running 则复用 taskId)→ 落任务记录 → JOB 启动 RunSyncTaskAsync → 立即返回 {taskId, status:'pending'}RunSyncTaskAsync(taskId) 后台入口:状态流转 pending→running→success/partial/failed、阶段 fetch/saveAdm/saveFee/done、每就诊或每 500 行回写进度running 且超过阈值(默认 30 分钟)无进度更新则置 failed 并写 ErrorMessagesrc/src/DRG/HISData/HisDataService.cls 实现 GetSyncTaskProgress(jsonObj):按 taskId 只读查询,返回状态/阶段/计数/percent/时间/错误摘要src/src/DRG/HISData/Interface.cls 增加 GetSyncTaskProgress 委托方法(四行头注释含 /// Code: 02010089)taskId 不存在的场景:返回非 '0' 的 errorCode 与提示,不抛异常scripts/insert_his_sync_task_interface.sql 注册 CB_MapInterface:Code='02010089'、ClassName='src.DRG.HISData.Interface'、MethodName='GetSyncTaskProgress'、ServiceType='S'src.DRG.HISData.* 并验证接口路由可达scripts/alter_his_sync_config_asyncflag.sql:为 BS_HISSyncConfig 增加 AsyncFlag 列并回填 'Y'src/src/User/BSHISSyncConfig.cls 增加 AsyncFlag 属性(InitialExpression = "Y")SyncTaskService.GetSyncConfig(02010079) 与 SaveSyncConfig(02010080) 增加 AsyncFlag 字段透传asyncFlagfrontend/nginx.conf 8082 的两个 location 补全 proxy_connect_timeout、proxy_send_timeout、client_max_body_size 与 proxy_buffering 相关参数172.16.1.6:8082 的 proxy_read_timeout 配置并记录实际值(504 大概率源于该跳)frontend/src/api/hisData.ts:HisInpatientSyncParams 增加 asyncFlag?: string,新增 getSyncTaskProgress(taskId) 方法(code 02010089)frontend/src/pages/HIS/DataSync.tsx:同步请求携带 asyncFlag:'Y',受理后取 taskId 启动轮询02010089,用现有 Progress 组件展示 percent 与 feeProcessed/feeTotal,含超时保护与失败终止splitDateRange(..., 7) 按天切批逻辑与相关 MAX_RANGE_DAYS 状态,改为一次提交完整日期范围02010075 刷新患者列表,并按 success/partial/failed 给出 message 提示admID 单患者同步入口,验证其在新流程下仍可用SaveInpatientFeeData 总耗时,确认单行平均耗时降至 5ms 以下(AdmDr, FeedetlSn) 不产生重复行、insertCount/updateCount 统计正确asyncFlag='N' 时 02010067 返回结构与改造前逐字一致(回归既有调用方)asyncFlag='Y' 时受理请求毫秒级返回,且轮询可观测到进度递增直至终态taskId 且不重复起后台进程FeeFlag='N' 时不落库费用明细,且不影响就诊/分组/预警结果failedUser.BSHISSyncTask、User.BSHISSyncConfig、src.DRG.HISData.*,执行建表与接口注册脚本