数据表与排查
大约 4 分钟约 1192 字
数据表与排查
本文说明业务表与工作流表的关系,并给出常见问题排查路径。
1. 业务表
请假业务表:Leave
关键字段:
| 字段 | 说明 |
|---|---|
Id | 业务主键 |
Status | 业务状态 |
WorkflowStatus | 审批状态 |
WorkflowInstanceCodes | 关联工作流实例编码 |
WorkflowComment | 审批意见 |
WorkflowCompleteTime | 审批完成时间 |
业务表是业务系统的最终状态来源。工作流实例完成后,必须通过业务回调把审批结果写回业务表。
2. 工作流核心业务表
| 表 | 作用 | 关键字段 |
|---|---|---|
WorkFlowFlow | 流程设计稿 | Code、Name、FormType、BusinessModule、FlowJson、LatestDefinitionId、Status |
WorkFlowDefinition | 发布后的流程定义 | WorkflowCode、FlowId、Version、DefinitionJson、IsActive、IsLatest |
WorkFlowInstance | 运行中的流程实例 | InstanceCode、WorkflowCoreInstanceId、DefinitionId、Status、BusinessModule、BusinessId、FormRecordId |
WorkFlowFormRecord | 发起时保存的表单数据快照 | InstanceCode、FormData、SubmitterId、SubmitTime |
WorkFlowStepInstance | 每个审批节点的执行记录 | InstanceCode、StepCode、Status、ApproverIds、ApprovalComment |
WorkFlowTodo | 待办、抄送、通知 | InstanceCode、StepCode、TodoUserId、TodoType、Status、BusinessModule、BusinessId |
WorkFlowExecutionLog | 流程执行日志 | InstanceCode、ActionType、ActionContent、Result、ErrorMessage |
WorkFlowInstance 上有业务索引:
[SugarIndex("i_{table}_biz", nameof(BusinessModule), OrderByType.Asc, nameof(BusinessId), OrderByType.Asc)]可通过 BusinessModule + BusinessId 快速找到业务单据对应的流程实例。
3. WorkflowCore 持久化表
插件还包含 WorkflowCore 持久化相关实体,例如:
WorkflowCoreWorkflowWorkflowCoreExecutionPointerWorkflowCoreEventWorkflowCoreSubscriptionWorkflowCoreExecutionErrorWorkflowCoreExtensionAttribute
业务排查通常先看插件自己的 WorkFlow* 表。只有当 WorkflowCore 实例启动、挂起、恢复或指针异常时,再看这些表。
4. 状态枚举
工作流实例状态 WorkflowStatusEnum:
| 值 | 名称 | 含义 |
|---|---|---|
0 | Pending | 待执行 |
1 | Running | 运行中 |
2 | Completed | 已完成 |
3 | Terminated | 已终止 |
4 | Suspended | 已暂停 |
待办状态:
| 值 | 含义 |
|---|---|
0 | 待处理 |
1 | 已处理 |
2 | 已拒绝 |
请假业务状态:
| 字段 | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
Status | 草稿 | 已提交 | 已通过 | 已拒绝 |
WorkflowStatus | 未提交 | 审批中 | 已通过 | 已拒绝 |
5. 从业务单据排查流程
已知业务模块和业务 ID,例如 Leave 和 123:
- 查业务表
Leave.Id = 123,确认Status、WorkflowStatus、WorkflowInstanceCodes。 - 用
WorkflowInstanceCodes查WorkFlowInstance.InstanceCode。 - 确认
WorkFlowInstance.Status、BusinessModule、BusinessId、FormRecordId。 - 查
WorkFlowFormRecord.InstanceCode,确认FormData是否包含条件字段。 - 查
WorkFlowTodo.InstanceCode,确认待办是否生成、待办人是否正确。 - 查
WorkFlowStepInstance.InstanceCode,确认当前节点状态。 - 查
WorkFlowExecutionLog.InstanceCode,确认审批、回调、错误日志。
6. 常见问题
业务页面看不到可选流程
检查:
- 流程设计时是否选择了正确业务模块。
- 流程是否已发布。
WorkFlowDefinition.IsActive是否为true。- 前端弹窗传入的
business-module是否等于后端常量,例如Leave。 getDefinitions查询参数中businessModule是否正确。
提交审批后业务状态没有变化
检查:
- 前端是否调用了业务模块
submitApi,而不是直接调用/api/workflow/startWorkflow。 workflowForm/{module}.ts是否正确注册submitApiName。- 后端 submit 是否在调用
StartWorkflow前后更新业务状态。 StartWorkflow异常时是否恢复了原状态。
审批完成后业务状态没有回写
检查:
WorkFlowInstance.BusinessModule和BusinessId是否有值。- 业务模块是否实现了
IWorkflowCompletedHandler并正确匹配BusinessModule。 - 如果使用 HTTP 回调:
WorkFlow:BusinessModuleCallbackRouteTemplate是否能解析到真实业务接口。 - 如果使用 HTTP 回调:
WorkFlow:BaseUrl或代理转发头是否正确。 - 如果使用 HTTP 回调:业务回调接口是否可访问。
WorkFlowExecutionLog或应用日志中是否有回调失败记录。- 业务回调是否校验
BusinessModule后提前返回。
条件分支不按预期走
检查:
WorkFlowFormRecord.FormData是否包含条件字段。- 字段名是否与表达式一致。
- 字段值类型是否正确,例如数字不要作为带单位的字符串。
WorkFlow:ConditionExpression是否把字段缺失或解析失败配置为不通过。- 日志中是否有条件表达式评估失败。
待办没有生成
检查:
- 首个用户任务节点是否配置了审批人。
- 审批人类型是角色或部门时,当前角色/部门下是否有用户。
WorkFlowStepInstance是否创建。WorkFlowTodo是否已有相同实例、节点、用户的待办,避免重复创建。WorkflowTodoService.CreateStepTodosAsync日志。
节点 HTTP 回调失败
检查:
- 节点是否配置了
callbackUrl。 - 相对 URL 是否能通过
BaseUrl组合为可访问地址。 callbackHeaders是否符合Key: Value格式。callbackBody是否是合法 JSON。- 占位符替换后是否仍是合法请求体。
WorkFlow:Callback:IgnoreFailure是否允许忽略失败。