1. 概述

系统需要使用流程业务,首先需要根据业务的情况在系统中先进行流珵业务的建模,建模的过程我们称为新建流程定义。平台使用的是BPMN的流程模型定义,这时我们需要提供在线的BPMN的流程定义设计器,如下所示:

2. 存储设计

2.1. 流程定义表

平台采用activiti作为底层的流程引擎,因此,其设计的xml为activiti原生的流程定义bpmn文件,只需要在平台增加一表bpm_def进行保存流程定义基本属性:

是否主键 字段名 字段描述 数据类型 长度 可空 备注
DEF_ID_ DEF_ID_ VARCHAR(64) 64    
  TREE_ID_ ID VARCHAR(64) 64 分类Id
  SUBJECT_ 标题 VARCHAR(255) 255   标题
  DESCP_ 描述 VARCHAR(1024) 1024 描述
  KEY_ 标识Key VARCHAR(255) 255   标识Key
  ACT_DEF_ID_ Activiti流程定义ID VARCHAR(255) 255 Activiti流程定义ID
  ACT_DEP_ID_ ACT流程发布ID VARCHAR(255) 255 ACT流程发布ID
  STATUS_ 状态 VARCHAR(20) 20   状态
  VERSION_ 版本号 INT     版本号
  IS_MAIN_ 主版本 VARCHAR(20) 20 主版本
  SETTING_ 定义属性设置 TEXT   定义属性设置
  MODEL_ID_ 设计模型ID VARCHAR(64) 64   设计模型ID,关联Activiti中的ACT_RE_MODEL表主键
  MAIN_DEF_ID_ 主定义ID VARCHAR(64) 64 主定义ID
  TENANT_ID_ 租用ID VARCHAR(64) 64 租用机构ID
  CREATE_BY_ 公共 - 创建人ID VARCHAR(64) 64 创建人ID
  CREATE_TIME_ 公共 - 创建时间 DATETIME   创建时间
  UPDATE_BY_ 更新人ID VARCHAR(64) 64 更新人ID
  UPDATE_TIME_ 公共 - 更新时间 DATETIME   更新时间
  CREATE_BY_ 公共 - 创建人ID VARCHAR(64) 64 创建人ID
  CREATE_TIME_ 公共 - 创建时间 DATETIME   创建时间
  UPDATE_BY_ 更新人ID VARCHAR(64) 64 更新人ID
  UPDATE_TIME_ 公共 - 更新时间 DATETIME   更新时间
  DATA_SAVE_MODE_ 数据保存模式 VARCHAR(10) 10 数据保存模式(all,json,db)
  SUPPORT_MOBILE_ 支持手机端 INT   支持手机端
  BO_DEF_ID_ BO定义ID VARCHAR(20) 20 BO定义ID
  BILL_NO_ 单号 VARCHAR(255) 255 单号
  START_DEP_ID_ 发起部门ID VARCHAR(64) 64 发起部门ID
  START_DEP_FULL_ 发起部门全名 VARCHAR(300) 300 发起部门全名
  IS_LIVE_ 是否复活 VARCHAR(64) 64 是否复活
  LIVE_INST_ID_ 复活的流程实例 VARCHAR(64) 64 复活的流程实例
  • 编码
  • 流程定义名称
  • 是否发布
  • 设计器存储的xml
  • 流程属性配置
  • 主版本Id
  • 版本号
  • Actviti的发布Id
  • Activiti的流程定义Id

【说明】

  • 编码是为作API接口发起流程的唯一标识。
  • 是否发布状态,只有发布状态的流程才允许发起,发布状态代表流程定义xml需要发布至activiti原生的引擎中去,并且返回了流程定义与发布Id
  • 版本号代表每次发布都会增加1,并且主版本Id相应发生变化
  • 设计器的xml是为设计器原生产生的原始xml,最终发布的xml则代表转化后给activiti引擎运行的流程定义,与原始xml有小小变化差异,如命名空间不一样。
  • 流程属性配置则用于存储流程属性,节点扩展各属性的配置

2.2. 流程定义扩展属性

流程定义的扩展属性存储于EXT_CONFS属性字段中,用于记录流程级别,任务级别,其他如网关,开始与结束节点等的属性配置,可根据业务的需要进行灵活扩展,如下所示,为其中一个节点的属性配置。

2.2.1. 流程级别属性扩展定义

2.2.1.1 JSON属性定义

