OA 系统工作流引擎 Camunda 实践(1)
  Qco8b99ZMQO6 2023年11月01日 26 0

 

Camunda是Activiti最大的贡献者之一(除Alfresco以外),同时也是它一个主 要的执行咨询合作伙伴。camunda表示Activiti可能太拘束于Alfresco对以文档为中心的工作流的需求(这个也是BPMN约束使然),而忽视了Activiti起步时 的更为普遍的BPM平台。camunda宣布他们正从Activiti 分裂出一个新的开源工程,那就是camunda BPM

 

官网

https://camunda.com/

下载

https://camunda.com/download/

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工具类

  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 }
Camunda工作流引擎工具类

 

  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 }
Camunda节点操作工具类

 

  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 }
Camunda服务工具类

 

 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监听器实现

 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 }
抄送人服务

 

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("=--------------------------------=");
    }

}
流程结束服务

 

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张表结构

   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;
Camunda框架自身49张表

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   110   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
Qco8b99ZMQO6