OA 系统工作流引擎 Camunda 实践(2)
再把一部分流程相关的表和代码做一下开源和解释,有疑问的评论
Camunda引擎流转信息
Camunda引擎结合OA业务系统整体流程信息
一个业务案例在系统中交互流向
介绍流程逻辑对应关系
一个流程关联一个业务表单;流程定义可以对应员工、角色、部门等;流程发起人可以是多个员工和多个角色;流程节点的审核人可以是多个员工、多个角色、多个主管、多个表单联系人和多个自选用户;执行人可以是多个员工、多个角色、多个表单联系人和多个自选用户;抄送人可以是多个员工、多个角色、多个表单联系人和多个自选用户;
员工或者有该角色的用户可以查询该流程定义;
流程实例的节点只对应到员工,流程发起的时候,需要把角色、部门等细化到员工身上。通过一些外部接口解决这个问题,通过发起人id获取部门主管用户集合;通过角色获取用户集合;通过发起人id和连续级别获取主管用户集合;
除了Camunda自身的表,还需要建立一些存储流程相关的基础数据表,如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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;
流程业务需要的基础表数据关系。如下,和图片数据案例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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;
我再举一个业务例子请假表,如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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;
系统代码例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@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; }
请假业务请求参数案例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
保存流程定义参数案例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
保存流程定义参数案例-有网关的:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{ "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":[ ] } }