流程级的json属性定义示例:

  1. "Process": {
  2. "detailForm": {
  3. "formpc": [
  4. {
  5. "boAlias": "purchaseOrder",
  6. "name": "采购单",
  7. "alias": "purchaseOrder",
  8. "permission": ""
  9. }
  10. ],
  11. "mobile": [
  12. {
  13. "boAlias": "purchaseOrder",
  14. "name": "采购单",
  15. "alias": "purchaseOrder",
  16. "permission": "{}",
  17. "id": "1290175530450284546"
  18. }
  19. ]
  20. },
  21. "boDefs": {
  22. "text": "采购单",
  23. "value": "purchaseOrder"
  24. },
  25. "endProcessScript": "",
  26. "subjectRuleData": [
  27. {
  28. "ruleSplitor": "processName",
  29. "ruleType": true
  30. },
  31. {
  32. "ruleSplitor": "-由",
  33. "ruleType": false
  34. },
  35. {
  36. "ruleSplitor": "createUser",
  37. "ruleType": true
  38. },
  39. {
  40. "ruleSplitor": "创建于",
  41. "ruleType": false
  42. },
  43. {
  44. "ruleSplitor": "createTime",
  45. "ruleType": true
  46. }
  47. ],
  48. "noticeTemplate": {},
  49. "id": "purchaseFlow",
  50. "processEndCopyConfig": [],
  51. "events": [
  52. {
  53. "eventConfigs": [],
  54. "eventType": {
  55. "name": "流程启动",
  56. "id": "PROCESS_STARTED"
  57. }
  58. },
  59. {
  60. "eventConfigs": [],
  61. "eventType": {
  62. "name": "流程完成",
  63. "id": "PROCESS_COMPLETED"
  64. }
  65. },
  66. {
  67. "eventConfigs": [],
  68. "eventType": {
  69. "name": "全局任务创建",
  70. "id": "GLOBAL_TASK_CREATE"
  71. }
  72. },
  73. {
  74. "eventConfigs": [],
  75. "eventType": {
  76. "name": "全局任务完成",
  77. "id": "GLOBAL_TASK_COMPLETE"
  78. }
  79. }
  80. ],
  81. "actDepId": "1290178520938364930",
  82. "orderNo": 1,
  83. "isMain": "YES",
  84. "processEndHandler": "",
  85. "nodeType": "bpmn:Process",
  86. "processEndHandlerName": "",
  87. "version": 2,
  88. "defId": "1290178520925782017",
  89. "treeId": "1273174971675750402",
  90. "processStartAfterHandler": "",
  91. "noticeTypes": "getui,weixin",
  92. "actDefId": "purchaseFlow:2:1290178521089359874",
  93. "name": "采购订单",
  94. "varConfigs": [
  95. {
  96. "uid": "AFZZS9DL3HHLU1B09OPISH97IJT53X20",
  97. "expression": "",
  98. "field": "purchaseOrder.lx",
  99. "datatype": "varchar",
  100. "label": "类型",
  101. "key": "lx"
  102. },
  103. {
  104. "uid": "GSG29FZ8UIN3WKF3VYI3LTPZ75I8E12P",
  105. "expression": "",
  106. "field": "purchaseOrder.je",
  107. "datatype": "number",
  108. "label": "金额",
  109. "key": "je"
  110. }
  111. ],
  112. "processStartPreHandlerName": "",
  113. "status": "DEPLOYED",
  114. "mainDefId": "1290178520925782017",
  115. "subjectRule": "{流程方案名称}-由{创建人}创建于{创建时间}",
  116. "pkId": "1290178520925782017",
  117. "buttonConfigs": [],
  118. "processStartAfterHandlerName": "",
  119. "startForm": {
  120. "formpc": [
  121. {
  122. "boAlias": "purchaseOrder",
  123. "name": "采购单",
  124. "alias": "purchaseOrder",
  125. "permission": ""
  126. }
  127. ],
  128. "mobile": [
  129. {
  130. "boAlias": "purchaseOrder",
  131. "name": "采购单",
  132. "alias": "purchaseOrder",
  133. "permission": "{}",
  134. "id": "1290175530450284546"
  135. }
  136. ]
  137. },
  138. "globalForm": {
  139. "formpc": [
  140. {
  141. "boAlias": "purchaseOrder",
  142. "name": "采购单",
  143. "alias": "purchaseOrder",
  144. "permission": ""
  145. }
  146. ],
  147. "mobile": [
  148. {
  149. "boAlias": "purchaseOrder",
  150. "name": "采购单",
  151. "alias": "purchaseOrder",
  152. "permission": "{}",
  153. "id": "1290175530450284546"
  154. }
  155. ]
  156. },
  157. "descp": "",
  158. "startNodeOptions": [
  159. "skipFirstNode",
  160. "startConfirm"
  161. ],
  162. "bpmSolFvConfings": {
  163. "solFvData": {},
  164. "label": "全局节点",
  165. "key": "globalForm"
  166. },
  167. "dataSetting": {},
  168. "updateBy": "1",
  169. "taskCompleteCopyConfig": [],
  170. "key": "purchaseFlow",
  171. "processStartPreHandler": "",
  172. "tableFormula": {},
  173. "remindDefs": [],
  174. "updateTime": "2020-08-13 16:04:17",
  175. "taskStartCopyConfig": [
  176. {
  177. "uid": "KXYTQ8FN0DB0V27WDOT3B4UVJQR50UEM",
  178. "condition": "",
  179. "name": "人员配置",
  180. "infoTypes": "getui",
  181. "configList": [
  182. {
  183. "display": "发起人",
  184. "calcType": "no",
  185. "logic": "or",
  186. "type": "starter",
  187. "config": "发起人",
  188. "currentComponet": "starterEdit"
  189. }
  190. ]
  191. }
  192. ],
  193. "createBy": "1",
  194. "jumpSkipOptions": {
  195. "expression": "",
  196. "type": [
  197. "sameNode",
  198. "noCondition"
  199. ]
  200. },
  201. "createTime": "2020-08-03 14:48:46"
  202. },

