前不久简单设计了个php的工作流程引擎,只有后端部分,前端没有做(前端写着好麻烦,于是偷懒了)。
主要功能是流程创建,可以设置流程使用是单独某人可用还是每个部门可用还是某个角色可用,每个流程可以设置自己的编号规则。流程里分为多个工作节点,每个节点可以设置是审批类型是或签还是会签,固定人审批还是某个部门某个角色的人审批,每个节点可以设置抄送人,可以设置根据申请人提交的表单数据来确定是否经过这个节点(多个字段都满足或者满足其中一个就要经过这个审批节点)。流程创建成功后自动生成该流程对应的数据表。
数据表
流程字段表单表:cmf_flowform
流程表:cmf_workflow
流程类型表:cmf_workflowtype
审批项表:cmf_program
审批记录表:cmf_flowlog
其它的一些常用表:
具体实现
代码目录结构:
外部只调用Workflow.php的方法来实现新建流程、新建审批工作项,审批,编辑流程,编辑审批项等。
整个审批流程怎么走是用一个php数组来判断的,转换成json后保存在流程表的FlowNodes字段下,数组包含键值如下:
$flow = [
[
'type' => // 1:会签 2:或签
'role' => // 审批人角色id
'department => // 审批人部门id
'user'=> // 审批人id
'self' => // 1:本部门对应角色签批
'copy' => // 抄送人id
'need' => [
[
'field' => // 字段
'type' => // 1:值大于 2:值相等 3:值小于
'value' => // 需要时字段条件值
]
[
'field' => // 字段
'type' => // 1:值大于 2:值相等 3:值小于
'value' => // 需要时字段条件值
]
]
'needtype' => // 1:且 2:或
]
];
每个流程还有自己编号规则,编号规则也是用一个数组表示,转json后保存在流程表OrderRule字段下。下面是示例:
$orderRule = [
[
'type' => // 1:标签 2:日期 3:增长值
'value' => // type为1时有值,字符串,例如:HQ
'datetype' => // type为2时有值 1:年 2:年月 3:年月日
'length' => // 增长值最高长度 type为3时有值
]
];
// 下面这个编号规则第一个编号就是HT201803001
$orderRule = [
[
'type' => 1,
'value' => 'HT'
],
[
'type' => 2,
'datetype' => 2
],
[
'type' => 3,
'length'=> 3,
]
];
新建审批项调用Workflow.php的方法createFlow($data)。
$data = [
'Name' => '事假',
'Introduce' => '用户事假申请',
'FlowNodes' => [
[
'type' => 2,
'role' => 2,
'self' => 1,
'need' => 1,
],
[
'type' => 2,
'role' => 4,
'copy' => 4,
'need' => [
[
'field' => 'TimeBetween1Total',
'type' => 1,
'value' => 3,
]
],
'needtype' => 1,
]
],
'DepartmentID' => NULL,
'RoleID' => 1,
'TypeID' => 1,
'UserID' => NULL,
'OrderRule' => [
[
'type' => 1,
'value' => 'SJ'
],
[
'type' => 2,
'datetype' => 2
],
[
'type' => 3,
'length'=> 3,
]
],
'Form' => [
[
'fieldtypeid' => 1,
'FieldName' => 'Content',
'FieldTitle' => '原因',
'Placeholder' => '请输入请假原因',
'Must' => 1,
],
[
'fieldtypeid' => 8,
'FieldName' => 'TimeBetween',
'FieldTitle' => '起止时间',
'Timetype' => 3,