【Bug 报告】JitWorkflow + 钉钉 processCentres:审批同意后流程未推进(syncToTable 未执行)


环境

说明
产品 Jit 平台 WorkflowSvc + 钉钉 processCentres 同步
业务审批流 workflows.paymentRegistrationApproval(付款单-审批)
关联模型 models.registrationOfPayments
部署形态 私有化部署(具体版本待平台确认)
集成 钉钉 OA 审批 / 待办同步(platformSwitch: 1

现象

两张付款单在审批人点击「同意」后,审批历史已写入,但流程 未进入下一节点,待办消失或无法继续审批。

案例 付款单号(业务号) 卡住时间 卡住节点 数据 ID
A FK******015 2026-06-08 17:35:04 FLauPz(总经办审批) 1020
B FK******007 2026-06-09 09:21:33 RevsSi(总经理审批) 1001

节点链路(配置正常,其他单据可过):

… → RevsSi(总经理审批)→ FLauPz(总经办审批)→ XxMHtz(总经办审批)→ …


期望行为

WorkflowSvc/doHandlehandleType=2 同意)完整执行:

  1. 写入 DataHistory / WorkflowHistory
  2. 调用钉钉 processCentres/tasks 将当前任务标记 COMPLETED
  3. 调用 syncToTable,更新业务表 currentNodeid / approvalStatus
  4. 创建下一节点 WorkflowTaskModel,并在钉钉创建新待办

实际行为

案例 A(FLauPz 后断流)

请求特征(异常):

POST .../workflows/services/WorkflowSvc/doHandle
args: {
  workflowName: workflows.paymentRegistrationApproval,
  handleType: 2,
  nodeId: FLauPz,
  rowData: { id: 1020 }          // 仅 id,无完整 row
}
token: None                        // 无登录 token

日志链路(requestId: [REQ-A]):

[时间] upsert models.registrationOfPayments pk=1020
[时间] insert WorkflowHistoryModel pk=57433
[时间] third request: .../oauth2/accessToken
[时间] App exit completed

缺失步骤:

  • DataHistory
  • 无钉钉 processCentres/tasks COMPLETED
  • syncToTable
  • 无下一节点 WorkflowTaskModel / 钉钉新待办

同一单据约 17:35:10 第二次 doHandle(同样 token:None、仅 {id:1020})只 upsert 付款单,仍未推进

对比:同流程成功案例(11:36:15,推进到 FLauPz)

DataHistory → WorkflowHistory → 钉钉 COMPLETED → syncToTable → WorkflowTaskModel → 钉钉新待办

案例 B(RevsSi 后断流)

请求特征(正常 Web 端):

POST .../workflows/services/WorkflowSvc/doHandle
args: {
  workflowName: workflows.paymentRegistrationApproval,
  handleType: 2,
  nodeId: RevsSi,
  rowData: { id: 1001, paymentOrderNumber: FK******007, ... }  // 完整 row
}
token: [JWT 存在]

日志链路(requestId: [REQ-B]):

[09:21:33] upsert registrationOfPayments pk=1001
[09:21:33] insert DataHistoryModel pk=185505
[09:21:33] insert WorkflowHistoryModel pk=57493
[09:21:33] third request: .../processCentres/tasks
           { processInstanceId: [PI-B], tasks: [{ taskId: [TASK-B], status: COMPLETED, result: AGREE }] }
[09:21:36] App exit completed    // 约 3 秒后结束

缺失步骤:

  • workflows syncToTable
  • 无下一节点(FLauPz)待办创建

对比:同单据更早一次成功(2026-06-08 09:35:54,推进到 RevsSi)

钉钉 COMPLETED → syncToTable(currNodeId=RevsSi)→ WorkflowTaskModel → 钉钉新待办

同一 processInstanceId: [PI-B]、同一 taskId: [TASK-B],09:21:33 的 COMPLETED 调用后 未触发 syncToTable


关键对比表

步骤 成功案例 案例 A(FLauPz) 案例 B(RevsSi)
完整 rowData 否(仅 id)
JWT token None
DataHistory
WorkflowHistory
钉钉 COMPLETED
syncToTable
下一节点待办
server.log ERROR -

初步判断

  1. 案例 AdoHandletoken:None + 极简 rowData部分成功(只写 WorkflowHistory),未完成钉钉回写与 syncToTable,属于 静默半成功,用户侧表现为「点过同意但流程断了」。
  2. 案例 B:请求参数正常,钉钉 COMPLETED 已调用,但 syncToTable 未执行且无 ERROR,疑似 平台工作流引擎在钉钉回调/同步后的推进逻辑静默失败
  3. server.log* 中检索到 多例「有 processCentres/tasks COMPLETED、同请求内无 syncToTable」模式,非个例
  4. 业务仓 NodePage、中间节点事件等 未见拦截 doHandle 的逻辑;transferOfFundsApprovalOfPayment 仅在流程 Pass 时触发,与本案无关。

复现线索(供平台排查)

占位符 含义 平台侧可查
[REQ-A] 案例 A requestId 17f296ed01e54726b95b35088e083e14(内网保留)
[REQ-B] 案例 B requestId fa6c66295346430e9bfd89dd4010ee7f(内网保留)
实例 A workflow instanceId 12265
实例 B workflow instanceId 12208
[PI-A] 钉钉 processInstanceId 6tTH2TieTpq2p3ruf40opQ0**********
[PI-B] 钉钉 processInstanceId lV8DXWVVQaaETYcDsR00hg0**********
FLauPz 待办 taskId 案例 A 101680152887
RevsSi 待办 taskId 案例 B 101638849135
WorkflowHistory 案例 A / B 57433 / 57493