关键属性作用描述

属性名 功能描述 示例值
detailForm 流程节点的明细表单,包括pc与mobile两端的表单的配置  
startForm 流程节点的开始表单,包括pc与mobile两端的表单的配置  
globalForm 流程全局的表单,包括pc与mobile两端的表单的配置  
boDefs 流程绑定的业务模型,流程中能使用哪些单据,即由其设置的业务对象来决定 “boDefs”: { “text”: “采购单”, “value”: “purchaseOrder” },
subjectRuleData 流程的标题规则,可以设置流程事项的标题,可由固定值与单据字段或流程变量动态生成  
noticeTemplate 通知的消息模块  
processEndCopyConfig 流程结束的抄送配置  
endProcessScript 流程结束时调用的脚本(Groovy Script)  
events 流程的调用事件,包括流程启动、流程完成,全局的任务创建,全局流程完成  
varConfigs 流程全局的变量配置,其值一般来自单据的字段  
processEndHandler 流程结束时调用的处理器,需要实现ProcessHandler的接口  
processStartAfterHandler 流程启动时调用的处理器,需要实现ProcessHandler的接口  
noticeTypes 消息通用类型,如短信,个推,企业微信 getui,weixin
buttonConfigs 流程启动界面的操作按钮配置  
startNodeOptions 流程启动的开关配置 跳过第一个节点=skipFirstNode 启动需要确认=startConfirm 启动可填写意见=fillOpinion 指定下一步用户=assignFlowUsers
dataSetting 为流程操作单据时,可对单据的业务对象进行一些字段值的数据更改  
taskCompleteCopyConfig 流程任务完成后的抄送配置  
taskStartCopyConfig 流程任务开始时的抄送配置  
tableFormula 任务完成时执行的表间公式  
remindDefs 任务的催办配置  
jumpSkipOptions 任务跳过的配置  

2.2.1.2. 获取配置类

通过流程定义Id可获取流程级的配置,如下所示:

ProcessConfig processConfig = bpmDefService.getProcessConfig(actDefId);

2.2.2. 任务节点属性配置:

2.2.2.1. JSON 属性定义

任务节点的属性配置定义示例如下所示:

  1. "UserTask_0e0aixm": {
  2. "allowScript": "",
  3. "backOptions": [
  4. "BACK",
  5. "BACK_TO_STARTOR"
  6. ],
  7. "allowTipInfo": "",
  8. "dbclick": true,
  9. "taskAfterHandlerName": "",
  10. "startCopyConfig": [],
  11. "bpmSolFvConfings": {
  12. "solFvData": {},
  13. "key": "UserTask_0e0aixm"
  14. },
  15. "dataSetting": {},
  16. "userConfigs": [
  17. {
  18. "uid": "I77W7P5W6SSBI0R28YGPMRPQF7FQQER4",
  19. "condition": "",
  20. "name": "人员配置",
  21. "configList": [
  22. {
  23. "display": "智慧科技",
  24. "calcType": "no",
  25. "logic": "or",
  26. "type": "group",
  27. "config": "2",
  28. "currentComponet": "groupEdit"
  29. }
  30. ]
  31. }
  32. ],
  33. "multipleType": "normal",
  34. "noticeTemplate": {},
  35. "id": "UserTask_0e0aixm",
  36. "taskPreHandler": "",
  37. "key": "UserTask_0e0aixm",
  38. "events": [],
  39. "taskAfterHandler": "",
  40. "orderNo": 60,
  41. "buttons": [],
  42. "signConfig": {
  43. "finishCondition": "",
  44. "votePrivileges": [],
  45. "calOption": "voteCount",
  46. "voteCount": 1,
  47. "finishOption": "waitAllVoted",
  48. "voteOption": "AGREE",
  49. "completeType": "TICKETS",
  50. "finishExecute": ""
  51. },
  52. "tableFormula": {},
  53. "remindDefs": [],
  54. "nodeType": "bpmn:UserTask",
  55. "taskPreHandlerName": "",
  56. "parentId": "purchaseFlow",
  57. "noticeTypes": "",
  58. "form": {},
  59. "jumpSkipOptions": {
  60. "expression": "",
  61. "type": ""
  62. },
  63. "jumpRules": [],
  64. "completeCopyConfig": [],
  65. "name": "C",
  66. "varConfigs": [],
  67. "switchOptions": []
  68. },

任务级属性定义说明:

