审批工作流

按 subject_type 绑定的人审人流程:AntV X6 设计、发布编译成步骤/边,运行时只读编译表,不解析画布 JSON。

创建 / 设计 / 发布

  1. 列表创建:选审批主体 → 得到「设计中」流程(带默认图),跳转设计器。
  2. 设计保存:只写 graph_json,不碰 steps/transitions。
  3. 发布:校验并编译 steps/transitions;状态变已发布;同类旧 published 归档。
  4. 已发布不可改图;要改 → 复制流程 出新设计中版本(钉住旧 workflow_id 的在途实例不受影响)。

设计器入口:/admin/workflows/{id}/design(仅设计中可进)。点选节点/边打开右侧属性面板,用 X6 setData 写入业务配置(审批人、条件、结束结果、边 trigger、通过时动作)。

审批 / 抄送指派方式(节点属性「指派方式」):

取值 说明
user 指定用户(user_id)
role 按 Spatie 角色(role_name)
subject_field 按单据用户字段(field,白名单见 config/workflows.php → assignee_fields,如开单人 / 费用申请人)

审批节点「通过时动作」(config.on_approve,可选):

主体 取值 说明
销售单 (空) 无动作,与原先一致
销售单 ship 通过时按当前明细直接出库(件数/单价不变)
销售单 accept 通过时按当前明细验收(实收=出库、无差异)
销售单 invoice 关键:通过时开票(衔接 08 销售发票;标记本单已开票)
销售单 collect 关键:通过时收款(衔接 08 回款;标记本单已收款)
费用申请 (空) 无动作
费用申请 pay 通过时付款:写 paid_at、状态 → paid

销售单财务闭环的两个关键节点是 开票(invoice)与 收款(collect),可与出库/验收节点画在同一条流程里,顺序由业务编排(先票后款 / 先款后票等)。

白名单见 config/workflows.php → actions。模型须实现 WorkflowActionable。

挂任意模型

  1. 模型实现 App\Contracts\WorkflowSubject(提交前状态 + 终态回写)。
  2. 在 config/workflows.php → subjects 注册类名、中文 label、condition_fields(字段中文;枚举可写 enum 供比较值下拉)、assignee_fields;需要节点动作时再配 actions 并实现 WorkflowActionable。
  3. 后台「审批流设计」下拉选择该主体,画图保存并发布。

费用申请、采购单、销售单均作为 subject 注册。采购审批通过后单据进入 confirmed(入库/冲销仍见 14)。销售:若节点未挂 ship,实例通过后进入 to_ship(再人手出库);若流程内已 ship/accept,结束时不再压回 to_ship。销售财务侧关键节点:invoice 开票、collect 收款(见上表)。费用申请:付款在节点 on_approve=pay 完成。财务驳回冲销不另开画布节点。

边界(与 14 分工)

进本工作流 不进本工作流
config/workflows.php 已注册的人审人单据(采购单、销售单、费用申请等) 财务驳回冲销(见 14);未挂 on_approve 时销售出库/验收仍在单据页人手点
销售节点 on_approve=ship|accept 触发的出库/验收写流水 独立「动作节点」类型(P0 复用审批节点)
销售关键节点 on_approve=invoice|collect(开票 / 收款) 单据页另做「开票」「收款」按钮(与费用申请同理,动作进节点)
费用申请节点 on_approve=pay 写已付款 单据页另做「已付款」按钮
后续可扩展的人审单据(如采购发票审核) Eloquent ER

两层数据

  • 设计时:workflows.graph_json(X6 toJSON)→ 发布编译 → workflow_steps + workflow_transitions
  • 运行时:单据 → workflow_instances → workflow_tasks(或签)→ workflow_logs;引擎从不解析 graph_json

运行时行为

  1. WorkflowEngine::submit($doc):主体 prepareWorkflowSubmit 后开实例;无 published 定义则拒绝。
  2. 通过:记日志 → 若当前审批节点有 on_approve 则执行(同一事务)→ 沿 trigger=approve 边前进;到达 end 调 applyWorkflowStatus。
  3. 驳回:审批节点 reject_to 可配「上一审批节点」(默认,走 approve_stack;栈空则实例终态驳回)或「开始(退回发起人)」。销售单未出库时驳回回 draft;已出库/已验收后不可驳回(须走退拒或财务驳回)。费用申请已 paid 后不可驳回。无需画驳回边。
  4. 作废:未结束实例与 pending 待办一并取消;已出库或费用已付款后作废同样被拒绝。

表字段与节点类型见实现代码与迁移;审批流水只写 workflow_logs。

P0 / 延后

P0 延后
可注册多 subject、五类节点、或签、驳回上一节点 / 退回发起人、销售 on_approve 出库/验收/开票/收款、费用申请 on_approve=pay 会签、驳回任意节点、消息投递对接、通过时弹窗改件数、采购侧动作