环境
| 项 | 说明 |
|---|---|
| 产品 | 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/doHandle(handleType=2 同意)完整执行:
- 写入 DataHistory / WorkflowHistory
- 调用钉钉
processCentres/tasks将当前任务标记COMPLETED - 调用
syncToTable,更新业务表currentNodeid/approvalStatus - 创建下一节点
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/tasksCOMPLETED - 无
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 | - | 无 | 无 |
初步判断
- 案例 A:
doHandle在token:None+ 极简 rowData 下 部分成功(只写 WorkflowHistory),未完成钉钉回写与syncToTable,属于 静默半成功,用户侧表现为「点过同意但流程断了」。 - 案例 B:请求参数正常,钉钉 COMPLETED 已调用,但
syncToTable未执行且无 ERROR,疑似 平台工作流引擎在钉钉回调/同步后的推进逻辑静默失败。 - 在
server.log*中检索到 多例「有processCentres/tasksCOMPLETED、同请求内无syncToTable」模式,非个例。 - 业务仓
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 |
建议平台排查:
doHandle在token:None时为何仍写入 WorkflowHistory 却不报错?- 钉钉
processCentres/tasksCOMPLETED 返回后,何种条件会跳过syncToTable?失败时为何 不落 ERROR 日志? - 已有 WorkflowHistory 时,重复
doHandle是否应幂等推进或明确返回失败?
附件说明
- 日志来源:
server.log/server.log.1/server.log.3 - 已脱敏:域名、钉钉 appKey/appSecret、用户/员工/供应商名称、手机号、OSS 地址、JWT、完整 processInstanceId 等
- 如需平台支持,可通过工单提供 未脱敏 requestId + 时间戳(上表内网列)
建议修复方向
token:None或 rowData 不完整时:拒绝写 WorkflowHistory,或强制走完整 sync 链路。- 钉钉 COMPLETED 失败或 syncToTable 未执行时:打 ERROR 并回滚/不提交 WorkflowHistory。
- 卡死检测:存在 WorkflowHistory 但
currentNodeid未变且无活跃 WorkflowTask 时告警或自动补偿。