属性名 功能描述 示例值
allowScript 检查当前的任务是否允许执行的判断脚本,Groovy脚本  
backOptions 回退选择项,即某个节点是否允许回退 BACK 回退上一步 BACK_TO_STARTOR 回退至发起人 BACK_SPEC 回退至某审批节点
taskPreHandlerName 任务完成的前置处理器,实现ProcessHandler接口  
taskAfterHandlerName 任务完成的前置处理器,实现ProcessHandler接口  
dataSetting 为流程操作单据时,可对单据的业务对象进行一些字段值的数据更改 由界面进行配置
userConfigs 节点人员配置,可由多个人员配置组成,实现不同的人员查找  
multipleType 多实例类型 normal为普通任务 parallel为并行 sequential为串行
noticeTemplate 通知模板  
events 事件调用配置,任务创建,任务完成事件  
buttons 审批单据的按钮配置  
signConfig 当multipleType为并行或串行任务时,才进行该属性的配置,具体参考会签的配置  
tableFormula 表间公式,流程任务在完成任务事项时触发表间公式的调用  
remindDefs 催办定义,定义节点的催办事项等  
noticeTypes 通知类型,可动态扩展,支持微信,邮件,内部消息,短信等  
jumpSkipOptions 跳过配置,支持动态的跳过配置管理 sameFollowNodeUser=相邻节点相同用户审批 noCondition=不需要条件直接跳过 onceUserCheck=当前用户曾审批 checkedByFormVars=根据表单变量判断
jumpRules 任务的跳转规则,支持任务的跳过处理  
varConfigs 变量配置,支持在节点上进行一些任务级别的变量配置  
switchOptions 任务节点一些开关参数配置 allowDefButtons=允许自定义审批按钮 allowPrintForm=允许打印表单 allowSelectExecutor=允许选择执行人 allowExecutorNull=允许执行人为空

2.2.2.2. 获取节点级的配置

  1. UserTaskConfig userTaskConfig= (UserTaskConfig) bpmDefService.getNodeConfig(execution.getProcessDefinitionId(),execution.getCurrentActivityId());

2.3. 单据配置

单据的配置请参考流程级与任务级的,若任务配置了单据,则优先使用任务级的配置。其配置格式如下所示:

  1. "detailForm": {
  2. "formpc": [
  3. {
  4. "boAlias": "purchaseOrder",
  5. "name": "采购单",
  6. "alias": "purchaseOrder",
  7. "permission": ""
  8. }
  9. ],
  10. "mobile": [
  11. {
  12. "boAlias": "purchaseOrder",
  13. "name": "采购单",
  14. "alias": "purchaseOrder",
  15. "permission": "{}",
  16. "id": "1290175530450284546"
  17. }
  18. ]
  19. }

说明:
boAlias:代表该单据绑定的BO实体的别名
alias:为单据的别名
name:为单据的名称
permission:单据在不同的地方有字段、按钮、子表的数据权限,其格式如下所示:

  1. {
  2. "subtableRights": [
  3. {
  4. "name": "采购单明细",
  5. "alias": "purchaseOrderItem",
  6. "type": "all",
  7. "setting": ""
  8. }
  9. ],
  10. "tabBtn": {},
  11. "sub": {
  12. "purchaseOrderItem": {
  13. "subTabBtn": {
  14. "add": {
  15. "edit_name": "无权限",
  16. "edit": "none",
  17. "name": "添加",
  18. "alias": "add",
  19. "type": "default",
  20. "openType": "inner"
  21. },
  22. "removeExist": {
  23. "edit_name": "所有人",
  24. "edit": "everyone",
  25. "name": "删除已添加",
  26. "alias": "removeExist",
  27. "type": "default"
  28. },
  29. "up": {
  30. "edit_name": "无权限",
  31. "edit": "none",
  32. "name": "上移",
  33. "alias": "up",
  34. "type": "default",
  35. "openType": "inner"
  36. },
  37. "down": {
  38. "edit_name": "无权限",
  39. "edit": "none",
  40. "name": "下移",
  41. "alias": "down",
  42. "type": "default",
  43. "openType": "inner"
  44. },
  45. "remove": {
  46. "edit_name": "无权限",
  47. "edit": "none",
  48. "name": "删除",
  49. "alias": "remove",
  50. "type": "default",
  51. "openType": "inner"
  52. }
  53. },
  54. "subAttr": {
  55. "cpbm": {
  56. "edit_name": "无权限",
  57. "read": "everyone",
  58. "require_name": "所有人",
  59. "edit": "none",
  60. "name": "产品编码",
  61. "alias": "cpbm",
  62. "require": "everyone",
  63. "read_name": "所有人"
  64. },
  65. "mc": {
  66. "edit_name": "无权限",
  67. "read": "everyone",
  68. "require_name": "所有人",
  69. "edit": "none",
  70. "name": "名称",
  71. "alias": "mc",
  72. "require": "everyone",
  73. "read_name": "所有人"
  74. },
  75. "sl": {
  76. "edit_name": "无权限",
  77. "read": "everyone",
  78. "require_name": "所有人",
  79. "edit": "none",
  80. "name": "数量",
  81. "alias": "sl",
  82. "require": "everyone",
  83. "read_name": "所有人"
  84. },
  85. "jg": {
  86. "edit_name": "无权限",
  87. "read": "everyone",
  88. "require_name": "所有人",
  89. "edit": "none",
  90. "name": "价格",
  91. "alias": "jg",
  92. "require": "everyone",
  93. "read_name": "所有人"
  94. }
  95. }
  96. }
  97. },
  98. "main": {
  99. "dh": {
  100. "edit_name": "无权限",
  101. "read": "everyone",
  102. "require_name": "所有人",
  103. "edit": "none",
  104. "name": "单号",
  105. "alias": "dh",
  106. "require": "everyone",
  107. "read_name": "所有人"
  108. },
  109. "fj": {
  110. "edit_name": "无权限",
  111. "read": "everyone",
  112. "require_name": "所有人",
  113. "edit": "none",
  114. "name": "附件",
  115. "alias": "fj",
  116. "require": "everyone",
  117. "read_name": "所有人"
  118. },
  119. "bz": {
  120. "edit_name": "无权限",
  121. "read": "everyone",
  122. "require_name": "所有人",
  123. "edit": "none",
  124. "name": "备注",
  125. "alias": "bz",
  126. "require": "everyone",
  127. "read_name": "所有人"
  128. },
  129. "je": {
  130. "edit_name": "无权限",
  131. "read": "everyone",
  132. "require_name": "所有人",
  133. "edit": "none",
  134. "name": "金额",
  135. "alias": "je",
  136. "require": "everyone",
  137. "read_name": "所有人"
  138. },
  139. "lx": {
  140. "edit_name": "无权限",
  141. "read": "everyone",
  142. "require_name": "所有人",
  143. "edit": "none",
  144. "name": "类型",
  145. "alias": "lx",
  146. "require": "everyone",
  147. "read_name": "所有人"
  148. },
  149. "cgr": {
  150. "edit_name": "无权限",
  151. "read": "everyone",
  152. "require_name": "所有人",
  153. "edit": "none",
  154. "name": "采购人",
  155. "alias": "cgr",
  156. "require": "everyone",
  157. "read_name": "所有人"
  158. }
  159. }
  160. }

