在我的YOS里面设计了一个工作流引擎,算是比较简单吧,仅仅是审批流。主要是针对过程控制和审批人角色的管理。
目的是通过这个工作流来灵活的适应企业各种流程的变化,把表单和流程分开。
工作流部分主要包括工作流定义、节点定义、角色定义、工作流操作记录这4块。
工作流定义中的表名称标识了该工作流将应用到某个记录表单信息的主表上,该类表都会有通用的字段用来标记,比如说提交人的员工编号、提交的时间、提交到的项目等等等等。
工作流节点用于标识工作流的状态,节点间设置关联,大致有这样四种类型:等待处理、通过初级而未终止、终止审批、终止拒绝。
角色定义主要围绕着上述的固定字段来进行动态角色获取,比如说人员直线上级的获取:
select leader_code as Actor_Code from hr_employeeassign where employee_code = ‘$EMPLOYEE_CODE$’ and  ‘$DATETIME$’ between Assign_BeginDate and Assign_EndDate
 
HR_Employee 是人员基础档案表,HR_EmployeeAssign是人员分配表,分配表中包含了诸如公司(集团企业)、地点、部门、岗位、上级领导人、有效期等等。
 
$EMPLOYEE_CODE$就是上面说的表的固定字段中的一种。
 
工作流和表单提交并不是同步的,表单提交后并不知道自己是结束了还是需要通过工作流完成操作,因此表单提交后起工作流信息是不存在的。
用DotNet开发了一个后台应用程序,该程序就负责定期根据工作流定义中提到的表处理对应的表单表。
如果表单表没有打上工作流标记,那它就给他打上工作流节点中标志为起始的工作流状态并设置相应审批人。
如果工作流表单已经打上了工作流标记并已经有了审批记录,那它就将对比当前的审批人标示和审批历史,把需要同一个人进行多次操作的自动审批掉,跳向下一个状态。
如果工作流表单已经进入终止状态,则将表单表的状态标志置为审批通过或被拒绝。
另外为使工作流更顺畅,DotNet程序还包含了邮件发送(JMail组件)和手机短信发送的功能,把工作流节点的通知传达给操作人。
 
此外工作流节点可以设置某些动作,存储一些SQL语句,当此步被通过转向下一步或被拒绝时,执行相应的SQL,对数据进行更新,也可以增加预处理SQL实现对数据的预处理。
 
用到的表不超过五个,但能摆弄出来的流程就多种多样了,再结合表单的逐级扩充,基本能满足日常应用。
 
表单和流程的分开一方面方提高流程的灵活性,另一方面只有提交人可以对表单数据内容进行修改,工作流节点的操作仅更新工作流状态和下一级审批人,保证了数据的准确性,为后期的数据分析奠定良好的基础。