建议平台排查:

  1. doHandletoken:None 时为何仍写入 WorkflowHistory 却不报错?
  2. 钉钉 processCentres/tasks COMPLETED 返回后,何种条件会跳过 syncToTable?失败时为何 不落 ERROR 日志
  3. 已有 WorkflowHistory 时,重复 doHandle 是否应幂等推进或明确返回失败?

附件说明

  • 日志来源:server.log / server.log.1 / server.log.3
  • 已脱敏:域名、钉钉 appKey/appSecret、用户/员工/供应商名称、手机号、OSS 地址、JWT、完整 processInstanceId 等
  • 如需平台支持,可通过工单提供 未脱敏 requestId + 时间戳(上表内网列)

建议修复方向

  1. token:None 或 rowData 不完整时:拒绝写 WorkflowHistory,或强制走完整 sync 链路。
  2. 钉钉 COMPLETED 失败或 syncToTable 未执行时:打 ERROR 并回滚/不提交 WorkflowHistory。
  3. 卡死检测:存在 WorkflowHistory 但 currentNodeid 未变且无活跃 WorkflowTask 时告警或自动补偿。

补充复现案例 C(2026-06-10,与案例 B 同模式)

同一业务流、同一部署环境,又出现一例:钉钉 task 已 COMPLETED,同请求内无 syncToTable,且无 ERROR


环境(与主帖一致)

说明
产品 Jit 平台 WorkflowSvc + 钉钉 processCentres 同步
业务审批流 workflows.paymentRegistrationApproval(付款单-审批)
关联模型 models.registrationOfPayments
集成 钉钉 OA 审批 / 待办同步(platformSwitch: 1

现象

案例 付款单号(业务号) 卡住时间 卡住节点 数据 ID
C FK******002 2026-06-10 09:14:58 iYWlUS(审计复核) 987

节点为流程最后一档审批(下一节点应为 EndNode),链路片段:

… → 出纳(qVTmcA) → 付款复核(uYWHXs) → 审计复核(iYWlUS) → EndNode

用户侧:审计复核点「同意」后,审批历史有记录,但流程未完结,实例仍停在 iYWlUS。


请求特征(正常 Web 端,非案例 A 的 token:None)

POST …/workflows/services/WorkflowSvc/doHandle

args: {

workflowName: workflows.paymentRegistrationApproval,

handleType: 2,

nodeId: iYWlUS,

rowData: { id: 987, paymentOrderNumber: FK******002, … } // 完整 row

}

token: [JWT 存在,已省略]


日志链路(requestId: 41b57fc0d4984bc58f10e62512d178f4

[09:14:58] upsert registrationOfPayments pk=987

[09:14:58] insert DataHistoryModel pk=186406

[09:14:58] insert WorkflowHistoryModel pk=57867

[09:14:58] third request: …/oauth2/accessToken

[09:14:59] third request: …/processCentres/tasks

       { processInstanceId: \[PI-C\], tasks: \[{ taskId: \[TASK-C\], status: COMPLETED, result: AGREE }\] }

[09:15:02] App exit completed // 约 3 秒后结束

缺失步骤(相对「最后一节点成功结束」):

  • 无第二条 WorkflowHistory(成功案例在 EndHandle 前通常会再写一条)
  • 无钉钉 processCentres/instances COMPLETED
  • EndHandle do
  • workflows syncToTable(状态应为「已通过」)
  • server.log ERROR / Exception

与同单据「中间节点成功」对比

09:02:28 同一实例、上一节点 uYWlUS(付款复核) 审批成功,日志完整:

钉钉 COMPLETED → syncToTable(currNodeId=iYWlUS)-> WorkflowTaskModel → 钉钉新待办

09:14:58 同一 processInstanceId: [PI-C]、task [TASK-C] 在 COMPLETED 之后,未触发 syncToTable / EndHandle------与主帖 案例 B 一致。


关键对比表(并入主帖汇总)

步骤 成功案例(中间节点) 案例 C(iYWlUS)
完整 rowData
JWT token
DataHistory
WorkflowHistory
钉钉 COMPLETED(tasks)
syncToTable
流程结束 / 下一节点 (应 EndHandle + 已通过)
server.log ERROR -

与案例 B 差异:B 卡在中间节点(缺下一待办);C 卡在最后审批节点(缺 EndHandle + 已通过)。断点模式相同:tasks COMPLETED 之后引擎未推进且无 ERROR。


复现线索(供平台排查,内网保留完整值)

占位符 含义 值(脱敏)
requestId 案例 C 41b57fc0d4984bc58f10e62512d178f4
实例 C workflow instanceId 12034
[PI-C] 钉钉 processInstanceId WEnaZOs3TFm9R0OmnnY0ig0***********
[TASK-C] iYWlUS 待办 taskId 101725944749
WorkflowHistory 本次同意记录 57867
DataHistory 本次 186406
日志文件 server.log(2026-06-10 09:14:58 段)

09:15 之后多次 getWorkflowDataStoreList / getWorkflowHistory 查询,实例 12034 仍为 nodeId: iYWlUS


建议与主帖并案

  1. 案例 A / B / C 均符合「有 tasks COMPLETED、无 syncToTable、无 ERROR」,建议同一根因排查。
  2. 请确认:tasks COMPLETED 返回后,何种分支会跳过 syncToTable / EndHandle;失败时为何不落 ERROR
  3. 若需未脱敏 [PI-C]、JWT、row 快照,可通过工单提供 requestId + 时间戳