2.4. 事件配置

平台扩展流程事件包括:

事件Key 触发时机 备注
TASK_CREATED 任务创建 配置于任务节点属性,由任务创建时触发
TASK_COMPLETED 任务完成 配置于任务节点属性,由任务完成时触发
PROCESS_STARTED 流程启动 配置于流程属性,由流程启动时触发
PROCESS_COMPLETED 流程完成 配置于流程属性,由流程结束完成时触发
GLOBAL_TASK_CREATE 全局任务创建 配置于流程属性,配置后,即表示该节点所有的任务节点在创建时都会触发该事件调用
GLOBAL_TASK_COMPLETE 全局任务完成 配置于流程属性,配置后,即表示该节点所有的任务节点在完成时都会触发该事件调用

平台在每个级别上的事件允许用户定义不同的外部调用方式,包括有:

2.4.1. Activiti的流程事件:

扩展的流程事件需要由Activiti的流程事件来触发,因此需要在Activiti的对应的事件监听器中进行以上流程事件的配置与调用,平台提供了以下Activiti的流程事件监听处理器。

在Activiti的引擎构建入口中,加上注流程级的全局事件监听:

  1. package com.redxun.bpm.config;
  2. /**
  3. * Activiti流程引擎构建配置入口
  4. * @author csx
  5. * @since 1.0
  6. */
  7. @Configuration
  8. public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration {
  9. @Bean
  10. @Primary
  11. public SpringProcessEngineConfiguration springProcessEngineConfiguration(
  12. PlatformTransactionManager transactionManager,
  13. SpringAsyncExecutor springAsyncExecutor,
  14. ActivitiProperties activitiProperties,
  15. @Autowired(required = false) DefaultActivityBehaviorFactoryMappingConfigurer processEngineConfigurationConfigurer,
  16. @Autowired(required = false) List<ProcessEngineConfigurator> processEngineConfigurators,
  17. UserGroupManager userGroupManager,
  18. @Qualifier(DataSourceUtil.GLOBAL_DATASOURCE) DataSource dataSource) throws IOException {
  19. SpringProcessEngineConfiguration conf = new SpringProcessEngineConfiguration();
  20. conf.setConfigurators(processEngineConfigurators);
  21. conf.setDataSource(dataSource);
  22. conf.setTransactionManager(transactionManager);
  23. //加入事件监听
  24. // 忽略部分代码...
  25. //加上全局事件的控制
  26. List<ActivitiEventListener> eventListeners=new ArrayList<>();
  27. eventListeners.add(new GlobalEventListener());
  28. conf.setEventListeners(eventListeners);
  29. return conf;
  30. }
  31. }

2.4.2. Activiti的全局事件监听器

