OA 系统工作流引擎 Camunda 实践(1)
Camunda是Activiti最大的贡献者之一(除Alfresco以外),同时也是它一个主 要的执行咨询合作伙伴。camunda表示Activiti可能太拘束于Alfresco对以文档为中心的工作流的需求(这个也是BPMN约束使然),而忽视了Activiti起步时 的更为普遍的BPM平台。camunda宣布他们正从Activiti 分裂出一个新的开源工程,那就是camunda BPM
官网
下载
Camunda文档中文站
http://camunda-cn.shaochenfeng.com/
学习路线知识点
https://www.processon.com/view/link/622da3ba1e085307a23dc108#map
学习知识路线是别人的被加密了,请使用下面的截图
由于公司业务限制,没有用到表单引擎和BPMN.js
模型是后端调用Camunda api(BpmnModelInstance、BpmnDiagram)自动生成的(老板嫌弃BPMN.js画的BPMN图丑),表单引擎比较复杂都是单独写,没用到在线表单生成
目前已实现功能点(国内常见的操作都能实现):发起,审批通过,驳回,转交他人审批,退回历史节点,前置加签/后置加签,撤回,重新发起,作废,转阅,催办
后面有部分代码,我也业务代码删除了,童鞋们可以参考一下,有疑问可以私信我。
效果图:
流程定义添加
用户发起:
审批:
后续相关代码实现
// 工作流引擎camunda-bpm依赖 implementation "org.camunda.bpm.springboot:camunda-bpm-spring-boot-starter:7.16.0" implementation "org.camunda.bpm.springboot:camunda-bpm-spring-boot-starter-webapp:7.16.0" implementation "org.camunda.bpm:camunda-engine-plugin-spin:7.16.0" implementation "org.camunda.spin:camunda-spin-dataformat-all:1.16.0"
Camunda工具类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.oa.business.flow.utils.camunda; 2 3 import cn.hutool.core.bean.BeanUtil; 4 import cn.hutool.core.collection.CollUtil; 5 import cn.hutool.core.lang.Snowflake; 6 import cn.hutool.core.util.IdUtil; 7 import cn.hutool.core.util.ObjectUtil; 8 import cn.hutool.core.util.StrUtil; 9 import cn.hutool.json.JSONArray; 10 import cn.hutool.json.JSONObject; 11 import cn.hutool.json.JSONUtil; 12 import com.galileotime.oa.business.flow.utils.camunda.constant.CamundaEnum; 13 import com.galileotime.oa.business.flow.utils.camunda.pojo.ProcessPOJO; 14 import lombok.extern.slf4j.Slf4j; 15 import org.camunda.bpm.model.bpmn.Bpmn; 16 import org.camunda.bpm.model.bpmn.BpmnModelInstance; 17 import org.camunda.bpm.model.bpmn.instance.Process; 18 import org.camunda.bpm.model.bpmn.instance.*; 19 import org.camunda.bpm.model.bpmn.instance.bpmndi.BpmnDiagram; 20 import org.camunda.bpm.model.bpmn.instance.bpmndi.BpmnEdge; 21 import org.camunda.bpm.model.bpmn.instance.bpmndi.BpmnPlane; 22 import org.camunda.bpm.model.bpmn.instance.bpmndi.BpmnShape; 23 import org.camunda.bpm.model.bpmn.instance.camunda.CamundaExecutionListener; 24 import org.camunda.bpm.model.bpmn.instance.camunda.CamundaTaskListener; 25 import org.camunda.bpm.model.bpmn.instance.dc.Bounds; 26 import org.camunda.bpm.model.bpmn.instance.di.Waypoint; 27 import org.springframework.stereotype.Component; 28 29 import java.util.HashMap; 30 import java.util.Iterator; 31 import java.util.List; 32 33 /** 34 * @author HeZeMin 35 * @className CamundaUtils 36 * @description Camunda工作流引擎工具类 37 * @date 2022/4/8 15:50 38 */ 39 @Slf4j 40 @Component 41 public class CamundaModelUtils { 42 /** 43 * 44 * @Description 创建流程定义 45 * @Return: void 46 * @Author HeZeMin 47 * @Date 2022年04月08日 15:54 48 */ 49 public String createExecutableProcess(HashMap<String, Object> param, Long userId) { 50 ProcessPOJO processPOJO = new ProcessPOJO(); 51 BeanUtil.copyProperties(param.get("process"), processPOJO); 52 log.info(JSONUtil.toJsonStr(param)); 53 54 //1、创建一个空的 BPMN 模型实例 55 BpmnModelInstance modelInstance = Bpmn.createEmptyModel(); 56 57 //2、创建BPMN定义元素,设置目标名称空间,并将其添加到新创建的模型实例中 58 Definitions definitions = modelInstance.newInstance(Definitions.class); 59 definitions.setTargetNamespace("http://camunda.org/examples"); 60 modelInstance.setDefinitions(definitions); 61 62 // di-对于图,需要创建一个图和一个平面元素。平面被设置在一个图对象中,图被添加为子元素 63 BpmnDiagram bpmnDiagram = modelInstance.newInstance(BpmnDiagram.class); 64 BpmnPlane plane = modelInstance.newInstance(BpmnPlane.class); 65 bpmnDiagram.setBpmnPlane(plane); 66 definitions.addChildElement(bpmnDiagram); 67 68 //3、创建流程 69 String procDefKey = CamundaEnum.PROCESS.getName() + this.id(); 70 Process process = createElement(definitions, procDefKey, Process.class); 71 process.setName(processPOJO.getProcessName()); 72 process.setExecutable(true);//可执行的流程 73 74 // di-平面元素添加process 75 plane.setBpmnElement(process); 76 77 //---业务代码处理start 78 //保存流程定义 79 //保存流程发起人用户 80 //保存流程发起人角色 81 //---业务代码处理end 82 83 //4、创建开始事件 84 StartEvent startEvent = this.createElement(process, CamundaEnum.EVENT.getName() + this.id(), StartEvent.class); 85 startEvent.setCamundaInitiator("initiator");//发起人 86 this.drawBpmnShape(modelInstance, plane, startEvent.getId());// di-平面元素添加节点 87 88 //5、创建申请人节点 89 UserTask userTask = this.createElement(process, CamundaEnum.ACTIVITY.getName() + this.id(), UserTask.class); 90 userTask.setName("发起人"); 91 userTask.setCamundaAssignee("${initiator}"); 92 // di-平面元素添加节点 93 this.drawBpmnShape(modelInstance, plane, userTask.getId()); 94 // 开始事件连线到申请人节点 95 SequenceFlow sequenceFlow = this.createSequenceFlow(process, startEvent, userTask); 96 // di-平面元素添加连线 97 this.drawBpmnEdge(modelInstance, plane, sequenceFlow.getId()); 98 99 //6、创建结束事件 100 EndEvent endEvent = this.createElement(process, CamundaEnum.EVENT.getName() + this.id(), EndEvent.class); 101 // 结束监听器 102 ExtensionElements extensionElements = this.createElement(endEvent, "", ExtensionElements.class); 103 CamundaExecutionListener start = this.createElement(extensionElements, "", CamundaExecutionListener.class); 104 start.setCamundaDelegateExpression("#{EndEventListener}"); 105 start.setCamundaEvent("start");//start||end 106 CamundaExecutionListener end = this.createElement(extensionElements, "", CamundaExecutionListener.class); 107 end.setCamundaDelegateExpression("#{EndEventListener}"); 108 end.setCamundaEvent("end");//start||end 109 endEvent.setExtensionElements(extensionElements); 110 this.drawBpmnShape(modelInstance, plane, endEvent.getId());// di-平面元素添加节点 111 112 //7、处理节点数据-[递归算法] 113 this.iterate(modelInstance, plane, process, userTask, endEvent, null, JSONUtil.toJsonStr(param.get("processModeel")), userId); 114 115 //8、验证模型 116 Bpmn.validateModel(modelInstance); 117 118 //9、转换为xml字符串 119 String xmlString = Bpmn.convertToString(modelInstance); 120 log.info(xmlString); 121 return xmlString; 122 } 123 /** 124 * 125 * @Description 修改流程定义 126 * @Return: void 127 * @Author HeZeMin 128 * @Date 2022年04月08日 15:54 129 */ 130 public String updateExecutableProcess(HashMap<String, Object> param, Long userId) { 131 ProcessPOJO processPOJO = new ProcessPOJO(); 132 BeanUtil.copyProperties(param.get("process"), processPOJO); 133 log.info(JSONUtil.toJsonStr(param)); 134 135 //1、创建一个空的 BPMN 模型实例 136 BpmnModelInstance modelInstance = Bpmn.createEmptyModel(); 137 138 //2、创建BPMN定义元素,设置目标名称空间,并将其添加到新创建的模型实例中 139 Definitions definitions = modelInstance.newInstance(Definitions.class); 140 definitions.setTargetNamespace("http://camunda.org/examples"); 141 modelInstance.setDefinitions(definitions); 142 143 // di-对于图,需要创建一个图和一个平面元素。平面被设置在一个图对象中,图被添加为子元素 144 BpmnDiagram bpmnDiagram = modelInstance.newInstance(BpmnDiagram.class); 145 BpmnPlane plane = modelInstance.newInstance(BpmnPlane.class); 146 bpmnDiagram.setBpmnPlane(plane); 147 definitions.addChildElement(bpmnDiagram); 148 149 //3、创建流程 150 String procDefKey = processPOJO.getProcDefKey(); 151 Process process = createElement(definitions, procDefKey, Process.class); 152 process.setName(processPOJO.getProcessName()); 153 process.setExecutable(true);//可执行的流程 154 155 // di-平面元素添加process 156 plane.setBpmnElement(process); 157 158 //---业务代码处理start 159 //修改流程定义 160 //流程发起人用户全部逻辑删除 161 //流程发起人角色全部逻辑删除 162 //保存流程发起人用户 163 //保存流程发起人角色 164 //流程节点定义规则全部逻辑删除 165 //流程节点定义用户规则全部逻辑删除 166 //流程网关定义规则全部逻辑删除 167 //流程网关定义条件规则全部逻辑删除 168 //---业务代码处理end 169 170 //4、创建开始事件 171 StartEvent startEvent = this.createElement(process, CamundaEnum.EVENT.getName() + this.id(), StartEvent.class); 172 startEvent.setCamundaInitiator("initiator");//发起人 173 this.drawBpmnShape(modelInstance, plane, startEvent.getId());// di-平面元素添加节点 174 175 //5、创建申请人节点 176 UserTask userTask = this.createElement(process, CamundaEnum.ACTIVITY.getName() + this.id(), UserTask.class); 177 userTask.setName("发起人"); 178 userTask.setCamundaAssignee("${initiator}"); 179 // di-平面元素添加节点 180 this.drawBpmnShape(modelInstance, plane, userTask.getId()); 181 // 开始事件连线到申请人节点 182 SequenceFlow sequenceFlow = this.createSequenceFlow(process, startEvent, userTask); 183 // di-平面元素添加连线 184 this.drawBpmnEdge(modelInstance, plane, sequenceFlow.getId()); 185 186 //6、创建结束事件 187 EndEvent endEvent = this.createElement(process, CamundaEnum.EVENT.getName() + this.id(), EndEvent.class); 188 // 结束监听器 189 ExtensionElements extensionElements = this.createElement(endEvent, "", ExtensionElements.class); 190 CamundaExecutionListener start = this.createElement(extensionElements, "", CamundaExecutionListener.class); 191 start.setCamundaDelegateExpression("#{EndEventListener}"); 192 start.setCamundaEvent("start");//start||end 193 CamundaExecutionListener end = this.createElement(extensionElements, "", CamundaExecutionListener.class); 194 end.setCamundaDelegateExpression("#{EndEventListener}"); 195 end.setCamundaEvent("end");//start||end 196 endEvent.setExtensionElements(extensionElements); 197 this.drawBpmnShape(modelInstance, plane, endEvent.getId());// di-平面元素添加节点 198 199 //7、处理节点数据-递归 200 this.iterate(modelInstance, plane, process, userTask, endEvent, null, JSONUtil.toJsonStr(param.get("processModeel")), userId); 201 202 //8、验证模型 203 Bpmn.validateModel(modelInstance); 204 205 //9、转换为xml字符串 206 String xmlString = Bpmn.convertToString(modelInstance); 207 log.info(xmlString); 208 return xmlString; 209 } 210 /** 211 *迭代器 212 * @Description 迭代器 213 * @Param process: 流程DOM对象 214 * @Param previouEvent: 上一节点DOM对象 215 * @Param endEvent: 结束事件DOM对象 216 * @Param conditionMap: 网关条件 217 * @Param jsonStr: 参数json串 218 * @Return: void 219 * @Author HeZeMin 220 * @Date 2022年04月12日 10:35 221 */ 222 public void iterate(BpmnModelInstance modelInstance, BpmnPlane plane, Process process, FlowNode previouEvent, FlowNode endEvent, HashMap<String, String> conditionMap, String jsonStr, Long userId) { 223 JSONObject jsonObject = JSONUtil.parseObj(jsonStr); 224 process.getId(); 225 if (ObjectUtil.isNotNull(jsonObject) && jsonObject.size() > 0) { 226 Integer nodeType = jsonObject.get("nodeType", Integer.class); 227 if (1 == nodeType || 2 == nodeType) {// 1=审批人,2=执行人 228 Integer auditType = jsonObject.get("auditType", Integer.class); 229 Integer auditMethod = jsonObject.get("auditMethod", Integer.class); 230 Integer isAdminAudit = jsonObject.get("isAdminAudit", Integer.class); 231 String dataType = jsonObject.get("dataType", String.class); 232 String nodeName = jsonObject.get("nodeName", String.class); 233 String dataValue = jsonObject.get("dataValue", String.class); 234 // 创建用户任务节点 235 String id = CamundaEnum.ACTIVITY.getName() + this.id(); 236 if (2 == nodeType) {// 执行人额外增加一个属性标识,不然不知道是执行人还是审批人 237 id = CamundaEnum.ACTIVITY.getName() + "executor_" + this.id();// 执行人标识 238 } 239 UserTask userTask = this.createElement(process, id, UserTask.class); 240 if (2 == nodeType) { 241 userTask.setName(StrUtil.isBlank(nodeName) ? "执行人" : nodeName); 242 } else { 243 userTask.setName(StrUtil.isBlank(nodeName) ? "审批人" : nodeName); 244 } 245 userTask.setCamundaAssignee("${assignee}"); 246 // 创建多人签实例 247 MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = this.createElement(userTask, "", MultiInstanceLoopCharacteristics.class); 248 //审批人集合参数 249 multiInstanceLoopCharacteristics.setCamundaCollection("assigneeList_" + id); 250 //迭代集合 251 multiInstanceLoopCharacteristics.setCamundaElementVariable("assignee"); 252 //完成条件 已完成数等于实例数 253 CompletionCondition completionCondition = this.createElement(multiInstanceLoopCharacteristics, "", CompletionCondition.class); 254 if (0 == auditMethod || 1 == auditMethod) {// 或签 255 completionCondition.setTextContent("${nrOfCompletedInstances == 1}"); 256 } else if (2 == auditMethod) {// 会签 257 completionCondition.setTextContent("${nrOfActiveInstances == nrOfInstances}"); 258 } else { 259 completionCondition.setTextContent("${nrOfActiveInstances == nrOfInstances}"); 260 } 261 multiInstanceLoopCharacteristics.setCompletionCondition(completionCondition); 262 // 并行,为true时就是顺序签 263 if (3 == auditMethod) { 264 multiInstanceLoopCharacteristics.setSequential(true); 265 } else { 266 multiInstanceLoopCharacteristics.setSequential(false); 267 } 268 userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); 269 270 // 站内信和提醒 监听器 271 ExtensionElements extensionElements = this.createElement(userTask, "", ExtensionElements.class); 272 CamundaTaskListener create = this.createElement(extensionElements, "", CamundaTaskListener.class); 273 create.setCamundaDelegateExpression("#{TaskMessageListener}"); 274 create.setCamundaEvent("create"); 275 CamundaTaskListener complete = this.createElement(extensionElements, "", CamundaTaskListener.class); 276 complete.setCamundaDelegateExpression("#{TaskMessageListener}"); 277 complete.setCamundaEvent("complete"); 278 userTask.setExtensionElements(extensionElements); 279 280 // di-平面元素添加节点 281 this.drawBpmnShape(modelInstance, plane, userTask.getId()); 282 283 //--相关数据存入数据库start 284 //保存节点 285 //保存节点对应的数据 286 //--相关数据存入数据库end 287 JSONArray nextNodeDataList = (JSONArray) jsonObject.get("nextNodeData"); 288 if (CollUtil.isNotEmpty(nextNodeDataList)) {//有下一个节点 289 SequenceFlow sequenceFlow = this.createSequenceFlow(process, previouEvent, userTask, conditionMap); 290 // di-平面元素添加连线 291 this.drawBpmnEdge(modelInstance, plane, sequenceFlow.getId()); 292 this.iterate(modelInstance, plane, process, userTask, endEvent, null, JSONUtil.toJsonStr(nextNodeDataList.get(0)), userId); 293 } else {// 没有下一个节点了,连线结束事件 294 SequenceFlow sequenceFlow = this.createSequenceFlow(process, previouEvent, userTask, conditionMap); 295 SequenceFlow sequenceFlow1 = this.createSequenceFlow(process, userTask, endEvent); 296 // di-平面元素添加连线 297 this.drawBpmnEdge(modelInstance, plane, sequenceFlow.getId()); 298 // di-平面元素添加连线 299 this.drawBpmnEdge(modelInstance, plane, sequenceFlow1.getId()); 300 } 301 } else if (3 == nodeType) {// 3=抄送人 302 Integer auditType = jsonObject.get("auditType", Integer.class); 303 Integer auditMethod = jsonObject.get("auditMethod", Integer.class); 304 Integer isAdminAudit = jsonObject.get("isAdminAudit", Integer.class); 305 String dataType = jsonObject.get("dataType", String.class); 306 String dataValue = jsonObject.get("dataValue", String.class); 307 String nodeName = jsonObject.get("nodeName", String.class); 308 // 创建用户任务节点 309 String id = CamundaEnum.ACTIVITY.getName() + "copy_" + this.id(); 310 UserTask userTask = this.createElement(process, id, UserTask.class); 311 userTask.setName(StrUtil.isBlank(nodeName) ? "抄送人" : nodeName); 312 313 // 抄送监听器 314 ExtensionElements extensionElements = this.createElement(userTask, "", ExtensionElements.class); 315 CamundaTaskListener create = this.createElement(extensionElements, "", CamundaTaskListener.class); 316 create.setCamundaDelegateExpression("#{CopyListener}"); 317 create.setCamundaEvent("create"); 318 CamundaTaskListener complete = this.createElement(extensionElements, "", CamundaTaskListener.class); 319 complete.setCamundaDelegateExpression("#{CopyListener}"); 320 complete.setCamundaEvent("complete"); 321 userTask.setExtensionElements(extensionElements); 322 323 // di-平面元素添加节点 324 this.drawBpmnShape(modelInstance, plane, userTask.getId()); 325 326 //--相关数据存入数据库 327 //保存节点 328 //保存节点对应的数据 329 //--相关数据存入数据库 330 331 JSONArray nextNodeDataList = (JSONArray) jsonObject.get("nextNodeData"); 332 if (CollUtil.isNotEmpty(nextNodeDataList)) {//有下一个节点 333 SequenceFlow sequenceFlow = this.createSequenceFlow(process, previouEvent, userTask, conditionMap); 334 // di-平面元素添加连线 335 this.drawBpmnEdge(modelInstance, plane, sequenceFlow.getId()); 336 this.iterate(modelInstance, plane, process, userTask, endEvent, null, JSONUtil.toJsonStr(nextNodeDataList.get(0)), userId); 337 } else {// 没有下一个节点了,连线结束事件 338 SequenceFlow sequenceFlow = this.createSequenceFlow(process, previouEvent, userTask, conditionMap); 339 SequenceFlow sequenceFlow1 = this.createSequenceFlow(process, userTask, endEvent); 340 // di-平面元素添加连线 341 this.drawBpmnEdge(modelInstance, plane, sequenceFlow.getId()); 342 // di-平面元素添加连线 343 this.drawBpmnEdge(modelInstance, plane, sequenceFlow1.getId()); 344 } 345 } else if (4 == nodeType){// 4=条件分支,只有网关才会有下一节点数据和条件判断数据同时出现的情况 346 String nodeName = jsonObject.get("nodeName", String.class); 347 // 创建网关 348 String id = CamundaEnum.GATEWAY.getName() + this.id(); 349 // 专属网关,直走一个条件 350 ExclusiveGateway gateway = this.createElement(process, id, ExclusiveGateway.class); 351 // 并行网关,所有条件都走 352 // ParallelGateway gateway = createElement(process, id, ParallelGateway.class); 353 SequenceFlow sequenceFlow = this.createSequenceFlow(process, previouEvent, gateway, conditionMap); 354 355 // di-平面元素添加节点 356 this.drawBpmnShape(modelInstance, plane, gateway.getId()); 357 // di-平面元素添加连线 358 this.drawBpmnEdge(modelInstance, plane, sequenceFlow.getId()); 359 360 //--相关数据存入数据库start 361 // 保存网关节点 362 //--相关数据存入数据库end 363 364 // 条件判断集合 365 JSONArray conditionList = (JSONArray) jsonObject.get("conditionList"); 366 Iterator<Object> iterator = conditionList.iterator(); 367 while (iterator.hasNext()) { 368 JSONObject condition = (JSONObject) iterator.next(); 369 370 //--相关数据存入数据库start 371 // 保存网关节点条件判断 372 //--相关数据存入数据库end 373 374 // 网关表达式 375 StringBuilder textContent = new StringBuilder(); 376 textContent.append("${"); 377 if (StrUtil.isNotBlank(condition.get("conditionKey_", String.class))) {//两个条件 378 textContent.append("("); 379 if (StrUtil.contains("区间", condition.get("operator", String.class))) { 380 textContent.append(condition.get("targetValue1", String.class) + condition.get("targetValue1Operator", String.class) + condition.get("conditionKey", String.class)) 381 .append(" && ") 382 .append(condition.get("conditionKey", String.class) + condition.get("targetValue2Operator", String.class) + condition.get("targetValue2", String.class)); 383 } else if (StrUtil.contains("包含", condition.get("operator", String.class))) { 384 List<String> stringList = StrUtil.split(condition.get("targetValue", String.class), ","); 385 for (int i = 0; i < stringList.size(); i++) { 386 String targetValue = stringList.get(i); 387 if (i == 0) { 388 textContent.append(condition.get("conditionKey", String.class) + " == " + targetValue); 389 } else { 390 textContent.append(" || "); 391 textContent.append(condition.get("conditionKey", String.class) + " == " + targetValue); 392 } 393 } 394 } else if (StrUtil.contains("不包含", condition.get("operator", String.class))) { 395 List<String> stringList = StrUtil.split(condition.get("targetValue", String.class), ","); 396 for (int i = 0; i < stringList.size(); i++) { 397 String targetValue = stringList.get(i); 398 if (i == 0) { 399 textContent.append(condition.get("conditionKey", String.class) + " != " + targetValue); 400 } else { 401 textContent.append(" && "); 402 textContent.append(condition.get("conditionKey", String.class) + " != " + targetValue); 403 } 404 } 405 } else { 406 textContent.append(condition.get("conditionKey", String.class) + condition.get("operator", String.class) + condition.get("targetValue", String.class)); 407 } 408 textContent.append(") && ("); 409 if (StrUtil.contains("区间", condition.get("operator_", String.class))) { 410 textContent.append(condition.get("targetValue1_", String.class) + condition.get("targetValue1Operator_", String.class) + condition.get("conditionKey_", String.class)) 411 .append(" && ") 412 .append(condition.get("conditionKey_", String.class) + condition.get("targetValue2Operator_", String.class) + condition.get("targetValue2_", String.class)); 413 } else if (StrUtil.contains("包含", condition.get("operator_", String.class))) { 414 List<String> stringList = StrUtil.split(condition.get("targetValue_", String.class), ","); 415 for (int i = 0; i < stringList.size(); i++) { 416 String targetValue = stringList.get(i); 417 if (i == 0) { 418 textContent.append(condition.get("conditionKey_", String.class) + " == " + targetValue); 419 } else { 420 textContent.append(" || "); 421 textContent.append(condition.get("conditionKey_", String.class) + " == " + targetValue); 422 } 423 } 424 } else if (StrUtil.contains("不包含", condition.get("operator_", String.class))) { 425 List<String> stringList = StrUtil.split(condition.get("targetValue_", String.class), ","); 426 for (int i = 0; i < stringList.size(); i++) { 427 String targetValue = stringList.get(i); 428 if (i == 0) { 429 textContent.append(condition.get("conditionKey_", String.class) + " != " + targetValue); 430 } else { 431 textContent.append(" && "); 432 textContent.append(condition.get("conditionKey_", String.class) + " != " + targetValue); 433 } 434 } 435 } else { 436 textContent.append(condition.get("conditionKey_", String.class) + condition.get("operator_", String.class) + condition.get("targetValue_", String.class)); 437 } 438 textContent.append(")"); 439 } else {// 一个条件 440 if (StrUtil.contains("区间", condition.get("operator", String.class))) { 441 textContent.append(condition.get("targetValue1", String.class) + condition.get("targetValue1Operator", String.class) + condition.get("conditionKey", String.class)) 442 .append(" && ") 443 .append(condition.get("conditionKey", String.class) + condition.get("targetValue2Operator", String.class) + condition.get("targetValue2", String.class)); 444 } else if (StrUtil.contains("包含", condition.get("operator", String.class))) { 445 List<String> stringList = StrUtil.split(condition.get("targetValue", String.class), ","); 446 for (int i = 0; i < stringList.size(); i++) { 447 String targetValue = stringList.get(i); 448 if (i == 0) { 449 textContent.append(condition.get("conditionKey", String.class) + " == " + targetValue); 450 } else { 451 textContent.append(" || "); 452 textContent.append(condition.get("conditionKey", String.class) + " == " + targetValue); 453 } 454 } 455 } else if (StrUtil.contains("不包含", condition.get("operator", String.class))) { 456 List<String> stringList = StrUtil.split(condition.get("targetValue", String.class), ","); 457 for (int i = 0; i < stringList.size(); i++) { 458 String targetValue = stringList.get(i); 459 if (i == 0) { 460 textContent.append(condition.get("conditionKey", String.class) + " != " + targetValue); 461 } else { 462 textContent.append(" && "); 463 textContent.append(condition.get("conditionKey", String.class) + " != " + targetValue); 464 } 465 } 466 } else { 467 textContent.append(condition.get("conditionKey", String.class) + condition.get("operator", String.class) + condition.get("targetValue", String.class)); 468 } 469 } 470 textContent.append("}"); 471 JSONArray nextNodeDataList = (JSONArray) condition.get("nextNodeData"); 472 if (CollUtil.isNotEmpty(nextNodeDataList)) {//有下一个节点 473 String conditionName = condition.get("conditionName", String.class); 474 HashMap<String, String> map = new HashMap<>(); 475 map.put("name", StrUtil.isBlank(conditionName) ? textContent.toString() : conditionName); 476 map.put("type", ""); 477 map.put("textContent", textContent.toString()); 478 this.iterate(modelInstance, plane, process, gateway, endEvent, map, JSONUtil.toJsonStr(nextNodeDataList.get(0)), userId); 479 } else { 480 SequenceFlow sequenceFlow1 = this.createSequenceFlow(process, gateway, endEvent); 481 // di-平面元素添加连线 482 this.drawBpmnEdge(modelInstance, plane, sequenceFlow1.getId()); 483 // 一下注释代码暂时用不到,勿删 484 // 网关的下一个节点,不是条件下的 485 // JSONArray gatewayNnextNodeDataList = (JSONArray) jsonObject.get("nextNodeData"); 486 // if (CollUtil.isNotEmpty(gatewayNnextNodeDataList)) {//有下一个节点 487 // this.createSequenceFlow(process, startEvent, gateway, conditionMap); 488 // this.iterate(process, gateway, endEvent, null, JSONUtil.toJsonStr(gatewayNnextNodeDataList.get(0))); 489 // } else {// 没有下一个节点了,连线结束事件 490 // this.createSequenceFlow(process, gateway, endEvent, conditionMap); 491 // } 492 } 493 } 494 } 495 } else { 496 // 开始事件连线到结束事件 497 SequenceFlow sequenceFlow = this.createSequenceFlow(process, previouEvent, endEvent); 498 // di-平面元素添加连线 499 this.drawBpmnEdge(modelInstance, plane, sequenceFlow.getId()); 500 } 501 } 502 /** 503 * Description:id生成器 504 * @Author HeZeMin 505 * @Date 2022年04月21日 15:25 506 */ 507 protected String id() { 508 Snowflake snowflake = IdUtil.getSnowflake(1, 1); 509 return snowflake.nextIdStr(); 510 } 511 /** 512 * Description:创建元素-在父元素下创建子元素- 513 * @Author HeZeMin 514 * @Date 2022年04月21日 15:24 515 */ 516 protected <T extends BpmnModelElementInstance> T createElement(BpmnModelElementInstance parentElement, String id, Class<T> elementClass) { 517 T element = parentElement.getModelInstance().newInstance(elementClass); 518 if (StrUtil.isNotBlank(id)) { 519 element.setAttributeValue("id", id, true); 520 } 521 parentElement.addChildElement(element); 522 return element; 523 } 524 /** 525 * Description:创建元素-在父元素下创建子元素,需要传元素属性 526 * @Author HeZeMin 527 * @Date 2022年04月21日 15:24 528 */ 529 protected <T extends BpmnModelElementInstance> T createElement(BpmnModelElementInstance parentElement, HashMap<String, String> params, Class<T> elementClass) { 530 T element = parentElement.getModelInstance().newInstance(elementClass); 531 if (CollUtil.isNotEmpty(params)) { 532 params.forEach((key, value) -> { 533 if ("id".equals(key)) { 534 element.setAttributeValue("id", value, true); 535 } else { 536 element.setAttributeValue(key, value); 537 } 538 }); 539 } 540 parentElement.addChildElement(element); 541 return element; 542 } 543 /** 544 * Description:创建线条元素-元素之间的连接线 545 * @Author HeZeMin 546 * @Date 2022年04月21日 14:42 547 */ 548 protected SequenceFlow createSequenceFlow(Process process, FlowNode from, FlowNode to) { 549 String identifier = from.getId() + "-" + to.getId(); 550 SequenceFlow sequenceFlow = this.createElement(process, identifier, SequenceFlow.class); 551 process.addChildElement(sequenceFlow); 552 sequenceFlow.setSource(from); 553 from.getOutgoing().add(sequenceFlow); 554 sequenceFlow.setTarget(to); 555 to.getIncoming().add(sequenceFlow); 556 return sequenceFlow; 557 } 558 /** 559 * Description:创建线条元素-网关元素之间的连接线,需要传判断条件 560 * @Author HeZeMin 561 * @Date 2022年04月21日 14:41 562 */ 563 protected SequenceFlow createSequenceFlow(Process process, FlowNode from, FlowNode to, HashMap<String, String> conditionMap) { 564 String identifier = from.getId() + "-" + to.getId(); 565 SequenceFlow sequenceFlow = this.createElement(process, identifier, SequenceFlow.class); 566 process.addChildElement(sequenceFlow); 567 sequenceFlow.setSource(from); 568 from.getOutgoing().add(sequenceFlow); 569 sequenceFlow.setTarget(to); 570 to.getIncoming().add(sequenceFlow); 571 // 判断是否有连线条件 572 if (CollUtil.isNotEmpty(conditionMap)) { 573 // set条件 574 sequenceFlow.setName(conditionMap.get("name")); 575 ConditionExpression conditionExpression = this.createElement(sequenceFlow, "", ConditionExpression.class); 576 // conditionExpression.setType(conditionMap.get("type")); 577 conditionExpression.setTextContent(conditionMap.get("textContent")); 578 sequenceFlow.setConditionExpression(conditionExpression); 579 } 580 return sequenceFlow; 581 } 582 /** 583 * Description:绘制节点 584 * @Author HeZeMin 585 * @Date 2022年04月21日 14:39 586 */ 587 protected void drawBpmnShape(BpmnModelInstance modelInstance, BpmnPlane plane, String elementById) { 588 BpmnShape bpmnShape = modelInstance.newInstance(BpmnShape.class); 589 BaseElement element1 = modelInstance.getModelElementById(elementById); 590 bpmnShape.setBpmnElement(element1); 591 bpmnShape.setId(elementById + "_di"); 592 Bounds bounds = modelInstance.newInstance(Bounds.class); 593 bounds.setX(150); 594 bounds.setY(80); 595 bounds.setHeight(80); 596 bounds.setWidth(100); 597 if (element1 instanceof ExclusiveGateway) { 598 bpmnShape.setMarkerVisible(true); 599 } 600 bpmnShape.setBounds(bounds); 601 plane.addChildElement(bpmnShape); 602 } 603 /** 604 * Description:绘制连线 605 * @Author HeZeMin 606 * @Date 2022年04月21日 14:40 607 */ 608 protected void drawBpmnEdge(BpmnModelInstance modelInstance, BpmnPlane plane, String elementById) { 609 BpmnEdge bpmnEdge = modelInstance.newInstance(BpmnEdge.class); 610 BaseElement element0 = modelInstance.getModelElementById(elementById); 611 bpmnEdge.setId(elementById + "_di"); 612 bpmnEdge.setBpmnElement(element0); 613 Waypoint wp1 = modelInstance.newInstance(Waypoint.class); 614 wp1.setX(300); 615 wp1.setY(100); 616 bpmnEdge.addChildElement(wp1); 617 Waypoint wp2 = modelInstance.newInstance(Waypoint.class); 618 wp2.setX(300); 619 wp2.setY(100); 620 bpmnEdge.addChildElement(wp2); 621 plane.addChildElement(bpmnEdge); 622 } 623 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.oa.business.flow.utils.camunda; 2 3 import cn.hutool.core.collection.CollUtil; 4 import cn.hutool.json.JSONObject; 5 import cn.hutool.json.JSONUtil; 6 import lombok.extern.slf4j.Slf4j; 7 import org.apache.commons.lang3.StringUtils; 8 import org.camunda.bpm.engine.*; 9 import org.camunda.bpm.engine.history.HistoricVariableInstance; 10 import org.camunda.bpm.engine.impl.RepositoryServiceImpl; 11 import org.camunda.bpm.engine.impl.bpmn.behavior.UserTaskActivityBehavior; 12 import org.camunda.bpm.engine.impl.el.ExpressionManager; 13 import org.camunda.bpm.engine.impl.javax.el.ExpressionFactory; 14 import org.camunda.bpm.engine.impl.javax.el.ValueExpression; 15 import org.camunda.bpm.engine.impl.juel.ExpressionFactoryImpl; 16 import org.camunda.bpm.engine.impl.juel.SimpleContext; 17 import org.camunda.bpm.engine.impl.persistence.entity.ProcessDefinitionEntity; 18 import org.camunda.bpm.engine.impl.pvm.PvmActivity; 19 import org.camunda.bpm.engine.impl.pvm.PvmTransition; 20 import org.camunda.bpm.engine.impl.pvm.process.ActivityImpl; 21 import org.camunda.bpm.engine.impl.task.TaskDefinition; 22 import org.springframework.beans.factory.annotation.Autowired; 23 import org.springframework.stereotype.Component; 24 25 import java.util.*; 26 import java.util.concurrent.CopyOnWriteArrayList; 27 import java.util.stream.Collectors; 28 29 /** 30 * Camunda节点操作工具类 31 * @author HeZeMin 32 * @className CamundaNodeUtils 33 * @date 2022/6/22 15:01 34 */ 35 @Slf4j 36 @Component 37 public class CamundaNodeUtils { 38 39 @Autowired 40 RepositoryService repositoryService;// 部署服务 41 @Autowired 42 RuntimeService runtimeService;// 运行服务 43 @Autowired 44 IdentityService identityService;// 用户服务 45 @Autowired 46 AuthorizationService authorizationService;// 授权服务 47 @Autowired 48 TaskService taskService;// 任务服务 49 @Autowired 50 HistoryService historyService;// 历史服务 51 52 /** 53 * Description:根据流程实例ID查询审批节点集合 54 * @Author HeZeMin 55 * @Date 2022年06月22日 17:05 56 */ 57 public List<JSONObject> simulationNextPath(String processInstanceId, boolean isHistoric) { 58 log.debug("-------------------------------------------------------"); 59 Map<String, Object> condition = new HashMap<>(); 60 if (isHistoric) { 61 List<HistoricVariableInstance> variableInstanceList = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).list(); 62 condition = new HashMap<>(variableInstanceList.size()); 63 for (int i = 0; i < variableInstanceList.size(); i++) { 64 condition.put(variableInstanceList.get(i).getName(), variableInstanceList.get(i).getValue()); 65 } 66 } else { 67 condition = runtimeService.getVariables(processInstanceId); 68 } 69 log.debug("condition---->" + JSONUtil.toJsonStr(condition)); 70 List<TaskDefinition> tasks = null; 71 try { 72 tasks = this.getNextTaskInfos(processInstanceId, condition, isHistoric); 73 } catch (Exception e) { 74 e.printStackTrace(); 75 } 76 log.debug("----------->" + JSONUtil.toJsonStr(tasks)); 77 List<JSONObject> ja = new ArrayList<>(); 78 if (CollUtil.isNotEmpty(tasks)) { 79 for (TaskDefinition task : tasks) { 80 JSONObject jo = new JSONObject(); 81 jo.set("key", task.getKey()); 82 jo.set("name", task.getNameExpression().getExpressionText()); 83 jo.set("assignment", task.getAssigneeExpression() == null ? "" : task.getAssigneeExpression().getExpressionText()); 84 ja.add(jo); 85 } 86 } 87 log.debug("----->" + ja.toString()); 88 log.debug("-------------------------------------------------------"); 89 return ja; 90 } 91 /** 92 * 获取下一个节点任务信息 93 * 94 * @param processInstanceId 95 * 流程实例ID 96 * @return 下一个节点信息 97 * @throws Exception 98 */ 99 public List<TaskDefinition> getNextTaskInfos(String processInstanceId, Map<String, Object> condition, boolean isHistoric) { 100 ProcessDefinitionEntity processDefinitionEntity = null; 101 List<TaskDefinition> tasks = new CopyOnWriteArrayList<TaskDefinition>(); 102 // 获取流程发布Id信息 103 String definitionId = ""; 104 if (isHistoric) { 105 definitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId(); 106 } else { 107 definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId) 108 .singleResult().getProcessDefinitionId(); 109 } 110 processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) 111 .getDeployedProcessDefinition(definitionId); 112 // 获取流程所有节点信息 113 List<ActivityImpl> activitiList = processDefinitionEntity.getActivities(); 114 115 activitiList = activitiList.stream().filter(activity -> activity.getProperty("type").equals("startEvent")).collect(Collectors.toList()); 116 this.nextTaskDefinitions(tasks, activitiList, activitiList.get(0).getId(), processInstanceId, condition); 117 118 return tasks; 119 } 120 121 private List<TaskDefinition> nextTaskDefinitions(List<TaskDefinition> tasks, List<ActivityImpl> activityList, String activityId, 122 String processInstanceId, Map<String, Object> condition) { 123 activityList.forEach(activity -> { 124 PvmActivity ac = null; 125 Object expression = null;// 表达式 126 log.debug("activityImpl.getActivityId()---->"+activity.getActivityId()+"---activityId---------->"+activityId+"--->"+activity.getProperty("type")); 127 // 如果遍历节点为用户任务并且节点不是当前节点信息 128 if ("userTask".equals(activity.getProperty("type")) && !activityId.equals(activity.getId())) { 129 // 获取该节点下一个节点信息 130 TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activity.getActivityBehavior()).getTaskDefinition(); 131 tasks.add(taskDefinition); 132 List<PvmTransition> outTransitions = activity.getOutgoingTransitions(); 133 List<ActivityImpl> activityListTmp = new ArrayList<>(); 134 activityListTmp.add((ActivityImpl)(outTransitions.get(0).getDestination())); 135 this.nextTaskDefinitions(tasks, activityListTmp, activityListTmp.get(0).getId(), processInstanceId, condition); 136 }else if (activity.getProperty("type").toString().contains("EndEvent") && !activityId.equals(activity.getId())) { 137 // 设置结束节点 138 TaskDefinition taskDefinition = new TaskDefinition(null); 139 ExpressionManager expressionManager = new ExpressionManager(); 140 taskDefinition.setKey(activity.getId() == null ? "end" : activity.getId()); 141 String name = activity.getProperty("name") == null ? "结束" : activity.getProperty("name").toString(); 142 taskDefinition.setNameExpression(expressionManager.createExpression(name)); 143 // taskDefinitions.add(taskDefinition); 144 } else if ("multiInstanceBody".equals(activity.getProperty("type")) && !activityId.equals(activity.getId())) { 145 // 获取该节点下一个节点信息 146 List<ActivityImpl> list = ((ActivityImpl) activity).getActivities(); 147 for(ActivityImpl act : list){ 148 //log.debug("act-------------->"+act.getActivityBehavior().getClass().getTypeName()); 149 TaskDefinition taskDefinition = ((UserTaskActivityBehavior) act.getActivityBehavior()).getTaskDefinition(); 150 tasks.add(taskDefinition); 151 } 152 List<ActivityImpl> activityListTmp = new ArrayList<>(); 153 activityListTmp.add((ActivityImpl) activity); 154 this.nextTaskDefinitions(tasks, activityListTmp, activityListTmp.get(0).getId(), processInstanceId, condition); 155 // 当前节点为exclusiveGateway或inclusiveGateway 156 } else if ("exclusiveGateway".equals(activity.getProperty("type")) || "inclusiveGateway".equals(activity.getProperty("type"))) { 157 List<PvmTransition> outTransitions = activity.getOutgoingTransitions(); 158 String defaultTransition = (String) activity.getProperty("default"); 159 if (outTransitions.size() == 1) { 160 List<ActivityImpl> activityListTmp = new ArrayList<>(); 161 activityListTmp.add((ActivityImpl) outTransitions.get(0).getDestination()); 162 this.nextTaskDefinitions(tasks, activityListTmp,activityListTmp.get(0).getId(), processInstanceId, condition); 163 } else if (outTransitions.size() > 1) { // 如果排他网关有多条线路信息 164 for (PvmTransition tr1 : outTransitions) { 165 ActivityImpl actImpl = (ActivityImpl) tr1.getDestination(); 166 if (actImpl.getProperty("type").toString().contains("EndEvent")) { 167 TaskDefinition taskDefinition = new TaskDefinition(null); 168 ExpressionManager expressionManager = new ExpressionManager(); 169 taskDefinition.setKey(actImpl.getId() == null ? "end" : actImpl.getId()); 170 String name = actImpl.getProperty("name") == null ? "结束" : actImpl.getProperty("name").toString(); 171 taskDefinition.setNameExpression(expressionManager.createExpression(name)); 172 // taskDefinitions.add(taskDefinition); 173 break; 174 } 175 expression = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息 176 if (null == expression) { 177 continue; 178 } 179 // 判断el表达式是否成立 180 if (isCondition(condition, StringUtils.trim(expression.toString()))) { 181 List<ActivityImpl> activityListTmp = new ArrayList<>(); 182 activityListTmp.add(actImpl); 183 this.nextTaskDefinitions(tasks, activityListTmp, "", processInstanceId, condition); 184 } 185 } 186 } 187 } else if ("parrallelGateway".equals(activity.getProperty("type"))) { 188 List<PvmTransition> outTransitions = activity.getOutgoingTransitions(); 189 for (PvmTransition tr1 : outTransitions) { 190 List<ActivityImpl> activityListTmp = new ArrayList<>(); 191 activityListTmp.add((ActivityImpl) tr1.getDestination()); 192 this.nextTaskDefinitions(tasks, activityListTmp,activityListTmp.get(0).getId(), processInstanceId, condition); 193 } 194 } else {//*************************************************************** 195 // 获取节点所有流向线路信息 196 List<PvmTransition> outTransitions = activity.getOutgoingTransitions(); 197 List<PvmTransition> outTransitionsTemp = null; 198 for (PvmTransition tr : outTransitions) { 199 ac = tr.getDestination(); // 获取线路的终点节点 200 log.debug("ac----------->" + ac.getId() + "------>" + ac.getProperty("type")); 201 // 如果流向线路为排他网关或包容网关 202 if ("exclusiveGateway".equals(ac.getProperty("type")) || "inclusiveGateway".equals(ac.getProperty("type"))) { 203 outTransitionsTemp = ac.getOutgoingTransitions(); 204 String defaultTransition = (String) ac.getProperty("default"); 205 // 如果排他网关只有一条线路信息 206 if (outTransitionsTemp.size() == 1) { 207 List<ActivityImpl> activityListTmp = new ArrayList<>(); 208 activityListTmp.add((ActivityImpl) outTransitionsTemp.get(0).getDestination()); 209 this.nextTaskDefinitions(tasks, activityListTmp,activityListTmp.get(0).getId(), processInstanceId, condition); 210 } else if (outTransitionsTemp.size() > 1) { // 如果排他网关有多条线路信息 211 for (PvmTransition tr1 : outTransitionsTemp) { 212 PvmActivity ac1 = tr1.getDestination(); 213 ActivityImpl actImpl = (ActivityImpl) ac1; 214 if (actImpl.getProperty("type").toString().contains("EndEvent")) { 215 TaskDefinition taskDefinition2 = new TaskDefinition(null); 216 ExpressionManager expressionManager2 = new ExpressionManager(); 217 taskDefinition2.setKey(actImpl.getId() == null ? "end" : actImpl.getId()); 218 String name2 = actImpl.getProperty("name") == null ? "结束" : actImpl.getProperty("name").toString(); 219 taskDefinition2.setNameExpression(expressionManager2.createExpression(name2)); 220 // taskDefinitions.add(taskDefinition2); 221 break; 222 } 223 expression = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息 224 if (null == expression) { 225 continue; 226 } 227 // 判断el表达式是否成立 228 if (this.isCondition(condition, StringUtils.trim(expression.toString()))) { 229 List<ActivityImpl> activityListTmp = new ArrayList<>(); 230 activityListTmp.add(actImpl); 231 this.nextTaskDefinitions(tasks, activityListTmp,"", processInstanceId, condition); 232 } 233 } 234 } 235 } else if ("userTask".equals(ac.getProperty("type"))) { 236 tasks.add(((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior()).getTaskDefinition()); 237 TaskDefinition taskDefinition = ((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior()).getTaskDefinition(); 238 List<ActivityImpl> activityListTmp = new ArrayList<>(); 239 activityListTmp.add((ActivityImpl) ac); 240 this.nextTaskDefinitions(tasks, activityListTmp,activityListTmp.get(0).getId(), processInstanceId, condition); 241 } else if ("multiInstanceBody".equals(ac.getProperty("type"))) { 242 List<ActivityImpl> list = ((ActivityImpl) ac).getActivities(); 243 for(ActivityImpl act : list){ 244 //log.debug("act-------------->"+act.getActivityBehavior().getClass().getTypeName()); 245 TaskDefinition taskDefinition = ((UserTaskActivityBehavior) act.getActivityBehavior()).getTaskDefinition(); 246 tasks.add(taskDefinition); 247 } 248 List<ActivityImpl> activityListTmp = new ArrayList<>(); 249 activityListTmp.add((ActivityImpl) ac); 250 this.nextTaskDefinitions(tasks, activityListTmp,activityListTmp.get(0).getId(), processInstanceId, condition); 251 } else if (ac.getProperty("type").toString().contains("EndEvent")) { 252 // 设置结束节点 253 TaskDefinition taskDefinition = new TaskDefinition(null); 254 ExpressionManager expressionManager = new ExpressionManager(); 255 taskDefinition.setKey(ac.getId() == null ? "end" : ac.getId()); 256 String name = ac.getProperty("name") == null ? "结束" : ac.getProperty("name").toString(); 257 taskDefinition.setNameExpression(expressionManager.createExpression(name)); 258 // taskDefinitions.add(taskDefinition); 259 } else if ("parrallelGateway".equals(ac.getProperty("type"))) { 260 List<PvmTransition> poutTransitions = ac.getOutgoingTransitions(); 261 for (PvmTransition tr1 : poutTransitions) { 262 tasks.add(((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior()).getTaskDefinition()); 263 List<ActivityImpl> activityListTmp = new ArrayList<>(); 264 activityListTmp.add((ActivityImpl) ac); 265 this.nextTaskDefinitions(tasks, activityListTmp, "", processInstanceId, condition); 266 } 267 } 268 } 269 } 270 // return taskDefinitions; 271 }); 272 return null; 273 } 274 275 private boolean isCondition(Map<String, Object> condition, String expression) { 276 try { 277 ExpressionFactory factory = new ExpressionFactoryImpl(); 278 SimpleContext context = new SimpleContext(); 279 if (condition != null) { 280 Iterator<Map.Entry<String, Object>> iterator = condition.entrySet().iterator(); 281 while (iterator.hasNext()) { 282 Map.Entry<String, Object> value = iterator.next(); 283 context.setVariable(value.getKey(), factory.createValueExpression(value.getValue(), String.class)); 284 } 285 } 286 ValueExpression e = factory.createValueExpression(context, expression, boolean.class); 287 return (Boolean) e.getValue(context); 288 } catch (Exception e) { 289 log.error("operation error"); 290 throw e; 291 } 292 } 293 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.oa.business.flow.utils.camunda; 2 3 import cn.hutool.core.collection.CollUtil; 4 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.json.JSONObject; 7 import lombok.extern.slf4j.Slf4j; 8 import org.camunda.bpm.engine.*; 9 import org.camunda.bpm.engine.history.HistoricActivityInstance; 10 import org.camunda.bpm.engine.history.HistoricTaskInstance; 11 import org.camunda.bpm.engine.impl.RepositoryServiceImpl; 12 import org.camunda.bpm.engine.impl.persistence.entity.ProcessDefinitionEntity; 13 import org.camunda.bpm.engine.impl.pvm.process.ActivityImpl; 14 import org.camunda.bpm.engine.repository.Deployment; 15 import org.camunda.bpm.engine.runtime.ActivityInstance; 16 import org.camunda.bpm.engine.runtime.ProcessInstance; 17 import org.camunda.bpm.engine.runtime.ProcessInstanceModificationBuilder; 18 import org.camunda.bpm.engine.task.Task; 19 import org.springframework.beans.factory.annotation.Autowired; 20 import org.springframework.stereotype.Component; 21 22 import java.util.*; 23 import java.util.stream.Collectors; 24 25 /** 26 * @author HeZeMin 27 * @className CamundaServiceUtils 28 * @description Camunda服务工具类 29 * @date 2022/4/12 11:44 30 */ 31 @Slf4j 32 @Component 33 public class CamundaServiceUtils { 34 @Autowired 35 RepositoryService repositoryService;// 部署服务 36 @Autowired 37 RuntimeService runtimeService;// 运行服务 38 @Autowired 39 IdentityService identityService;// 用户服务 40 @Autowired 41 AuthorizationService authorizationService;// 授权服务 42 @Autowired 43 TaskService taskService;// 任务服务 44 @Autowired 45 HistoryService historyService;// 历史服务 46 @Autowired 47 ManagementService managementService; 48 49 // 1、部署流程定义 50 public JSONObject deployProcess(JSONObject params) { 51 // 获取参数 52 String name = params.get("processName", String.class); 53 String bpmnXmlStr = params.get("bpmnXmlStr", String.class); 54 // 部署流程定义 55 Deployment deployment = repositoryService.createDeployment() 56 .name(name) 57 .addString(name + ".bpmn20.xml", bpmnXmlStr) 58 .deploy(); 59 // managementService.registerProcessApplication(deployment.getId(), Context.getCurrentProcessApplication()); 60 // 封装返回结果集 61 JSONObject res = new JSONObject(); 62 res.set("deploymentId", deployment.getId()); 63 res.set("deploymentName", deployment.getName()); 64 return res; 65 } 66 67 // 2、启动流程实例 68 public JSONObject startProcess(Map<String, Object> params) { 69 String initiator = (String) params.get("initiator"); 70 String processDefinitionKey = (String) params.get("processDefinitionKey"); 71 String businessKey = (String) params.get("businessKey"); 72 Map<String, Object> variables = (Map<String, Object>) params.get("variables"); 73 // 设置发起人 74 identityService.setAuthenticatedUserId(initiator); 75 // 启动流程定义 76 ProcessInstance simpleTest = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables); 77 if (ObjectUtil.isNull(simpleTest)) { 78 return null; 79 } 80 // 自动跳过发起人节点 81 // List<Task> list = taskService.createTaskQuery().taskAssignee(initiator).processInstanceId(simpleTest.getId()).list(); 82 // if (CollUtil.isNotEmpty(list)) { 83 // taskService.complete(list.get(0).getId()); 84 // } 85 // 结果集封装 86 JSONObject res = new JSONObject(); 87 res.set("processInstanceId", simpleTest.getId()); 88 res.set("initiator", initiator); 89 res.set("processInstanceParentId", simpleTest.getProcessInstanceId()); 90 res.set("processDefinitionId", simpleTest.getProcessDefinitionId()); 91 return res; 92 } 93 94 // 3、审批同意 95 public JSONObject pass(JSONObject params) { 96 // 获取变量 97 String taskId = params.get("taskId", String.class); 98 String userId = params.get("userId", String.class); 99 String processInstanceId = params.get("processInstanceId", String.class); 100 String comment = params.get("comment", String.class); 101 Map<String, Object> variables = params.get("variables", Map.class); 102 // 添加审批人 103 identityService.setAuthenticatedUserId(userId); 104 // 判断是否有审批意见 105 if (StrUtil.isNotBlank(comment)) { 106 // 提交审批意见 107 taskService.createComment(taskId, processInstanceId, comment); 108 } 109 // 完成当前任务实例 110 taskService.complete(taskId, variables); 111 // 结果集封装 112 JSONObject res = new JSONObject(); 113 return res; 114 } 115 116 // 4、审批拒绝 117 public JSONObject reject(JSONObject params) { 118 // 获取变量 119 String taskId = params.get("taskId", String.class); 120 String processInstanceId = params.get("processInstanceId", String.class); 121 String userId = params.get("userId", String.class); 122 String comment = params.get("comment", String.class); 123 // 添加审批人 124 identityService.setAuthenticatedUserId(userId); 125 // 获取当前任务,未办理任务id 126 HistoricTaskInstance currTask = historyService.createHistoricTaskInstanceQuery() 127 .taskId(taskId) 128 .singleResult(); 129 if (ObjectUtil.isNull(currTask)) { 130 log.error("没有查询到审批任务"); 131 JSONObject res = new JSONObject(); 132 res.set("msg", "没有查询到审批任务"); 133 return res; 134 } 135 // 驳回审批意见 136 taskService.createComment(taskId, currTask.getProcessInstanceId(), comment); 137 //获取流程实例 138 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() 139 .processInstanceId(currTask.getProcessInstanceId()) 140 .singleResult(); 141 //获取流程定义 142 ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) 143 .getDeployedProcessDefinition(currTask.getProcessDefinitionId()); 144 145 ActivityImpl currentActivity = (processDefinitionEntity).findActivity(currTask.getTaskDefinitionKey()); 146 // 获取起始活动 147 List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery() 148 .activityType("userTask") 149 .processInstanceId(processInstanceId) 150 .finished() 151 .orderByHistoricActivityInstanceEndTime() 152 .asc() 153 .list(); 154 if(historicActivityInstances.size() == 0){ 155 JSONObject res = new JSONObject(); 156 return res; 157 } 158 // 起始节点活动 159 ActivityImpl lastActivity = processDefinitionEntity.findActivity(historicActivityInstances.get(0).getActivityId()); 160 161 // 退回至起点申请人 162 runtimeService.createProcessInstanceModification(processInstanceId) 163 // 关闭当前活动任务节点 164 .cancelAllForActivity(currentActivity.getActivityId()) 165 .setAnnotation("驳回") 166 // 启动申请人节点 167 .startBeforeActivity(lastActivity.getActivityId()) 168 .execute(); 169 // 结果集封装 170 JSONObject res = new JSONObject(); 171 return res; 172 } 173 174 // 5、转交 175 public JSONObject transfer(JSONObject params) { 176 // 获取变量 177 String taskId = params.get("taskId", String.class); 178 String userId = params.get("userId", String.class); 179 Date transferTime = params.get("transferTime", Date.class); 180 // 添加审批人 181 identityService.setAuthenticatedUserId(userId); 182 // 委托他人 183 taskService.delegateTask(taskId, userId); 184 JSONObject res = new JSONObject(); 185 return res; 186 } 187 188 // 6、退回 189 public JSONObject returnOldTask(JSONObject params) { 190 // 获取变量 191 String taskId = params.get("taskId", String.class); 192 String processInstanceId = params.get("processInstanceId", String.class); 193 String targetActivityId = params.get("targetActivityId", String.class); 194 String comment = params.get("comment", String.class); 195 196 // 退回意见 197 taskService.createComment(taskId, processInstanceId, comment); 198 199 //获取当前环节实例 200 ProcessInstanceModificationBuilder processInstanceModificationBuilder = runtimeService.createProcessInstanceModification(processInstanceId); 201 Set<String> activityIdSet = new HashSet<>(); 202 taskService.createTaskQuery().processInstanceId(processInstanceId).active().list().forEach(taskQuery -> { 203 String activityId = taskQuery.getTaskDefinitionKey(); 204 if(activityIdSet.add(activityId)){ 205 processInstanceModificationBuilder.cancelAllForActivity(activityId); 206 } 207 }); 208 // ArrayList<String> userIds = (ArrayList<String>) runtimeService.getVariable(processInstanceId, "assigneeList_" + targetActivityId); 209 // log.info(JSONUtil.toJsonStr(userIds)); 210 // Map<String, Object> vars = new HashMap<String, Object>(1); 211 // vars.put("assigneeList_" + targetActivityId, userIds); 212 processInstanceModificationBuilder.startBeforeActivity(targetActivityId + "#multiInstanceBody") 213 // .setVariable("assigneeList_" + targetActivityId, userIds) 214 // .setVariable("assignee", "${assignee}") 215 // .setVariablesLocal(map) 216 .execute(); 217 218 JSONObject res = new JSONObject(); 219 return res; 220 } 221 222 // 7、加签(前后都能加) 223 public JSONObject addSignature(JSONObject params) { 224 JSONObject res = new JSONObject(); 225 // 获取变量 226 String userId = params.get("userId", String.class);// 当前用户id 227 String taskId = params.get("taskId", String.class);// 当前任务id 228 String processInstanceId = params.get("processInstanceId", String.class);// 当前流程实例id 229 String comment = params.get("comment", String.class);// 加签意见 230 Integer type = params.get("type", Integer.class);// 加签类型(1=前置加签,2=后置加签) 231 String addUserId = params.get("addUserId", String.class);// 加签用户id 232 Integer auditMethod = params.get("auditMethod", Integer.class);// // 审批类型:1=或签,2=会签,3=顺序签 233 // 获取当前任务,未办理任务id 234 HistoricTaskInstance currTask = historyService.createHistoricTaskInstanceQuery() 235 .taskId(taskId).singleResult(); 236 if (ObjectUtil.isNull(currTask)) { 237 log.error("没有查询到审批任务,只有任务所属人才可以加签"); 238 return null; 239 } 240 // 加签意见 241 taskService.createComment(taskId, currTask.getProcessInstanceId(), comment); 242 // 获取当前活动实例 243 ActivityInstance activity = runtimeService.getActivityInstance(processInstanceId); 244 ActivityInstance[] childActivityInstances = activity.getChildActivityInstances(); 245 ActivityInstance childActivityInstance = childActivityInstances[0]; 246 String activityId = childActivityInstance.getActivityId().split("#")[0]; 247 248 // 获取到原来的人员变量,进行加签 249 List<String> variableList = (List<String>) runtimeService.getVariableLocal(currTask.getProcessInstanceId(), "assigneeList_" + activityId); 250 // if (variableList.size() > 1) { 251 // System.out.println("该节点审批人数超过一个,无法加签"); 252 // } 253 LinkedList<String> linkedList = variableList.stream().collect(Collectors.toCollection(LinkedList::new)); 254 // 当前审批人的索引 255 int indexOf = linkedList.indexOf(userId); 256 if (1 == type) {//前置加签 257 if (indexOf == 0) { 258 linkedList.addFirst(addUserId); 259 } else { 260 linkedList.add(indexOf, addUserId); 261 } 262 } else if (2 == type) {//后置加签 263 if (linkedList.size() - 1 == indexOf) { 264 linkedList.addLast(addUserId); 265 } else { 266 linkedList.add(indexOf + 1, addUserId); 267 } 268 } else { 269 if (indexOf == 0) { 270 linkedList.addFirst(addUserId); 271 } else { 272 linkedList.add(indexOf, addUserId); 273 } 274 } 275 // 人员变量 276 Map<String, Object> vars = new HashMap<String, Object>(1); 277 if (auditMethod == 3) {// 顺序签处理 278 int indexOfto = linkedList.indexOf(userId); 279 List<String> userIds = new ArrayList<>(); 280 for (int i = 0; i < linkedList.size(); i++) { 281 String id = linkedList.get(i); 282 if (1 == type) {// 前置 283 if ((indexOfto - 1) <= i) { 284 userIds.add(id); 285 } 286 } else if (2 == type) {// 后置 287 if (indexOfto <= i) { 288 userIds.add(id); 289 } 290 } else { 291 userIds.add(id); 292 } 293 } 294 res.set("userIds", userIds); 295 vars.put("assigneeList_" + activityId, userIds); 296 } else { 297 res.set("userIds", linkedList); 298 vars.put("assigneeList_" + activityId, linkedList.stream().collect(Collectors.toList())); 299 } 300 301 // 获取当前环节实例 302 ProcessInstanceModificationBuilder processInstanceModificationBuilder = runtimeService.createProcessInstanceModification(processInstanceId); 303 Set<String> activityIdSet = new HashSet<>(); 304 taskService.createTaskQuery().processInstanceId(processInstanceId).active().list().forEach(taskQuery -> { 305 String activityId1 = taskQuery.getTaskDefinitionKey(); 306 if(activityIdSet.add(activityId1)){ 307 // 关闭当前多实例活动任务节点 308 processInstanceModificationBuilder.cancelAllForActivity(activityId1); 309 } 310 }); 311 // 启动当前多实例活动任务节点 312 processInstanceModificationBuilder.startBeforeActivity(childActivityInstance.getActivityId()) 313 // 局部变量 314 .setVariablesLocal(vars) 315 .execute(); 316 return res; 317 } 318 319 // 8、todo 我的待办-待审核 320 public JSONObject pending(JSONObject params) { 321 String userId = params.get("userId", String.class); 322 Integer pageIndex = params.get("pageIndex", Integer.class); 323 Integer pageSize = params.get("pageSize", Integer.class); 324 int firstResult = (pageIndex - 1) * pageSize ; 325 int maxResults = pageSize; 326 //查询待办 327 List<Task> list = taskService.createTaskQuery().taskAssignee(userId).listPage(firstResult, maxResults); 328 long count = taskService.createTaskQuery().taskAssignee(userId).count(); 329 // 封装结果集 330 JSONObject res = new JSONObject(); 331 res.set("list", list); 332 res.set("pageCount", count); 333 return res; 334 } 335 336 // 8、todo 我的已办 337 public JSONObject done(JSONObject params) { 338 String userId = params.get("userId", String.class); 339 Integer pageIndex = params.get("pageIndex", Integer.class); 340 Integer pageSize = params.get("pageSize", Integer.class); 341 int firstResult = (pageIndex - 1) * pageSize ; 342 int maxResults = pageSize; 343 344 List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery() 345 .taskAssignee(userId) 346 .finished() 347 .listPage(firstResult, maxResults); 348 long count = historyService.createHistoricTaskInstanceQuery() 349 .taskAssignee(userId) 350 .finished() 351 .count(); 352 353 JSONObject res = new JSONObject(); 354 res.set("list", historicTaskInstances); 355 res.set("pageCount", count); 356 return res; 357 } 358 359 // 9、todo 作废 360 public JSONObject invalid(JSONObject params) { 361 // 流程到了最后一个审批节点可以作废,流程实例和业务数据关系表状态变更,业务数据回滚, 362 // 获取变量 363 String processInstanceId = params.get("processInstanceId", String.class); 364 String userId = params.get("userId", String.class); 365 String comment = params.get("comment", String.class);//作废意见 366 367 368 JSONObject res = new JSONObject(); 369 return res; 370 } 371 372 // 10、todo 转阅 373 public JSONObject forward(JSONObject params) { 374 JSONObject res = new JSONObject(); 375 return res; 376 } 377 378 // 11、撤回 379 public JSONObject withdraw(JSONObject params) { 380 // 获取变量 381 String taskId = params.get("taskId", String.class); 382 String processInstanceId = params.get("processInstanceId", String.class); 383 String userId = params.get("userId", String.class); 384 // 获取当前任务,未办理任务id 385 HistoricTaskInstance currTask = historyService.createHistoricTaskInstanceQuery() 386 .taskId(taskId).singleResult(); 387 if (ObjectUtil.isNull(currTask)) { 388 log.error("没有查询到审批任务"); 389 JSONObject res = new JSONObject(); 390 res.set("msg", "没有查询到审批任务"); 391 return res; 392 } 393 // 撤回审批意见 394 taskService.createComment(taskId, processInstanceId, "发起人撤回"); 395 396 // 退回至起点申请人 397 ProcessInstanceModificationBuilder processInstanceModificationBuilder = runtimeService.createProcessInstanceModification(processInstanceId); 398 Set<String> activityIdSet = new HashSet<>(); 399 taskService.createTaskQuery().processInstanceId(processInstanceId).active().list().forEach(taskQuery -> { 400 String activityId = taskQuery.getTaskDefinitionKey(); 401 if(activityIdSet.add(activityId)){ 402 processInstanceModificationBuilder.cancelAllForActivity(activityId); 403 } 404 }); 405 processInstanceModificationBuilder.setAnnotation("撤回") 406 // 启动申请人节点 407 .startBeforeActivity(currTask.getTaskDefinitionKey()) 408 .execute(); 409 // 结果集封装 410 JSONObject res = new JSONObject(); 411 return res; 412 } 413 414 // 12、todo 催办 415 public JSONObject urge(JSONObject params) { 416 JSONObject res = new JSONObject(); 417 return res; 418 } 419 // 13、todo 获取历史节点 420 public JSONObject listHistoricalNode(JSONObject params) { 421 // // 新建一个有序不重复集合 422 // LinkedHashSet linkedHashSet = new LinkedHashSet(); 423 获取当前的任务节点 424 // String activeTask = "Activity_0lj34xv"; 425 // String backTask = ""; 426 // historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).orderByHistoricTaskInstanceEndTime().asc().list().stream().forEach(historicTaskInstance -> { 427 // linkedHashSet.add(historicTaskInstance.getTaskDefinitionKey()); 428 // }); 429 // if(linkedHashSet.size() == 0){ 430 // return ; 431 // } 432 遍历到当前的任务节点后,取上一次遍历的值 433 // Iterator<String> iterator = linkedHashSet.iterator(); 434 // while(iterator.hasNext()){ 435 // String nowTask = iterator.next(); 436 // if(StrUtil.equals(nowTask,activeTask)){ 437 // return backTask; 438 // } 439 // backTask = nowTask; 440 // } 441 // backTask.toString(); 442 JSONObject res = new JSONObject(); 443 return res; 444 } 445 446 // 14、重新启动流程实例 447 public JSONObject relaunch(Map<String, Object> params) { 448 String initiator = (String) params.get("initiator"); 449 String processDefinitionId = (String) params.get("processDefinitionId"); 450 String processInstanceId = (String) params.get("processInstanceId"); 451 String businessKey = (String) params.get("businessKey"); 452 Map<String, Object> variables = (Map<String, Object>) params.get("variables"); 453 454 // 覆盖所有变量 455 runtimeService.setVariables(processInstanceId, variables); 456 457 // 跳过发起人节点,进行审批 458 List<Task> list = taskService.createTaskQuery().taskAssignee(initiator).taskName("发起人").processInstanceId(processInstanceId).list(); 459 if (CollUtil.isNotEmpty(list)) { 460 taskService.complete(list.get(0).getId()); 461 } 462 // 结果集封装 463 JSONObject res = new JSONObject(); 464 return res; 465 } 466 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.oa.business.flow.utils.camunda.constant; 2 /** 3 * @author HeZeMin 4 * @className CamundaE 5 * @description 流程引擎枚举类 6 * @date 2022/4/8 18:02 7 */ 8 public enum CamundaEnum { 9 PROCESS("Process_"), 10 EVENT("Event_"), 11 ACTIVITY("Activity_"), 12 GATEWAY("Gateway_"), 13 TASK("Task_"); 14 15 private final String name; 16 17 private CamundaEnum(String name) { 18 this.name = name; 19 } 20 public String getName() { 21 return name; 22 } 23 }
Camunda监听器实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.oa.business.flow.utils.camunda.listener; 2 3 import cn.hutool.core.collection.CollUtil; 4 import cn.hutool.json.JSONUtil; 5 import com.oa.dubbo.api.flow.service.act.ActHiProcinstService; 6 import lombok.extern.slf4j.Slf4j; 7 import org.camunda.bpm.engine.TaskService; 8 import org.camunda.bpm.engine.delegate.DelegateTask; 9 import org.camunda.bpm.engine.delegate.TaskListener; 10 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.stereotype.Component; 12 13 import java.util.List; 14 15 /** 16 * Description:抄送人服务 17 * @Author HeZeMin 18 * @Date 2022年04月20日 17:24 19 */ 20 @Slf4j 21 @Component("CopyListener") 22 public class CopyListener implements TaskListener { 23 @Autowired 24 TaskService taskService; 25 @Autowired 26 ActHiProcinstService actHiProcinstService; 27 28 /** 29 *基本思路 - 监听器实现 30 * 可以通过给抄送节点添加监听器,进而在通过自己的业务实现数据库消息表的添加。 31 * 拿到当前task的一些信息,查询要抄送的人的信息,然后通过Spring IOC中拿到的service进行相应的业务逻辑添加(消息表新增),然后对该节点进行一个通过。 32 */ 33 @Override 34 public void notify(DelegateTask delegateTask) { 35 String eventName = delegateTask.getEventName(); 36 String taskId = delegateTask.getId(); 37 String processInstanceId = delegateTask.getProcessInstanceId(); 38 String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); 39 List<String> userIdList = (List<String>) delegateTask.getVariable("assigneeList_" + taskDefinitionKey); 40 if("create".equals(eventName)){ 41 // 抄送人 业务处理 42 log.info("create===========抄送人逻辑开始"); 43 44 // 更新流程步骤的审批状态 45 46 if (CollUtil.isNotEmpty(userIdList)) { 47 // 保存待阅 48 // 给抄送人发站内信和提醒 49 } 50 // 该抄送任务完成 51 taskService.complete(delegateTask.getId()); 52 } else if("assigment".equals(eventName)){ 53 log.info("assigment===========流程部署"); 54 } else if("complete".equals(eventName)){ 55 log.info("complete===========抄送人逻辑完成"); 56 } else if("delete".equals(eventName)){ 57 log.info("delete===========流程结束"); 58 } 59 log.info("delegateTask.getAssignee() = " + delegateTask.getAssignee()); 60 log.info("delegateTask.getId() = " + delegateTask.getId()); 61 log.info("taskDefinitionKey = " + taskDefinitionKey); 62 log.info("variables = " + JSONUtil.toJsonStr(delegateTask.getVariables())); 63 log.info("userIdList = " + JSONUtil.toJsonStr(userIdList)); 64 log.info("=--------------------------------="); 65 } 66 67 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.oa.business.flow.utils.camunda.listener; import com.oa.dubbo.api.flow.service.act.ActHiProcinstService; import lombok.extern.slf4j.Slf4j; import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.ExecutionListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Description:流程结束服务 * @Author HeZeMin * @Date 2022年04月20日 17:24 */ @Slf4j @Component("EndEventListener") public class EndEventListener implements ExecutionListener { @Autowired TaskService taskService; @Autowired ActHiProcinstService actHiProcinstService; /** * 基本思路 - 监听器实现 * 可以通过给结束节点添加监听器,进而在通过自己的业务实现数据库消息表的添加。 * 拿到流程实例信息,变更业务表状态为已通过,或者同步申请数据到业务表 */ @Override public void notify(DelegateExecution execution) throws Exception { log.info("===========流程结束了=========="); String eventName = execution.getEventName(); String businessKey = execution.getProcessBusinessKey(); String processDefinitionId = execution.getProcessDefinitionId(); String processInstanceId = execution.getProcessInstanceId(); String initiator = (String) execution.getVariable("initiator"); String tableName = ""; if("start".equals(eventName)){ log.info("start===========流程启动"); // 给发起人发消息 }else if("end".equals(eventName)){ // 修改流程实例关系状态为 已完成 log.info("end===========流程结束"); } log.info("delegateTask.getId() = " + execution.getId()); log.info("tableName = " + tableName); log.info("processDefinitionId = " + processDefinitionId); log.info("processInstanceId = " + processInstanceId); log.info("businessKey = " + businessKey); log.info("=--------------------------------="); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.oa.business.flow.utils.camunda.listener; import com.oa.dubbo.api.flow.service.act.ActHiProcinstService; import lombok.extern.slf4j.Slf4j; import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.delegate.DelegateTask; import org.camunda.bpm.engine.delegate.TaskListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Description:审批和执行人的站内信和提醒 监听器 * @Author HeZeMin * @Date 2022年06月17日 9:39 */ @Slf4j @Component("TaskMessageListener") public class TaskMessageListener implements TaskListener { @Autowired TaskService taskService; @Autowired ActHiProcinstService actHiProcinstService; /** *基本思路 - 监听器实现 * 可以通过给抄送节点添加监听器,进而在通过自己的业务实现数据库消息表的添加。 * 拿到当前task的一些信息,查询要抄送的人的信息,然后通过Spring IOC中拿到的service进行相应的业务逻辑添加(消息表新增),然后对该节点进行一个通过。 */ @Override public void notify(DelegateTask delegateTask) { String eventName = delegateTask.getEventName(); String taskId = delegateTask.getId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); String processInstanceId = delegateTask.getProcessInstanceId(); if(TaskListener.EVENTNAME_CREATE.equals(eventName)){ log.info("create===========审批节点开始"); // 更新流程步骤的审批状态 // 给待审核人发提醒 }else if("assigment".equals(eventName)){ log.info("assigment===========流程部署"); }else if("complete".equals(eventName)){ log.info("complete===========流程完成"); // 更新流程步骤的审批状态 }else if("delete".equals(eventName)){ log.info("delete===========流程结束"); } log.info("delegateTask.getAssignee() = " + delegateTask.getAssignee()); log.info("taskId = " + taskId); log.info("taskDefinitionKey = " + taskDefinitionKey); log.info("eventName = " + eventName); log.info("processInstanceId = " + processInstanceId); log.info("=--------------------------------="); } }
Camunda框架的49张表结构
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 Navicat Premium Data Transfer 3 4 Source Server : 222.175.63.26-oa-prod 5 Source Server Type : MySQL 6 Source Server Version : 80024 7 Source Host : 222.175.63.26:13307 8 Source Schema : oa_cloud_master 9 10 Target Server Type : MySQL 11 Target Server Version : 80024 12 File Encoding : 65001 13 14 Date: 21/10/2022 10:17:48 15 */ 16 17 SET NAMES utf8mb4; 18 SET FOREIGN_KEY_CHECKS = 0; 19 20 -- ---------------------------- 21 -- Table structure for act_ge_bytearray 22 -- ---------------------------- 23 DROP TABLE IF EXISTS `act_ge_bytearray`; 24 CREATE TABLE `act_ge_bytearray` ( 25 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 26 `REV_` int NULL DEFAULT NULL COMMENT '版本', 27 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称', 28 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部署ID', 29 `BYTES_` longblob NULL COMMENT '字节内容', 30 `GENERATED_` tinyint NULL DEFAULT NULL COMMENT '是否系统生成(0用户创建,null系统生成)', 31 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 32 `TYPE_` int NULL DEFAULT NULL COMMENT '类型', 33 `CREATE_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', 34 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例根ID', 35 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '删除时间', 36 PRIMARY KEY (`ID_`) USING BTREE, 37 INDEX `DEPLOYMENT_ID_`(`DEPLOYMENT_ID_`) USING BTREE, 38 INDEX `ROOT_PROC_INST_ID_`(`ROOT_PROC_INST_ID_`) USING BTREE 39 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程通用数据/流程引擎二进制数据表【常用】' ROW_FORMAT = Dynamic; 40 41 -- ---------------------------- 42 -- Table structure for act_ge_property 43 -- ---------------------------- 44 DROP TABLE IF EXISTS `act_ge_property`; 45 CREATE TABLE `act_ge_property` ( 46 `NAME_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称', 47 `VALUE_` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '值', 48 `REV_` int NULL DEFAULT NULL COMMENT '版本', 49 PRIMARY KEY (`NAME_`) USING BTREE 50 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程通用数据/流程引擎属性配置表【初始化】' ROW_FORMAT = Dynamic; 51 52 -- ---------------------------- 53 -- Table structure for act_ge_schema_log 54 -- ---------------------------- 55 DROP TABLE IF EXISTS `act_ge_schema_log`; 56 CREATE TABLE `act_ge_schema_log` ( 57 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 58 `TIMESTAMP_` datetime(0) NULL DEFAULT NULL COMMENT '时间戳', 59 `VERSION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '版本', 60 PRIMARY KEY (`ID_`) USING BTREE 61 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程通用数据/数据库脚本执行日志表' ROW_FORMAT = Dynamic; 62 63 -- ---------------------------- 64 -- Table structure for act_hi_actinst 65 -- ---------------------------- 66 DROP TABLE IF EXISTS `act_hi_actinst`; 67 CREATE TABLE `act_hi_actinst` ( 68 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 69 `PARENT_ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父节点实例ID', 70 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY', 71 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '流程定义ID', 72 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例根ID', 73 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '流程实例ID', 74 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '执行实例ID', 75 `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '节点ID', 76 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务ID', 77 `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '调用外部的流程实例ID', 78 `CALL_CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '调用外部的案例实例ID', 79 `ACT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点名称', 80 `ACT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '节点类型', 81 `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '办理人', 82 `START_TIME_` datetime(0) NOT NULL COMMENT '开始时间', 83 `END_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', 84 `DURATION_` bigint NULL DEFAULT NULL COMMENT '耗时', 85 `ACT_INST_STATE_` int NULL DEFAULT NULL COMMENT '活动实例状态', 86 `SEQUENCE_COUNTER_` bigint NULL DEFAULT NULL COMMENT '序列计数器', 87 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 88 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '删除时间', 89 PRIMARY KEY (`ID_`) USING BTREE, 90 INDEX `ACT_ID_`(`ACT_ID_`) USING BTREE, 91 INDEX `TASK_ID_`(`TASK_ID_`) USING BTREE, 92 INDEX `EXECUTION_ID_`(`EXECUTION_ID_`) USING BTREE, 93 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 94 INDEX `ROOT_PROC_INST_ID_`(`ROOT_PROC_INST_ID_`) USING BTREE, 95 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE, 96 INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE, 97 INDEX `PARENT_ACT_INST_ID_`(`PARENT_ACT_INST_ID_`) USING BTREE 98 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的活动实例表【常用】' ROW_FORMAT = Dynamic; 99 100 -- ---------------------------- 101 -- Table structure for act_hi_attachment 102 -- ---------------------------- 103 DROP TABLE IF EXISTS `act_hi_attachment`; 104 CREATE TABLE `act_hi_attachment` ( 105 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 106 `REV_` int NULL DEFAULT NULL, 107 `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 108 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 109 `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 110 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 111 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 112 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 113 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 114 `URL_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 115 `CONTENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 116 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 117 `CREATE_TIME_` datetime(0) NULL DEFAULT NULL, 118 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 119 PRIMARY KEY (`ID_`) USING BTREE 120 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程附件表' ROW_FORMAT = Dynamic; 121 122 -- ---------------------------- 123 -- Table structure for act_hi_batch 124 -- ---------------------------- 125 DROP TABLE IF EXISTS `act_hi_batch`; 126 CREATE TABLE `act_hi_batch` ( 127 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 128 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 129 `TOTAL_JOBS_` int NULL DEFAULT NULL, 130 `JOBS_PER_SEED_` int NULL DEFAULT NULL, 131 `INVOCATIONS_PER_JOB_` int NULL DEFAULT NULL, 132 `SEED_JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 133 `MONITOR_JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 134 `BATCH_JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 135 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 136 `CREATE_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 137 `START_TIME_` datetime(0) NOT NULL, 138 `END_TIME_` datetime(0) NULL DEFAULT NULL, 139 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 140 PRIMARY KEY (`ID_`) USING BTREE 141 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的批处理记录表' ROW_FORMAT = Dynamic; 142 143 -- ---------------------------- 144 -- Table structure for act_hi_caseactinst 145 -- ---------------------------- 146 DROP TABLE IF EXISTS `act_hi_caseactinst`; 147 CREATE TABLE `act_hi_caseactinst` ( 148 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 149 `PARENT_ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 150 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 151 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 152 `CASE_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 153 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 154 `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 155 `CALL_CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 156 `CASE_ACT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 157 `CASE_ACT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 158 `CREATE_TIME_` datetime(0) NOT NULL, 159 `END_TIME_` datetime(0) NULL DEFAULT NULL, 160 `DURATION_` bigint NULL DEFAULT NULL, 161 `STATE_` int NULL DEFAULT NULL, 162 `REQUIRED_` bit(1) NULL DEFAULT NULL, 163 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 164 PRIMARY KEY (`ID_`) USING BTREE 165 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的CMMN活动实例表' ROW_FORMAT = Dynamic; 166 167 -- ---------------------------- 168 -- Table structure for act_hi_caseinst 169 -- ---------------------------- 170 DROP TABLE IF EXISTS `act_hi_caseinst`; 171 CREATE TABLE `act_hi_caseinst` ( 172 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 173 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 174 `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 175 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 176 `CREATE_TIME_` datetime(0) NOT NULL, 177 `CLOSE_TIME_` datetime(0) NULL DEFAULT NULL, 178 `DURATION_` bigint NULL DEFAULT NULL, 179 `STATE_` int NULL DEFAULT NULL, 180 `CREATE_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 181 `SUPER_CASE_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 182 `SUPER_PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 183 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 184 PRIMARY KEY (`ID_`) USING BTREE 185 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的CMMN实例表' ROW_FORMAT = Dynamic; 186 187 -- ---------------------------- 188 -- Table structure for act_hi_comment 189 -- ---------------------------- 190 DROP TABLE IF EXISTS `act_hi_comment`; 191 CREATE TABLE `act_hi_comment` ( 192 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 193 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型(event事件、comment意见)', 194 `TIME_` datetime(0) NOT NULL COMMENT '时间', 195 `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '处理人', 196 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务ID', 197 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例跟ID', 198 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 199 `ACTION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '行为类型', 200 `MESSAGE_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '基本内容', 201 `FULL_MSG_` longblob NULL COMMENT '全部内容', 202 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 203 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '移除时间', 204 PRIMARY KEY (`ID_`) USING BTREE, 205 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 206 INDEX `TASK_ID_`(`TASK_ID_`) USING BTREE 207 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程审批意见表【常用】' ROW_FORMAT = Dynamic; 208 209 -- ---------------------------- 210 -- Table structure for act_hi_dec_in 211 -- ---------------------------- 212 DROP TABLE IF EXISTS `act_hi_dec_in`; 213 CREATE TABLE `act_hi_dec_in` ( 214 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 215 `DEC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 216 `CLAUSE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 217 `CLAUSE_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 218 `VAR_TYPE_` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 219 `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 220 `DOUBLE_` double NULL DEFAULT NULL, 221 `LONG_` bigint NULL DEFAULT NULL, 222 `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 223 `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 224 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 225 `CREATE_TIME_` datetime(0) NULL DEFAULT NULL, 226 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 227 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 228 PRIMARY KEY (`ID_`) USING BTREE 229 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的DMN变量输入表' ROW_FORMAT = Dynamic; 230 231 -- ---------------------------- 232 -- Table structure for act_hi_dec_out 233 -- ---------------------------- 234 DROP TABLE IF EXISTS `act_hi_dec_out`; 235 CREATE TABLE `act_hi_dec_out` ( 236 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 237 `DEC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 238 `CLAUSE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 239 `CLAUSE_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 240 `RULE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 241 `RULE_ORDER_` int NULL DEFAULT NULL, 242 `VAR_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 243 `VAR_TYPE_` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 244 `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 245 `DOUBLE_` double NULL DEFAULT NULL, 246 `LONG_` bigint NULL DEFAULT NULL, 247 `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 248 `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 249 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 250 `CREATE_TIME_` datetime(0) NULL DEFAULT NULL, 251 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 252 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 253 PRIMARY KEY (`ID_`) USING BTREE 254 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的DMN变量输出表' ROW_FORMAT = Dynamic; 255 256 -- ---------------------------- 257 -- Table structure for act_hi_decinst 258 -- ---------------------------- 259 DROP TABLE IF EXISTS `act_hi_decinst`; 260 CREATE TABLE `act_hi_decinst` ( 261 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 262 `DEC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 263 `DEC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 264 `DEC_DEF_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 265 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 266 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 267 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 268 `CASE_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 269 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 270 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 271 `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 272 `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 273 `EVAL_TIME_` datetime(0) NOT NULL, 274 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 275 `COLLECT_VALUE_` double NULL DEFAULT NULL, 276 `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 277 `ROOT_DEC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 278 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 279 `DEC_REQ_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 280 `DEC_REQ_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 281 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 282 PRIMARY KEY (`ID_`) USING BTREE 283 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的DMN实例表' ROW_FORMAT = Dynamic; 284 285 -- ---------------------------- 286 -- Table structure for act_hi_detail 287 -- ---------------------------- 288 DROP TABLE IF EXISTS `act_hi_detail`; 289 CREATE TABLE `act_hi_detail` ( 290 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 291 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类型', 292 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY', 293 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 294 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例根ID', 295 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 296 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程执行ID', 297 `CASE_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例定义KEY', 298 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例定义ID', 299 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例实例ID', 300 `CASE_EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例执行ID', 301 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务ID', 302 `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点实例ID', 303 `VAR_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程变量记录ID', 304 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称', 305 `VAR_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '变量类型', 306 `REV_` int NULL DEFAULT NULL COMMENT '版本', 307 `TIME_` datetime(0) NOT NULL COMMENT '时间戳', 308 `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '二进制数据对应ID', 309 `DOUBLE_` double NULL DEFAULT NULL COMMENT 'double类型值', 310 `LONG_` bigint NULL DEFAULT NULL COMMENT 'long类型值', 311 `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文本类型值', 312 `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文本类型值2', 313 `SEQUENCE_COUNTER_` bigint NULL DEFAULT NULL COMMENT '序列计数器', 314 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 315 `OPERATION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 316 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '移除时间', 317 `INITIAL_` bit(1) NULL DEFAULT NULL, 318 PRIMARY KEY (`ID_`) USING BTREE, 319 INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE, 320 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE, 321 INDEX `ROOT_PROC_INST_ID_`(`ROOT_PROC_INST_ID_`) USING BTREE, 322 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 323 INDEX `EXECUTION_ID_`(`EXECUTION_ID_`) USING BTREE 324 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程运行时变量详情记录表【常用】' ROW_FORMAT = Dynamic; 325 326 -- ---------------------------- 327 -- Table structure for act_hi_ext_task_log 328 -- ---------------------------- 329 DROP TABLE IF EXISTS `act_hi_ext_task_log`; 330 CREATE TABLE `act_hi_ext_task_log` ( 331 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 332 `TIMESTAMP_` timestamp(0) NOT NULL, 333 `EXT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 334 `RETRIES_` int NULL DEFAULT NULL, 335 `TOPIC_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 336 `WORKER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 337 `PRIORITY_` bigint NOT NULL DEFAULT 0, 338 `ERROR_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 339 `ERROR_DETAILS_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 340 `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 341 `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 342 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 343 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 344 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 345 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 346 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 347 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 348 `STATE_` int NULL DEFAULT NULL, 349 `REV_` int NULL DEFAULT NULL, 350 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 351 PRIMARY KEY (`ID_`) USING BTREE 352 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程任务消息执行表' ROW_FORMAT = Dynamic; 353 354 -- ---------------------------- 355 -- Table structure for act_hi_identitylink 356 -- ---------------------------- 357 DROP TABLE IF EXISTS `act_hi_identitylink`; 358 CREATE TABLE `act_hi_identitylink` ( 359 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 360 `TIMESTAMP_` timestamp(0) NOT NULL COMMENT '时间戳', 361 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型', 362 `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户ID', 363 `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户组ID', 364 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务ID', 365 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例根ID', 366 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 367 `OPERATION_TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作类型', 368 `ASSIGNER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分配者ID', 369 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY', 370 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 371 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '移除时间', 372 PRIMARY KEY (`ID_`) USING BTREE, 373 INDEX `TASK_ID_`(`TASK_ID_`) USING BTREE, 374 INDEX `ROOT_PROC_INST_ID_`(`ROOT_PROC_INST_ID_`) USING BTREE, 375 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE, 376 INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE 377 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程运行过程中用户关系【常用】' ROW_FORMAT = Dynamic; 378 379 -- ---------------------------- 380 -- Table structure for act_hi_incident 381 -- ---------------------------- 382 DROP TABLE IF EXISTS `act_hi_incident`; 383 CREATE TABLE `act_hi_incident` ( 384 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 385 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 386 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 387 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 388 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 389 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 390 `CREATE_TIME_` timestamp(0) NOT NULL, 391 `END_TIME_` timestamp(0) NULL DEFAULT NULL, 392 `INCIDENT_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 393 `INCIDENT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 394 `ACTIVITY_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 395 `FAILED_ACTIVITY_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 396 `CAUSE_INCIDENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 397 `ROOT_CAUSE_INCIDENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 398 `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 399 `HISTORY_CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 400 `INCIDENT_STATE_` int NULL DEFAULT NULL, 401 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 402 `JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 403 `ANNOTATION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 404 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 405 PRIMARY KEY (`ID_`) USING BTREE 406 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程异常事件记录表' ROW_FORMAT = Dynamic; 407 408 -- ---------------------------- 409 -- Table structure for act_hi_job_log 410 -- ---------------------------- 411 DROP TABLE IF EXISTS `act_hi_job_log`; 412 CREATE TABLE `act_hi_job_log` ( 413 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 414 `TIMESTAMP_` datetime(0) NOT NULL, 415 `JOB_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 416 `JOB_DUEDATE_` datetime(0) NULL DEFAULT NULL, 417 `JOB_RETRIES_` int NULL DEFAULT NULL, 418 `JOB_PRIORITY_` bigint NOT NULL DEFAULT 0, 419 `JOB_EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 420 `JOB_EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 421 `JOB_STATE_` int NULL DEFAULT NULL, 422 `JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 423 `JOB_DEF_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 424 `JOB_DEF_CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 425 `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 426 `FAILED_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 427 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 428 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 429 `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 430 `PROCESS_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 431 `PROCESS_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 432 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 433 `SEQUENCE_COUNTER_` bigint NULL DEFAULT NULL, 434 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 435 `HOSTNAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 436 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 437 PRIMARY KEY (`ID_`) USING BTREE 438 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程作业记录表' ROW_FORMAT = Dynamic; 439 440 -- ---------------------------- 441 -- Table structure for act_hi_op_log 442 -- ---------------------------- 443 DROP TABLE IF EXISTS `act_hi_op_log`; 444 CREATE TABLE `act_hi_op_log` ( 445 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 446 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 447 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 448 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 449 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 450 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 451 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 452 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 453 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 454 `CASE_EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 455 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 456 `JOB_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 457 `JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 458 `BATCH_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 459 `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 460 `TIMESTAMP_` timestamp(0) NOT NULL, 461 `OPERATION_TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 462 `OPERATION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 463 `ENTITY_TYPE_` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 464 `PROPERTY_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 465 `ORG_VALUE_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 466 `NEW_VALUE_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 467 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 468 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 469 `CATEGORY_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 470 `EXTERNAL_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 471 `ANNOTATION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 472 PRIMARY KEY (`ID_`) USING BTREE, 473 INDEX `DEPLOYMENT_ID_`(`DEPLOYMENT_ID_`) USING BTREE 474 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/操作历史日志【常用】' ROW_FORMAT = Dynamic; 475 476 -- ---------------------------- 477 -- Table structure for act_hi_procinst 478 -- ---------------------------- 479 DROP TABLE IF EXISTS `act_hi_procinst`; 480 CREATE TABLE `act_hi_procinst` ( 481 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 482 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '流程实例ID', 483 `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '业务KEY', 484 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY', 485 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '流程定义ID', 486 `START_TIME_` datetime(0) NOT NULL COMMENT '开始时间', 487 `END_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', 488 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '移除时间', 489 `DURATION_` bigint NULL DEFAULT NULL COMMENT '耗时', 490 `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '启动人ID', 491 `START_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '启动节点ID', 492 `END_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '结束节点ID', 493 `SUPER_PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父流程实例ID', 494 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例根ID', 495 `SUPER_CASE_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父案例实例ID', 496 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例实例ID', 497 `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '删除原因', 498 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 499 `STATE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态', 500 PRIMARY KEY (`ID_`) USING BTREE, 501 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 502 INDEX `BUSINESS_KEY_`(`BUSINESS_KEY_`) USING BTREE, 503 INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE, 504 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE 505 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程实例【常用】' ROW_FORMAT = Dynamic; 506 507 -- ---------------------------- 508 -- Table structure for act_hi_taskinst 509 -- ---------------------------- 510 DROP TABLE IF EXISTS `act_hi_taskinst`; 511 CREATE TABLE `act_hi_taskinst` ( 512 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 513 `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务定义KEY', 514 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY', 515 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 516 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例根ID', 517 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 518 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程执行ID', 519 `CASE_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例定义KEY', 520 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例定义ID', 521 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例实例ID', 522 `CASE_EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例执行ID', 523 `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点实例ID', 524 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称', 525 `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父任务ID', 526 `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', 527 `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '委托人ID', 528 `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '办理人ID', 529 `START_TIME_` datetime(0) NOT NULL COMMENT '开始时间', 530 `END_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', 531 `DURATION_` bigint NULL DEFAULT NULL COMMENT '耗时', 532 `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '删除原因', 533 `PRIORITY_` int NULL DEFAULT NULL COMMENT '优先级', 534 `DUE_DATE_` datetime(0) NULL DEFAULT NULL COMMENT '超时时间', 535 `FOLLOW_UP_DATE_` datetime(0) NULL DEFAULT NULL COMMENT '跟踪时间', 536 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 537 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '移除时间', 538 PRIMARY KEY (`ID_`) USING BTREE, 539 INDEX `TASK_DEF_KEY_`(`TASK_DEF_KEY_`) USING BTREE, 540 INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE, 541 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE, 542 INDEX `ROOT_PROC_INST_ID_`(`ROOT_PROC_INST_ID_`) USING BTREE, 543 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 544 INDEX `EXECUTION_ID_`(`EXECUTION_ID_`) USING BTREE, 545 INDEX `ACT_INST_ID_`(`ACT_INST_ID_`) USING BTREE, 546 INDEX `ASSIGNEE_`(`ASSIGNEE_`) USING BTREE 547 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的任务实例【常用】' ROW_FORMAT = Dynamic; 548 549 -- ---------------------------- 550 -- Table structure for act_hi_varinst 551 -- ---------------------------- 552 DROP TABLE IF EXISTS `act_hi_varinst`; 553 CREATE TABLE `act_hi_varinst` ( 554 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 555 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY', 556 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 557 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例根ID', 558 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 559 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程执行ID', 560 `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点实例ID', 561 `CASE_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例定义KEY', 562 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例定义ID', 563 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例实例ID', 564 `CASE_EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例执行ID', 565 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务ID', 566 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称', 567 `VAR_TYPE_` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '变量类型', 568 `CREATE_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', 569 `REV_` int NULL DEFAULT NULL COMMENT '版本', 570 `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '二进制数据ID', 571 `DOUBLE_` double NULL DEFAULT NULL COMMENT 'double类型值', 572 `LONG_` bigint NULL DEFAULT NULL COMMENT 'long类型值', 573 `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文本类型值', 574 `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文本类型值2', 575 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 576 `STATE_` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态', 577 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '移除时间', 578 PRIMARY KEY (`ID_`) USING BTREE, 579 INDEX `PROC_DEF_KEY_`(`PROC_DEF_KEY_`) USING BTREE, 580 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE, 581 INDEX `ROOT_PROC_INST_ID_`(`ROOT_PROC_INST_ID_`) USING BTREE, 582 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 583 INDEX `EXECUTION_ID_`(`EXECUTION_ID_`) USING BTREE, 584 INDEX `TASK_ID_`(`TASK_ID_`) USING BTREE, 585 INDEX `ACT_INST_ID_`(`ACT_INST_ID_`) USING BTREE 586 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程历史记录/历史的流程变量记录表【常用】' ROW_FORMAT = Dynamic; 587 588 -- ---------------------------- 589 -- Table structure for act_id_group 590 -- ---------------------------- 591 DROP TABLE IF EXISTS `act_id_group`; 592 CREATE TABLE `act_id_group` ( 593 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 594 `REV_` int NULL DEFAULT NULL COMMENT '版本', 595 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组名称', 596 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组类型(SYSTEM系统、WORKFLOW业务)', 597 PRIMARY KEY (`ID_`) USING BTREE 598 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组织用户信息/群组信息表【常用】' ROW_FORMAT = Dynamic; 599 600 -- ---------------------------- 601 -- Table structure for act_id_info 602 -- ---------------------------- 603 DROP TABLE IF EXISTS `act_id_info`; 604 CREATE TABLE `act_id_info` ( 605 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 606 `REV_` int NULL DEFAULT NULL, 607 `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 608 `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 609 `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 610 `VALUE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 611 `PASSWORD_` longblob NULL, 612 `PARENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 613 PRIMARY KEY (`ID_`) USING BTREE 614 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组织用户信息/用户扩展信息表' ROW_FORMAT = Dynamic; 615 616 -- ---------------------------- 617 -- Table structure for act_id_membership 618 -- ---------------------------- 619 DROP TABLE IF EXISTS `act_id_membership`; 620 CREATE TABLE `act_id_membership` ( 621 `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户ID', 622 `GROUP_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '组ID', 623 PRIMARY KEY (`USER_ID_`, `GROUP_ID_`) USING BTREE 624 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组织用户信息/用户群组关系表【常用】' ROW_FORMAT = Dynamic; 625 626 -- ---------------------------- 627 -- Table structure for act_id_tenant 628 -- ---------------------------- 629 DROP TABLE IF EXISTS `act_id_tenant`; 630 CREATE TABLE `act_id_tenant` ( 631 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 632 `REV_` int NULL DEFAULT NULL, 633 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 634 PRIMARY KEY (`ID_`) USING BTREE 635 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组织用户信息/租户信息表' ROW_FORMAT = Dynamic; 636 637 -- ---------------------------- 638 -- Table structure for act_id_tenant_member 639 -- ---------------------------- 640 DROP TABLE IF EXISTS `act_id_tenant_member`; 641 CREATE TABLE `act_id_tenant_member` ( 642 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 643 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 644 `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 645 `GROUP_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 646 PRIMARY KEY (`ID_`) USING BTREE 647 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组织用户信息/用户租户关系表' ROW_FORMAT = Dynamic; 648 649 -- ---------------------------- 650 -- Table structure for act_id_user 651 -- ---------------------------- 652 DROP TABLE IF EXISTS `act_id_user`; 653 CREATE TABLE `act_id_user` ( 654 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 655 `REV_` int NULL DEFAULT NULL COMMENT '版本', 656 `FIRST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓', 657 `LAST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名', 658 `EMAIL_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮件', 659 `PWD_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码', 660 `SALT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '盐值', 661 `LOCK_EXP_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '锁定过期时间', 662 `ATTEMPTS_` int NULL DEFAULT NULL COMMENT '尝试次数', 663 `PICTURE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片ID', 664 PRIMARY KEY (`ID_`) USING BTREE 665 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组织用户信息/用户信息表【常用】' ROW_FORMAT = Dynamic; 666 667 -- ---------------------------- 668 -- Table structure for act_re_camformdef 669 -- ---------------------------- 670 DROP TABLE IF EXISTS `act_re_camformdef`; 671 CREATE TABLE `act_re_camformdef` ( 672 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 673 `REV_` int NULL DEFAULT NULL, 674 `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 675 `VERSION_` int NOT NULL, 676 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 677 `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 678 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 679 PRIMARY KEY (`ID_`) USING BTREE 680 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程资源存储/' ROW_FORMAT = Dynamic; 681 682 -- ---------------------------- 683 -- Table structure for act_re_case_def 684 -- ---------------------------- 685 DROP TABLE IF EXISTS `act_re_case_def`; 686 CREATE TABLE `act_re_case_def` ( 687 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 688 `REV_` int NULL DEFAULT NULL, 689 `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 690 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 691 `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 692 `VERSION_` int NOT NULL, 693 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 694 `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 695 `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 696 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 697 `HISTORY_TTL_` int NULL DEFAULT NULL, 698 PRIMARY KEY (`ID_`) USING BTREE 699 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程资源存储/CMMN案例管理模型定义表' ROW_FORMAT = Dynamic; 700 701 -- ---------------------------- 702 -- Table structure for act_re_decision_def 703 -- ---------------------------- 704 DROP TABLE IF EXISTS `act_re_decision_def`; 705 CREATE TABLE `act_re_decision_def` ( 706 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 707 `REV_` int NULL DEFAULT NULL, 708 `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 709 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 710 `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 711 `VERSION_` int NOT NULL, 712 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 713 `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 714 `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 715 `DEC_REQ_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 716 `DEC_REQ_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 717 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 718 `HISTORY_TTL_` int NULL DEFAULT NULL, 719 `VERSION_TAG_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 720 PRIMARY KEY (`ID_`) USING BTREE 721 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程资源存储/DMN决策模型定义表' ROW_FORMAT = Dynamic; 722 723 -- ---------------------------- 724 -- Table structure for act_re_decision_req_def 725 -- ---------------------------- 726 DROP TABLE IF EXISTS `act_re_decision_req_def`; 727 CREATE TABLE `act_re_decision_req_def` ( 728 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 729 `REV_` int NULL DEFAULT NULL, 730 `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 731 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 732 `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 733 `VERSION_` int NOT NULL, 734 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 735 `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 736 `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 737 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 738 PRIMARY KEY (`ID_`) USING BTREE 739 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程资源存储/决策需求定义表' ROW_FORMAT = Dynamic; 740 741 -- ---------------------------- 742 -- Table structure for act_re_deployment 743 -- ---------------------------- 744 DROP TABLE IF EXISTS `act_re_deployment`; 745 CREATE TABLE `act_re_deployment` ( 746 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 747 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程名称', 748 `DEPLOY_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '部署时间', 749 `SOURCE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '来源', 750 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 751 PRIMARY KEY (`ID_`) USING BTREE 752 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程资源存储/流程部署表【常用】' ROW_FORMAT = Dynamic; 753 754 -- ---------------------------- 755 -- Table structure for act_re_procdef 756 -- ---------------------------- 757 DROP TABLE IF EXISTS `act_re_procdef`; 758 CREATE TABLE `act_re_procdef` ( 759 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 760 `REV_` int NULL DEFAULT NULL COMMENT '版本', 761 `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义的Namespace分类', 762 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义名称', 763 `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '流程定义KEY', 764 `VERSION_` int NOT NULL COMMENT '流程定义版本号', 765 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部署ID', 766 `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源名称', 767 `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'DGRM资源名称', 768 `HAS_START_FORM_KEY_` tinyint NULL DEFAULT NULL COMMENT '是否有启动表单', 769 `SUSPENSION_STATE_` int NULL DEFAULT NULL COMMENT '流程挂起', 770 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 771 `VERSION_TAG_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '版本标签', 772 `HISTORY_TTL_` int NULL DEFAULT NULL, 773 `STARTABLE_` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否是可启动流程', 774 PRIMARY KEY (`ID_`) USING BTREE, 775 INDEX `KEY_`(`KEY_`) USING BTREE, 776 INDEX `DEPLOYMENT_ID_`(`DEPLOYMENT_ID_`) USING BTREE, 777 INDEX `VERSION_`(`VERSION_`) USING BTREE 778 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程资源存储/BPMN流程模型定义表【常用】' ROW_FORMAT = Dynamic; 779 780 -- ---------------------------- 781 -- Table structure for act_ru_authorization 782 -- ---------------------------- 783 DROP TABLE IF EXISTS `act_ru_authorization`; 784 CREATE TABLE `act_ru_authorization` ( 785 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 786 `REV_` int NOT NULL, 787 `TYPE_` int NOT NULL, 788 `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 789 `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 790 `RESOURCE_TYPE_` int NOT NULL, 791 `RESOURCE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 792 `PERMS_` int NULL DEFAULT NULL, 793 `REMOVAL_TIME_` datetime(0) NULL DEFAULT NULL, 794 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 795 PRIMARY KEY (`ID_`) USING BTREE 796 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程运行时收取表【常用】' ROW_FORMAT = Dynamic; 797 798 -- ---------------------------- 799 -- Table structure for act_ru_batch 800 -- ---------------------------- 801 DROP TABLE IF EXISTS `act_ru_batch`; 802 CREATE TABLE `act_ru_batch` ( 803 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 804 `REV_` int NOT NULL, 805 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 806 `TOTAL_JOBS_` int NULL DEFAULT NULL, 807 `JOBS_CREATED_` int NULL DEFAULT NULL, 808 `JOBS_PER_SEED_` int NULL DEFAULT NULL, 809 `INVOCATIONS_PER_JOB_` int NULL DEFAULT NULL, 810 `SEED_JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 811 `BATCH_JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 812 `MONITOR_JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 813 `SUSPENSION_STATE_` int NULL DEFAULT NULL, 814 `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 815 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 816 `CREATE_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 817 PRIMARY KEY (`ID_`) USING BTREE 818 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程执行批处理表' ROW_FORMAT = Dynamic; 819 820 -- ---------------------------- 821 -- Table structure for act_ru_case_execution 822 -- ---------------------------- 823 DROP TABLE IF EXISTS `act_ru_case_execution`; 824 CREATE TABLE `act_ru_case_execution` ( 825 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 826 `REV_` int NULL DEFAULT NULL, 827 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 828 `SUPER_CASE_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 829 `SUPER_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 830 `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 831 `PARENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 832 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 833 `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 834 `PREV_STATE_` int NULL DEFAULT NULL, 835 `CURRENT_STATE_` int NULL DEFAULT NULL, 836 `REQUIRED_` bit(1) NULL DEFAULT NULL, 837 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 838 PRIMARY KEY (`ID_`) USING BTREE 839 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/CMMN案例运行执行表' ROW_FORMAT = Dynamic; 840 841 -- ---------------------------- 842 -- Table structure for act_ru_case_sentry_part 843 -- ---------------------------- 844 DROP TABLE IF EXISTS `act_ru_case_sentry_part`; 845 CREATE TABLE `act_ru_case_sentry_part` ( 846 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 847 `REV_` int NULL DEFAULT NULL, 848 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 849 `CASE_EXEC_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 850 `SENTRY_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 851 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 852 `SOURCE_CASE_EXEC_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 853 `STANDARD_EVENT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 854 `SOURCE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 855 `VARIABLE_EVENT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 856 `VARIABLE_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 857 `SATISFIED_` bit(1) NULL DEFAULT NULL, 858 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 859 PRIMARY KEY (`ID_`) USING BTREE 860 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/CMMN案例运行时哨兵部分表' ROW_FORMAT = Dynamic; 861 862 -- ---------------------------- 863 -- Table structure for act_ru_event_subscr 864 -- ---------------------------- 865 DROP TABLE IF EXISTS `act_ru_event_subscr`; 866 CREATE TABLE `act_ru_event_subscr` ( 867 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 868 `REV_` int NULL DEFAULT NULL COMMENT '版本', 869 `EVENT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '事件类型', 870 `EVENT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事件名称', 871 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '执行ID', 872 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 873 `ACTIVITY_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点ID', 874 `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '配置', 875 `CREATED_` datetime(0) NOT NULL COMMENT '创建时间', 876 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 877 PRIMARY KEY (`ID_`) USING BTREE 878 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程事件订阅表' ROW_FORMAT = Dynamic; 879 880 -- ---------------------------- 881 -- Table structure for act_ru_execution 882 -- ---------------------------- 883 DROP TABLE IF EXISTS `act_ru_execution`; 884 CREATE TABLE `act_ru_execution` ( 885 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 886 `REV_` int NULL DEFAULT NULL COMMENT '版本', 887 `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例根ID', 888 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 889 `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '业务KEY', 890 `PARENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程父实例ID', 891 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 892 `SUPER_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父流程实例对应的执行', 893 `SUPER_CASE_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父案例实例对应的执行', 894 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例实例ID', 895 `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点ID', 896 `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点实例ID', 897 `IS_ACTIVE_` tinyint NULL DEFAULT NULL COMMENT '是否激活', 898 `IS_CONCURRENT_` tinyint NULL DEFAULT NULL COMMENT '是否并行', 899 `IS_SCOPE_` tinyint NULL DEFAULT NULL COMMENT '是否多实例范围', 900 `IS_EVENT_SCOPE_` tinyint NULL DEFAULT NULL COMMENT '是否事件多实例范围', 901 `SUSPENSION_STATE_` int NULL DEFAULT NULL COMMENT '挂起状态', 902 `CACHED_ENT_STATE_` int NULL DEFAULT NULL COMMENT '缓存状态', 903 `SEQUENCE_COUNTER_` bigint NULL DEFAULT NULL COMMENT '序列计数器', 904 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 905 PRIMARY KEY (`ID_`) USING BTREE, 906 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 907 INDEX `BUSINESS_KEY_`(`BUSINESS_KEY_`) USING BTREE, 908 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE, 909 INDEX `ACT_INST_ID_`(`ACT_INST_ID_`) USING BTREE 910 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/BPMN流程运行时记录表【常用】' ROW_FORMAT = Dynamic; 911 912 -- ---------------------------- 913 -- Table structure for act_ru_ext_task 914 -- ---------------------------- 915 DROP TABLE IF EXISTS `act_ru_ext_task`; 916 CREATE TABLE `act_ru_ext_task` ( 917 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 918 `REV_` int NOT NULL, 919 `WORKER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 920 `TOPIC_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 921 `RETRIES_` int NULL DEFAULT NULL, 922 `ERROR_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 923 `ERROR_DETAILS_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 924 `LOCK_EXP_TIME_` datetime(0) NULL DEFAULT NULL, 925 `SUSPENSION_STATE_` int NULL DEFAULT NULL, 926 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 927 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 928 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 929 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 930 `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 931 `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 932 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 933 `PRIORITY_` bigint NOT NULL DEFAULT 0, 934 PRIMARY KEY (`ID_`) USING BTREE 935 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程任务消息执行表' ROW_FORMAT = Dynamic; 936 937 -- ---------------------------- 938 -- Table structure for act_ru_filter 939 -- ---------------------------- 940 DROP TABLE IF EXISTS `act_ru_filter`; 941 CREATE TABLE `act_ru_filter` ( 942 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 943 `REV_` int NOT NULL, 944 `RESOURCE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 945 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 946 `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 947 `QUERY_` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 948 `PROPERTIES_` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL, 949 PRIMARY KEY (`ID_`) USING BTREE 950 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程定义查询配置表【常用】' ROW_FORMAT = Dynamic; 951 952 -- ---------------------------- 953 -- Table structure for act_ru_identitylink 954 -- ---------------------------- 955 DROP TABLE IF EXISTS `act_ru_identitylink`; 956 CREATE TABLE `act_ru_identitylink` ( 957 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 958 `REV_` int NULL DEFAULT NULL COMMENT '版本', 959 `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户组ID', 960 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型', 961 `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户ID', 962 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务ID', 963 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 964 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 965 PRIMARY KEY (`ID_`) USING BTREE 966 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/运行时流程人员表【常用】' ROW_FORMAT = Dynamic; 967 968 -- ---------------------------- 969 -- Table structure for act_ru_incident 970 -- ---------------------------- 971 DROP TABLE IF EXISTS `act_ru_incident`; 972 CREATE TABLE `act_ru_incident` ( 973 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 974 `REV_` int NOT NULL COMMENT '版本', 975 `INCIDENT_TIMESTAMP_` datetime(0) NOT NULL COMMENT '事件时间戳', 976 `INCIDENT_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事件信息', 977 `INCIDENT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '事件类型', 978 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程执行ID', 979 `ACTIVITY_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点ID', 980 `FAILED_ACTIVITY_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 981 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 982 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 983 `CAUSE_INCIDENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事件原因ID', 984 `ROOT_CAUSE_INCIDENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事件原因根ID', 985 `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事件配置', 986 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 987 `JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'JOB定义ID', 988 `ANNOTATION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 989 PRIMARY KEY (`ID_`) USING BTREE 990 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/运行时异常事件表' ROW_FORMAT = Dynamic; 991 992 -- ---------------------------- 993 -- Table structure for act_ru_job 994 -- ---------------------------- 995 DROP TABLE IF EXISTS `act_ru_job`; 996 CREATE TABLE `act_ru_job` ( 997 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 998 `REV_` int NULL DEFAULT NULL COMMENT '版本', 999 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类型', 1000 `LOCK_EXP_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '锁定过期时间', 1001 `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '锁定用户', 1002 `EXCLUSIVE_` bit(1) NULL DEFAULT NULL COMMENT '独占标识', 1003 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '执行ID', 1004 `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 1005 `PROCESS_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 1006 `PROCESS_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY', 1007 `RETRIES_` int NULL DEFAULT NULL COMMENT '重试次数', 1008 `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '异常堆栈ID', 1009 `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '异常信息', 1010 `FAILED_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 1011 `DUEDATE_` datetime(0) NULL DEFAULT NULL COMMENT '截止时间', 1012 `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '重复', 1013 `REPEAT_OFFSET_` bigint NULL DEFAULT 0, 1014 `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '处理类型', 1015 `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '处理配置', 1016 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部署ID', 1017 `SUSPENSION_STATE_` int NOT NULL DEFAULT 1 COMMENT '挂起状态', 1018 `JOB_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '作业定义ID', 1019 `PRIORITY_` bigint NOT NULL DEFAULT 0 COMMENT '作业优先级', 1020 `SEQUENCE_COUNTER_` bigint NULL DEFAULT NULL COMMENT '序列计数器', 1021 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 1022 `CREATE_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', 1023 PRIMARY KEY (`ID_`) USING BTREE 1024 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程运行时作业表' ROW_FORMAT = Dynamic; 1025 1026 -- ---------------------------- 1027 -- Table structure for act_ru_jobdef 1028 -- ---------------------------- 1029 DROP TABLE IF EXISTS `act_ru_jobdef`; 1030 CREATE TABLE `act_ru_jobdef` ( 1031 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 1032 `REV_` int NULL DEFAULT NULL COMMENT '版本', 1033 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 1034 `PROC_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义KEY', 1035 `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点ID', 1036 `JOB_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'JOB类型', 1037 `JOB_CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'JOB配置', 1038 `SUSPENSION_STATE_` int NULL DEFAULT NULL COMMENT '挂起状态', 1039 `JOB_PRIORITY_` bigint NULL DEFAULT NULL COMMENT '优先级', 1040 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 1041 `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 1042 PRIMARY KEY (`ID_`) USING BTREE 1043 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程作业定义表' ROW_FORMAT = Dynamic; 1044 1045 -- ---------------------------- 1046 -- Table structure for act_ru_meter_log 1047 -- ---------------------------- 1048 DROP TABLE IF EXISTS `act_ru_meter_log`; 1049 CREATE TABLE `act_ru_meter_log` ( 1050 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 1051 `NAME_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 1052 `REPORTER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 1053 `VALUE_` bigint NULL DEFAULT NULL, 1054 `TIMESTAMP_` datetime(0) NULL DEFAULT NULL, 1055 `MILLISECONDS_` bigint NULL DEFAULT 0, 1056 PRIMARY KEY (`ID_`) USING BTREE 1057 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程运行时度量日志表【常用】' ROW_FORMAT = Dynamic; 1058 1059 -- ---------------------------- 1060 -- Table structure for act_ru_task 1061 -- ---------------------------- 1062 DROP TABLE IF EXISTS `act_ru_task`; 1063 CREATE TABLE `act_ru_task` ( 1064 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 1065 `REV_` int NULL DEFAULT NULL COMMENT '版本', 1066 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程执行ID', 1067 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 1068 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程定义ID', 1069 `CASE_EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例执行ID', 1070 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例实例ID', 1071 `CASE_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例定义ID', 1072 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称', 1073 `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父任务ID', 1074 `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', 1075 `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务定义KEY', 1076 `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '委托人', 1077 `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '办理人', 1078 `DELEGATION_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '委托状态', 1079 `PRIORITY_` int NULL DEFAULT NULL COMMENT '优先级', 1080 `CREATE_TIME_` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', 1081 `DUE_DATE_` datetime(0) NULL DEFAULT NULL COMMENT '截止时间', 1082 `FOLLOW_UP_DATE_` datetime(0) NULL DEFAULT NULL COMMENT '跟踪时间', 1083 `SUSPENSION_STATE_` int NULL DEFAULT NULL COMMENT '挂起状态', 1084 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 1085 PRIMARY KEY (`ID_`) USING BTREE, 1086 INDEX `EXECUTION_ID_`(`EXECUTION_ID_`) USING BTREE, 1087 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 1088 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE, 1089 INDEX `PARENT_TASK_ID_`(`PARENT_TASK_ID_`) USING BTREE, 1090 INDEX `ASSIGNEE_`(`ASSIGNEE_`) USING BTREE 1091 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程运行时任务表【常用】' ROW_FORMAT = Dynamic; 1092 1093 -- ---------------------------- 1094 -- Table structure for act_ru_task_meter_log 1095 -- ---------------------------- 1096 DROP TABLE IF EXISTS `act_ru_task_meter_log`; 1097 CREATE TABLE `act_ru_task_meter_log` ( 1098 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 1099 `ASSIGNEE_HASH_` bigint NULL DEFAULT NULL, 1100 `TIMESTAMP_` datetime(0) NULL DEFAULT NULL, 1101 PRIMARY KEY (`ID_`) USING BTREE 1102 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/运行时task度量日志表【常用】' ROW_FORMAT = Dynamic; 1103 1104 -- ---------------------------- 1105 -- Table structure for act_ru_variable 1106 -- ---------------------------- 1107 DROP TABLE IF EXISTS `act_ru_variable`; 1108 CREATE TABLE `act_ru_variable` ( 1109 `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', 1110 `REV_` int NULL DEFAULT NULL COMMENT '版本', 1111 `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '变量类型', 1112 `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '变量名称', 1113 `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程执行ID', 1114 `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程实例ID', 1115 `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 1116 `CASE_EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例执行ID', 1117 `CASE_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '案例实例ID', 1118 `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务ID', 1119 `BATCH_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 1120 `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '二进制内容ID', 1121 `DOUBLE_` double NULL DEFAULT NULL COMMENT 'DOUBLE类型值', 1122 `LONG_` bigint NULL DEFAULT NULL COMMENT 'LONG类型值', 1123 `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文本值', 1124 `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文本值2', 1125 `VAR_SCOPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '变量范围', 1126 `SEQUENCE_COUNTER_` bigint NULL DEFAULT NULL COMMENT '序列计数器', 1127 `IS_CONCURRENT_LOCAL_` tinyint NULL DEFAULT NULL COMMENT '是否并发', 1128 `TENANT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户ID', 1129 PRIMARY KEY (`ID_`) USING BTREE, 1130 INDEX `PROC_DEF_ID_`(`PROC_DEF_ID_`) USING BTREE, 1131 INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, 1132 INDEX `EXECUTION_ID_`(`EXECUTION_ID_`) USING BTREE 1133 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程运行时/流程运行时变量表【常用】' ROW_FORMAT = Dynamic; 1134 1135 SET FOREIGN_KEY_CHECKS = 1;