list = sysExpressionService.selectSysExpressionList(sysExpression);
- return AjaxResult.success(list);
- }
-
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowInstanceController.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowInstanceController.java
deleted file mode 100644
index 71ed4f1..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowInstanceController.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.yanzhu.flowable.controller;
-
-
-import com.yanzhu.common.core.domain.AjaxResult;
-import com.yanzhu.flowable.domain.FlowTaskVo;
-import com.yanzhu.flowable.service.IFlowInstanceService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- * 工作流流程实例管理
- *
- * @author Tony
- * @date 2021-04-03
- */
-@Slf4j
-@Api(tags = "工作流流程实例管理")
-@RestController
-@RequestMapping("/flowable/instance")
-public class FlowInstanceController {
-
- @Autowired
- private IFlowInstanceService flowInstanceService;
-
- @ApiOperation(value = "根据流程定义id启动流程实例")
- @PostMapping("/startBy/{procDefId}")
- public AjaxResult startById(@ApiParam(value = "流程定义id") @PathVariable(value = "procDefId") String procDefId,
- @ApiParam(value = "变量集合,json对象") @RequestBody Map variables) {
- return flowInstanceService.startProcessInstanceById(procDefId, variables);
-
- }
-
-
- @ApiOperation(value = "激活或挂起流程实例")
- @PostMapping(value = "/updateState")
- public AjaxResult updateState(@ApiParam(value = "1:激活,2:挂起", required = true) @RequestParam Integer state,
- @ApiParam(value = "流程实例ID", required = true) @RequestParam String instanceId) {
- flowInstanceService.updateState(state,instanceId);
- return AjaxResult.success();
- }
-
- @ApiOperation("结束流程实例")
- @PostMapping(value = "/stopProcessInstance")
- public AjaxResult stopProcessInstance(@RequestBody FlowTaskVo flowTaskVo) {
- flowInstanceService.stopProcessInstance(flowTaskVo);
- return AjaxResult.success();
- }
-
- @ApiOperation(value = "删除流程实例")
- @DeleteMapping(value = "/delete/{instanceIds}")
- public AjaxResult delete(@ApiParam(value = "流程实例ID", required = true) @PathVariable String[] instanceIds,
- @ApiParam(value = "删除原因") @RequestParam(required = false) String deleteReason) {
- for (String instanceId : instanceIds) {
- flowInstanceService.delete(instanceId,deleteReason);
- }
- return AjaxResult.success();
- }
-}
\ No newline at end of file
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowTaskController.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowTaskController.java
deleted file mode 100644
index ed887eb..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowTaskController.java
+++ /dev/null
@@ -1,268 +0,0 @@
-package com.yanzhu.flowable.controller;
-
-import com.yanzhu.common.annotation.Log;
-import com.yanzhu.common.core.domain.AjaxResult;
-import com.yanzhu.common.enums.BusinessType;
-import com.yanzhu.flowable.domain.FlowTaskDto;
-import com.yanzhu.system.domain.flowable.FlowQueryVo;
-import com.yanzhu.flowable.domain.FlowTaskVo;
-import com.yanzhu.flowable.service.IFlowTaskService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletResponse;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * 工作流任务管理
- *
- * @author Tony
- * @date 2021-04-03
- */
-@Slf4j
-@Api(tags = "工作流流程任务管理")
-@RestController
-@RequestMapping("/flowable/task")
-public class FlowTaskController {
-
- @Autowired
- private IFlowTaskService flowTaskService;
-
- @ApiOperation(value = "我发起的流程", response = FlowTaskDto.class)
- @GetMapping(value = "/myProcess")
- public AjaxResult myProcess(FlowQueryVo queryVo) {
- return flowTaskService.myProcess(queryVo);
- }
-
- @ApiOperation(value = "取消申请", response = FlowTaskDto.class)
- @Log(title = "终止申请", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/stopProcess")
- public AjaxResult stopProcess(@RequestBody FlowTaskVo flowTaskVo) {
- return flowTaskService.stopProcess(flowTaskVo);
- }
-
- @ApiOperation(value = "撤回流程", response = FlowTaskDto.class)
- @Log(title = "撤回流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/revokeProcess")
- public AjaxResult revokeProcess(@RequestBody FlowTaskVo flowTaskVo) {
- return flowTaskService.revokeProcess(flowTaskVo);
- }
-
- @ApiOperation(value = "获取待办列表", response = FlowTaskDto.class)
- @GetMapping(value = "/todoList")
- public AjaxResult todoList(FlowQueryVo queryVo) {
- return flowTaskService.todoList(queryVo);
- }
-
- @ApiOperation(value = "获取已办任务", response = FlowTaskDto.class)
- @GetMapping(value = "/finishedList")
- public AjaxResult finishedList(FlowQueryVo queryVo) {
- return flowTaskService.finishedList(queryVo);
- }
-
-
- @ApiOperation(value = "流程历史流转记录", response = FlowTaskDto.class)
- @GetMapping(value = "/flowRecord")
- public AjaxResult flowRecord(String procInsId, String deployId) {
- return flowTaskService.flowRecord(procInsId, deployId);
- }
-
-
- @ApiOperation(value = "流程初始化表单", response = FlowTaskDto.class)
- @GetMapping(value = "/flowFormData")
- public AjaxResult flowFormData(String deployId) {
- return flowTaskService.flowFormData(deployId);
- }
-
- @ApiOperation(value = "获取流程变量", response = FlowTaskDto.class)
- @GetMapping(value = "/processVariables/{taskId}")
- public AjaxResult processVariables(@ApiParam(value = "流程任务Id") @PathVariable(value = "taskId") String taskId) {
- return flowTaskService.processVariables(taskId);
- }
-
- @ApiOperation(value = "审批任务")
- @Log(title = "审批流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/complete")
- public AjaxResult complete(@RequestBody FlowTaskVo flowTaskVo) {
- return flowTaskService.complete(flowTaskVo);
- }
-
- @ApiOperation(value = "重新提交流程")
- @Log(title = "重新提交流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/completeAndModify")
- public AjaxResult completeAndModify(@RequestBody FlowTaskVo flowTaskVo) {
- return flowTaskService.complete(flowTaskVo);
- }
-
- @ApiOperation(value = "驳回任务")
- @Log(title = "驳回流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/reject")
- public AjaxResult taskReject(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.taskReject(flowTaskVo);
- return AjaxResult.success();
- }
-
- @ApiOperation(value = "退回任务")
- @Log(title = "退回流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/return")
- public AjaxResult taskReturn(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.taskReturn(flowTaskVo);
- return AjaxResult.success();
- }
-
- @ApiOperation(value = "获取所有可回退的节点")
- @PostMapping(value = "/returnList")
- public AjaxResult findReturnTaskList(@RequestBody FlowTaskVo flowTaskVo) {
- return flowTaskService.findReturnTaskList(flowTaskVo);
- }
-
- @ApiOperation(value = "删除任务")
- @Log(title = "删除流程", businessType = BusinessType.DELETE)
- @DeleteMapping(value = "/delete")
- public AjaxResult delete(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.deleteTask(flowTaskVo);
- return AjaxResult.success();
- }
-
- @ApiOperation(value = "认领/签收任务")
- @Log(title = "认领/签收流程", businessType = BusinessType.INSERT)
- @PostMapping(value = "/claim")
- public AjaxResult claim(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.claim(flowTaskVo);
- return AjaxResult.success();
- }
-
- @ApiOperation(value = "取消认领/签收任务")
- @Log(title = "取消认领/签收流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/unClaim")
- public AjaxResult unClaim(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.unClaim(flowTaskVo);
- return AjaxResult.success();
- }
-
- @ApiOperation(value = "委派任务")
- @Log(title = "委派流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/delegateTask")
- public AjaxResult delegate(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.delegateTask(flowTaskVo);
- return AjaxResult.success();
- }
-
- @ApiOperation(value = "任务归还")
- @Log(title = "归还流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/resolveTask")
- public AjaxResult resolveTask(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.resolveTask(flowTaskVo);
- return AjaxResult.success();
- }
-
- @ApiOperation(value = "转办任务")
- @Log(title = "转办流程", businessType = BusinessType.UPDATE)
- @PostMapping(value = "/assignTask")
- public AjaxResult assign(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.assignTask(flowTaskVo);
- return AjaxResult.success();
- }
-
- @PostMapping(value = "/addMultiInstanceExecution")
- @ApiOperation(value = "多实例加签")
- public AjaxResult addMultiInstanceExecution(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.addMultiInstanceExecution(flowTaskVo);
- return AjaxResult.success("加签成功");
- }
-
- @PostMapping(value = "/deleteMultiInstanceExecution")
- @ApiOperation(value = "多实例减签")
- public AjaxResult deleteMultiInstanceExecution(@RequestBody FlowTaskVo flowTaskVo) {
- flowTaskService.deleteMultiInstanceExecution(flowTaskVo);
- return AjaxResult.success("减签成功");
- }
-
- @ApiOperation(value = "获取下一节点")
- @PostMapping(value = "/nextFlowNode")
- public AjaxResult getNextFlowNode(@RequestBody FlowTaskVo flowTaskVo) {
- return flowTaskService.getNextFlowNode(flowTaskVo);
- }
-
- @ApiOperation(value = "流程发起时获取下一节点")
- @PostMapping(value = "/nextFlowNodeByStart")
- public AjaxResult getNextFlowNodeByStart(@RequestBody FlowTaskVo flowTaskVo) {
- return flowTaskService.getNextFlowNodeByStart(flowTaskVo);
- }
-
- /**
- * 生成流程图
- *
- * @param processId 任务ID
- */
- @GetMapping("/diagram/{processId}")
- public void genProcessDiagram(HttpServletResponse response,
- @PathVariable("processId") String processId) {
- InputStream inputStream = flowTaskService.diagram(processId);
- OutputStream os = null;
- BufferedImage image = null;
- try {
- image = ImageIO.read(inputStream);
- response.setContentType("image/png");
- os = response.getOutputStream();
- if (image != null) {
- ImageIO.write(image, "png", os);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (os != null) {
- os.flush();
- os.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- /**
- * 获取流程执行节点
- *
- * @param procInsId 流程实例编号
- * @param procInsId 任务执行编号
- */
- @GetMapping("/flowViewer/{procInsId}/{executionId}")
- public AjaxResult getFlowViewer(@PathVariable("procInsId") String procInsId,
- @PathVariable("executionId") String executionId) {
- return flowTaskService.getFlowViewer(procInsId, executionId);
- }
-
- /**
- * 流程节点信息
- *
- * @param procInsId 流程实例id
- * @return
- */
- @GetMapping("/flowXmlAndNode")
- public AjaxResult flowXmlAndNode(@RequestParam(value = "procInsId", required = false) String procInsId,
- @RequestParam(value = "deployId", required = false) String deployId) {
- return flowTaskService.flowXmlAndNode(procInsId, deployId);
- }
-
- /**
- * 流程节点表单
- *
- * @param taskId 流程任务编号
- * @return
- */
- @GetMapping("/flowTaskForm")
- public AjaxResult flowTaskForm(@RequestParam(value = "taskId", required = false) String taskId) throws Exception {
- return flowTaskService.flowTaskForm(taskId);
- }
-
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/SysFormController.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/SysFormController.java
deleted file mode 100644
index 171cf20..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/SysFormController.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package com.yanzhu.flowable.controller;
-
-import java.util.List;
-
-import com.yanzhu.flowable.service.ISysDeployFormService;
-import com.yanzhu.system.domain.SysDeployForm;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.yanzhu.common.annotation.Log;
-import com.yanzhu.common.core.controller.BaseController;
-import com.yanzhu.common.core.domain.AjaxResult;
-import com.yanzhu.common.enums.BusinessType;
-import com.yanzhu.system.domain.SysForm;
-import com.yanzhu.flowable.service.ISysFormService;
-import com.yanzhu.common.utils.poi.ExcelUtil;
-import com.yanzhu.common.core.page.TableDataInfo;
-
-/**
- * 流程表单Controller
- *
- * @author Tony
- * @date 2021-04-03
- */
-@RestController
-@RequestMapping("/flowable/form")
-public class SysFormController extends BaseController {
- @Autowired
- private ISysFormService SysFormService;
-
- @Autowired
- private ISysDeployFormService sysDeployFormService;
-
- /**
- * 查询流程表单列表
- */
- @PreAuthorize("@ss.hasPermi('flowable:form:list')")
- @GetMapping("/list")
- public TableDataInfo list(SysForm sysForm) {
- startPage();
- List list = SysFormService.selectSysFormList(sysForm);
- return getDataTable(list);
- }
-
- @GetMapping("/formList")
- public AjaxResult formList(SysForm sysForm) {
- List list = SysFormService.selectSysFormList(sysForm);
- return AjaxResult.success(list);
- }
- /**
- * 导出流程表单列表
- */
- @PreAuthorize("@ss.hasPermi('flowable:form:export')")
- @Log(title = "流程表单", businessType = BusinessType.EXPORT)
- @GetMapping("/export")
- public AjaxResult export(SysForm sysForm) {
- List list = SysFormService.selectSysFormList(sysForm);
- ExcelUtil util = new ExcelUtil(SysForm.class);
- return util.exportExcel(list, "form");
- }
-
- /**
- * 获取流程表单详细信息
- */
- @PreAuthorize("@ss.hasPermi('flowable:form:query')")
- @GetMapping(value = "/{formId}")
- public AjaxResult getInfo(@PathVariable("formId") Long formId) {
- return AjaxResult.success(SysFormService.selectSysFormById(formId));
- }
-
- /**
- * 新增流程表单
- */
- @PreAuthorize("@ss.hasPermi('flowable:form:add')")
- @Log(title = "流程表单", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@RequestBody SysForm sysForm) {
- return toAjax(SysFormService.insertSysForm(sysForm));
- }
-
- /**
- * 修改流程表单
- */
- @PreAuthorize("@ss.hasPermi('flowable:form:edit')")
- @Log(title = "流程表单", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@RequestBody SysForm sysForm) {
- return toAjax(SysFormService.updateSysForm(sysForm));
- }
-
- /**
- * 删除流程表单
- */
- @PreAuthorize("@ss.hasPermi('flowable:form:remove')")
- @Log(title = "流程表单", businessType = BusinessType.DELETE)
- @DeleteMapping("/{formIds}")
- public AjaxResult remove(@PathVariable Long[] formIds) {
- return toAjax(SysFormService.deleteSysFormByIds(formIds));
- }
-
-
- /**
- * 挂载流程表单
- */
- @Log(title = "流程表单", businessType = BusinessType.INSERT)
- @PostMapping("/addDeployForm")
- public AjaxResult addDeployForm(@RequestBody SysDeployForm sysDeployForm) {
- return toAjax(sysDeployFormService.insertSysDeployForm(sysDeployForm));
- }
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowCommentDto.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowCommentDto.java
deleted file mode 100644
index 4b9d597..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowCommentDto.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.yanzhu.flowable.domain;
-
-import lombok.Builder;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author Tony
- * @date 2021/3/28 15:50
- */
-@Data
-@Builder
-public class FlowCommentDto implements Serializable {
-
- /**
- * 意见类别 0 正常意见 1 退回意见 2 驳回意见
- */
- private String type;
-
- /**
- * 意见内容
- */
- private String comment;
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowFromFieldDTO.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowFromFieldDTO.java
deleted file mode 100644
index e591207..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowFromFieldDTO.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.yanzhu.flowable.domain;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author Tony
- * @date 2021/3/31 23:20
- */
-@Data
-public class FlowFromFieldDTO implements Serializable {
-
- private Object fields;
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowNextDto.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowNextDto.java
deleted file mode 100644
index 70b506a..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowNextDto.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.yanzhu.flowable.domain;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 动态人员、组
- * @author Tony
- * @date 2021/4/17 22:59
- */
-@Data
-public class FlowNextDto implements Serializable {
-
- private String type;
- private String dataType;
- private String vars;
-
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowSaveXmlVo.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowSaveXmlVo.java
deleted file mode 100644
index 46d9fbe..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowSaveXmlVo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.yanzhu.flowable.domain;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author Tony
- * @date 2021/3/28 19:48
- */
-@Data
-public class FlowSaveXmlVo implements Serializable {
-
- /**
- * 流程名称
- */
- private String name;
-
- /**
- * 流程分类
- */
- private String category;
-
- /**
- * 流程单位
- */
- private String ownerDeptId;
-
- /**
- * xml 文件
- */
- private String xml;
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowTaskDto.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowTaskDto.java
deleted file mode 100644
index 5db80e9..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowTaskDto.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.yanzhu.flowable.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 工作流任务
- *
- * @author Tony
- * @date 2021-04-03
- */
-@Getter
-@Setter
-@ApiModel("工作流任务相关-返回参数")
-public class FlowTaskDto implements Serializable {
-
- @ApiModelProperty("任务编号")
- private String taskId;
-
- @ApiModelProperty("任务执行编号")
- private String executionId;
-
- @ApiModelProperty("任务名称")
- private String taskName;
-
- @ApiModelProperty("任务Key")
- private String taskDefKey;
-
- @ApiModelProperty("任务执行人Id")
- private Long assigneeId;
-
- @ApiModelProperty("部门名称")
- private String deptName;
-
- @ApiModelProperty("流程发起人部门名称")
- private String startDeptName;
-
- @ApiModelProperty("任务执行人名称")
- private String assigneeName;
-
- @ApiModelProperty("任务执行人部门")
- private String assigneeDeptName;;
-
- @ApiModelProperty("流程发起人Id")
- private String startUserId;
-
- @ApiModelProperty("流程发起人名称")
- private String startUserName;
-
- @ApiModelProperty("流程类型")
- private String category;
-
- @ApiModelProperty("流程变量信息")
- private Object procVars;
-
- @ApiModelProperty("局部变量信息")
- private Object taskLocalVars;
-
- @ApiModelProperty("流程部署编号")
- private String deployId;
-
- @ApiModelProperty("流程ID")
- private String procDefId;
-
- @ApiModelProperty("流程key")
- private String procDefKey;
-
- @ApiModelProperty("流程定义名称")
- private String procDefName;
-
- @ApiModelProperty("流程定义内置使用版本")
- private int procDefVersion;
-
- @ApiModelProperty("流程实例ID")
- private String procInsId;
-
- @ApiModelProperty("历史流程实例ID")
- private String hisProcInsId;
-
- @ApiModelProperty("任务耗时")
- private String duration;
-
- @ApiModelProperty("任务意见")
- private FlowCommentDto comment;
-
- @ApiModelProperty("候选执行人")
- private String candidate;
-
- @ApiModelProperty("任务创建时间")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private Date createTime;
-
- @ApiModelProperty("任务完成时间")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private Date finishTime;
-
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowTaskVo.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowTaskVo.java
deleted file mode 100644
index c31612b..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowTaskVo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.yanzhu.flowable.domain;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- *
流程任务
- *
- * @author Tony
- * @date 2021-04-03
- */
-@Data
-@ApiModel("工作流任务相关--请求参数")
-public class FlowTaskVo {
-
- @ApiModelProperty("任务Id")
- private String taskId;
-
- @ApiModelProperty("用户Id")
- private String userId;
-
- @ApiModelProperty("任务意见")
- private String comment;
-
- @ApiModelProperty("流程实例Id")
- private String instanceId;
-
- @ApiModelProperty("节点")
- private String targetKey;
-
- private String deploymentId;
- @ApiModelProperty("流程环节定义ID")
- private String defId;
-
- @ApiModelProperty("子执行流ID")
- private String currentChildExecutionId;
-
- @ApiModelProperty("子执行流是否已执行")
- private Boolean flag;
-
- @ApiModelProperty("流程变量信息")
- private Map variables;
-
- @ApiModelProperty("审批人")
- private String assignee;
-
- @ApiModelProperty("候选人")
- private List candidateUsers;
-
- @ApiModelProperty("审批组")
- private List candidateGroups;
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowViewerDto.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowViewerDto.java
deleted file mode 100644
index 60b221f..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/domain/FlowViewerDto.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.yanzhu.flowable.domain;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author Tony
- * @date 2021/4/21 20:55
- */
-@Data
-public class FlowViewerDto implements Serializable {
-
- /**
- * 流程key
- */
- private String key;
-
- /**
- * 是否完成(已经审批)
- */
- private boolean completed;
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/factory/FlowServiceFactory.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/factory/FlowServiceFactory.java
deleted file mode 100644
index e66efd7..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/factory/FlowServiceFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.yanzhu.flowable.factory;
-
-import lombok.Getter;
-import org.flowable.engine.*;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-
-/**
- * flowable 引擎注入封装
- * @author Tony
- * @date 2021-04-03
- */
-@Component
-@Getter
-public class FlowServiceFactory {
-
- @Resource
- protected RepositoryService repositoryService;
-
- @Resource
- protected RuntimeService runtimeService;
-
- @Resource
- protected IdentityService identityService;
-
- @Resource
- protected TaskService taskService;
-
- @Resource
- protected HistoryService historyService;
-
- @Resource
- protected ManagementService managementService;
-
- @Qualifier("processEngine")
- @Resource
- protected ProcessEngine processEngine;
-
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/CustomProcessDiagramCanvas.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/CustomProcessDiagramCanvas.java
deleted file mode 100644
index 7a0baca..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/CustomProcessDiagramCanvas.java
+++ /dev/null
@@ -1,370 +0,0 @@
-package com.yanzhu.flowable.flow;
-
-import org.flowable.bpmn.model.AssociationDirection;
-import org.flowable.bpmn.model.GraphicInfo;
-import org.flowable.image.impl.DefaultProcessDiagramCanvas;
-import org.flowable.image.util.ReflectUtil;
-
-import javax.imageio.ImageIO;
-import java.awt.*;
-import java.awt.font.FontRenderContext;
-import java.awt.font.LineBreakMeasurer;
-import java.awt.font.TextAttribute;
-import java.awt.font.TextLayout;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Rectangle2D;
-import java.awt.geom.RoundRectangle2D;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.text.AttributedCharacterIterator;
-import java.text.AttributedString;
-
-/**
- * @author Tony
- * @date 2021/4/4 23:58
- */
-public class CustomProcessDiagramCanvas extends DefaultProcessDiagramCanvas {
- //定义走过流程连线颜色为绿色
- protected static Color HIGHLIGHT_SequenceFlow_COLOR = Color.GREEN;
- //设置未走过流程的连接线颜色
- protected static Color CONNECTION_COLOR = Color.BLACK;
- //设置flows连接线字体颜色red
- protected static Color LABEL_COLOR = new Color(0, 0, 0);
- //高亮显示task框颜色
- protected static Color HIGHLIGHT_COLOR = Color.GREEN;
- protected static Color HIGHLIGHT_COLOR1 = Color.RED;
-
- public CustomProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) {
- super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader);
- this.initialize(imageType);
- }
-
- /**
- * 重写绘制连线的方式,设置绘制颜色
- * @param xPoints
- * @param yPoints
- * @param conditional
- * @param isDefault
- * @param connectionType
- * @param associationDirection
- * @param highLighted
- * @param scaleFactor
- */
- @Override
- public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) {
- Paint originalPaint = this.g.getPaint();
- Stroke originalStroke = this.g.getStroke();
- this.g.setPaint(CONNECTION_COLOR);
- if (connectionType.equals("association")) {
- this.g.setStroke(ASSOCIATION_STROKE);
- } else if (highLighted) {
- this.g.setPaint(HIGHLIGHT_SequenceFlow_COLOR);
- this.g.setStroke(HIGHLIGHT_FLOW_STROKE);
- }
-
- for (int i = 1; i < xPoints.length; ++i) {
- Integer sourceX = xPoints[i - 1];
- Integer sourceY = yPoints[i - 1];
- Integer targetX = xPoints[i];
- Integer targetY = yPoints[i];
- java.awt.geom.Line2D.Double line = new java.awt.geom.Line2D.Double((double) sourceX, (double) sourceY, (double) targetX, (double) targetY);
- this.g.draw(line);
- }
-
- java.awt.geom.Line2D.Double line;
- if (isDefault) {
- line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]);
- this.drawDefaultSequenceFlowIndicator(line, scaleFactor);
- }
-
- if (conditional) {
- line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]);
- this.drawConditionalSequenceFlowIndicator(line, scaleFactor);
- }
-
- if (associationDirection.equals(AssociationDirection.ONE) || associationDirection.equals(AssociationDirection.BOTH)) {
- line = new java.awt.geom.Line2D.Double((double) xPoints[xPoints.length - 2], (double) yPoints[xPoints.length - 2], (double) xPoints[xPoints.length - 1], (double) yPoints[xPoints.length - 1]);
- this.drawArrowHead(line, scaleFactor);
- }
-
- if (associationDirection.equals(AssociationDirection.BOTH)) {
- line = new java.awt.geom.Line2D.Double((double) xPoints[1], (double) yPoints[1], (double) xPoints[0], (double) yPoints[0]);
- this.drawArrowHead(line, scaleFactor);
- }
-
- this.g.setPaint(originalPaint);
- this.g.setStroke(originalStroke);
- }
-
- /**
- * 设置字体大小图标颜色
- * @param imageType
- */
- @Override
- public void initialize(String imageType) {
- if ("png".equalsIgnoreCase(imageType)) {
- this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 2);
- } else {
- this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 1);
- }
-
- this.g = this.processDiagram.createGraphics();
- if (!"png".equalsIgnoreCase(imageType)) {
- this.g.setBackground(new Color(255, 255, 255, 0));
- this.g.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
- }
-
- this.g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- //修改图标颜色,修改图标字体大小
- this.g.setPaint(Color.black);
- Font font = new Font(this.activityFontName, 10, 14);
- this.g.setFont(font);
- this.fontMetrics = this.g.getFontMetrics();
- //修改连接线字体大小
- LABEL_FONT = new Font(this.labelFontName, 10, 15);
- ANNOTATION_FONT = new Font(this.annotationFontName, 0, 11);
-
- try {
- USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/userTask.png", this.customClassLoader));
- SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/scriptTask.png", this.customClassLoader));
- SERVICETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/serviceTask.png", this.customClassLoader));
- RECEIVETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/receiveTask.png", this.customClassLoader));
- SENDTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/sendTask.png", this.customClassLoader));
- MANUALTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/manualTask.png", this.customClassLoader));
- BUSINESS_RULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/businessRuleTask.png", this.customClassLoader));
- SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/shellTask.png", this.customClassLoader));
- DMN_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/dmnTask.png", this.customClassLoader));
- CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/camelTask.png", this.customClassLoader));
- MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/muleTask.png", this.customClassLoader));
- HTTP_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/httpTask.png", this.customClassLoader));
- TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/timer.png", this.customClassLoader));
- COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate-throw.png", this.customClassLoader));
- COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate.png", this.customClassLoader));
- ERROR_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error-throw.png", this.customClassLoader));
- ERROR_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error.png", this.customClassLoader));
- MESSAGE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message-throw.png", this.customClassLoader));
- MESSAGE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message.png", this.customClassLoader));
- SIGNAL_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal-throw.png", this.customClassLoader));
- SIGNAL_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal.png", this.customClassLoader));
- } catch (IOException var4) {
- LOGGER.warn("Could not load image for process diagram creation: {}", var4.getMessage());
- }
-
- }
-
- /**
- * 设置连接线字体
- * @param text
- * @param graphicInfo
- * @param centered
- */
- @Override
- public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered) {
- float interline = 1.0f;
-
- // text
- if (text != null && text.length() > 0) {
- Paint originalPaint = g.getPaint();
- Font originalFont = g.getFont();
-
- g.setPaint(LABEL_COLOR);
- g.setFont(LABEL_FONT);
-
- int wrapWidth = 100;
- int textY = (int) graphicInfo.getY();
-
- // TODO: use drawMultilineText()
- AttributedString as = new AttributedString(text);
- as.addAttribute(TextAttribute.FOREGROUND, g.getPaint());
- as.addAttribute(TextAttribute.FONT, g.getFont());
- AttributedCharacterIterator aci = as.getIterator();
- FontRenderContext frc = new FontRenderContext(null, true, false);
- LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc);
-
- while (lbm.getPosition() < text.length()) {
- TextLayout tl = lbm.nextLayout(wrapWidth);
- textY += tl.getAscent();
-
- Rectangle2D bb = tl.getBounds();
- double tX = graphicInfo.getX();
-
- if (centered) {
- tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2);
- }
- tl.draw(g, (float) tX, textY);
- textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent();
- }
-
- // restore originals
- g.setFont(originalFont);
- g.setPaint(originalPaint);
- }
- }
-
- /**
- * 高亮显示task框完成的
- * @param x
- * @param y
- * @param width
- * @param height
- */
- @Override
- public void drawHighLight(int x, int y, int width, int height) {
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
-
- g.setPaint(HIGHLIGHT_COLOR);
- g.setStroke(THICK_TASK_BORDER_STROKE);
-
- RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20);
- g.draw(rect);
-
- g.setPaint(originalPaint);
- g.setStroke(originalStroke);
- }
-
- /**
- * 自定义task框当前的位置
- * @param x
- * @param y
- * @param width
- * @param height
- */
- public void drawHighLightNow(int x, int y, int width, int height) {
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
-
- g.setPaint(HIGHLIGHT_COLOR1);
- g.setStroke(THICK_TASK_BORDER_STROKE);
-
- RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20);
- g.draw(rect);
-
- g.setPaint(originalPaint);
- g.setStroke(originalStroke);
- }
-
- /**
- * 自定义结束节点
- * @param x
- * @param y
- * @param width
- * @param height
- */
- public void drawHighLightEnd(int x, int y, int width, int height) {
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
-
- g.setPaint(HIGHLIGHT_COLOR);
- g.setStroke(THICK_TASK_BORDER_STROKE);
-
- RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20);
- g.draw(rect);
-
- g.setPaint(originalPaint);
- g.setStroke(originalStroke);
- }
-
- /**
- * task框自定义文字
- * @param name
- * @param graphicInfo
- * @param thickBorder
- * @param scaleFactor
- */
- @Override
- protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder, double scaleFactor) {
-
- Paint originalPaint = g.getPaint();
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
-
- // Create a new gradient paint for every task box, gradient depends on x and y and is not relative
- g.setPaint(TASK_BOX_COLOR);
-
- int arcR = 6;
- if (thickBorder) {
- arcR = 3;
- }
-
- // shape
- RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR);
- g.fill(rect);
- g.setPaint(TASK_BORDER_COLOR);
-
- if (thickBorder) {
- Stroke originalStroke = g.getStroke();
- g.setStroke(THICK_TASK_BORDER_STROKE);
- g.draw(rect);
- g.setStroke(originalStroke);
- } else {
- g.draw(rect);
- }
-
- g.setPaint(originalPaint);
- // text
- if (scaleFactor == 1.0 && name != null && name.length() > 0) {
- int boxWidth = width - (2 * TEXT_PADDING);
- int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2;
- int boxX = x + width / 2 - boxWidth / 2;
- int boxY = y + height / 2 - boxHeight / 2 + ICON_PADDING + ICON_PADDING - 2 - 2;
-
- drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight);
- }
- }
-
- protected static Color EVENT_COLOR = new Color(255, 255, 255);
-
- /**
- * 重写开始事件
- * @param graphicInfo
- * @param image
- * @param scaleFactor
- */
- @Override
- public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) {
- Paint originalPaint = g.getPaint();
- g.setPaint(EVENT_COLOR);
- Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(),
- graphicInfo.getWidth(), graphicInfo.getHeight());
- g.fill(circle);
- g.setPaint(EVENT_BORDER_COLOR);
- g.draw(circle);
- g.setPaint(originalPaint);
- if (image != null) {
- // calculate coordinates to center image
- int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / (2 * scaleFactor)));
- int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / (2 * scaleFactor)));
- g.drawImage(image, imageX, imageY,
- (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null);
- }
-
- }
-
- /**
- * 重写结束事件
- * @param graphicInfo
- * @param scaleFactor
- */
- @Override
- public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) {
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
- g.setPaint(EVENT_COLOR);
- Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(),
- graphicInfo.getWidth(), graphicInfo.getHeight());
- g.fill(circle);
- g.setPaint(EVENT_BORDER_COLOR);
-// g.setPaint(HIGHLIGHT_COLOR);
- if (scaleFactor == 1.0) {
- g.setStroke(END_EVENT_STROKE);
- } else {
- g.setStroke(new BasicStroke(2.0f));
- }
- g.draw(circle);
- g.setStroke(originalStroke);
- g.setPaint(originalPaint);
- }
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/CustomProcessDiagramGenerator.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/CustomProcessDiagramGenerator.java
deleted file mode 100644
index d3fa369..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/CustomProcessDiagramGenerator.java
+++ /dev/null
@@ -1,404 +0,0 @@
-package com.yanzhu.flowable.flow;
-
-
-import org.flowable.bpmn.model.Process;
-import org.flowable.bpmn.model.*;
-import org.flowable.image.impl.DefaultProcessDiagramCanvas;
-import org.flowable.image.impl.DefaultProcessDiagramGenerator;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * @author Tony
- * @date 2021/4/5 0:31
- */
-public class CustomProcessDiagramGenerator extends DefaultProcessDiagramGenerator {
- @Override
- protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) {
- this.prepareBpmnModel(bpmnModel);
- DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader);
- Iterator var13 = bpmnModel.getPools().iterator();
-
- while (var13.hasNext()) {
- Pool process = (Pool) var13.next();
- GraphicInfo subProcesses = bpmnModel.getGraphicInfo(process.getId());
- processDiagramCanvas.drawPoolOrLane(process.getName(), subProcesses, scaleFactor);
- }
-
- var13 = bpmnModel.getProcesses().iterator();
-
- Process process1;
- Iterator subProcesses1;
- while (var13.hasNext()) {
- process1 = (Process) var13.next();
- subProcesses1 = process1.getLanes().iterator();
-
- while (subProcesses1.hasNext()) {
- Lane artifact = (Lane) subProcesses1.next();
- GraphicInfo subProcess = bpmnModel.getGraphicInfo(artifact.getId());
- processDiagramCanvas.drawPoolOrLane(artifact.getName(), subProcess, scaleFactor);
- }
- }
-
- var13 = bpmnModel.getProcesses().iterator();
-
- while (var13.hasNext()) {
- process1 = (Process) var13.next();
- subProcesses1 = process1.findFlowElementsOfType(FlowNode.class).iterator();
-
- while (subProcesses1.hasNext()) {
- FlowNode artifact1 = (FlowNode) subProcesses1.next();
- if (!this.isPartOfCollapsedSubProcess(artifact1, bpmnModel)) {
- this.drawActivity(processDiagramCanvas, bpmnModel, artifact1, highLightedActivities, highLightedFlows, scaleFactor, Boolean.valueOf(drawSequenceFlowNameWithNoLabelDI));
- }
- }
- }
-
- var13 = bpmnModel.getProcesses().iterator();
-
- label75:
- while (true) {
- List subProcesses2;
- do {
- if (!var13.hasNext()) {
- return processDiagramCanvas;
- }
-
- process1 = (Process) var13.next();
- subProcesses1 = process1.getArtifacts().iterator();
-
- while (subProcesses1.hasNext()) {
- Artifact artifact2 = (Artifact) subProcesses1.next();
- this.drawArtifact(processDiagramCanvas, bpmnModel, artifact2);
- }
-
- subProcesses2 = process1.findFlowElementsOfType(SubProcess.class, true);
- } while (subProcesses2 == null);
-
- Iterator artifact3 = subProcesses2.iterator();
-
- while (true) {
- GraphicInfo graphicInfo;
- SubProcess subProcess1;
- do {
- do {
- if (!artifact3.hasNext()) {
- continue label75;
- }
-
- subProcess1 = (SubProcess) artifact3.next();
- graphicInfo = bpmnModel.getGraphicInfo(subProcess1.getId());
- } while (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded().booleanValue());
- } while (this.isPartOfCollapsedSubProcess(subProcess1, bpmnModel));
-
- Iterator var19 = subProcess1.getArtifacts().iterator();
-
- while (var19.hasNext()) {
- Artifact subProcessArtifact = (Artifact) var19.next();
- this.drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact);
- }
- }
- }
- }
-
- protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) {
- double minX = 1.7976931348623157E308D;
- double maxX = 0.0D;
- double minY = 1.7976931348623157E308D;
- double maxY = 0.0D;
-
- GraphicInfo nrOfLanes;
- for (Iterator flowNodes = bpmnModel.getPools().iterator(); flowNodes.hasNext(); maxY = nrOfLanes.getY() + nrOfLanes.getHeight()) {
- Pool artifacts = (Pool) flowNodes.next();
- nrOfLanes = bpmnModel.getGraphicInfo(artifacts.getId());
- minX = nrOfLanes.getX();
- maxX = nrOfLanes.getX() + nrOfLanes.getWidth();
- minY = nrOfLanes.getY();
- }
-
- List var23 = gatherAllFlowNodes(bpmnModel);
- Iterator var24 = var23.iterator();
-
- label155:
- while (var24.hasNext()) {
- FlowNode var26 = (FlowNode) var24.next();
- GraphicInfo artifact = bpmnModel.getGraphicInfo(var26.getId());
- if (artifact.getX() + artifact.getWidth() > maxX) {
- maxX = artifact.getX() + artifact.getWidth();
- }
-
- if (artifact.getX() < minX) {
- minX = artifact.getX();
- }
-
- if (artifact.getY() + artifact.getHeight() > maxY) {
- maxY = artifact.getY() + artifact.getHeight();
- }
-
- if (artifact.getY() < minY) {
- minY = artifact.getY();
- }
-
- Iterator process = var26.getOutgoingFlows().iterator();
-
- while (true) {
- List l;
- do {
- if (!process.hasNext()) {
- continue label155;
- }
-
- SequenceFlow graphicInfoList = (SequenceFlow) process.next();
- l = bpmnModel.getFlowLocationGraphicInfo(graphicInfoList.getId());
- } while (l == null);
-
- Iterator graphicInfo = l.iterator();
-
- while (graphicInfo.hasNext()) {
- GraphicInfo graphicInfo1 = (GraphicInfo) graphicInfo.next();
- if (graphicInfo1.getX() > maxX) {
- maxX = graphicInfo1.getX();
- }
-
- if (graphicInfo1.getX() < minX) {
- minX = graphicInfo1.getX();
- }
-
- if (graphicInfo1.getY() > maxY) {
- maxY = graphicInfo1.getY();
- }
-
- if (graphicInfo1.getY() < minY) {
- minY = graphicInfo1.getY();
- }
- }
- }
- }
-
- List var25 = gatherAllArtifacts(bpmnModel);
- Iterator var27 = var25.iterator();
-
- GraphicInfo var37;
- while (var27.hasNext()) {
- Artifact var29 = (Artifact) var27.next();
- GraphicInfo var31 = bpmnModel.getGraphicInfo(var29.getId());
- if (var31 != null) {
- if (var31.getX() + var31.getWidth() > maxX) {
- maxX = var31.getX() + var31.getWidth();
- }
-
- if (var31.getX() < minX) {
- minX = var31.getX();
- }
-
- if (var31.getY() + var31.getHeight() > maxY) {
- maxY = var31.getY() + var31.getHeight();
- }
-
- if (var31.getY() < minY) {
- minY = var31.getY();
- }
- }
-
- List var33 = bpmnModel.getFlowLocationGraphicInfo(var29.getId());
- if (var33 != null) {
- Iterator var35 = var33.iterator();
-
- while (var35.hasNext()) {
- var37 = (GraphicInfo) var35.next();
- if (var37.getX() > maxX) {
- maxX = var37.getX();
- }
-
- if (var37.getX() < minX) {
- minX = var37.getX();
- }
-
- if (var37.getY() > maxY) {
- maxY = var37.getY();
- }
-
- if (var37.getY() < minY) {
- minY = var37.getY();
- }
- }
- }
- }
-
- int var28 = 0;
- Iterator var30 = bpmnModel.getProcesses().iterator();
-
- while (var30.hasNext()) {
- Process var32 = (Process) var30.next();
- Iterator var34 = var32.getLanes().iterator();
-
- while (var34.hasNext()) {
- Lane var36 = (Lane) var34.next();
- ++var28;
- var37 = bpmnModel.getGraphicInfo(var36.getId());
- if (var37.getX() + var37.getWidth() > maxX) {
- maxX = var37.getX() + var37.getWidth();
- }
-
- if (var37.getX() < minX) {
- minX = var37.getX();
- }
-
- if (var37.getY() + var37.getHeight() > maxY) {
- maxY = var37.getY() + var37.getHeight();
- }
-
- if (var37.getY() < minY) {
- minY = var37.getY();
- }
- }
- }
-
- if (var23.isEmpty() && bpmnModel.getPools().isEmpty() && var28 == 0) {
- minX = 0.0D;
- minY = 0.0D;
- }
-
- return new CustomProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader);
- }
-
-
- private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) {
- processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight());
-
- }
-
- private static void drawHighLightNow(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) {
- processDiagramCanvas.drawHighLightNow((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight());
-
- }
-
- private static void drawHighLightEnd(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) {
- processDiagramCanvas.drawHighLightEnd((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight());
-
- }
-
- @Override
- protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel,
- FlowNode flowNode, java.util.List highLightedActivities, java.util.List highLightedFlows, double scaleFactor, Boolean drawSequenceFlowNameWithNoLabelDI) {
-
- DefaultProcessDiagramGenerator.ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass());
- if (drawInstruction != null) {
-
- drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode);
-
- // Gather info on the multi instance marker
- boolean multiInstanceSequential = false;
- boolean multiInstanceParallel = false;
- boolean collapsed = false;
- if (flowNode instanceof Activity) {
- Activity activity = (Activity) flowNode;
- MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics();
- if (multiInstanceLoopCharacteristics != null) {
- multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential();
- multiInstanceParallel = !multiInstanceSequential;
- }
- }
-
- // Gather info on the collapsed marker
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- if (flowNode instanceof SubProcess) {
- collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded();
- } else if (flowNode instanceof CallActivity) {
- collapsed = true;
- }
-
- if (scaleFactor == 1.0) {
- // Actually draw the markers
- processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(),
- multiInstanceSequential, multiInstanceParallel, collapsed);
- }
-
- // Draw highlighted activities
- if (highLightedActivities.contains(flowNode.getId())) {
-
- if (highLightedActivities.get(highLightedActivities.size() - 1).equals(flowNode.getId())
- && !"endenv".equals(flowNode.getId())) {
- if ((flowNode.getId().contains("Event_"))) {
- drawHighLightEnd((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
- } else {
- drawHighLightNow((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
- }
- } else {
- drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
- }
-
-
- }
-
- }
-
- // Outgoing transitions of activity
- for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
- boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId()));
- String defaultFlow = null;
- if (flowNode instanceof Activity) {
- defaultFlow = ((Activity) flowNode).getDefaultFlow();
- } else if (flowNode instanceof Gateway) {
- defaultFlow = ((Gateway) flowNode).getDefaultFlow();
- }
-
- boolean isDefault = false;
- if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) {
- isDefault = true;
- }
- boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway);
-
- String sourceRef = sequenceFlow.getSourceRef();
- String targetRef = sequenceFlow.getTargetRef();
- FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef);
- FlowElement targetElement = bpmnModel.getFlowElement(targetRef);
- java.util.List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
- if (graphicInfoList != null && graphicInfoList.size() > 0) {
- graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList);
- int xPoints[] = new int[graphicInfoList.size()];
- int yPoints[] = new int[graphicInfoList.size()];
-
- for (int i = 1; i < graphicInfoList.size(); i++) {
- GraphicInfo graphicInfo = graphicInfoList.get(i);
- GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1);
-
- if (i == 1) {
- xPoints[0] = (int) previousGraphicInfo.getX();
- yPoints[0] = (int) previousGraphicInfo.getY();
- }
- xPoints[i] = (int) graphicInfo.getX();
- yPoints[i] = (int) graphicInfo.getY();
-
- }
-
- processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor);
-
-
- // Draw sequenceflow label
- GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId());
- if (labelGraphicInfo != null) {
- processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false);
- } else {
- if (drawSequenceFlowNameWithNoLabelDI) {
- GraphicInfo lineCenter = getLineCenter(graphicInfoList);
- processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false);
- }
-
- }
- }
- }
-
- // Nested elements
- if (flowNode instanceof FlowElementsContainer) {
- for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) {
- if (nestedFlowElement instanceof FlowNode && !isPartOfCollapsedSubProcess(nestedFlowElement, bpmnModel)) {
- drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement,
- highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI);
- }
- }
- }
- }
-}
-
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/FindNextNodeUtil.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/FindNextNodeUtil.java
deleted file mode 100644
index 89d06ba..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/FindNextNodeUtil.java
+++ /dev/null
@@ -1,257 +0,0 @@
-package com.yanzhu.flowable.flow;
-
-import com.googlecode.aviator.AviatorEvaluator;
-import com.googlecode.aviator.Expression;
-//import com.greenpineyu.fel.FelEngine;
-//import com.greenpineyu.fel.FelEngineImpl;
-//import com.greenpineyu.fel.context.FelContext;
-import org.flowable.bpmn.model.Process;
-import org.flowable.bpmn.model.*;
-import org.flowable.engine.RepositoryService;
-import org.flowable.engine.repository.ProcessDefinition;
-
-import java.util.*;
-
-/**
- * @author Tony
- * @date 2021/4/19 20:51
- */
-public class FindNextNodeUtil {
-
- /**
- * 获取下一步骤的用户任务
- *
- * @param repositoryService
- * @param map
- * @return
- */
- public static List getNextUserTasks(RepositoryService repositoryService, org.flowable.task.api.Task task, Map map) {
- List data = new ArrayList<>();
- ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult();
- BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
- Process mainProcess = bpmnModel.getMainProcess();
- Collection flowElements = mainProcess.getFlowElements();
- String key = task.getTaskDefinitionKey();
- FlowElement flowElement = bpmnModel.getFlowElement(key);
- next(flowElements, flowElement, map, data);
- return data;
- }
-
- /**
- * 启动流程时获取下一步骤的用户任务
- *
- * @param repositoryService
- * @param map
- * @return
- */
- public static List getNextUserTasksByStart(RepositoryService repositoryService, ProcessDefinition processDefinition, Map map) {
- List data = new ArrayList<>();
- BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
- Process mainProcess = bpmnModel.getMainProcess();
- Collection flowElements = mainProcess.getFlowElements();
- String key = null;
- // 找到开始节点 并获取唯一key
- for (FlowElement flowElement : flowElements) {
- if (flowElement instanceof StartEvent) {
- key = flowElement.getId();
- break;
- }
- }
- FlowElement flowElement = bpmnModel.getFlowElement(key);
- next(flowElements, flowElement, map, data);
- return data;
- }
-
-
-
- /**
- * 查找下一节点
- *
- * @param flowElements
- * @param flowElement
- * @param map
- * @param nextUser
- */
- public static void next(Collection flowElements, FlowElement flowElement, Map map, List nextUser) {
- //如果是结束节点
- if (flowElement instanceof EndEvent) {
- //如果是子任务的结束节点
- if (getSubProcess(flowElements, flowElement) != null) {
- flowElement = getSubProcess(flowElements, flowElement);
- }
- }
- //获取Task的出线信息--可以拥有多个
- List outGoingFlows = null;
- if (flowElement instanceof Task) {
- outGoingFlows = ((Task) flowElement).getOutgoingFlows();
- } else if (flowElement instanceof Gateway) {
- outGoingFlows = ((Gateway) flowElement).getOutgoingFlows();
- } else if (flowElement instanceof StartEvent) {
- outGoingFlows = ((StartEvent) flowElement).getOutgoingFlows();
- } else if (flowElement instanceof SubProcess) {
- outGoingFlows = ((SubProcess) flowElement).getOutgoingFlows();
- } else if (flowElement instanceof CallActivity) {
- outGoingFlows = ((CallActivity) flowElement).getOutgoingFlows();
- }
- if (outGoingFlows != null && outGoingFlows.size() > 0) {
- //遍历所有的出线--找到可以正确执行的那一条
- for (SequenceFlow sequenceFlow : outGoingFlows) {
- //1.有表达式,且为true
- //2.无表达式
- String expression = sequenceFlow.getConditionExpression();
- if (expression == null ||
- expressionResult(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))) {
- //出线的下一节点
- String nextFlowElementID = sequenceFlow.getTargetRef();
- if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) {
- continue;
- }
-
- //查询下一节点的信息
- FlowElement nextFlowElement = getFlowElementById(nextFlowElementID, flowElements);
- //调用流程
- if (nextFlowElement instanceof CallActivity) {
- CallActivity ca = (CallActivity) nextFlowElement;
- if (ca.getLoopCharacteristics() != null) {
- UserTask userTask = new UserTask();
- userTask.setId(ca.getId());
-
- userTask.setId(ca.getId());
- userTask.setLoopCharacteristics(ca.getLoopCharacteristics());
- userTask.setName(ca.getName());
- nextUser.add(userTask);
- }
- next(flowElements, nextFlowElement, map, nextUser);
- }
- //用户任务
- if (nextFlowElement instanceof UserTask) {
- nextUser.add((UserTask) nextFlowElement);
- }
- //排他网关
- else if (nextFlowElement instanceof ExclusiveGateway) {
- next(flowElements, nextFlowElement, map, nextUser);
- }
- //并行网关
- else if (nextFlowElement instanceof ParallelGateway) {
- next(flowElements, nextFlowElement, map, nextUser);
- }
- //接收任务
- else if (nextFlowElement instanceof ReceiveTask) {
- next(flowElements, nextFlowElement, map, nextUser);
- }
- //服务任务
- else if (nextFlowElement instanceof ServiceTask) {
- next(flowElements, nextFlowElement, map, nextUser);
- }
- //子任务的起点
- else if (nextFlowElement instanceof StartEvent) {
- next(flowElements, nextFlowElement, map, nextUser);
- }
- //结束节点
- else if (nextFlowElement instanceof EndEvent) {
- next(flowElements, nextFlowElement, map, nextUser);
- }
- }
- }
- }
- }
-
- /**
- * 判断是否是多实例子流程并且需要设置集合类型变量
- */
- public static boolean checkSubProcess(String Id, Collection flowElements, List nextUser) {
- for (FlowElement flowElement1 : flowElements) {
- if (flowElement1 instanceof SubProcess && flowElement1.getId().equals(Id)) {
-
- SubProcess sp = (SubProcess) flowElement1;
- if (sp.getLoopCharacteristics() != null) {
- String inputDataItem = sp.getLoopCharacteristics().getInputDataItem();
- UserTask userTask = new UserTask();
- userTask.setId(sp.getId());
- userTask.setLoopCharacteristics(sp.getLoopCharacteristics());
- userTask.setName(sp.getName());
- nextUser.add(userTask);
- return true;
- }
- }
- }
-
- return false;
-
- }
-
- /**
- * 查询一个节点的是否子任务中的节点,如果是,返回子任务
- *
- * @param flowElements 全流程的节点集合
- * @param flowElement 当前节点
- * @return
- */
- public static FlowElement getSubProcess(Collection flowElements, FlowElement flowElement) {
- for (FlowElement flowElement1 : flowElements) {
- if (flowElement1 instanceof SubProcess) {
- for (FlowElement flowElement2 : ((SubProcess) flowElement1).getFlowElements()) {
- if (flowElement.equals(flowElement2)) {
- return flowElement1;
- }
- }
- }
- }
- return null;
- }
-
-
- /**
- * 根据ID查询流程节点对象, 如果是子任务,则返回子任务的开始节点
- *
- * @param Id 节点ID
- * @param flowElements 流程节点集合
- * @return
- */
- public static FlowElement getFlowElementById(String Id, Collection flowElements) {
- for (FlowElement flowElement : flowElements) {
- if (flowElement.getId().equals(Id)) {
- //如果是子任务,则查询出子任务的开始节点
- if (flowElement instanceof SubProcess) {
- return getStartFlowElement(((SubProcess) flowElement).getFlowElements());
- }
- return flowElement;
- }
- if (flowElement instanceof SubProcess) {
- FlowElement flowElement1 = getFlowElementById(Id, ((SubProcess) flowElement).getFlowElements());
- if (flowElement1 != null) {
- return flowElement1;
- }
- }
- }
- return null;
- }
-
- /**
- * 返回流程的开始节点
- *
- * @param flowElements 节点集合
- * @description:
- */
- public static FlowElement getStartFlowElement(Collection flowElements) {
- for (FlowElement flowElement : flowElements) {
- if (flowElement instanceof StartEvent) {
- return flowElement;
- }
- }
- return null;
- }
-
- /**
- * 校验el表达式
- *
- * @param map
- * @param expression
- * @return
- */
- public static boolean expressionResult(Map map, String expression) {
- Expression exp = AviatorEvaluator.compile(expression);
- final Object execute = exp.execute(map);
- return Boolean.parseBoolean(String.valueOf(execute));
- }
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/FlowableUtils.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/FlowableUtils.java
deleted file mode 100644
index 530cf03..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/FlowableUtils.java
+++ /dev/null
@@ -1,589 +0,0 @@
-package com.yanzhu.flowable.flow;
-
-import lombok.extern.slf4j.Slf4j;
-import org.flowable.bpmn.model.*;
-import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
-import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
-import org.flowable.task.api.history.HistoricTaskInstance;
-
-import java.util.*;
-
-/**
- * @author Tony
- * @date 2021-04-03 23:57
- */
-@Slf4j
-public class FlowableUtils {
-
- /**
- * 根据节点,获取入口连线
- * @param source
- * @return
- */
- public static List getElementIncomingFlows(FlowElement source) {
- List sequenceFlows = null;
- if (source instanceof FlowNode) {
- sequenceFlows = ((FlowNode) source).getIncomingFlows();
- } else if (source instanceof Gateway) {
- sequenceFlows = ((Gateway) source).getIncomingFlows();
- } else if (source instanceof SubProcess) {
- sequenceFlows = ((SubProcess) source).getIncomingFlows();
- } else if (source instanceof StartEvent) {
- sequenceFlows = ((StartEvent) source).getIncomingFlows();
- } else if (source instanceof EndEvent) {
- sequenceFlows = ((EndEvent) source).getIncomingFlows();
- }
- return sequenceFlows;
- }
-
- /**
- * 根据节点,获取出口连线
- * @param source
- * @return
- */
- public static List getElementOutgoingFlows(FlowElement source) {
- List sequenceFlows = null;
- if (source instanceof FlowNode) {
- sequenceFlows = ((FlowNode) source).getOutgoingFlows();
- } else if (source instanceof Gateway) {
- sequenceFlows = ((Gateway) source).getOutgoingFlows();
- } else if (source instanceof SubProcess) {
- sequenceFlows = ((SubProcess) source).getOutgoingFlows();
- } else if (source instanceof StartEvent) {
- sequenceFlows = ((StartEvent) source).getOutgoingFlows();
- } else if (source instanceof EndEvent) {
- sequenceFlows = ((EndEvent) source).getOutgoingFlows();
- }
- return sequenceFlows;
- }
-
- /**
- * 获取全部节点列表,包含子流程节点
- * @param flowElements
- * @param allElements
- * @return
- */
- public static Collection getAllElements(Collection flowElements, Collection allElements) {
- allElements = allElements == null ? new ArrayList<>() : allElements;
-
- for (FlowElement flowElement : flowElements) {
- allElements.add(flowElement);
- if (flowElement instanceof SubProcess) {
- // 继续深入子流程,进一步获取子流程
- allElements = FlowableUtils.getAllElements(((SubProcess) flowElement).getFlowElements(), allElements);
- }
- }
- return allElements;
- }
-
- /**
- * 迭代获取父级任务节点列表,向前找
- * @param source 起始节点
- * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
- * @param userTaskList 已找到的用户任务节点
- * @return
- */
- public static List iteratorFindParentUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) {
- userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList;
- hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;
-
- // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代
- if (source instanceof StartEvent && source.getSubProcess() != null) {
- userTaskList = iteratorFindParentUserTasks(source.getSubProcess(), hasSequenceFlow, userTaskList);
- }
-
- // 根据类型,获取入口连线
- List sequenceFlows = getElementIncomingFlows(source);
-
- if (sequenceFlows != null) {
- // 循环找到目标元素
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- // 类型为用户节点,则新增父级节点
- if (sequenceFlow.getSourceFlowElement() instanceof UserTask) {
- userTaskList.add((UserTask) sequenceFlow.getSourceFlowElement());
- continue;
- }
- // 类型为子流程,则添加子流程开始节点出口处相连的节点
- if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) {
- // 获取子流程用户任务节点
- List childUserTaskList = findChildProcessUserTasks((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, null);
- // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续
- if (childUserTaskList != null && childUserTaskList.size() > 0) {
- userTaskList.addAll(childUserTaskList);
- continue;
- }
- }
- // 继续迭代
- userTaskList = iteratorFindParentUserTasks(sequenceFlow.getSourceFlowElement(), hasSequenceFlow, userTaskList);
- }
- }
- return userTaskList;
- }
-
- /**
- * 根据正在运行的任务节点,迭代获取子级任务节点列表,向后找
- * @param source 起始节点(退回节点)
- * @param runTaskKeyList 正在运行的任务 Key,用于校验任务节点是否是正在运行的节点
- * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
- * @param userTaskList 需要撤回的用户任务列表
- * @return
- */
- public static List iteratorFindChildUserTasks(FlowElement source, List runTaskKeyList, Set hasSequenceFlow, List userTaskList) {
- hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;
- userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList;
-
- // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代
- if (source instanceof EndEvent && source.getSubProcess() != null) {
- userTaskList = iteratorFindChildUserTasks(source.getSubProcess(), runTaskKeyList, hasSequenceFlow, userTaskList);
- }
-
- // 根据类型,获取出口连线
- List sequenceFlows = getElementOutgoingFlows(source);
-
- if (sequenceFlows != null) {
- // 循环找到目标元素
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加
- if (sequenceFlow.getTargetFlowElement() instanceof UserTask && runTaskKeyList.contains((sequenceFlow.getTargetFlowElement()).getId())) {
- userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement());
- continue;
- }
- // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取
- if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) {
- List childUserTaskList = iteratorFindChildUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), runTaskKeyList, hasSequenceFlow, null);
- // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续
- if (childUserTaskList != null && childUserTaskList.size() > 0) {
- userTaskList.addAll(childUserTaskList);
- continue;
- }
- }
- // 继续迭代
- userTaskList = iteratorFindChildUserTasks(sequenceFlow.getTargetFlowElement(), runTaskKeyList, hasSequenceFlow, userTaskList);
- }
- }
- return userTaskList;
- }
-
- /**
- * 迭代获取子流程用户任务节点
- * @param source 起始节点
- * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
- * @param userTaskList 需要撤回的用户任务列表
- * @return
- */
- public static List findChildProcessUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) {
- hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;
- userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList;
-
- // 根据类型,获取出口连线
- List sequenceFlows = getElementOutgoingFlows(source);
-
- if (sequenceFlows != null) {
- // 循环找到目标元素
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加
- if (sequenceFlow.getTargetFlowElement() instanceof UserTask) {
- userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement());
- continue;
- }
- // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取
- if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) {
- List childUserTaskList = findChildProcessUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, null);
- // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续
- if (childUserTaskList != null && childUserTaskList.size() > 0) {
- userTaskList.addAll(childUserTaskList);
- continue;
- }
- }
- // 继续迭代
- userTaskList = findChildProcessUserTasks(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, userTaskList);
- }
- }
- return userTaskList;
- }
-
- /**
- * 从后向前寻路,获取所有脏线路上的点
- * @param source 起始节点
- * @param passRoads 已经经过的点集合
- * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
- * @param targets 目标脏线路终点
- * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储
- * @return
- */
- public static Set iteratorFindDirtyRoads(FlowElement source, List passRoads, Set hasSequenceFlow, List targets, Set dirtyRoads) {
- passRoads = passRoads == null ? new ArrayList<>() : passRoads;
- dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads;
- hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;
-
- // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代
- if (source instanceof StartEvent && source.getSubProcess() != null) {
- dirtyRoads = iteratorFindDirtyRoads(source.getSubProcess(), passRoads, hasSequenceFlow, targets, dirtyRoads);
- }
-
- // 根据类型,获取入口连线
- List sequenceFlows = getElementIncomingFlows(source);
-
- if (sequenceFlows != null) {
- // 循环找到目标元素
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- // 新增经过的路线
- passRoads.add(sequenceFlow.getSourceFlowElement().getId());
- // 如果此点为目标点,确定经过的路线为脏线路,添加点到脏线路中,然后找下个连线
- if (targets.contains(sequenceFlow.getSourceFlowElement().getId())) {
- dirtyRoads.addAll(passRoads);
- continue;
- }
- // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代
- if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) {
- dirtyRoads = findChildProcessAllDirtyRoad((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, dirtyRoads);
- // 是否存在子流程上,true 是,false 否
- Boolean isInChildProcess = dirtyTargetInChildProcess((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, targets, null);
- if (isInChildProcess) {
- // 已在子流程上找到,该路线结束
- continue;
- }
- }
- // 继续迭代
- dirtyRoads = iteratorFindDirtyRoads(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, targets, dirtyRoads);
- }
- }
- return dirtyRoads;
- }
-
- /**
- * 迭代获取子流程脏路线
- * 说明,假如回退的点就是子流程,那么也肯定会回退到子流程最初的用户任务节点,因此子流程中的节点全是脏路线
- * @param source 起始节点
- * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
- * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储
- * @return
- */
- public static Set findChildProcessAllDirtyRoad(FlowElement source, Set hasSequenceFlow, Set dirtyRoads) {
- hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;
- dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads;
-
- // 根据类型,获取出口连线
- List sequenceFlows = getElementOutgoingFlows(source);
-
- if (sequenceFlows != null) {
- // 循环找到目标元素
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- // 添加脏路线
- dirtyRoads.add(sequenceFlow.getTargetFlowElement().getId());
- // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取
- if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) {
- dirtyRoads = findChildProcessAllDirtyRoad((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, dirtyRoads);
- }
- // 继续迭代
- dirtyRoads = findChildProcessAllDirtyRoad(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, dirtyRoads);
- }
- }
- return dirtyRoads;
- }
-
- /**
- * 判断脏路线结束节点是否在子流程上
- * @param source 起始节点
- * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
- * @param targets 判断脏路线节点是否存在子流程上,只要存在一个,说明脏路线只到子流程为止
- * @param inChildProcess 是否存在子流程上,true 是,false 否
- * @return
- */
- public static Boolean dirtyTargetInChildProcess(FlowElement source, Set hasSequenceFlow, List targets, Boolean inChildProcess) {
- hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;
- inChildProcess = inChildProcess != null && inChildProcess;
-
- // 根据类型,获取出口连线
- List sequenceFlows = getElementOutgoingFlows(source);
-
- if (sequenceFlows != null && !inChildProcess) {
- // 循环找到目标元素
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- // 如果发现目标点在子流程上存在,说明只到子流程为止
- if (targets.contains(sequenceFlow.getTargetFlowElement().getId())) {
- inChildProcess = true;
- break;
- }
- // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取
- if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) {
- inChildProcess = dirtyTargetInChildProcess((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, targets, inChildProcess);
- }
- // 继续迭代
- inChildProcess = dirtyTargetInChildProcess(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, targets, inChildProcess);
- }
- }
- return inChildProcess;
- }
-
- /**
- * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行
- * 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况
- * @param source 起始节点
- * @param isSequential 是否串行
- * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
- * @param targetKsy 目标节点
- * @return
- */
- public static Boolean iteratorCheckSequentialReferTarget(FlowElement source, String targetKsy, Set hasSequenceFlow, Boolean isSequential) {
- isSequential = isSequential == null || isSequential;
- hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;
-
- // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代
- if (source instanceof StartEvent && source.getSubProcess() != null) {
- isSequential = iteratorCheckSequentialReferTarget(source.getSubProcess(), targetKsy, hasSequenceFlow, isSequential);
- }
-
- // 根据类型,获取入口连线
- List sequenceFlows = getElementIncomingFlows(source);
-
- if (sequenceFlows != null) {
- // 循环找到目标元素
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- // 如果目标节点已被判断为并行,后面都不需要执行,直接返回
- if (!isSequential) {
- break;
- }
- // 这条线路存在目标节点,这条线路完成,进入下个线路
- if (targetKsy.equals(sequenceFlow.getSourceFlowElement().getId())) {
- continue;
- }
- if (sequenceFlow.getSourceFlowElement() instanceof StartEvent) {
- isSequential = false;
- break;
- }
- // 否则就继续迭代
- isSequential = iteratorCheckSequentialReferTarget(sequenceFlow.getSourceFlowElement(), targetKsy, hasSequenceFlow, isSequential);
- }
- }
- return isSequential;
- }
-
- /**
- * 从后向前寻路,获取到达节点的所有路线
- * 不存在直接回退到子流程,但是存在回退到父级流程的情况
- * @param source 起始节点
- * @param passRoads 已经经过的点集合
- * @param roads 路线
- * @return
- */
- public static List> findRoad(FlowElement source, List passRoads, Set hasSequenceFlow, List> roads) {
- passRoads = passRoads == null ? new ArrayList<>() : passRoads;
- roads = roads == null ? new ArrayList<>() : roads;
- hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;
-
- // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代
- if (source instanceof StartEvent && source.getSubProcess() != null) {
- roads = findRoad(source.getSubProcess(), passRoads, hasSequenceFlow, roads);
- }
-
- // 根据类型,获取入口连线
- List sequenceFlows = getElementIncomingFlows(source);
-
- if (sequenceFlows != null && sequenceFlows.size() != 0) {
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- // 添加经过路线
- if (sequenceFlow.getSourceFlowElement() instanceof UserTask) {
- passRoads.add((UserTask) sequenceFlow.getSourceFlowElement());
- }
- // 继续迭代
- roads = findRoad(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, roads);
- }
- } else {
- // 添加路线
- roads.add(passRoads);
- }
- return roads;
- }
-
- /**
- * 历史节点数据清洗,清洗掉又回滚导致的脏数据
- * @param allElements 全部节点信息
- * @param historicTaskInstanceList 历史任务实例信息,数据采用开始时间升序
- * @return
- */
- public static List historicTaskInstanceClean(Collection allElements, List historicTaskInstanceList) {
- // 会签节点收集
- List multiTask = new ArrayList<>();
- allElements.forEach(flowElement -> {
- if (flowElement instanceof UserTask) {
- // 如果该节点的行为为会签行为,说明该节点为会签节点
- if (((UserTask) flowElement).getBehavior() instanceof ParallelMultiInstanceBehavior || ((UserTask) flowElement).getBehavior() instanceof SequentialMultiInstanceBehavior) {
- multiTask.add(flowElement.getId());
- }
- }
- });
- // 循环放入栈,栈 LIFO:后进先出
- Stack stack = new Stack<>();
- historicTaskInstanceList.forEach(stack::push);
- // 清洗后的历史任务实例
- List lastHistoricTaskInstanceList = new ArrayList<>();
- // 网关存在可能只走了部分分支情况,且还存在跳转废弃数据以及其他分支数据的干扰,因此需要对历史节点数据进行清洗
- // 临时用户任务 key
- StringBuilder userTaskKey = null;
- // 临时被删掉的任务 key,存在并行情况
- List deleteKeyList = new ArrayList<>();
- // 临时脏数据线路
- List> dirtyDataLineList = new ArrayList<>();
- // 由某个点跳到会签点,此时出现多个会签实例对应 1 个跳转情况,需要把这些连续脏数据都找到
- // 会签特殊处理下标
- int multiIndex = -1;
- // 会签特殊处理 key
- StringBuilder multiKey = null;
- // 会签特殊处理操作标识
- boolean multiOpera = false;
- while (!stack.empty()) {
- // 从这里开始 userTaskKey 都还是上个栈的 key
- // 是否是脏数据线路上的点
- final boolean[] isDirtyData = {false};
- for (Set oldDirtyDataLine : dirtyDataLineList) {
- if (oldDirtyDataLine.contains(stack.peek().getTaskDefinitionKey())) {
- isDirtyData[0] = true;
- }
- }
- // 删除原因不为空,说明从这条数据开始回跳或者回退的
- // MI_END:会签完成后,其他未签到节点的删除原因,不在处理范围内
- if (stack.peek().getDeleteReason() != null && !"MI_END".equals(stack.peek().getDeleteReason())) {
- // 可以理解为脏线路起点
- String dirtyPoint = "";
- if (stack.peek().getDeleteReason().contains("Change activity to ")) {
- dirtyPoint = stack.peek().getDeleteReason().replace("Change activity to ", "");
- }
- // 会签回退删除原因有点不同
- if (stack.peek().getDeleteReason().contains("Change parent activity to ")) {
- dirtyPoint = stack.peek().getDeleteReason().replace("Change parent activity to ", "");
- }
- FlowElement dirtyTask = null;
- // 获取变更节点的对应的入口处连线
- // 如果是网关并行回退情况,会变成两条脏数据路线,效果一样
- for (FlowElement flowElement : allElements) {
- if (flowElement.getId().equals(stack.peek().getTaskDefinitionKey())) {
- dirtyTask = flowElement;
- }
- }
- // 获取脏数据线路
- Set dirtyDataLine = FlowableUtils.iteratorFindDirtyRoads(dirtyTask, null, null, Arrays.asList(dirtyPoint.split(",")), null);
- // 自己本身也是脏线路上的点,加进去
- dirtyDataLine.add(stack.peek().getTaskDefinitionKey());
- log.info(stack.peek().getTaskDefinitionKey() + "点脏路线集合:" + dirtyDataLine);
- // 是全新的需要添加的脏线路
- boolean isNewDirtyData = true;
- for (int i = 0; i < dirtyDataLineList.size(); i++) {
- // 如果发现他的上个节点在脏线路内,说明这个点可能是并行的节点,或者连续驳回
- // 这时,都以之前的脏线路节点为标准,只需合并脏线路即可,也就是路线补全
- if (dirtyDataLineList.get(i).contains(userTaskKey.toString())) {
- isNewDirtyData = false;
- dirtyDataLineList.get(i).addAll(dirtyDataLine);
- }
- }
- // 已确定时全新的脏线路
- if (isNewDirtyData) {
- // deleteKey 单一路线驳回到并行,这种同时生成多个新实例记录情况,这时 deleteKey 其实是由多个值组成
- // 按照逻辑,回退后立刻生成的实例记录就是回退的记录
- // 至于驳回所生成的 Key,直接从删除原因中获取,因为存在驳回到并行的情况
- deleteKeyList.add(dirtyPoint + ",");
- dirtyDataLineList.add(dirtyDataLine);
- }
- // 添加后,现在这个点变成脏线路上的点了
- isDirtyData[0] = true;
- }
- // 如果不是脏线路上的点,说明是有效数据,添加历史实例 Key
- if (!isDirtyData[0]) {
- lastHistoricTaskInstanceList.add(stack.peek().getTaskDefinitionKey());
- }
- // 校验脏线路是否结束
- for (int i = 0; i < deleteKeyList.size(); i ++) {
- // 如果发现脏数据属于会签,记录下下标与对应 Key,以备后续比对,会签脏数据范畴开始
- if (multiKey == null && multiTask.contains(stack.peek().getTaskDefinitionKey())
- && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) {
- multiIndex = i;
- multiKey = new StringBuilder(stack.peek().getTaskDefinitionKey());
- }
- // 会签脏数据处理,节点退回会签清空
- // 如果在会签脏数据范畴中发现 Key改变,说明会签脏数据在上个节点就结束了,可以把会签脏数据删掉
- if (multiKey != null && !multiKey.toString().equals(stack.peek().getTaskDefinitionKey())) {
- deleteKeyList.set(multiIndex , deleteKeyList.get(multiIndex).replace(stack.peek().getTaskDefinitionKey() + ",", ""));
- multiKey = null;
- // 结束进行下校验删除
- multiOpera = true;
- }
- // 其他脏数据处理
- // 发现该路线最后一条脏数据,说明这条脏数据线路处理完了,删除脏数据信息
- // 脏数据产生的新实例中是否包含这条数据
- if (multiKey == null && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) {
- // 删除匹配到的部分
- deleteKeyList.set(i , deleteKeyList.get(i).replace(stack.peek().getTaskDefinitionKey() + ",", ""));
- }
- // 如果每组中的元素都以匹配过,说明脏数据结束
- if ("".equals(deleteKeyList.get(i))) {
- // 同时删除脏数据
- deleteKeyList.remove(i);
- dirtyDataLineList.remove(i);
- break;
- }
- }
- // 会签数据处理需要在循环外处理,否则可能导致溢出
- // 会签的数据肯定是之前放进去的所以理论上不会溢出,但还是校验下
- if (multiOpera && deleteKeyList.size() > multiIndex && "".equals(deleteKeyList.get(multiIndex))) {
- // 同时删除脏数据
- deleteKeyList.remove(multiIndex);
- dirtyDataLineList.remove(multiIndex);
- multiIndex = -1;
- multiOpera = false;
- }
- // pop() 方法与 peek() 方法不同,在返回值的同时,会把值从栈中移除
- // 保存新的 userTaskKey 在下个循环中使用
- userTaskKey = new StringBuilder(stack.pop().getTaskDefinitionKey());
- }
- log.info("清洗后的历史节点数据:" + lastHistoricTaskInstanceList);
- return lastHistoricTaskInstanceList;
- }
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/ModelUtils.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/ModelUtils.java
deleted file mode 100644
index b302b44..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/ModelUtils.java
+++ /dev/null
@@ -1,372 +0,0 @@
-package com.yanzhu.flowable.flow;
-
-import com.yanzhu.common.utils.StringUtils;
-import org.flowable.bpmn.converter.BpmnXMLConverter;
-import org.flowable.bpmn.model.Process;
-import org.flowable.bpmn.model.*;
-import org.flowable.common.engine.impl.util.io.StringStreamSource;
-
-import java.util.*;
-
-/**
- * @author KonBAI
- * @createTime 2022/3/26 19:04
- */
-public class ModelUtils {
-
- private static final BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
-
- /**
- * xml转bpmnModel对象
- *
- * @param xml xml
- * @return bpmnModel对象
- */
- public static BpmnModel getBpmnModel(String xml) {
- return bpmnXMLConverter.convertToBpmnModel(new StringStreamSource(xml), false, false);
- }
-
- /**
- * bpmnModel转xml字符串
- *
- * @deprecated 存在会丢失 bpmn 连线问题
- * @param bpmnModel bpmnModel对象
- * @return xml字符串
- */
- @Deprecated
- public static String getBpmnXmlStr(BpmnModel bpmnModel) {
- return StringUtils.utf8Str(getBpmnXml(bpmnModel));
- }
-
- /**
- * bpmnModel转xml对象
- *
- * @deprecated 存在丢失 bpmn 连线问题
- * @param bpmnModel bpmnModel对象
- * @return xml
- */
- @Deprecated
- public static byte[] getBpmnXml(BpmnModel bpmnModel) {
- return bpmnXMLConverter.convertToXML(bpmnModel);
- }
-
- /**
- * 根据节点,获取入口连线
- *
- * @param source 起始节点
- * @return 入口连线列表
- */
- public static List getElementIncomingFlows(FlowElement source) {
- List sequenceFlows = new ArrayList<>();
- if (source instanceof FlowNode) {
- sequenceFlows = ((FlowNode) source).getIncomingFlows();
- }
- return sequenceFlows;
- }
-
-
- /**
- * 根据节点,获取出口连线
- *
- * @param source 起始节点
- * @return 出口连线列表
- */
- public static List getElementOutgoingFlows(FlowElement source) {
- List sequenceFlows = new ArrayList<>();
- if (source instanceof FlowNode) {
- sequenceFlows = ((FlowNode) source).getOutgoingFlows();
- }
- return sequenceFlows;
- }
-
- /**
- * 获取开始节点
- *
- * @param model bpmnModel对象
- * @return 开始节点(未找到开始节点,返回null)
- */
- public static StartEvent getStartEvent(BpmnModel model) {
- Process process = model.getMainProcess();
- FlowElement startElement = process.getInitialFlowElement();
- if (startElement instanceof StartEvent) {
- return (StartEvent) startElement;
- }
- return getStartEvent(process.getFlowElements());
- }
-
- /**
- * 获取开始节点
- *
- * @param flowElements 流程元素集合
- * @return 开始节点(未找到开始节点,返回null)
- */
- public static StartEvent getStartEvent(Collection flowElements) {
- for (FlowElement flowElement : flowElements) {
- if (flowElement instanceof StartEvent) {
- return (StartEvent) flowElement;
- }
- }
- return null;
- }
-
- /**
- * 获取结束节点
- *
- * @param model bpmnModel对象
- * @return 结束节点(未找到开始节点,返回null)
- */
- public static EndEvent getEndEvent(BpmnModel model) {
- Process process = model.getMainProcess();
- return getEndEvent(process.getFlowElements());
- }
-
- /**
- * 获取结束节点
- *
- * @param flowElements 流程元素集合
- * @return 结束节点(未找到开始节点,返回null)
- */
- public static EndEvent getEndEvent(Collection flowElements) {
- for (FlowElement flowElement : flowElements) {
- if (flowElement instanceof EndEvent) {
- return (EndEvent) flowElement;
- }
- }
- return null;
- }
-
- public static UserTask getUserTaskByKey(BpmnModel model, String taskKey) {
- Process process = model.getMainProcess();
- FlowElement flowElement = process.getFlowElement(taskKey);
- if (flowElement instanceof UserTask) {
- return (UserTask) flowElement;
- }
- return null;
- }
-
- /**
- * 获取流程元素信息
- *
- * @param model bpmnModel对象
- * @param flowElementId 元素ID
- * @return 元素信息
- */
- public static FlowElement getFlowElementById(BpmnModel model, String flowElementId) {
- Process process = model.getMainProcess();
- return process.getFlowElement(flowElementId);
- }
-
- /**
- * 获取元素表单Key(限开始节点和用户节点可用)
- *
- * @param flowElement 元素
- * @return 表单Key
- */
- public static String getFormKey(FlowElement flowElement) {
- if (flowElement != null) {
- if (flowElement instanceof StartEvent) {
- return ((StartEvent) flowElement).getFormKey();
- } else if (flowElement instanceof UserTask) {
- return ((UserTask) flowElement).getFormKey();
- }
- }
- return null;
- }
-
- /**
- * 获取开始节点属性值
- * @param model bpmnModel对象
- * @param name 属性名
- * @return 属性值
- */
- public static String getStartEventAttributeValue(BpmnModel model, String name) {
- StartEvent startEvent = getStartEvent(model);
- return getElementAttributeValue(startEvent, name);
- }
-
- /**
- * 获取结束节点属性值
- * @param model bpmnModel对象
- * @param name 属性名
- * @return 属性值
- */
- public static String getEndEventAttributeValue(BpmnModel model, String name) {
- EndEvent endEvent = getEndEvent(model);
- return getElementAttributeValue(endEvent, name);
- }
-
- /**
- * 获取用户任务节点属性值
- * @param model bpmnModel对象
- * @param taskKey 任务Key
- * @param name 属性名
- * @return 属性值
- */
- public static String getUserTaskAttributeValue(BpmnModel model, String taskKey, String name) {
- UserTask userTask = getUserTaskByKey(model, taskKey);
- return getElementAttributeValue(userTask, name);
- }
-
- /**
- * 获取元素属性值
- * @param baseElement 流程元素
- * @param name 属性名
- * @return 属性值
- */
- public static String getElementAttributeValue(BaseElement baseElement, String name) {
- if (baseElement != null) {
- List attributes = baseElement.getAttributes().get(name);
- if (attributes != null && !attributes.isEmpty()) {
- attributes.iterator().next().getValue();
- Iterator attrIterator = attributes.iterator();
- if(attrIterator.hasNext()) {
- ExtensionAttribute attribute = attrIterator.next();
- return attribute.getValue();
- }
- }
- }
- return null;
- }
-
- public static boolean isMultiInstance(BpmnModel model, String taskKey) {
- UserTask userTask = getUserTaskByKey(model, taskKey);
- if (!Objects.isNull(userTask)) {
- return userTask.hasMultiInstanceLoopCharacteristics();
- }
- return false;
- }
-
- /**
- * 获取所有用户任务节点
- *
- * @param model bpmnModel对象
- * @return 用户任务节点列表
- */
- public static Collection getAllUserTaskEvent(BpmnModel model) {
- Process process = model.getMainProcess();
- Collection flowElements = process.getFlowElements();
- return getAllUserTaskEvent(flowElements, null);
- }
-
- /**
- * 获取所有用户任务节点
- * @param flowElements 流程元素集合
- * @param allElements 所有流程元素集合
- * @return 用户任务节点列表
- */
- public static Collection getAllUserTaskEvent(Collection flowElements, Collection allElements) {
- allElements = allElements == null ? new ArrayList<>() : allElements;
- for (FlowElement flowElement : flowElements) {
- if (flowElement instanceof UserTask) {
- allElements.add((UserTask) flowElement);
- }
- if (flowElement instanceof SubProcess) {
- // 继续深入子流程,进一步获取子流程
- allElements = getAllUserTaskEvent(((SubProcess) flowElement).getFlowElements(), allElements);
- }
- }
- return allElements;
- }
-
- /**
- * 查找起始节点下一个用户任务列表列表
- * @param source 起始节点
- * @return 结果
- */
- public static List findNextUserTasks(FlowElement source) {
- return findNextUserTasks(source, null, null);
- }
-
- /**
- * 查找起始节点下一个用户任务列表列表
- * @param source 起始节点
- * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
- * @param userTaskList 用户任务列表
- * @return 结果
- */
- public static List findNextUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) {
- hasSequenceFlow = Optional.ofNullable(hasSequenceFlow).orElse(new HashSet<>());
- userTaskList = Optional.ofNullable(userTaskList).orElse(new ArrayList<>());
- // 获取出口连线
- List sequenceFlows = getElementOutgoingFlows(source);
- if (!sequenceFlows.isEmpty()) {
- for (SequenceFlow sequenceFlow : sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (hasSequenceFlow.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- hasSequenceFlow.add(sequenceFlow.getId());
- FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement();
- if (targetFlowElement instanceof UserTask) {
- // 若节点为用户任务,加入到结果列表中
- userTaskList.add((UserTask) targetFlowElement);
- } else {
- // 若节点非用户任务,继续递归查找下一个节点
- findNextUserTasks(targetFlowElement, hasSequenceFlow, userTaskList);
- }
- }
- }
- return userTaskList;
- }
-
- /**
- * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行
- * 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况
- * @param source 起始节点
- * @param target 目标节点
- * @param visitedElements 已经经过的连线的 ID,用于判断线路是否重复
- * @return 结果
- */
- public static boolean isSequentialReachable(FlowElement source, FlowElement target, Set visitedElements) {
- visitedElements = visitedElements == null ? new HashSet<>() : visitedElements;
- if (source instanceof StartEvent && isInEventSubprocess(source)) {
- return false;
- }
-
- // 根据类型,获取入口连线
- List sequenceFlows = getElementIncomingFlows(source);
- if (sequenceFlows != null && sequenceFlows.size() > 0) {
- // 循环找到目标元素
- for (SequenceFlow sequenceFlow: sequenceFlows) {
- // 如果发现连线重复,说明循环了,跳过这个循环
- if (visitedElements.contains(sequenceFlow.getId())) {
- continue;
- }
- // 添加已经走过的连线
- visitedElements.add(sequenceFlow.getId());
- FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement();
- // 这条线路存在目标节点,这条线路完成,进入下个线路
- if (target.getId().equals(sourceFlowElement.getId())) {
- continue;
- }
- // 如果目标节点为并行网关,则不继续
- if (sourceFlowElement instanceof ParallelGateway) {
- return false;
- }
- // 否则就继续迭代
- boolean isSequential = isSequentialReachable(sourceFlowElement, target, visitedElements);
- if (!isSequential) {
- return false;
- }
- }
- }
- return true;
- }
-
- protected static boolean isInEventSubprocess(FlowElement flowElement) {
- FlowElementsContainer flowElementsContainer = flowElement.getParentContainer();
- while (flowElementsContainer != null) {
- if (flowElementsContainer instanceof EventSubProcess) {
- return true;
- }
-
- if (flowElementsContainer instanceof FlowElement) {
- flowElementsContainer = ((FlowElement) flowElementsContainer).getParentContainer();
- } else {
- flowElementsContainer = null;
- }
- }
- return false;
- }
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowExecutionListener.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowExecutionListener.java
deleted file mode 100644
index c4c6141..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowExecutionListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.yanzhu.flowable.listener;
-
-import lombok.extern.slf4j.Slf4j;
-import org.flowable.common.engine.api.delegate.Expression;
-import org.flowable.engine.delegate.DelegateExecution;
-import org.flowable.engine.delegate.ExecutionListener;
-import org.springframework.stereotype.Component;
-
-/**
- * 执行监听器
- *
- * 执行监听器允许在执行过程中执行Java代码。
- * 执行监听器可以捕获事件的类型:
- * 流程实例启动,结束
- * 输出流捕获
- * 获取启动,结束
- * 路由开始,结束
- * 中间事件开始,结束
- * 触发开始事件,触发结束事件
- *
- * @author Tony
- * @date 2022/12/16
- */
-@Slf4j
-@Component
-public class FlowExecutionListener implements ExecutionListener {
- /**
- * 流程设计器添加的参数
- */
- private Expression param;
-
- @Override
- public void notify(DelegateExecution execution) {
- log.info("执行监听器:{}", execution);
- }
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowTaskEndListener.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowTaskEndListener.java
deleted file mode 100644
index 40a721e..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowTaskEndListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.yanzhu.flowable.listener;
-
-import lombok.extern.slf4j.Slf4j;
-import org.flowable.engine.delegate.DelegateExecution;
-import org.flowable.engine.delegate.ExecutionListener;
-import org.flowable.engine.delegate.TaskListener;
-import org.flowable.task.service.delegate.DelegateTask;
-import org.springframework.stereotype.Component;
-
-/**
- * 任务监听器
- *
- * create(创建):在任务被创建且所有的任务属性设置完成后才触发
- * assignment(指派):在任务被分配给某个办理人之后触发
- * complete(完成):在配置了监听器的上一个任务完成时触发
- * delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发
- *
- * @author Tony
- * @date 2021/4/20
- */
-@Slf4j
-@Component
-public class FlowTaskEndListener implements ExecutionListener {
-
- @Override
- public void notify(DelegateExecution delegateExecution) {
- log.info("任务结束监听器:{}", delegateExecution);
- }
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowTaskListener.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowTaskListener.java
deleted file mode 100644
index 1c74ba9..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/listener/FlowTaskListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.yanzhu.flowable.listener;
-
-import lombok.extern.slf4j.Slf4j;
-import org.flowable.engine.delegate.TaskListener;
-import org.flowable.task.service.delegate.DelegateTask;
-import org.springframework.stereotype.Component;
-
-/**
- * 任务监听器
- *
- * create(创建):在任务被创建且所有的任务属性设置完成后才触发
- * assignment(指派):在任务被分配给某个办理人之后触发
- * complete(完成):在配置了监听器的上一个任务完成时触发
- * delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发
- *
- * @author Tony
- * @date 2021/4/20
- */
-@Slf4j
-@Component
-public class FlowTaskListener implements TaskListener{
-
- @Override
- public void notify(DelegateTask delegateTask) {
- log.info("任务监听器:{}", delegateTask);
- // TODO 获取事件类型 delegateTask.getEventName(),可以通过监听器给任务执行人发送相应的通知消息
- }
-
-}
diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/service/IFlowBusinessKeyService.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/service/IFlowBusinessKeyService.java
deleted file mode 100644
index 11f7385..0000000
--- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/service/IFlowBusinessKeyService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.yanzhu.flowable.service;
-
-import com.yanzhu.system.domain.flowable.FlowTaskEntity;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author JiangYuQi
- * @date 2021-04-03 14:41
- */
-public interface IFlowBusinessKeyService {
-
- /**
- * 根据条件查询所有流任务
- * @param flowTaskEntity
- * @return
- */
- public List selectAllFlowTaskByParams(FlowTaskEntity flowTaskEntity);
-
- /**
- * 根据条件统计所有流任务
- * @param flowTaskEntity
- * @return
- */
- public Map quueryCount(FlowTaskEntity flowTaskEntity);
-
- /**
- * 根据条件流程Id查询操作日志
- * @param procInsId
- * @return
- */
- public List