通过全局的事件监听器实现不同的事件调用不同的处理器,在不同的事件处理器中,调用流程级或任务节点级的事件配置,执行不同的任务操作,如执行SQL,执行Groovy脚本,执行外部的WebService接口等。

  1. package com.redxun.bpm.activiti.event;
  2. import com.redxun.bpm.activiti.event.handler.*;
  3. import org.activiti.engine.delegate.event.ActivitiEvent;
  4. import org.activiti.engine.delegate.event.ActivitiEventListener;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. /**
  10. * 全局事件监听器
  11. * @author csx
  12. *
  13. */
  14. public class GlobalEventListener implements ActivitiEventListener {
  15. private Logger logger= LoggerFactory.getLogger(GlobalEventListener.class);
  16. //事件类型,处理器映射
  17. Map<String, EventHandler> eventTypes=new HashMap<>();
  18. public GlobalEventListener(){
  19. initEventHandlers();
  20. }
  21. @Override
  22. public void onEvent(ActivitiEvent event) {
  23. String eventType=event.getType().name();
  24. //加上监听事件处理
  25. EventHandler handler=eventTypes.get(eventType);
  26. if(handler!=null){
  27. handler.handle(event);
  28. }
  29. }
  30. @Override
  31. public boolean isFailOnException() {
  32. return true;
  33. }
  34. /**
  35. * 初始化事件处理器
  36. */
  37. public void initEventHandlers(){
  38. //注册流程实例创建事件处理器
  39. eventTypes.put(EventType.PROCESS_STARTED.name(), new ProcessStartedEventHandler());
  40. //注册流程实例完成结束事件处理器
  41. eventTypes.put(EventType.PROCESS_COMPLETED.name(),new ProcessCompletedEventHandler());
  42. //注册流程任务创建事件处理器
  43. eventTypes.put(EventType.TASK_CREATED.name(),new TaskCreatedEventHandler());
  44. //注册流程任务完成事件处理器
  45. eventTypes.put(EventType.TASK_COMPLETED.name(),new TaskCompletedEventHandler());
  46. //注册流程活动开始事件处理器
  47. eventTypes.put(EventType.ACTIVITY_STARTED.name(),new ActivityStartedEventHandler());
  48. //注册流程活动结束事件处理器
  49. eventTypes.put(EventType.ACTIVITY_COMPLETED.name(),new ActivityCompletedEventHandler());
  50. }
  51. }

2.4.3. 流程级事件调用

流程级的事件调用指的是流程的创建事件与流程结束事件,在设计器中设计时,配置的界面如下:


添加流程级的事件


流程级的事件配置

2.4.3.1. JSON配置

  1. "events": [
  2. {
  3. "eventConfigs": [
  4. {
  5. "async": "true",
  6. "handerTypeName": "脚本",
  7. "action": "AGREE",
  8. "description": "调用脚本推送采购订单至SAP",
  9. "handerType": "script",
  10. "config": {
  11. "dsAlias": "",
  12. "script": "processScript.doPurchaseOrder(purchaseOrder_lx,purchaseOrder_je,\r\npurchaseOrder_dh);"
  13. }
  14. }
  15. ],
  16. "eventType": {
  17. "name": "流程启动",
  18. "id": "PROCESS_STARTED"
  19. }
  20. },
  21. {
  22. "eventConfigs": [],
  23. "eventType": {
  24. "name": "流程完成",
  25. "id": "PROCESS_COMPLETED"
  26. }
  27. },
  28. {
  29. "eventConfigs": [],
  30. "eventType": {
  31. "name": "全局任务创建",
  32. "id": "GLOBAL_TASK_CREATE"
  33. }
  34. },
  35. {
  36. "eventConfigs": [],
  37. "eventType": {
  38. "name": "全局任务完成",
  39. "id": "GLOBAL_TASK_COMPLETE"
  40. }
  41. }
  42. ],

以上的事件配置调用的类型可以进行选择,如SQL,Groovy脚本,调用WebService接口。

不同类型的事件调用器扩展如下所示:

  • ScriptEventHandler为脚本调用处理器
  • SqlEventHandler为SQL执行调用处理器
  • WebReqEventHandler为WebService的执行调用处理器

2.4.3.2. 节点级的事件调用

节点级的事件调用也类似流程级的事件调用,在线设计器选中某一任务节点时,也通过以下界面进行不同事件级的配置调用:

事件调用的方式也流程级的事件调用方式一致。

2.5. 按钮配置

按钮配置也分为流程级与任务级的按钮配置,分别代表流程启动时的功能按钮与任务办理的功能按钮。系统提供默认的功能配置,非默认的配置允许用户手工添加,但点击的事件代码则需要在单据与流程进行扩展定义。

2.5.1.JSON配置

