OA 系统工作流引擎 Camunda 实践(2)

再把一部分流程相关的表和代码做一下开源和解释,有疑问的评论

 

 

 

Camunda引擎流转信息

 

 

Camunda引擎结合OA业务系统整体流程信息

 

 

 

 

 

一个业务案例在系统中交互流向

 

 

 

 

介绍流程逻辑对应关系

一个流程关联一个业务表单;流程定义可以对应员工、角色、部门等;流程发起人可以是多个员工和多个角色;流程节点的审核人可以是多个员工、多个角色、多个主管、多个表单联系人和多个自选用户;执行人可以是多个员工、多个角色、多个表单联系人和多个自选用户;抄送人可以是多个员工、多个角色、多个表单联系人和多个自选用户;

员工或者有该角色的用户可以查询该流程定义;

流程实例的节点只对应到员工,流程发起的时候,需要把角色、部门等细化到员工身上。通过一些外部接口解决这个问题,通过发起人id获取部门主管用户集合;通过角色获取用户集合;通过发起人id和连续级别获取主管用户集合;

 

 

 

 

 

 

 

除了Camunda自身的表,还需要建立一些存储流程相关的基础数据表,如下

 

  1 SET NAMES utf8mb4;
  2 SET FOREIGN_KEY_CHECKS = 0;
  3 
  4 -- ----------------------------
  5 -- Table structure for jbpm_approval_process_record
  6 -- ----------------------------
  7 DROP TABLE IF EXISTS `jbpm_approval_process_record`;
  8 CREATE TABLE `jbpm_approval_process_record`  (
  9   `id` bigint NOT NULL COMMENT '主键',
 10   `business_process_id` bigint NULL DEFAULT NULL COMMENT '业务数据和流程实例关系表id',
 11   `process_instance_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程实例id',
 12   `task_def_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务节点key',
 13   `approval_node` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批节点(发起人、审核人、执行人、抄送人)',
 14   `audit_method` int NULL DEFAULT NULL COMMENT '审批方式(0=自己,1=或签,2=会签,3=顺序签)',
 15   `approval_node_list` json NULL COMMENT '审批节点详情列表(用户id,用户姓名,审批状态【审核中,已通过,已拒绝,转交,撤回】,转交人json,操作时间,备审批注)',
 16   `task_is_end` int NULL DEFAULT 0 COMMENT '任务节点是否结束(0=否,1=是)',
 17   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
 18   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
 19   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
 20   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
 21   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
 22   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
 23   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
 24   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
 25   PRIMARY KEY (`id`) USING BTREE,
 26   INDEX `business_process_id`(`business_process_id`) USING BTREE,
 27   INDEX `process_instance_id`(`process_instance_id`) USING BTREE,
 28   INDEX `task_def_key`(`task_def_key`) USING BTREE
 29 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '审批流程记录' ROW_FORMAT = Dynamic;
 30 
 31 -- ----------------------------
 32 -- Table structure for jbpm_business_draft
 33 -- ----------------------------
 34 DROP TABLE IF EXISTS `jbpm_business_draft`;
 35 CREATE TABLE `jbpm_business_draft`  (
 36   `id` bigint NOT NULL COMMENT '主键',
 37   `process_definition_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义key',
 38   `process_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程名称',
 39   `apply_user_id` bigint NULL DEFAULT NULL COMMENT '申请人id',
 40   `apply_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '申请人姓名',
 41   `dept_id` bigint NULL DEFAULT NULL COMMENT '部门id',
 42   `dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名称',
 43   `summary` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '摘要',
 44   `from_data_json` json NULL COMMENT '表单数据json',
 45   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
 46   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
 47   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
 48   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
 49   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
 50   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
 51   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
 52   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
 53   PRIMARY KEY (`id`) USING BTREE,
 54   INDEX `process_definition_key`(`process_definition_key`) USING BTREE,
 55   INDEX `apply_user_id`(`apply_user_id`) USING BTREE
 56 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '业务流程申请草稿' ROW_FORMAT = Dynamic;
 57 
 58 -- ----------------------------
 59 -- Table structure for jbpm_business_process
 60 -- ----------------------------
 61 DROP TABLE IF EXISTS `jbpm_business_process`;
 62 CREATE TABLE `jbpm_business_process`  (
 63   `id` bigint NOT NULL COMMENT '主键',
 64   `process_definition_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义key',
 65   `process_instance_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程实例id',
 66   `process_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程名称',
 67   `apply_user_id` bigint NULL DEFAULT NULL COMMENT '申请人id',
 68   `apply_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '申请人姓名',
 69   `dept_id` bigint NULL DEFAULT NULL COMMENT '部门id',
 70   `dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名称',
 71   `summary` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '摘要',
 72   `delivery_time` datetime(0) NULL DEFAULT NULL COMMENT '送达时间',
 73   `state` int NULL DEFAULT NULL COMMENT '流程状态(1=审核中,2=办理中,3=已同意,4=驳回,5=撤回,6=作废,7=已重新发起)',
 74   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
 75   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
 76   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
 77   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
 78   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
 79   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
 80   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
 81   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
 82   PRIMARY KEY (`id`) USING BTREE,
 83   INDEX `process_definition_key`(`process_definition_key`) USING BTREE,
 84   INDEX `process_instance_id`(`process_instance_id`) USING BTREE,
 85   INDEX `apply_user_id`(`apply_user_id`) USING BTREE,
 86   INDEX `state`(`state`) USING BTREE
 87 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '业务数据和流程实例关系表' ROW_FORMAT = Dynamic;
 88 
 89 -- ----------------------------
 90 -- Table structure for jbpm_business_read
 91 -- ----------------------------
 92 DROP TABLE IF EXISTS `jbpm_business_read`;
 93 CREATE TABLE `jbpm_business_read`  (
 94   `id` bigint NOT NULL COMMENT '主键',
 95   `business_process_id` bigint NULL DEFAULT NULL COMMENT '业务数据和流程实例关系表id',
 96   `user_id` bigint NULL DEFAULT NULL COMMENT '阅读用户id',
 97   `state` int NULL DEFAULT 0 COMMENT '阅读状态(0=未阅,1=已阅)',
 98   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
 99   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
100   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
101   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
102   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
103   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
104   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
105   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
106   PRIMARY KEY (`id`) USING BTREE,
107   INDEX `business_process_id`(`business_process_id`) USING BTREE,
108   INDEX `user_id`(`user_id`) USING BTREE
109 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '申请业务阅读表' ROW_FORMAT = Dynamic;
110 
111 -- ----------------------------
112 -- Table structure for jbpm_process_gateway_rule
113 -- ----------------------------
114 DROP TABLE IF EXISTS `jbpm_process_gateway_rule`;
115 CREATE TABLE `jbpm_process_gateway_rule`  (
116   `id` bigint NOT NULL COMMENT '主键',
117   `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY',
118   `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务定义key',
119   `node_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '网关节点名称',
120   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
121   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
122   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
123   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
124   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
125   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
126   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
127   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
128   PRIMARY KEY (`id`) USING BTREE,
129   INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE,
130   INDEX `TASK_DEF_KEY_`(`TASK_DEF_KEY_`) USING BTREE
131 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程网关定义规则表' ROW_FORMAT = Dynamic;
132 
133 -- ----------------------------
134 -- Table structure for jbpm_process_group
135 -- ----------------------------
136 DROP TABLE IF EXISTS `jbpm_process_group`;
137 CREATE TABLE `jbpm_process_group`  (
138   `id` bigint NOT NULL COMMENT '主键',
139   `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程分组名称',
140   `sort` int NULL DEFAULT NULL COMMENT '排序',
141   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
142   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
143   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
144   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
145   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
146   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
147   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
148   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
149   PRIMARY KEY (`id`) USING BTREE,
150   INDEX `name`(`name`) USING BTREE
151 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程分组表' ROW_FORMAT = Dynamic;
152 
153 -- ----------------------------
154 -- Table structure for jbpm_process_node_condition_rule
155 -- ----------------------------
156 DROP TABLE IF EXISTS `jbpm_process_node_condition_rule`;
157 CREATE TABLE `jbpm_process_node_condition_rule`  (
158   `id` bigint NOT NULL COMMENT '主键',
159   `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY',
160   `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务定义key',
161   `condition_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条件节点名称',
162   `table_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表名1',
163   `condition_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条件关键字1',
164   `operator` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作符(=,>,>=,<,<=,!=,区间)',
165   `target_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值',
166   `target_value1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值1(操作符是‘区间’时用)',
167   `target_value1_operator` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值1操作符(<,<=)(操作符是‘区间’时用)',
168   `target_value2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值2(操作符是‘区间’时用)',
169   `target_value2_operator` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值2操作符(<,<=)(操作符是‘区间’时用)',
170   `table_name_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表名2',
171   `condition_key_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条件关键字2',
172   `operator_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作符(=,>,>=,<,<=,!=,区间)',
173   `target_value_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值',
174   `target_value1_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值1(操作符是‘区间’时用)',
175   `target_value1_operator_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值1操作符(<,<=)(操作符是‘区间’时用)',
176   `target_value2_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值2(操作符是‘区间’时用)',
177   `target_value2_operator_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目标值2操作符(<,<=)(操作符是‘区间’时用)',
178   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
179   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
180   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
181   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
182   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
183   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
184   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
185   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
186   PRIMARY KEY (`id`) USING BTREE,
187   INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE,
188   INDEX `TASK_DEF_KEY_`(`TASK_DEF_KEY_`) USING BTREE
189 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程网关定义条件规则表' ROW_FORMAT = Dynamic;
190 
191 -- ----------------------------
192 -- Table structure for jbpm_process_node_rule
193 -- ----------------------------
194 DROP TABLE IF EXISTS `jbpm_process_node_rule`;
195 CREATE TABLE `jbpm_process_node_rule`  (
196   `id` bigint NOT NULL COMMENT '主键',
197   `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY',
198   `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务定义key',
199   `node_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '网关节点名称',
200   `audit_type` int NULL DEFAULT NULL COMMENT '审核人类型(0=指定用户,1=部门主管,2=角色,3=表单内联系人,4=连续主管,5=自选用户)',
201   `audit_method` int NULL DEFAULT NULL COMMENT '审批方式(0=自己,1=或签,2=会签,3=顺序签)',
202   `is_admin_audit` int NULL DEFAULT NULL COMMENT '是否管理员审批(0=无,1=自动通过,2=移交管理员)',
203   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
204   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
205   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
206   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
207   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
208   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
209   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
210   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
211   PRIMARY KEY (`id`) USING BTREE,
212   INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE,
213   INDEX `TASK_DEF_KEY_`(`TASK_DEF_KEY_`) USING BTREE
214 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程节点定义规则表' ROW_FORMAT = Dynamic;
215 
216 -- ----------------------------
217 -- Table structure for jbpm_process_node_user_rule
218 -- ----------------------------
219 DROP TABLE IF EXISTS `jbpm_process_node_user_rule`;
220 CREATE TABLE `jbpm_process_node_user_rule`  (
221   `id` bigint NOT NULL COMMENT '主键',
222   `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY',
223   `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务定义key',
224   `data_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据类型(user=用户id,role=角色id,form=表单内联系人字段,lianxuzhuguan=连续主管查询级别,required=是否必选)',
225   `data_value` varchar(5000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据值',
226   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
227   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
228   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
229   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
230   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
231   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
232   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
233   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
234   PRIMARY KEY (`id`) USING BTREE,
235   INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE,
236   INDEX `TASK_DEF_KEY_`(`TASK_DEF_KEY_`) USING BTREE
237 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程节点定义用户规则表' ROW_FORMAT = Dynamic;
238 
239 -- ----------------------------
240 -- Table structure for jbpm_process_role_rule
241 -- ----------------------------
242 DROP TABLE IF EXISTS `jbpm_process_role_rule`;
243 CREATE TABLE `jbpm_process_role_rule`  (
244   `id` bigint NOT NULL COMMENT '主键',
245   `role_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色id',
246   `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY',
247   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
248   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
249   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
250   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
251   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
252   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
253   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
254   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
255   PRIMARY KEY (`id`) USING BTREE,
256   INDEX `role_id`(`role_id`) USING BTREE,
257   INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE
258 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程定义角色规则表' ROW_FORMAT = Dynamic;
259 
260 -- ----------------------------
261 -- Table structure for jbpm_process_user_rule
262 -- ----------------------------
263 DROP TABLE IF EXISTS `jbpm_process_user_rule`;
264 CREATE TABLE `jbpm_process_user_rule`  (
265   `id` bigint NOT NULL COMMENT '主键',
266   `user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户id',
267   `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY',
268   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
269   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
270   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
271   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
272   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
273   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
274   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
275   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
276   PRIMARY KEY (`id`) USING BTREE,
277   INDEX `user_id`(`user_id`) USING BTREE,
278   INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE
279 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程定义用户规则表' ROW_FORMAT = Dynamic;
280 
281 -- ----------------------------
282 -- Table structure for jbpm_taskinstance_ext
283 -- ----------------------------
284 DROP TABLE IF EXISTS `jbpm_taskinstance_ext`;
285 CREATE TABLE `jbpm_taskinstance_ext`  (
286   `id` bigint NOT NULL COMMENT '主键',
287   `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY',
288   `PROC_DEF_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程定义ID',
289   `process_icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程图标',
290   `process_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程名称',
291   `process_group_id` bigint NULL DEFAULT NULL COMMENT '所属分组id',
292   `process_data_type_id` bigint NULL DEFAULT NULL COMMENT '数据类型id',
293   `process_state` int NULL DEFAULT 0 COMMENT '状态(0=启用,1=停用)',
294   `process_remark` varchar(900) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '流程说明',
295   `initator_auto` int NULL DEFAULT 0 COMMENT '发起人审批时自动通过(0=否,1=是)',
296   `is_draft` int NULL DEFAULT 0 COMMENT '是否草稿(0=否,1=是)',
297   `process_model_param_str` json NULL COMMENT '流程模型参数字符串,为了前端回显方便',
298   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
299   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
300   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
301   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
302   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
303   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
304   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
305   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
306   `sort` varchar(7) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '排序',
307   PRIMARY KEY (`id`) USING BTREE,
308   INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE,
309   INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE,
310   INDEX `process_name`(`process_name`) USING BTREE,
311   INDEX `process_group_id`(`process_group_id`) USING BTREE,
312   INDEX `updated_time`(`is_delete`, `sort`, `updated_time`) USING BTREE
313 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '流程实例与业务数据关系表' ROW_FORMAT = Dynamic;
314 
315 SET FOREIGN_KEY_CHECKS = 1;
View Code

 

流程业务需要的基础表数据关系。如下,和图片数据案例

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for core_dynamic_tables_field_config_record
-- ----------------------------
DROP TABLE IF EXISTS `core_dynamic_tables_field_config_record`;
CREATE TABLE `core_dynamic_tables_field_config_record`  (
  `id` bigint NOT NULL COMMENT '主键',
  `table_id` bigint NULL DEFAULT NULL COMMENT '表id',
  `table_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表名称',
  `field_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段名称',
  `field_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段类型',
  `column_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段类型及长度',
  `field_comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段注释',
  `field_sort` int NULL DEFAULT NULL COMMENT '字段排序',
  `default_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段默认值',
  `is_form_user` int NULL DEFAULT 0 COMMENT '是否表单用户(0=不是,1=是)',
  `is_condition` int NULL DEFAULT 0 COMMENT '是否条件判断字段',
  `field_select_type` int NULL DEFAULT 1000 COMMENT '字段选择类型(1000=其他,2000=用户,3000=数据字典,4000=部门,5000=假勤)',
  `field_select_type_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型值(数据字典key)',
  `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
  `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
  `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
  `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
  `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
  `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `table_id`(`table_id`) USING BTREE,
  INDEX `table_name`(`table_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1647039396373888069 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据表字段配置记录' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for core_dynamic_tables_record
-- ----------------------------
DROP TABLE IF EXISTS `core_dynamic_tables_record`;
CREATE TABLE `core_dynamic_tables_record`  (
  `id` bigint NOT NULL COMMENT '主键',
  `parent_id` bigint NULL DEFAULT NULL COMMENT '表父级id',
  `table_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表名称',
  `table_comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表注释',
  `table_module_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表模块名称',
  `is_flag` int NULL DEFAULT 0 COMMENT '是否标记(0=否,1=是)',
  `is_notice` int NULL DEFAULT 0 COMMENT '是否提醒(0=否,1=是)',
  `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
  `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
  `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
  `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
  `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
  `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `table_name`(`table_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据表配置记录' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for core_dynamic_tables_relation
-- ----------------------------
DROP TABLE IF EXISTS `core_dynamic_tables_relation`;
CREATE TABLE `core_dynamic_tables_relation`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `primary_table` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主表名',
  `child_table` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '子表名',
  `is_master` int NULL DEFAULT 0 COMMENT '是否主表',
  `table_sql` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '查询sql语句',
  `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
  `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
  `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
  `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
  `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
  `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `primary_table`(`primary_table`) USING BTREE,
  INDEX `child_table`(`child_table`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 45 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据表关系' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;
View Code

 

 

 

 

我再举一个业务例子请假表,如下 

 1 SET NAMES utf8mb4;
 2 SET FOREIGN_KEY_CHECKS = 0;
 3 
 4 -- ----------------------------
 5 -- Table structure for vacate
 6 -- ----------------------------
 7 DROP TABLE IF EXISTS `vacate`;
 8 CREATE TABLE `vacate`  (
 9   `id` bigint NOT NULL COMMENT '主键',
10   `apply_user_id` bigint NULL DEFAULT NULL COMMENT '申请人ID',
11   `apply_time` datetime(0) NULL DEFAULT NULL COMMENT '申请时间',
12   `vacate_type` bigint NULL DEFAULT NULL COMMENT '请假类型',
13   `start_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间',
14   `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间',
15   `duration` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请假时长',
16   `reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请假事由',
17   `attach_files` json NULL COMMENT '附件',
18   `status` int NULL DEFAULT NULL COMMENT '状态(1000=待审核,2000=已通过,3000=已驳回,4000=已作废,5000=已撤回)',
19   `hours` decimal(10, 2) NULL DEFAULT NULL COMMENT '剩余工时',
20   `is_active` int NULL DEFAULT NULL COMMENT '是否启用 1已启用 0 禁用',
21   `process_instance_id` VARCHAR(255)    COMMENT '流程实例ID' ,
22   `is_delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除(0=否,1=是)',
23   `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
24   `created_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
25   `updated_by` bigint NULL DEFAULT NULL COMMENT '更新人',
26   `updated_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
27   `deleted_by` bigint NULL DEFAULT NULL COMMENT '删除人',
28   `deleted_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',
29   `revision` bigint NULL DEFAULT NULL COMMENT '乐观锁',
30   PRIMARY KEY (`id`) USING BTREE,
31   INDEX `apply_user_id`(`apply_user_id`) USING BTREE COMMENT '申请人',
32   INDEX `status`(`status`) USING BTREE COMMENT '状态'
33 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '请假表' ROW_FORMAT = Dynamic;
34 
35 SET FOREIGN_KEY_CHECKS = 1;
View Code

 

 

系统代码例子:

 1 //新增流程定义
 2 @Override
 3     public void saveProcess(HashMap<String, Object> param, Long userId) {
 4         if (CollUtil.isEmpty(param)) {
 5             throw new LogicHandlerException("未获取到流程参数");
 6         }
 7         ProcessPOJO processPOJO = new ProcessPOJO();
 8         BeanUtil.copyProperties(param.get("process"), processPOJO);
 9 
10         // 自定义构建流程-没有流程图
11         JSONObject jsonObject = null;
12         try {
13             String bpmnXmlStr = camundaModelUtils.createExecutableProcess(param, userId);
14             jsonObject = new JSONObject();
15             jsonObject.set("processName", processPOJO.getProcessName());
16             jsonObject.set("bpmnXmlStr", bpmnXmlStr);
17         } catch (ModelValidationException e) {
18             throw new LogicHandlerException("流程设计有误,导致创建流程模型失败,请重新设计");
19         }
20 
21         // 部署流程
22         JSONObject jsonObject1 = camundaServiceUtils.deployProcess(jsonObject);
23         // 根据部署id查询流程定义
24         ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(jsonObject1.get("deploymentId", String.class)).singleResult();
25         // 更新流程定义id
26         LambdaUpdateWrapper<JbpmTaskinstanceExt> updateWrapper = Wrappers.lambdaUpdate(JbpmTaskinstanceExt.class);
27         updateWrapper.set(JbpmTaskinstanceExt::getProcDefId, processDefinition.getDeploymentId());
28         updateWrapper.eq(JbpmTaskinstanceExt::getProcDefKey, processDefinition.getKey());
29         taskinstanceExtService.update(updateWrapper);
30         log.info(JSONUtil.toJsonStr(jsonObject1));
31     }
32 
33 
34 
35 //修改流程定义
36 @Override
37     public void updateProcess(HashMap<String, Object> param, Long userId) {
38         if (CollUtil.isEmpty(param)) {
39             throw new LogicHandlerException("未获取到流程参数");
40         }
41         ProcessPOJO processPOJO = new ProcessPOJO();
42         BeanUtil.copyProperties(param.get("process"), processPOJO);
43         if (StrUtil.isBlank(processPOJO.getProcDefKey())) {
44             throw new LogicHandlerException("未获取到流程定义Key");
45         }
46 
47         LambdaQueryWrapper<JbpmBusinessProcess> lambdaQuery1 = Wrappers.lambdaQuery(JbpmBusinessProcess.class);
48         lambdaQuery1.eq(JbpmBusinessProcess::getIsDelete, false);
49         lambdaQuery1.in(JbpmBusinessProcess::getState, 1, 2);
50         lambdaQuery1.eq(JbpmBusinessProcess::getProcessDefinitionKey, processPOJO.getProcDefKey());
51         long count = jbpmBusinessProcessService.count(lambdaQuery1);
52         if (count > 0) {
53             throw new LogicHandlerException(StrUtil.format("该流程定义下存在{}个未通过的流程实例,不可修改。", count));
54         }
55         // 1、自定义构建流程-没有流程图
56         JSONObject jsonObject = null;
57         String bpmnXmlStr = "";
58         try {
59             bpmnXmlStr = camundaModelUtils.updateExecutableProcess(param, userId);
60             jsonObject = new JSONObject();
61             jsonObject.set("processName", processPOJO.getProcessName());
62             jsonObject.set("bpmnXmlStr", bpmnXmlStr);
63         } catch (ModelValidationException e) {
64             throw new LogicHandlerException("流程设计有误,导致创建流程模型失败,请重新设计");
65         }
66         // 更新流程模型文件
67         LambdaQueryWrapper<ActReProcdef> lambdaQuery3 = Wrappers.lambdaQuery(ActReProcdef.class);
68         lambdaQuery3.eq(ActReProcdef::getKey, processPOJO.getProcDefKey());
69         lambdaQuery3.last("LIMIT 1");
70         ActReProcdef one = actReProcdefService.getOne(lambdaQuery3);
71         if (ObjectUtil.isNotNull(one)) {
72             LambdaQueryWrapper<ActGeBytearray> lambdaQuery4 = Wrappers.lambdaQuery(ActGeBytearray.class);
73             lambdaQuery4.eq(ActGeBytearray::getDeploymentId, one.getDeploymentId());
74             ActGeBytearray actGeBytearray = ActGeBytearray.builder().build();
75             actGeBytearray.setBytes(bpmnXmlStr.getBytes(StandardCharsets.UTF_8));
76             actGeBytearrayService.update(actGeBytearray, lambdaQuery4);
77         }
78 
79         // 2、部署流程
80         JSONObject jsonObject1 = camundaServiceUtils.deployProcess(jsonObject);
81 
82         // 根据部署id查询流程定义
83         ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(jsonObject1.get("deploymentId", String.class)).singleResult();
84         // 更新流程定义id
85         LambdaUpdateWrapper<JbpmTaskinstanceExt> updateWrapper = Wrappers.lambdaUpdate(JbpmTaskinstanceExt.class);
86         updateWrapper.set(JbpmTaskinstanceExt::getProcDefId, processDefinition.getDeploymentId());
87         updateWrapper.eq(JbpmTaskinstanceExt::getProcDefKey, processDefinition.getKey());
88         taskinstanceExtService.update(updateWrapper);
89 }
系统代码案例
 1 // 自选审批人
 2         JSONObject choiceUserData = command.getChoiceUserData();
 3         // 启动入职通知流程定义
 4         JSONObject startProcessParam = new JSONObject();
 5         startProcessParam.set("userId", command.getCreatedBy());
 6         startProcessParam.set("processDefinitionKey", command.getProcessDefinitionKey());
 7         startProcessParam.set("choiceUserData", choiceUserData);
 8         startProcessParam.set("businessKey", String.valueOf(vacate.getId()));
 9         startProcessParam.set("summary", StrUtil.format("请假类型:{}<br>请假时间:{}" + CoreConstant.DEFAULT_LINE + "{}", ObjectUtil.isNotNull(attendanceVacate) ? attendanceVacate.getVacateName() : vacate.getVacateType(), DateUtil.format(vacate.getStartTime(), "yyyy-MM-dd HH:mm"), DateUtil.format(vacate.getEndTime(), "yyyy-MM-dd HH:mm")));
10         startProcessParam.set("newDate", vacate.getApplyTime());
11         boolean flag1 = processLogic.startProcess(startProcessParam);
12         if (!flag1) {
13             throw new LogicHandlerException("请假流程定义启动失败", "2A46377933B648F792CBF9B9DD211F60");
14         }
请假调用流程引擎案例
  1 @Override
  2     public boolean startProcess(JSONObject param) {
  3 //        log.error("param:{}", JSONUtil.toJsonStr(param));
  4         String userId = param.get("userId", String.class);
  5         String processDefinitionKey = param.get("processDefinitionKey", String.class);
  6 //        JSONObject formData = param.get("formData", JSONObject.class);
  7         JSONObject choiceUserData = param.get("choiceUserData", JSONObject.class);
  8         String businessKey = param.get("businessKey", String.class);
  9         String summary = param.get("summary", String.class);
 10         Date newDate = ObjectUtil.isNull(param.get("newDate", Date.class)) ? DateUtil.date() : param.get("newDate", Date.class);
 11 
 12         //0、查询流程定义
 13         UmsUser umsUser = iUmsUserService.getOneById(Long.valueOf(userId));
 14         if (ObjectUtil.isNull(umsUser)) {
 15             throw new LogicHandlerException("当前登录用户信息获取失败");
 16         }
 17         Long deptId = iUmsUserPostService.getMainDeptIdByUserId(umsUser.getId());
 18         if (ObjectUtil.isNull(deptId)) {
 19             throw new LogicHandlerException("当前登录用户部门ID获取失败");
 20         }
 21         SysDepartment sysDepartment = iSysDepartmentService.getOneById(deptId);
 22         if (ObjectUtil.isNull(sysDepartment)) {
 23             throw new LogicHandlerException("当前登录用户部门信息获取失败");
 24         }
 25         JbpmTaskinstanceExt taskinstanceExt = this.getJbpmTaskinstanceExt(processDefinitionKey);
 26 
 27         //1、保存业务数据,返回业务编码
 28         CoreDynamicTablesRecord dynamicTablesRecord = this.getDynamicTablesRecord(taskinstanceExt);
 29 
 30         //2、查询流程定义变量,审批人、执行人、抄送人、条件字段等等
 31         Map<String, Object> variables = new HashMap<>();
 32         variables.put("initiator", userId);
 33         this.nodeUserVariables(processDefinitionKey, choiceUserData, userId, businessKey, variables);
 34         this.nodeConditionVariables(processDefinitionKey, businessKey, variables);
 35 
 36         //3、启动流程定义
 37         Map<String, Object> jsonObject = new HashMap<>();
 38         jsonObject.put("initiator", userId);
 39         jsonObject.put("processDefinitionKey", processDefinitionKey);
 40         jsonObject.put("businessKey", businessKey);
 41         jsonObject.put("variables", variables);
 42         JSONObject resObject = camundaServiceUtils.startProcess(jsonObject);
 43 
 44         //4、保存业务和流程关系表
 45         JbpmBusinessProcess businessProcess = JbpmBusinessProcess.builder()
 46                 .createdBy(Long.valueOf(userId)).createdTime(newDate).processDefinitionKey(processDefinitionKey)
 47                 .processInstanceId(resObject.get("processInstanceId", String.class)).processName(taskinstanceExt.getProcessName())
 48                 .applyUserId(Long.valueOf(userId)).applyUserName(umsUser.getRealName())
 49                 .deptId(sysDepartment.getId()).deptName(sysDepartment.getName()).summary(summary)
 50                 .state(1).isDelete(false).build();
 51         jbpmBusinessProcessService.save(businessProcess);
 52 
 53         // 自动跳过发起人节点
 54         List<Task> taskList = taskService.createTaskQuery().taskAssignee(resObject.get("initiator", String.class)).processInstanceId(resObject.get("processInstanceId", String.class)).list();
 55         if (CollUtil.isNotEmpty(taskList)) {
 56             taskService.complete(taskList.get(0).getId());
 57         }
 58 
 59         //5、生成流程实例审批步骤
 60         Long businessProcessId = businessProcess.getId();
 61         List<JSONObject> jsonArray = camundaNodeUtils.simulationNextPath(resObject.get("processInstanceId", String.class), false);
 62         if (CollUtil.isNotEmpty(jsonArray)) {
 63             List<JbpmApprovalProcessRecord> approvalProcessRecordList = new ArrayList<>();
 64             // 获取到流程实例的全部变量
 65             Map<String, Object> condition = runtimeService.getVariables(resObject.get("processInstanceId", String.class));
 66 //            log.error("condition:{}",JSONUtil.toJsonStr(condition));
 67             JSONObject jsonObject2 = jsonArray.get(0);
 68             jsonArray.forEach(node -> {
 69                 String key = node.get("key", String.class);
 70                 String name = node.get("name", String.class);
 71                 // 发起人节点
 72                 if (jsonObject2.get("key", String.class).equals(key)) {
 73                     UmsUser user = iUmsUserService.getOneById(Long.valueOf(String.valueOf(condition.get("initiator"))));
 74                     if (ObjectUtil.isNotNull(user)) {
 75                         List<JSONObject> approvalNodeList = new ArrayList<>();
 76                         JSONObject jsonObject1 = new JSONObject();
 77                         jsonObject1.set("userId", user.getId());
 78                         jsonObject1.set("userName", user.getRealName());
 79                         // 状态:审核中,办理中,同意,系统同意,撤回,作废,拒绝,转交,前置加签,后置加签,未阅,已阅,退回,自动退回
 80                         jsonObject1.set("state", "已发起");
 81                         jsonObject1.set("referrer", "");// 转交,加签,退回json数据
 82                         jsonObject1.set("handleTime", DateUtil.now());// 处理时间
 83                         jsonObject1.set("remark", "");// 备注
 84                         jsonObject1.set("isEnd", "1");// 是否结束(0=否,1=是)
 85                         approvalNodeList.add(jsonObject1);
 86                         // 审批步骤数据处理
 87                         JbpmApprovalProcessRecord jbpmApprovalProcessRecord = JbpmApprovalProcessRecord.builder()
 88                                 .businessProcessId(businessProcessId).processInstanceId(resObject.get("processInstanceId", String.class))
 89                                 .approvalNode(name).taskDefKey(key).approvalNodeList(JSONUtil.toJsonStr(approvalNodeList)).isDelete(false)
 90                                 .createdBy(Long.valueOf(userId)).createdTime(newDate).build();
 91                         jbpmApprovalProcessRecord.setTaskIsEnd(1);// 任务是否结束(0=否,1=是)
 92                         approvalProcessRecordList.add(jbpmApprovalProcessRecord);
 93                     }
 94                 }
 95                 // 其他节点
 96                 List<String> array = (List<String>) condition.get("assigneeList_" + key);
 97                 if (CollUtil.isNotEmpty(array)) {
 98                     List<UmsUser> list = new ArrayList<>();
 99                     if (array.contains(CoreConstant.FLOW_AUTO_PASS_USER)) {
100                         UmsUser user = UmsUser.builder().id(1L).realName("").build();
101                         list.add(user);
102                     } else {
103                         list = iUmsUserService.listUserByIds(array.stream().map(Long::valueOf).collect(Collectors.toList()));
104                     }
105                     if (CollUtil.isNotEmpty(list)) {
106                         List<JSONObject> approvalNodeList = new ArrayList<>();
107                         list.forEach(umsUser1 -> {
108                             JSONObject jsonObject1 = new JSONObject();
109                             jsonObject1.set("userId", umsUser1.getId());
110                             jsonObject1.set("userName", umsUser1.getRealName());
111                             if (jsonArray.size() > 1 && key.equals(jsonArray.get(1).get("key", String.class))) {
112                                 boolean stateFlag = key.contains("_executor_");
113                                 boolean stateFlag1 = key.contains("_copy_");
114                                 // 状态:审核中,办理中,同意,系统同意,撤回,作废,拒绝,转交,前置加签,后置加签,未阅,已阅,退回,自动退回
115                                 jsonObject1.set("state", stateFlag ? "办理中" : stateFlag1 ? "未阅" : "审核中");
116                             } else {
117                                 // 状态:审核中,办理中,同意,系统同意,撤回,作废,拒绝,转交,前置加签,后置加签,未阅,已阅,退回,自动退回
118                                 jsonObject1.set("state", "");
119                             }
120                             jsonObject1.set("referrer", "");// 转交,加签,退回json数据
121                             jsonObject1.set("handleTime", "");// 处理时间
122                             jsonObject1.set("remark", "");// 备注
123                             jsonObject1.set("isEnd", "0");// 是否结束(0=否,1=是)
124                             approvalNodeList.add(jsonObject1);
125                         });
126                         // 根据流程定义key和任务key查询节点配置信息
127                         LambdaQueryWrapper<JbpmProcessNodeRule> lambdaQuery1 = Wrappers.lambdaQuery(JbpmProcessNodeRule.class);
128                         lambdaQuery1.eq(JbpmProcessNodeRule::getIsDelete, false);
129                         lambdaQuery1.eq(JbpmProcessNodeRule::getProcDefKey, processDefinitionKey);
130                         lambdaQuery1.eq(JbpmProcessNodeRule::getTaskDefKey, key);
131                         lambdaQuery1.last("LIMIT 1");
132                         JbpmProcessNodeRule jbpmProcessNodeRule = processNodeRuleService.getOne(lambdaQuery1);
133                         Integer auditMethod = null;// 审批类型,或签还是会签等等
134                         if (ObjectUtil.isNotNull(jbpmProcessNodeRule) && ObjectUtil.isNotNull(jbpmProcessNodeRule.getAuditMethod())) {
135                             if (1 == jbpmProcessNodeRule.getAuditMethod()) {
136                                 auditMethod = jbpmProcessNodeRule.getAuditMethod();
137                             } else if (2 == jbpmProcessNodeRule.getAuditMethod()) {
138                                 auditMethod = jbpmProcessNodeRule.getAuditMethod();
139                             } else if (3 == jbpmProcessNodeRule.getAuditMethod()) {
140                                 auditMethod = jbpmProcessNodeRule.getAuditMethod();
141                             }
142                         }
143                         // 审批步骤数据处理
144                         JbpmApprovalProcessRecord jbpmApprovalProcessRecord = JbpmApprovalProcessRecord.builder()
145                                 .businessProcessId(businessProcessId).processInstanceId(resObject.get("processInstanceId", String.class))
146                                 .approvalNode(name).taskDefKey(key).approvalNodeList(JSONUtil.toJsonStr(approvalNodeList)).isDelete(false)
147                                 .createdBy(Long.valueOf(userId)).auditMethod(auditMethod).taskIsEnd(0).createdTime(newDate).build();
148                         approvalProcessRecordList.add(jbpmApprovalProcessRecord);
149                     }
150                 }
151             });
152             // 保存审批步骤
153             jbpmApprovalProcessRecordService.saveBatch(approvalProcessRecordList);
154         }
155 
156         //7、发送消息给业务端
157         JSONObject messageData = new JSONObject();
158         messageData.set("processInstanceId", resObject.get("processInstanceId", String.class));
159         messageData.set("businessKey", businessKey);
160         messageData.set("state", 1);
161         BaseMO<Object> message = BaseMO.builder().messageType(MessageType.BUSINESS)
162                 .messageData(JSONUtil.toJsonStr(messageData))
163                 .messageIdentifier(MessageIdentifierConstant.OA_FLOW + dynamicTablesRecord.getTableName()).build();
164         rabbitTemplateLogic.sendMessage(RabbitMQConstant.Queue.QUEUE_OA_BUSINESS, message);
165         return true;
166     }
167 
168     @Override
169     public boolean relaunch(JSONObject param) {
170         String userId = param.get("userId", String.class);
171         String processDefinitionKey = param.get("processDefinitionKey", String.class);
172         JSONObject choiceUserData = param.get("choiceUserData", JSONObject.class);
173         String businessKey = param.get("businessKey", String.class);
174         String summary = param.get("summary", String.class);
175         String processInstanceId = param.get("processInstanceId", String.class);
176         Date newDate = ObjectUtil.isNull(param.get("newDate", Date.class)) ? DateUtil.date() : param.get("newDate", Date.class);
177 
178         //0、查询流程定义
179         UmsUser umsUser = iUmsUserService.getOneById(Long.valueOf(userId));
180         if (ObjectUtil.isNull(umsUser)) {
181             throw new LogicHandlerException("当前登录用户信息获取失败");
182         }
183         Long deptId = iUmsUserPostService.getMainDeptIdByUserId(umsUser.getId());
184         if (ObjectUtil.isNull(deptId)) {
185             throw new LogicHandlerException("当前登录用户部门ID获取失败");
186         }
187         SysDepartment sysDepartment = iSysDepartmentService.getOneById(deptId);
188         if (ObjectUtil.isNull(sysDepartment)) {
189             throw new LogicHandlerException("当前登录用户部门信息获取失败");
190         }
191 
192         // 查询流程定义
193         JbpmTaskinstanceExt taskinstanceExt = this.getJbpmTaskinstanceExt(processDefinitionKey);
194 
195         // 流程定义修改后,旧的流程实例不可用重新发起
196         LambdaQueryWrapper<JbpmBusinessProcess> lambdaQuery1 = Wrappers.lambdaQuery(JbpmBusinessProcess.class);
197         lambdaQuery1.eq(JbpmBusinessProcess::getProcessInstanceId, processInstanceId);
198         lambdaQuery1.eq(JbpmBusinessProcess::getProcessDefinitionKey, processDefinitionKey);
199         lambdaQuery1.last("LIMIT 1");
200         JbpmBusinessProcess one = jbpmBusinessProcessService.getOne(lambdaQuery1);
201         if (ObjectUtil.isNotNull(taskinstanceExt.getUpdatedTime()) && ObjectUtil.isNotNull(one) && DateUtil.compare(one.getCreatedTime(), taskinstanceExt.getUpdatedTime()) < 0) {
202             throw new LogicHandlerException("流程定义已修改,该流程实例不可重新发起,请到发起申请里面申请!");
203         }
204 
205         //1、保存业务数据,返回业务编码
206         CoreDynamicTablesRecord dynamicTablesRecord = this.getDynamicTablesRecord(taskinstanceExt);
207 
208         //2、查询流程定义变量,审批人、执行人、抄送人、条件字段等等
209         Map<String, Object> variables = new HashMap<>();
210         variables.put("initiator", userId);
211         this.nodeUserVariables(processDefinitionKey, choiceUserData, userId, businessKey, variables);
212         this.nodeConditionVariables(processDefinitionKey, businessKey, variables);
213 
214         //3、启动流程定义
215         Map<String, Object> jsonObject = new HashMap<>();
216         jsonObject.put("initiator", userId);
217         jsonObject.put("processDefinitionKey", processDefinitionKey);
218         jsonObject.put("businessKey", businessKey);
219         jsonObject.put("variables", variables);
220         JSONObject resObject = camundaServiceUtils.startProcess(jsonObject);
221 
222         //4、保存业务和流程关系表
223         JbpmBusinessProcess businessProcess = JbpmBusinessProcess.builder()
224                 .createdBy(Long.valueOf(userId)).createdTime(newDate).processDefinitionKey(processDefinitionKey)
225                 .processInstanceId(resObject.get("processInstanceId", String.class)).processName(taskinstanceExt.getProcessName())
226                 .applyUserId(Long.valueOf(userId)).applyUserName(umsUser.getRealName())
227                 .deptId(sysDepartment.getId()).deptName(sysDepartment.getName()).summary(summary)
228                 .state(1).isDelete(false).build();
229         jbpmBusinessProcessService.save(businessProcess);
230 
231         // 自动跳过发起人节点
232         List<Task> taskList = taskService.createTaskQuery().taskAssignee(resObject.get("initiator", String.class)).processInstanceId(resObject.get("processInstanceId", String.class)).list();
233         if (CollUtil.isNotEmpty(taskList)) {
234             taskService.complete(taskList.get(0).getId());
235         }
236 
237         //4、修改业务和流程关系表
238         LambdaUpdateWrapper<JbpmBusinessProcess> lambdaUpdate1 = Wrappers.lambdaUpdate(JbpmBusinessProcess.class);
239         lambdaUpdate1.eq(JbpmBusinessProcess::getProcessInstanceId, processInstanceId);
240         lambdaUpdate1.eq(JbpmBusinessProcess::getProcessDefinitionKey, processDefinitionKey);
241         lambdaUpdate1.set(JbpmBusinessProcess::getIsDelete, true);
242         boolean flag1 = jbpmBusinessProcessService.update(lambdaUpdate1);
243         if (!flag1) {
244             throw new LogicHandlerException("业务数据和流程实例关系表修改失败");
245         }
246 
247         //删除已发起数据
248         LambdaQueryWrapper<ActHiTaskinst> lambdaQuery6 = Wrappers.lambdaQuery(ActHiTaskinst.class);
249         lambdaQuery6.eq(ActHiTaskinst::getProcInstId, processInstanceId);
250         actHiTaskinstService.remove(lambdaQuery6);
251         LambdaQueryWrapper<ActHiProcinst> lambdaQuery7 = Wrappers.lambdaQuery(ActHiProcinst.class);
252         lambdaQuery7.eq(ActHiProcinst::getProcInstId, processInstanceId);
253         actHiProcinstService.remove(lambdaQuery7);
254 
255         // 重新发起后,没有审批的任务节点步骤,逻辑删除
256         LambdaUpdateWrapper<JbpmApprovalProcessRecord> lambdaUpdate2 = Wrappers.lambdaUpdate(JbpmApprovalProcessRecord.class);
257         lambdaUpdate2.eq(JbpmApprovalProcessRecord::getIsDelete, false);
258         lambdaUpdate2.eq(JbpmApprovalProcessRecord::getProcessInstanceId, processInstanceId);
259         lambdaUpdate2.eq(JbpmApprovalProcessRecord::getTaskIsEnd, 0);
260         lambdaUpdate2.set(JbpmApprovalProcessRecord::getIsDelete, true);
261         lambdaUpdate2.set(JbpmApprovalProcessRecord::getDeletedBy, userId);
262         lambdaUpdate2.set(JbpmApprovalProcessRecord::getDeletedTime, newDate);
263         jbpmApprovalProcessRecordService.update(lambdaUpdate2);
264         LambdaUpdateWrapper<JbpmApprovalProcessRecord> lambdaUpdate3 = Wrappers.lambdaUpdate(JbpmApprovalProcessRecord.class);
265         lambdaUpdate3.eq(JbpmApprovalProcessRecord::getProcessInstanceId, processInstanceId);
266         lambdaUpdate3.set(JbpmApprovalProcessRecord::getBusinessProcessId, businessProcess.getId());
267         lambdaUpdate3.set(JbpmApprovalProcessRecord::getProcessInstanceId, resObject.get("processInstanceId", String.class));
268         jbpmApprovalProcessRecordService.update(lambdaUpdate3);
269 
270         //5、追加生成流程实例审批步骤
271         LambdaQueryWrapper<JbpmApprovalProcessRecord> lambdaQuery2 = Wrappers.lambdaQuery(JbpmApprovalProcessRecord.class);
272         lambdaQuery2.eq(JbpmApprovalProcessRecord::getIsDelete, false);
273         lambdaQuery2.eq(JbpmApprovalProcessRecord::getProcessInstanceId, resObject.get("processInstanceId", String.class));
274         lambdaQuery2.last("LIMIT 1");
275         JbpmApprovalProcessRecord approvalProcessRecord = jbpmApprovalProcessRecordService.getOne(lambdaQuery2);
276         if (ObjectUtil.isNotNull(approvalProcessRecord)) {
277             List<JSONObject> jsonArray = camundaNodeUtils.simulationNextPath(resObject.get("processInstanceId", String.class), false);
278             if (CollUtil.isNotEmpty(jsonArray)) {
279                 List<JbpmApprovalProcessRecord> approvalProcessRecordList = new ArrayList<>();
280                 JSONObject jsonObject2 = jsonArray.get(0);
281                 jsonArray.forEach(node -> {
282                     String key = node.get("key", String.class);
283                     String name = node.get("name", String.class);
284                     // 发起人节点
285                     if (jsonObject2.get("key", String.class).equals(key)) {
286                         UmsUser user = iUmsUserService.getOneById(Long.valueOf(String.valueOf(variables.get("initiator"))));
287                         if (ObjectUtil.isNotNull(user)) {
288                             List<JSONObject> approvalNodeList = new ArrayList<>();
289                             JSONObject jsonObject1 = new JSONObject();
290                             jsonObject1.set("userId", user.getId());
291                             jsonObject1.set("userName", user.getRealName());
292                             // 状态:审核中,办理中,同意,系统同意,撤回,作废,拒绝,转交,前置加签,后置加签,未阅,已阅,退回,自动退回
293                             jsonObject1.set("state", "已发起");
294                             jsonObject1.set("referrer", "");// 转交,加签,退回json数据
295                             jsonObject1.set("handleTime", DateUtil.now());// 处理时间
296                             jsonObject1.set("remark", "");// 备注
297                             jsonObject1.set("isEnd", "1");// 是否结束(0=否,1=是)
298                             approvalNodeList.add(jsonObject1);
299                             // 审批步骤数据处理
300                             JbpmApprovalProcessRecord jbpmApprovalProcessRecord = JbpmApprovalProcessRecord.builder()
301                                     .businessProcessId(approvalProcessRecord.getBusinessProcessId()).processInstanceId(resObject.get("processInstanceId", String.class))
302                                     .approvalNode(name).taskDefKey(key).approvalNodeList(JSONUtil.toJsonStr(approvalNodeList)).isDelete(false)
303                                     .createdBy(Long.valueOf(userId)).createdTime(newDate).build();
304                             jbpmApprovalProcessRecord.setTaskIsEnd(1);// 任务是否结束(0=否,1=是)
305                             approvalProcessRecordList.add(jbpmApprovalProcessRecord);
306                         }
307                     }
308                     List<String> array1 = (List<String>) variables.get("assigneeList_" + key);
309                     if (CollUtil.isNotEmpty(array1)) {
310                         List<UmsUser> list = new ArrayList<>();
311                         if (array1.contains(CoreConstant.FLOW_AUTO_PASS_USER)) {
312                             UmsUser user = UmsUser.builder().id(1L).realName("").build();
313                             list.add(user);
314                         } else {
315                             list = iUmsUserService.listUserByIds(array1.stream().map(Long::valueOf).collect(Collectors.toList()));
316                         }
317                         if (CollUtil.isNotEmpty(list)) {
318                             List<JSONObject> approvalNodeList1 = new ArrayList<>();
319                             list.forEach(umsUser1 -> {
320                                 JSONObject jsonObject1 = new JSONObject();
321                                 jsonObject1.set("userId", umsUser1.getId());
322                                 jsonObject1.set("userName", umsUser1.getRealName());
323                                 if (key.equals(jsonArray.get(0).get("key", String.class))) {
324                                     boolean stateFlag = key.contains("_executor_");
325                                     boolean stateFlag1 = key.contains("_copy_");
326                                     // 状态:审核中,办理中,同意,系统同意,撤回,作废,拒绝,转交,加签,未阅,已阅,退回,自动退回
327                                     jsonObject1.set("state", stateFlag ? "办理中" : stateFlag1 ? "未阅" : "审核中");
328                                 } else {
329                                     // 状态:审核中,办理中,同意,系统同意,撤回,作废,拒绝,转交,加签,未阅,已阅,退回,自动退回
330                                     jsonObject1.set("state", "");
331                                 }
332                                 jsonObject1.set("referrer", "");// 转交,加签,退回json数据
333                                 jsonObject1.set("handleTime", "");// 处理时间
334                                 jsonObject1.set("remark", "");// 备注
335                                 jsonObject1.set("isEnd", "0");// 是否结束(0=否,1=是)
336                                 approvalNodeList1.add(jsonObject1);
337                             });
338                             // 根据流程定义key和任务key查询节点配置信息
339                             LambdaQueryWrapper<JbpmProcessNodeRule> lambdaQuery3 = Wrappers.lambdaQuery(JbpmProcessNodeRule.class);
340                             lambdaQuery3.eq(JbpmProcessNodeRule::getIsDelete, false);
341                             lambdaQuery3.eq(JbpmProcessNodeRule::getProcDefKey, processDefinitionKey);
342                             lambdaQuery3.eq(JbpmProcessNodeRule::getTaskDefKey, key);
343                             lambdaQuery3.last("LIMIT 1");
344                             JbpmProcessNodeRule jbpmProcessNodeRule = processNodeRuleService.getOne(lambdaQuery3);
345                             Integer auditMethod = null;// 审批类型,或签还是会签等等
346                             if (ObjectUtil.isNotNull(jbpmProcessNodeRule) && ObjectUtil.isNotNull(jbpmProcessNodeRule.getAuditMethod())) {
347                                 if (1 == jbpmProcessNodeRule.getAuditMethod()) {
348                                     auditMethod = jbpmProcessNodeRule.getAuditMethod();
349                                 } else if (2 == jbpmProcessNodeRule.getAuditMethod()) {
350                                     auditMethod = jbpmProcessNodeRule.getAuditMethod();
351                                 } else if (3 == jbpmProcessNodeRule.getAuditMethod()) {
352                                     auditMethod = jbpmProcessNodeRule.getAuditMethod();
353                                 }
354                             }
355                             // 审批步骤数据处理
356                             JbpmApprovalProcessRecord jbpmApprovalProcessRecord = JbpmApprovalProcessRecord.builder()
357                                     .businessProcessId(approvalProcessRecord.getBusinessProcessId()).processInstanceId(resObject.get("processInstanceId", String.class))
358                                     .approvalNode(name).taskDefKey(key).approvalNodeList(JSONUtil.toJsonStr(approvalNodeList1)).isDelete(false)
359                                     .createdBy(Long.valueOf(userId)).auditMethod(auditMethod).taskIsEnd(0).createdTime(newDate).build();
360                             approvalProcessRecordList.add(jbpmApprovalProcessRecord);
361                         }
362                     }
363                 });
364                 // 保存审批步骤
365                 jbpmApprovalProcessRecordService.saveBatch(approvalProcessRecordList);
366             }
367         }
368 
369         // 删除旧的流程实例
370         runtimeService.deleteProcessInstance(processInstanceId, "重新发起了");
371 
372         //7、发送消息给业务端
373         JSONObject messageData = new JSONObject();
374         messageData.set("processInstanceId", processInstanceId);
375         messageData.set("businessKey", businessKey);
376         messageData.set("state", 1);
377         BaseMO<Object> message = BaseMO.builder().messageType(MessageType.BUSINESS)
378                 .messageData(JSONUtil.toJsonStr(messageData))
379                 .messageIdentifier(MessageIdentifierConstant.OA_FLOW + dynamicTablesRecord.getTableName()).build();
380         rabbitTemplateLogic.sendMessage(RabbitMQConstant.Queue.QUEUE_OA_BUSINESS, message);
381         return true;
382     }
383 
384     /**
385      * Description:网关条件字段变量数据处理
386      * @Author HeZeMin
387      * @Date 2022年04月19日 9:44
388      */
389     private void nodeConditionVariables(String processDefinitionKey, String businessKey, Map<String, Object> variables) {
390         JbpmProcessNodeConditionRule conditionRule = JbpmProcessNodeConditionRule.builder().procDefKey(processDefinitionKey).build();
391         List<JbpmProcessNodeConditionRule> processNodeConditionRuleList = processNodeConditionRuleService.listByKey(conditionRule);
392         if (CollUtil.isNotEmpty(processNodeConditionRuleList)) {
393             processNodeConditionRuleList.forEach(processNodeConditionRule -> {
394                 String sql = coreDynamicTablesRelationService.getByChildTable(processNodeConditionRule.getTableName());
395                 String format = StrUtil.format(sql, processNodeConditionRule.getConditionKey(), businessKey);
396 //                log.error("format:{}", JSONUtil.toJsonStr(format));
397                 JSONObject jsonObject = dynamicTablesRecordService.selectSqlTemplate(format);
398 //                log.error("jsonObject:{}", JSONUtil.toJsonStr(jsonObject));
399                 variables.put(processNodeConditionRule.getConditionKey(), jsonObject.get(processNodeConditionRule.getConditionKey()));
400                 if (StrUtil.isNotBlank(processNodeConditionRule.getTableName_())) {
401                     String sql1 = coreDynamicTablesRelationService.getByChildTable(processNodeConditionRule.getTableName_());
402                     String format1 = StrUtil.format(sql1, processNodeConditionRule.getConditionKey_(), businessKey);
403 //                log.error("format1:{}", JSONUtil.toJsonStr(format1));
404                     JSONObject jsonObject1 = dynamicTablesRecordService.selectSqlTemplate(format1);
405 //                log.error("jsonObject1:{}", JSONUtil.toJsonStr(jsonObject1));
406                     variables.put(processNodeConditionRule.getConditionKey_(), jsonObject1.get(processNodeConditionRule.getConditionKey_()));
407                 }
408             });
409         }
410     }
411 
412     /**
413      * Description:审核人、执行人、抄送人 用户变量数据处理
414      * @Author HeZeMin
415      * @Date 2022年04月18日 17:44
416      */
417     private void nodeUserVariables(String processDefinitionKey, JSONObject choiceUserData, String userId, String businessKey, Map<String, Object> variables) {
418         //处理审核人、执行人和抄送人环境变量数据
419         LambdaQueryWrapper<JbpmProcessNodeRule> queryWrapper1 = Wrappers.lambdaQuery(JbpmProcessNodeRule.class);
420         queryWrapper1.eq(JbpmProcessNodeRule::getIsDelete, false);
421         queryWrapper1.eq(JbpmProcessNodeRule::getProcDefKey, processDefinitionKey);
422         List<JbpmProcessNodeRule> processNodeRuleList = processNodeRuleService.list(queryWrapper1);
423         if (CollUtil.isNotEmpty(processNodeRuleList)) {
424             processNodeRuleList.forEach(processNodeRule -> {
425                 switch (processNodeRule.getAuditType()){
426                     case 0://指定用户
427                         LambdaQueryWrapper<JbpmProcessNodeUserRule> lambdaQuery = Wrappers.lambdaQuery(JbpmProcessNodeUserRule.class);
428                         lambdaQuery.eq(JbpmProcessNodeUserRule::getIsDelete, false);
429                         lambdaQuery.eq(JbpmProcessNodeUserRule::getProcDefKey, processNodeRule.getProcDefKey());
430                         lambdaQuery.eq(JbpmProcessNodeUserRule::getTaskDefKey, processNodeRule.getTaskDefKey());
431                         List<JbpmProcessNodeUserRule> list = processNodeUserRuleService.list(lambdaQuery);
432                         List<String> userIds = JSONUtil.parseArray(list.get(0).getDataValue()).toList(String.class);
433                         variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
434                         break;
435                     case 1://部门主管
436                         // 根据发起人userid查询上级主管,没有就一直往上查,最终也没有按空规则处理
437                         userIds = new ArrayList<>();
438                         userIds = departmentLogic.getManagerIdsByUserId(Long.valueOf(userId)).stream().map(String::valueOf).collect(Collectors.toList());
439                         if (CollUtil.isNotEmpty(userIds)) {
440                             variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
441                         } else {// 数据为空时按规则处理
442                             String taskDefKey = processNodeRule.getTaskDefKey();
443                             if (!taskDefKey.contains("_copy_")) {
444                                 userIds = new ArrayList<>(1);
445                                 if (1 == processNodeRule.getIsAdminAudit()) {// 自动通过
446                                     // 自动通过用户id
447 //                                    userIds.add(String.valueOf(roleLogic.getUserIdByIdentifier(CoreConstant.ROLE_1)));
448                                     userIds.add(CoreConstant.FLOW_AUTO_PASS_USER);
449                                 } else if (2 == processNodeRule.getIsAdminAudit()) {// 转交管理员
450                                     // 查询审批流程管理员
451                                     List<Long> ids = roleLogic.getUserIdsByIdentifier(CoreConstant.ROLE_2);
452                                     userIds.addAll(ids.stream().map(String::valueOf).collect(Collectors.toList()));// 管理员id
453                                 }
454                             }
455                             variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
456                         }
457                         break;
458                     case 2://角色
459                         LambdaQueryWrapper<JbpmProcessNodeUserRule> lambdaQuery1 = Wrappers.lambdaQuery(JbpmProcessNodeUserRule.class);
460                         lambdaQuery1.eq(JbpmProcessNodeUserRule::getIsDelete, false);
461                         lambdaQuery1.eq(JbpmProcessNodeUserRule::getProcDefKey, processNodeRule.getProcDefKey());
462                         lambdaQuery1.eq(JbpmProcessNodeUserRule::getTaskDefKey, processNodeRule.getTaskDefKey());
463                         List<JbpmProcessNodeUserRule> list1 = processNodeUserRuleService.list(lambdaQuery1);
464                         List<String> roleIds = JSONUtil.parseArray(list1.get(0).getDataValue()).toList(String.class);
465                         // 根据角色id集合查询用户集合
466                         List<Long> collect = roleIds.stream().map(Long::valueOf).collect(Collectors.toList());
467                         userIds = new ArrayList<>();
468                         userIds = iUmsUserRoleService.getUserIdsByRoleIds(collect).stream().distinct().map(String::valueOf).collect(Collectors.toList());
469                         if (CollUtil.isNotEmpty(userIds)) {
470                             variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
471                         } else {// 数据为空时按规则处理
472                             String taskDefKey = processNodeRule.getTaskDefKey();
473                             if (!taskDefKey.contains("_copy_")) {
474                                 userIds = new ArrayList<>(1);
475                                 if (1 == processNodeRule.getIsAdminAudit()) {// 自动通过
476                                     // 自动通过用户id
477 //                                    userIds.add(String.valueOf(roleLogic.getUserIdByIdentifier(CoreConstant.ROLE_1)));
478                                     userIds.add(CoreConstant.FLOW_AUTO_PASS_USER);
479                                 } else if (2 == processNodeRule.getIsAdminAudit()) {// 转交管理员
480                                     // 查询审批流程管理员
481                                     List<Long> ids = roleLogic.getUserIdsByIdentifier(CoreConstant.ROLE_2);
482                                     userIds.addAll(ids.stream().map(String::valueOf).collect(Collectors.toList()));// 管理员id
483                                 }
484                             }
485                             variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
486                         }
487                         break;
488                     case 3://表单内联系人
489                         LambdaQueryWrapper<JbpmProcessNodeUserRule> lambdaQuery2 = Wrappers.lambdaQuery(JbpmProcessNodeUserRule.class);
490                         lambdaQuery2.eq(JbpmProcessNodeUserRule::getIsDelete, false);
491                         lambdaQuery2.eq(JbpmProcessNodeUserRule::getProcDefKey, processNodeRule.getProcDefKey());
492                         lambdaQuery2.eq(JbpmProcessNodeUserRule::getTaskDefKey, processNodeRule.getTaskDefKey());
493                         List<JbpmProcessNodeUserRule> list2 = processNodeUserRuleService.list(lambdaQuery2);
494                         // formFields的数据结构为:表名*字段
495 //                        List<String> formFields = JSONUtil.parseArray(list2.get(0).getDataValue()).toList(String.class);
496                         List<String> formFields = new ArrayList<>();
497                         formFields.add(list2.get(0).getDataValue());
498                         // 根据表单内联系人字段查询用户id集合
499                         userIds = new ArrayList<>();
500                         for (String field : formFields) {
501                             List<String> split = StrUtil.split(field, "*");
502                             String sql = coreDynamicTablesRelationService.getByChildTable(split.get(0));
503                             String format = StrUtil.format(sql, split.get(1), businessKey);
504 //                            log.error("format:{}", JSONUtil.toJsonStr(format));
505                             ArrayList<JSONObject> objects = dynamicTablesRecordService.listSqlTemplate(format);
506 //                            log.error("format:{}", JSONUtil.toJsonStr(objects));
507                             for (JSONObject obj : objects) {
508                                 if (ObjectUtil.isNotNull(obj)) {
509                                     String uid = obj.get(split.get(1), String.class);
510                                     userIds.add(uid);
511                                 }
512                             }
513                         }
514                         if (CollUtil.isNotEmpty(userIds)) {
515                             List<UmsUser> list3 = umsUserService.listUserByIds(userIds.stream().map(Long::valueOf).collect(Collectors.toList()));
516                             if (CollUtil.isNotEmpty(list3)) {
517                                 userIds = list3.stream().map(u -> String.valueOf(u.getId())).collect(Collectors.toList());
518                             }
519                         }
520                         if (CollUtil.isNotEmpty(userIds)) {
521                             variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
522                         } else {// 数据为空时按规则处理
523                             String taskDefKey = processNodeRule.getTaskDefKey();
524                             if (!taskDefKey.contains("_copy_")) {
525                                 userIds = new ArrayList<>(1);
526                                 if (1 == processNodeRule.getIsAdminAudit()) {// 自动通过
527                                     // 自动通过用户id
528 //                                    userIds.add(String.valueOf(roleLogic.getUserIdByIdentifier(CoreConstant.ROLE_1)));
529                                     userIds.add(CoreConstant.FLOW_AUTO_PASS_USER);
530                                 } else if (2 == processNodeRule.getIsAdminAudit()) {// 转交管理员
531                                     // 查询审批流程管理员
532                                     List<Long> ids = roleLogic.getUserIdsByIdentifier(CoreConstant.ROLE_2);
533                                     userIds.addAll(ids.stream().map(String::valueOf).collect(Collectors.toList()));// 管理员id
534                                 }
535                             }
536                             variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
537                         }
538                         break;
539                     case 4://连续主管
540                         userIds = new ArrayList<>();
541                         LambdaQueryWrapper<JbpmProcessNodeUserRule> lambdaQuery3 = Wrappers.lambdaQuery(JbpmProcessNodeUserRule.class);
542                         lambdaQuery3.eq(JbpmProcessNodeUserRule::getIsDelete, false);
543                         lambdaQuery3.eq(JbpmProcessNodeUserRule::getProcDefKey, processNodeRule.getProcDefKey());
544                         lambdaQuery3.eq(JbpmProcessNodeUserRule::getTaskDefKey, processNodeRule.getTaskDefKey());
545                         List<JbpmProcessNodeUserRule> list3 = processNodeUserRuleService.list(lambdaQuery3);
546                         String dataValue = list3.get(0).getDataValue();
547                         // 根据连续主管级别查询用户id集合,直接主管到老板是有序的,这里是顺序审批
548                         Map<String, Object> managerIdsByDeptId = departmentLogic.getManagerIdsByDeptId(Long.valueOf(userId), Integer.parseInt(dataValue));
549 //                        log.error("*////////////"+JSONUtil.toJsonStr(managerIdsByDeptId));
550                         List<Long> userIds1 = (List<Long>) managerIdsByDeptId.get("userIds");
551 //                        log.error("*////////////"+JSONUtil.toJsonStr(userIds1));
552                         if (CollUtil.isNotEmpty(userIds1)) {
553                             List<UmsUser> list4 = umsUserService.listUserByIds(userIds1);
554 //                            log.error("*////////////"+JSONUtil.toJsonStr(list4));
555                             if (CollUtil.isNotEmpty(list4)) {
556                                 userIds = list4.stream().map(u -> String.valueOf(u.getId())).collect(Collectors.toList());
557                             }
558                         }
559                         if (CollUtil.isNotEmpty(userIds)) {
560                             variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
561                         } else {// 数据为空时按规则处理
562                             String taskDefKey = processNodeRule.getTaskDefKey();
563                             if (!taskDefKey.contains("_copy_")) {
564                                 userIds = new ArrayList<>(1);
565                                 if (1 == processNodeRule.getIsAdminAudit()) {// 自动通过
566                                     // 自动通过用户id
567 //                                    userIds.add(String.valueOf(roleLogic.getUserIdByIdentifier(CoreConstant.ROLE_1)));
568                                     userIds.add(CoreConstant.FLOW_AUTO_PASS_USER);
569                                 } else if (2 == processNodeRule.getIsAdminAudit()) {// 转交管理员
570                                     // 查询审批流程管理员
571                                     List<Long> ids = roleLogic.getUserIdsByIdentifier(CoreConstant.ROLE_2);
572                                     userIds.addAll(ids.stream().map(String::valueOf).collect(Collectors.toList()));// 管理员id
573                                 }
574                             }
575                             variables.put("assigneeList_" + processNodeRule.getTaskDefKey(), userIds);
576                         }
577                         break;
578                     case 5://自选用户
579                         // 这里先给前端返回哪些任务是自选,再处理前端返回了的数据
580                         if (CollUtil.isNotEmpty(choiceUserData)) {
581                             choiceUserData.forEach((key, value) -> {
582                                 if (ObjectUtil.isNotNull(value)) {
583                                     variables.put("assigneeList_" + key, value);
584                                 } else {
585                                     variables.put("assigneeList_" + key, new ArrayList<>());
586                                 }
587                             });
588                         }
589                         break;
590                     default:
591                 }
592             });
593         }
594     }
595 
596     /**
597      * Description:根据数据类型id查询数据表配置
598      * @Author HeZeMin
599      * @Date 2022年04月18日 16:15
600      */
601     private CoreDynamicTablesRecord getDynamicTablesRecord(JbpmTaskinstanceExt taskinstanceExt) {
602         CoreDynamicTablesRecord dynamicTablesRecord = dynamicTablesRecordService.getById(taskinstanceExt.getProcessDataTypeId());
603         if (ObjectUtil.isNull(dynamicTablesRecord)) {
604             throw new LogicHandlerException("数据类型不存在,无法启动", "D82689771AC7405797F22D86B93DBA1C");
605         }
606         return dynamicTablesRecord;
607     }
608 
609     /**
610      * Description:查询流程定义
611      * @Author HeZeMin
612      * @Date 2022年04月18日 16:14
613      */
614     private JbpmTaskinstanceExt getJbpmTaskinstanceExt(String processDefinitionKey) {
615         // 查询
616         LambdaQueryWrapper<JbpmTaskinstanceExt> queryWrapper = Wrappers.lambdaQuery(JbpmTaskinstanceExt.class);
617         queryWrapper.eq(JbpmTaskinstanceExt::getProcDefKey, processDefinitionKey);
618         queryWrapper.eq(JbpmTaskinstanceExt::getIsDelete, false);
619         queryWrapper.eq(JbpmTaskinstanceExt::getProcessState, 0);
620         queryWrapper.last("LIMIT 1");
621         JbpmTaskinstanceExt taskinstanceExt = taskinstanceExtService.getOne(queryWrapper);
622         if (ObjectUtil.isNull(taskinstanceExt)) {
623             throw new LogicHandlerException("流程定义不存在,无法启动");
624         }
625         if (ObjectUtil.isNotNull(taskinstanceExt) && 1 == taskinstanceExt.getProcessState()) {
626             throw new LogicHandlerException("流程定义已禁用,暂无法发起流程!");
627         }
628         // 验证判断
629         ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
630                 .processDefinitionKey(processDefinitionKey).latestVersion().singleResult();
631         if (pd == null) {
632             throw new LogicHandlerException("流程定义不存在,无法启动");
633         }
634         if (pd != null && pd.isSuspended()) {
635             throw new LogicHandlerException("流程定义已禁用,暂无法发起流程!");
636         }
637         return taskinstanceExt;
638     }
流程引擎,启动流程和重发启动流程代码案例
@Override
    public List<JSONObject> listOptionalNode(JSONObject param) {
        String processDefinitionKey = param.get("processDefinitionKey", String.class);
        LambdaQueryWrapper<JbpmProcessNodeRule> lambdaQuery = Wrappers.lambdaQuery(JbpmProcessNodeRule.class);
        lambdaQuery.eq(JbpmProcessNodeRule::getProcDefKey, processDefinitionKey);
        lambdaQuery.eq(JbpmProcessNodeRule::getAuditType, 5);//自选
        lambdaQuery.eq(JbpmProcessNodeRule::getIsDelete, DeletedStatusEnum.NOT_DELETE.getCode());
        List<JbpmProcessNodeRule> list = processNodeRuleService.list(lambdaQuery);
        LambdaQueryWrapper<JbpmProcessNodeUserRule> lambdaQuery1 = Wrappers.lambdaQuery(JbpmProcessNodeUserRule.class);
        lambdaQuery1.eq(JbpmProcessNodeUserRule::getProcDefKey, processDefinitionKey);
        lambdaQuery1.eq(JbpmProcessNodeUserRule::getDataType, "required");
        lambdaQuery1.eq(JbpmProcessNodeUserRule::getIsDelete, DeletedStatusEnum.NOT_DELETE.getCode());
        List<JbpmProcessNodeUserRule> list1 = processNodeUserRuleService.list(lambdaQuery1);
        if (CollUtil.isEmpty(list) || CollUtil.isEmpty(list1)) {
            return new ArrayList<JSONObject>(0);
        }
        List<JSONObject> res = new ArrayList<>();
        list.forEach(processNodeRule -> {
            JSONObject jsonObject = new JSONObject();
            jsonObject.set("taskDefKey", processNodeRule.getTaskDefKey());
            jsonObject.set("nodeName", processNodeRule.getNodeName());
            jsonObject.set("auditMethod", processNodeRule.getAuditMethod());
            list1.forEach(processNodeUserRule -> {
                if (processNodeUserRule.getTaskDefKey().equals(processNodeRule.getTaskDefKey())) {
                    jsonObject.set("isRequired", processNodeUserRule.getDataValue());
                }
            });
            res.add(jsonObject);
        });
        return res;
    }
发起申请时查询流程自选任务节点

 请假业务请求参数案例:

 1 {
 2     "startTime":"2023-02-27 11:54:32",
 3     "endTime":"2023-02-28 11:54:32",
 4     "reason":"123123",
 5     "hours":"122.31",
 6     "vacateType":"1554444762585038849",
 7     "attachFiles":"[]",
 8     "choiceUserData":{
 9         "Activity_copy_1582581514531639296":[
10             "1554402787205451776"
11         ]
12     },
13     "processDefinitionKey":"Process_1582575674995118080"
14 }
View Code

 保存流程定义参数案例:

  1 {
  2     "process":{
  3         "processIcon":null,
  4         "processIconArray":"",
  5         "processName":"测试流程",
  6         "processGroupId":"1571779354469904385",
  7         "processDataTypeId":"1547039389964992583",
  8         "processState":0,
  9         "sort":0,
 10         "processRemark":"流程说明",
 11         "userIdsAndRoleIds":[
 12             "1615256100117024768"
 13         ],
 14         "initatorUserId":[
 15             "1615256100117024768"
 16         ],
 17         "initatorRoleId":[
 18 
 19         ]
 20     },
 21     "processModeel":{
 22         "nodeName":"审批人",
 23         "nodeType":1,
 24         "auditType":2,
 25         "auditMethod":2,
 26         "isAdminAudit":1,
 27         "dataType":"role",
 28         "dataValue":"["1554392780851220481"]",
 29         "extendedFields":{
 30             "isAdminAudit1":"",
 31             "isAdminAudit2":1,
 32             "isAdminAudit3":"",
 33             "isAdminAudit4":"",
 34             "auditMethod0":2,
 35             "auditMethod1":"",
 36             "auditMethod2":2,
 37             "auditMethod3":"",
 38             "auditMethod4":"",
 39             "auditMethod5":"",
 40             "auditMethod6":"",
 41             "error":false,
 42             "key":"IJYiKUDpkszPRNmm3zB5X1XZB7mM5r8c",
 43             "hasUser":true,
 44             "oaProcessUserRuleList":[
 45 
 46             ],
 47             "oaProcessRoleRuleList":[
 48                 "1554392780851220481"
 49             ],
 50             "oaFinish":"",
 51             "required":1,
 52             "form":"",
 53             "formName":"",
 54             "inForm":"",
 55             "showName1":"",
 56             "showName2":""
 57         },
 58         "nextNodeData":[
 59             {
 60                 "nodeName":"办理人",
 61                 "nodeType":2,
 62                 "auditType":2,
 63                 "auditMethod":1,
 64                 "isAdminAudit":1,
 65                 "dataType":"role",
 66                 "dataValue":"["1554392780851220481"]",
 67                 "extendedFields":{
 68                     "error":false,
 69                     "key":"MxipXtSadUloztaAP2oESuFNsaI3NiW6",
 70                     "hasUser":true,
 71                     "oaProcessUserRuleList":[
 72 
 73                     ],
 74                     "oaProcessRoleRuleList":[
 75                         "1554392780851220481"
 76                     ],
 77                     "oaFinish":"",
 78                     "required":1,
 79                     "form":"",
 80                     "formName":"",
 81                     "inForm":"",
 82                     "showName1":"",
 83                     "showName2":""
 84                 },
 85                 "nextNodeData":[
 86                     {
 87                         "nodeName":"抄送人",
 88                         "nodeType":3,
 89                         "auditType":2,
 90                         "auditMethod":"",
 91                         "isAdminAudit":"",
 92                         "dataType":"role",
 93                         "dataValue":"["1554392780851220481"]",
 94                         "extendedFields":{
 95                             "error":false,
 96                             "key":"KJ2tNL03V8yraHshn3Cs9RVmKubfZJ43",
 97                             "hasUser":true,
 98                             "oaProcessUserRuleList":[
 99 
100                             ],
101                             "oaProcessRoleRuleList":[
102                                 "1554392780851220481"
103                             ],
104                             "oaFinish":"",
105                             "required":1,
106                             "form":"",
107                             "formName":"",
108                             "inForm":"",
109                             "showName1":"",
110                             "showName2":""
111                         },
112                         "nextNodeData":[
113 
114                         ],
115                         "conditionList":[
116 
117                         ]
118                     }
119                 ],
120                 "conditionList":[
121 
122                 ]
123             }
124         ],
125         "conditionList":[
126 
127         ]
128     }
129 }
View Code

 保存流程定义参数案例-有网关的:

{
    "process":{
        "processName":"测试",
        "processGroupId":"1654027678378438658",
        "processDataTypeId":"1547039389964992583",
        "processState":0,
        "sort":0,
        "initatorUserId":[

        ],
        "initatorRoleId":[
            "1554392780851220481"
        ]
    },
    "processModeel":{
        "nodeName":"审批人",
        "nodeType":1,
        "auditType":1,
        "auditMethod":2,
        "isAdminAudit":1,
        "dataType":"",
        "dataValue":"",
        "nextNodeData":[
            {
                "nodeName":"条件",
                "nodeType":4,
                "auditType":"",
                "auditMethod":"",
                "dataType":"",
                "isAdminAudit":"",
                "dataValue":"",
                "nextNodeData":Array[0],
                "conditionList":[
                    {
                        "conditionName":"条件1",
                        "tableName":"vacate",
                        "conditionKey":"duration",
                        "operator":"<=",
                        "targetValue":"24.00",
                        "targetValue1":"",
                        "targetValue1Operator":"",
                        "targetValue2":"",
                        "targetValue2Operator":"",
                        "tableName_":"",
                        "conditionKey_":"",
                        "operator_":"",
                        "targetValue_":"",
                        "targetValue1_":"",
                        "targetValue1Operator_":"",
                        "targetValue2_":"",
                        "targetValue2Operator_":"",
                        "nextNodeData":[
                            {
                                "nodeName":"办理人",
                                "nodeType":2,
                                "auditType":2,
                                "auditMethod":1,
                                "isAdminAudit":1,
                                "dataType":"role",
                                "dataValue":"["1620716546951819266"]",
                                "nextNodeData":[

                                ],
                                "conditionList":[

                                ]
                            }
                        ]
                    },
                    {
                        "conditionName":"条件2",
                        "tableName":"vacate",
                        "conditionKey":"duration",
                        "operator":">",
                        "targetValue":"24.00",
                        "targetValue1":"",
                        "targetValue1Operator":"",
                        "targetValue2":"",
                        "targetValue2Operator":"",
                        "tableName_":"",
                        "conditionKey_":"",
                        "operator_":"",
                        "targetValue_":"",
                        "targetValue1_":"",
                        "targetValue1Operator_":"",
                        "targetValue2_":"",
                        "targetValue2Operator_":"",
                        "nextNodeData":[
                            {
                                "nodeName":"审批人",
                                "nodeType":1,
                                "auditType":2,
                                "auditMethod":2,
                                "isAdminAudit":1,
                                "dataType":"role",
                                "dataValue":"["1559791029853999105"]",
                                "nextNodeData":[
                                    {
                                        "nodeName":"办理人",
                                        "nodeType":2,
                                        "auditType":2,
                                        "auditMethod":1,
                                        "isAdminAudit":1,
                                        "dataType":"role",
                                        "dataValue":"["1620716546951819266"]",
                                        "nextNodeData":[

                                        ],
                                        "conditionList":[

                                        ]
                                    }
                                ],
                                "conditionList":[

                                ]
                            }
                        ]
                    }
                ]
            }
        ],
        "conditionList":[

        ]
    }
}
View Code

 

posted @ 2023-02-28 10:15  何童鞋  阅读(1017)  评论(5编辑  收藏  举报