系统对按钮的存储格式如下:

  1. "buttons": [
  2. {
  3. "uid": "CKB1U75C2WLVP4OKB32B7HEZO7ZFT9UN",
  4. "closeable": false,
  5. "editable": false,
  6. "name": "审批",
  7. "icon": "icon-approve",
  8. "jsMethod": "approve",
  9. "id": "btnApprove",
  10. "type": "primary"
  11. },
  12. {
  13. "uid": "ILQ5B600ETU7BJCTU10CCGLQNXLACMG9",
  14. "closeable": true,
  15. "editable": false,
  16. "name": "锁定",
  17. "icon": "icon-addSign",
  18. "jsMethod": "doLock",
  19. "id": "btnLock",
  20. "type": "default"
  21. },
  22. {
  23. "uid": "3PCKZTW7C5A3S4R1O16IEXS6MJU7K82T",
  24. "closeable": true,
  25. "editable": false,
  26. "name": "驳回",
  27. "icon": "icon-reject",
  28. "jsMethod": "reject",
  29. "id": "btnReject",
  30. "type": "default"
  31. },
  32. {
  33. "uid": "MMFT9A2GBWEZROOFO43MH33DOD27IQND",
  34. "closeable": false,
  35. "editable": false,
  36. "name": "转办",
  37. "icon": "icon-transfer",
  38. "jsMethod": "doTransfer",
  39. "id": "btnTransfer",
  40. "type": "default"
  41. },
  42. {
  43. "uid": "8VKBQQ2WW1FEOHQOCJ0E5LLD47ONQ2TB",
  44. "closeable": false,
  45. "editable": false,
  46. "name": "沟通",
  47. "icon": "icon-communicate",
  48. "jsMethod": "communicate",
  49. "id": "btnCommu",
  50. "type": "default"
  51. },
  52. {
  53. "uid": "KEKXKK5A6MVLBED8A31R3BXAG30PP84K",
  54. "closeable": true,
  55. "editable": false,
  56. "name": "作废",
  57. "icon": "icon-discard",
  58. "jsMethod": "doDiscard",
  59. "id": "btnDiscard",
  60. "type": "danger"
  61. },
  62. {
  63. "uid": "3NDDULB0OY807UPV2KJ1YGHWQSRTYF9L",
  64. "closeable": true,
  65. "editable": false,
  66. "name": "打印",
  67. "icon": "icon-print",
  68. "jsMethod": "doPrint",
  69. "id": "btnPrint",
  70. "type": "default"
  71. },
  72. {
  73. "uid": "VGYO15XW7A2OA9U0WI4CO9E57MPIAPLH",
  74. "closeable": true,
  75. "editable": false,
  76. "name": "保存",
  77. "icon": "icon-save",
  78. "jsMethod": "doSaveData",
  79. "id": "btnSave",
  80. "type": "default"
  81. },
  82. {
  83. "uid": "P2KBWO2BSPWIKFTCKTL1LH7DWTI3HAXA",
  84. "closeable": false,
  85. "editable": false,
  86. "name": "流程图",
  87. "icon": "icon-flowImg",
  88. "jsMethod": "doFlowImg",
  89. "id": "btnFlowImg",
  90. "type": "default"
  91. },
  92. {
  93. "uid": "12XF2LQ3N6JD05QUHFLJOCTOPXW86SDW",
  94. "closeable": false,
  95. "editable": false,
  96. "name": "审批历史",
  97. "icon": "icon-history",
  98. "jsMethod": "doHistory",
  99. "id": "btnHistory",
  100. "type": "default"
  101. },
  102. {
  103. "uid": "BGA1SD5WC9APRZ9PQ3BC17NSKK2YC7YX",
  104. "closeable": true,
  105. "editable": false,
  106. "name": "留言",
  107. "icon": "icon-message",
  108. "jsMethod": "doMessage",
  109. "id": "btnMessage",
  110. "type": "default"
  111. }
  112. ],

以上的按钮的事件调用均定义于jpaas_bpm_desinger的前端项目TaskToolBar.vue与ProcessToolBar.vue中。

2.6. 催办配置

2.6.1. JSON配置

在流程任务节点中,配置存储格式如下所示:

  1. "remindDefs": [
  2. {
  3. "sendInterval": {
  4. "hour": 0,
  5. "day": "2",
  6. "minute": 0
  7. },
  8. "sendTimes": 2,
  9. "script": "SysFunApi.compareDays(SysFunApi.getCurDate(),checkDate)",
  10. "uid": "NHCWV2NN7BTUBH90ZD9VVB4SQ7YN3T4B",
  11. "condition": "purchaseOrder.je > 0",
  12. "dateType": "CALENDAR",
  13. "notifyType": "getui,weixin,mail",
  14. "name": "定期1天催办",
  15. "timeToSend": {
  16. "hour": 0,
  17. "day": "10",
  18. "minute": 0
  19. },
  20. "timeLimitHandler": "",
  21. "action": "approve",
  22. "expireDate": {
  23. "hour": 0,
  24. "day": "1",
  25. "minute": 0
  26. },
  27. "event": "TASK_CREATED"
  28. }
  29. ],

界面配置如下:

2.6.2. 任务催办的后台逻辑处理

说明:

  1. 在全局的任务创建事件中,TaskCreatedEventHandler 中发布TaskCreateApplicationEvent事件
  2. ReminderListener监听该事件,根据节点催办配置实现催办实例的插入
  3. RemindJob通过BpmRemindInstService获取过期与未过期的任务,调用本身的办法发送消息进行相关人员的催办处理

2.7. 会签配置

会签是用于流程多实例的任务节点中,可实现同一任务多人同时办理或分步办理,平台可以设置会签的投标规则与跳出的条件设置,设置的格式如下所示:

2.7.1. JSON配置

  1. "signConfig": {
  2. "finishCondition": "",
  3. "votePrivileges": [],
  4. "calOption": "voteCount",
  5. "voteCount": 1,
  6. "finishOption": "waitAllVoted",
  7. "voteOption": "AGREE",
  8. "completeType": "TICKETS",
  9. "finishExecute": ""
  10. },

参数说明:

  • finishCondition:完成的条件脚本
  • calOption:计算选项,按票数还是百分比
  • voteCount:投票数量值
  • finishOption:完成选项,是等待所有投票,还是达到条件往下执行
  • voteOption: 计算的投票类型
  • completeType:完成计算的类型,
  • finishExecute:完成后执行的脚本

2.8. 人员配置

人员配置是任务节点在创建时,需要动态根据配置项计算出来的人员,并且把人员分配给用户任务的配置信息,它支持:

  • 按条件的人员查找规则
  • 不同的用户集合进行与或非运算
  • 支持不同的人员查找策略算法
  • 支持用户组及是否计算到人员

2.8.1. 人员配置项定义

2.8.1.1. JSON配置

  1. "userConfigs": [
  2. {
  3. "uid": "QXXDHCL4IQC1R1WKY6ZZ39WHIP6UIQ8B",
  4. "condition": "",
  5. "name": "人员配置",
  6. "configList": [
  7. {
  8. "display": "发起人",
  9. "calcType": "yes",
  10. "logic": "or",
  11. "type": "starter",
  12. "config": "发起人",
  13. "currentComponet": "starterEdit"
  14. },
  15. {
  16. "display": "郭靖,黄蓉",
  17. "calcType": "yes",
  18. "logic": "or",
  19. "type": "user",
  20. "config": "1273526648723415041,1273526443793915905",
  21. "currentComponet": "userEdit"
  22. },
  23. {
  24. "display": "财务部,研发部",
  25. "calcType": "yes",
  26. "logic": "or",
  27. "type": "group",
  28. "config": "1273526190164353025,1273526098128740353",
  29. "currentComponet": "groupEdit"
  30. }
  31. ]
  32. }
  33. ],

2.8.1.2. 界面展示

2.9. 跳转规则配置

用于处理流程非常规的任务跳转处理,如任务节点在满足一条件时,让任务直接跳至结束,尽管流程节点没有画连接至结束节点。它能让一些非正规流程任务的跳转变得灵活,而且不会对流程定义进行修改,影响了其他流程实例。

2.9.1. JSON存储

在定义上扩展如下所示:

  1. "jumpRules": [
  2. {
  3. "destNodeId": "UserTask_0e0aixm",
  4. "uid": "FXOF0HC9PMAO5FR20A2C7NE13VQ79E40",
  5. "scriptConfig": "purchaseOrder.je > 2000",
  6. "name": "跳至总经理",
  7. "destNodeName": "总经理审批"
  8. }
  9. ],

说明:

scriptConfig:为满足条件脚本则跳至目标节点destNodeId对应的节点

2.9.2. 配置界面:

2.10. 抄送配置

系统支持流程开始、结束、任务开始、结束时均可以产生对应的一些基于微信、邮件、内部消息、个推等消息的抄送。

2.10.1. JSON存储

  1. "startCopyConfig": [
  2. {
  3. "uid": "QQ0U7AU0RX71US0BOQLU2AD0URGB1V9V",
  4. "condition": "",
  5. "name": "人员配置",
  6. "configList": [
  7. {
  8. "display": "xxx",
  9. "calcType": "no",
  10. "logic": "or",
  11. "type": "group",
  12. "config": "1284391456728883201",
  13. "currentComponet": "groupEdit"
  14. }
  15. ]
  16. }
  17. ],
  18. "completeCopyConfig": [
  19. {
  20. "uid": "53ZE6D9O5HWD44E8EE50KZFAZ5O26YUR",
  21. "condition": "",
  22. "name": "人员配置",
  23. "infoTypes": "getui,weixin,mail",
  24. "configList": [
  25. {
  26. "display": "黄蓉,郭芙蓉",
  27. "calcType": "no",
  28. "logic": "or",
  29. "type": "user",
  30. "config": "1273526443793915905,1273499857644363777",
  31. "currentComponet": "userEdit"
  32. }
  33. ]
  34. }
  35. ],

2.10.2. 界面配置:

文档更新时间: 2020-08-16 15:22   作者:csx