From c8bc73954b11b40cc62945099a4f7ca1a73154a1 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期五, 22 十一月 2024 10:22:43 +0800
Subject: [PATCH] 集成flowable接口
---
flowable/src/main/java/com/ycl/controller/TaskController.java | 208 +++++
flowable/src/main/resources/mapper/PurchaseMapper.xml | 2
flowable/src/main/java/com/ycl/mapper/ActRuExecutionMapper.java | 2
flowable/src/main/java/com/ycl/service/ILeaveapplyService.java | 2
flowable/src/main/java/com/ycl/mapper/PurchaseMapper.java | 2
flowable/src/main/java/com/ycl/controller/FlowDesignerController.java | 139 +++
flowable/src/main/java/com/ycl/controller/FlowController.java | 223 +++++
flowable/src/main/java/com/ycl/controller/LeaveapplyController.java | 226 +++++
flowable/src/main/java/com/ycl/mapper/MeetingMapper.java | 2
flowable/src/main/java/com/ycl/mapper/LeaveapplyMapper.java | 2
flowable/src/main/java/com/ycl/service/impl/LeaveapplyServiceImpl.java | 130 +++
flowable/src/main/java/com/ycl/service/IMeetingService.java | 2
flowable/src/main/java/com/ycl/controller/MeetingController.java | 128 +++
flowable/src/main/resources/mapper/LeaveapplyMapper.xml | 2
flowable/src/main/java/com/ycl/controller/DynamicFlowController.java | 208 +++++
flowable/src/main/java/com/ycl/controller/ModelManageController.java | 161 ++++
flowable/src/main/java/com/ycl/service/impl/PurchaseServiceImpl.java | 130 +++
flowable/src/main/resources/mapper/MeetingMapper.xml | 2
flowable/src/main/java/com/ycl/controller/PurchaseController.java | 217 +++++
flowable/src/main/java/com/ycl/service/IPurchaseService.java | 18
/dev/null | 7
flowable/src/main/java/com/ycl/service/impl/MeetingServiceImpl.java | 131 +++
flowable/src/main/resources/mapper/ActRuExecutionMapper.xml | 2
flowable/src/main/java/com/ycl/util/ActivitiTracingChart.java | 8
flowable/src/main/java/com/ycl/controller/FlowMonitorController.java | 403 ++++++++++
25 files changed, 2,324 insertions(+), 33 deletions(-)
diff --git a/flowable/gradle/wrapper/gradle-wrapper.jar b/flowable/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index d64cd49..0000000
--- a/flowable/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/flowable/gradle/wrapper/gradle-wrapper.properties b/flowable/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index ac2064c..0000000
--- a/flowable/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
-networkTimeout=10000
-validateDistributionUrl=true
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
diff --git a/flowable/src/main/java/com/ycl/controller/DynamicFlowController.java b/flowable/src/main/java/com/ycl/controller/DynamicFlowController.java
new file mode 100644
index 0000000..82ea0c1
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/DynamicFlowController.java
@@ -0,0 +1,208 @@
+package com.ycl.controller;
+
+
+import com.ycl.common.core.domain.AjaxResult;
+import com.ycl.common.utils.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.flowable.bpmn.BpmnAutoLayout;
+import org.flowable.bpmn.model.Process;
+import org.flowable.bpmn.model.*;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.repository.Deployment;
+import org.flowable.engine.runtime.Execution;
+import org.flowable.task.api.Task;
+import org.flowable.validation.ValidationError;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@Api(value = "鍔ㄦ�佹祦绋嬫帴鍙�")
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/dynamic/flow")
+public class DynamicFlowController {
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final RepositoryService repositoryService;
+
+ private final HistoryService historyService;
+
+
+ @ApiOperation("閬嶅巻娴佺▼淇℃伅")
+ @GetMapping(value = "/info/{processInstanceId}")
+ @ResponseBody
+ public AjaxResult remove(@PathVariable String processInstanceId) {
+ String processDefinitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
+ Collection<FlowElement> flowElements = bpmnModel.getMainProcess().getFlowElements();
+ for (FlowElement flowElement : flowElements) {
+ if (flowElement instanceof UserTask) {
+ UserTask userTask = (UserTask) flowElement;
+ System.out.println(flowElement.getName());
+ System.out.println(flowElement.getId());
+ System.out.println(userTask.getAssignee());
+ String assigneeEl = userTask.getAssignee();
+ if (StringUtils.isBlank(assigneeEl)) {
+ continue;
+ }
+ if (assigneeEl.startsWith("${") && assigneeEl.endsWith("}") && assigneeEl.length() > 3) {
+ String assignee = assigneeEl.substring(2, assigneeEl.length() - 2);
+ System.out.println("assignee:" + assignee);
+ }
+ }
+ }
+ return AjaxResult.success(flowElements);
+ }
+
+ @ApiOperation("鎾ら攢:寮哄埗缁撴潫涓�涓祦绋�")
+ @GetMapping(value = "/forceEnd/{taskId}")
+ @ResponseBody
+ public AjaxResult forceEnd(@PathVariable String taskId) {
+ Task t = taskService.createTaskQuery().taskId(taskId).singleResult();
+ String processDefinitionId = runtimeService.createProcessInstanceQuery().processInstanceId(t.getProcessInstanceId()).singleResult().getProcessDefinitionId();
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
+ // 瀵绘壘娴佺▼瀹炰緥褰撳墠浠诲姟鐨刟ctiveId
+ Execution execution = runtimeService.createExecutionQuery().executionId(t.getExecutionId()).singleResult();
+ String activityId = execution.getActivityId();
+ FlowNode currentNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId);
+ // 鍒涘缓缁撴潫鑺傜偣鍜岃繛鎺ョ嚎
+ EndEvent end = new EndEvent();
+ end.setName("寮哄埗缁撴潫");
+ end.setId("forceEnd");
+ List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>();
+ SequenceFlow newSequenceFlow = new SequenceFlow();
+ newSequenceFlow.setId("newFlow");
+ newSequenceFlow.setSourceFlowElement(currentNode);
+ newSequenceFlow.setTargetFlowElement(end);
+ newSequenceFlowList.add(newSequenceFlow);
+ // 澶囦唤鍘熸湁鏂瑰悜
+ List<SequenceFlow> dataflows = currentNode.getOutgoingFlows();
+ List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
+ oriSequenceFlows.addAll(dataflows);
+ // 娓呯┖鍘熸湁鏂瑰悜
+ currentNode.getOutgoingFlows().clear();
+ // 璁剧疆鏂版柟鍚�
+ currentNode.setOutgoingFlows(newSequenceFlowList);
+ // 瀹屾垚褰撳墠浠诲姟
+ taskService.addComment(taskId, t.getProcessInstanceId(), "comment", "鎾ら攢娴佺▼");
+ taskService.complete(taskId);
+ // 鎭㈠鍘熸湁鏂瑰悜
+ currentNode.setOutgoingFlows(oriSequenceFlows);
+ return AjaxResult.success();
+ }
+
+ @ApiOperation("椹冲洖鎴栬烦杞埌鎸囧畾鑺傜偣")
+ @GetMapping(value = "/jump/{taskId}/{sid}")
+ @ResponseBody
+ public AjaxResult jump(@PathVariable String taskId, @PathVariable String sid) {
+ Task t = taskService.createTaskQuery().taskId(taskId).singleResult();
+ String processDefinitionId = runtimeService.createProcessInstanceQuery().processInstanceId(t.getProcessInstanceId()).singleResult().getProcessDefinitionId();
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
+ // 瀵绘壘娴佺▼瀹炰緥褰撳墠浠诲姟鐨刟ctiveId
+ Execution execution = runtimeService.createExecutionQuery().executionId(t.getExecutionId()).singleResult();
+ String activityId = execution.getActivityId();
+ FlowNode currentNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId);
+ FlowNode targetNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sid);
+ // 鍒涘缓杩炴帴绾�
+ List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>();
+ SequenceFlow newSequenceFlow = new SequenceFlow();
+ newSequenceFlow.setId("newFlow");
+ newSequenceFlow.setSourceFlowElement(currentNode);
+ newSequenceFlow.setTargetFlowElement(targetNode);
+ newSequenceFlowList.add(newSequenceFlow);
+ // 澶囦唤鍘熸湁鏂瑰悜
+ List<SequenceFlow> dataflows = currentNode.getOutgoingFlows();
+ List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
+ oriSequenceFlows.addAll(dataflows);
+ // 娓呯┖鍘熸湁鏂瑰悜
+ currentNode.getOutgoingFlows().clear();
+ // 璁剧疆鏂版柟鍚�
+ currentNode.setOutgoingFlows(newSequenceFlowList);
+ // 瀹屾垚褰撳墠浠诲姟
+ taskService.addComment(taskId, t.getProcessInstanceId(), "comment", "璺宠浆鑺傜偣");
+ taskService.complete(taskId);
+ // 鎭㈠鍘熸湁鏂瑰悜
+ currentNode.setOutgoingFlows(oriSequenceFlows);
+ return AjaxResult.success();
+ }
+
+ @ApiOperation("鍔ㄦ�佸垱寤烘祦绋�")
+ @GetMapping(value = "/createProcess")
+ @ResponseBody
+ public AjaxResult createProcess() {
+ // 寮�濮嬭妭鐐圭殑灞炴��
+ StartEvent startEvent = new StartEvent();
+ startEvent.setId("start");
+ startEvent.setName("start");
+ // 鏅�歎serTask鑺傜偣
+ UserTask userTask = new UserTask();
+ userTask.setId("userTask");
+ userTask.setName("瀹℃壒浠诲姟");
+ // 缁撴潫鑺傜偣灞炴��
+ EndEvent endEvent = new EndEvent();
+ endEvent.setId("end");
+ endEvent.setName("end");
+ // 杩炵嚎淇℃伅
+ List<SequenceFlow> flows = new ArrayList<SequenceFlow>();
+ List<SequenceFlow> toEnd = new ArrayList<SequenceFlow>();
+ SequenceFlow s1 = new SequenceFlow();
+ s1.setId("flow1");
+ s1.setName("flow1");
+ s1.setSourceRef(startEvent.getId());
+ s1.setTargetRef(userTask.getId());
+ flows.add(s1);
+
+ SequenceFlow s2 = new SequenceFlow();
+ s2.setId("flow2");
+ s2.setName("flow2");
+ s2.setSourceRef(userTask.getId());
+ s2.setTargetRef(endEvent.getId());
+ toEnd.add(s2);
+ startEvent.setOutgoingFlows(flows);
+ userTask.setOutgoingFlows(toEnd);
+
+ // 缁欐祦绋嬪璞℃坊鍔犲厓绱�
+ Process process = new Process();
+ process.setId("dynamicProcess");
+ process.setName("鍔ㄦ�佹祦绋�");
+ process.addFlowElement(startEvent);
+ process.addFlowElement(s1);
+ process.addFlowElement(userTask);
+ process.addFlowElement(s2);
+ process.addFlowElement(endEvent);
+ // 鍒涘缓妯″瀷瀵硅薄
+ BpmnModel bpmnModel = new BpmnModel();
+ bpmnModel.addProcess(process);
+ // 娴佺▼鍥捐嚜鍔ㄥ竷灞�
+ new BpmnAutoLayout(bpmnModel).execute();
+
+ // 妯″瀷鍚堟硶鎬ф牎楠�
+ List<ValidationError> validationErrorList = repositoryService.validateProcess(bpmnModel);
+ if (validationErrorList.size() == 0) {
+ // 妯″瀷鍚堟硶灏遍儴缃叉祦绋�
+ Deployment deploy = repositoryService.createDeployment().category("dynamic")
+ .key("dynamicProcess")
+ .addBpmnModel("dynamicProcess.bpmn20.xml", bpmnModel)
+ .deploy();
+ return AjaxResult.success("success");
+ } else {
+ return AjaxResult.error("fail");
+ }
+ }
+
+}
diff --git a/flowable/src/main/java/com/ycl/controller/FlowController.java b/flowable/src/main/java/com/ycl/controller/FlowController.java
new file mode 100644
index 0000000..428630f
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/FlowController.java
@@ -0,0 +1,223 @@
+package com.ycl.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.ycl.common.core.controller.BaseController;
+import com.ycl.common.core.domain.AjaxResult;
+import com.ycl.common.core.page.TableDataInfo;
+import com.ycl.common.utils.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.io.IOUtils;
+
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.editor.constants.ModelDataJsonConstants;
+import org.flowable.editor.language.json.converter.BpmnJsonConverter;
+import org.flowable.engine.ProcessEngineConfiguration;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.repository.Model;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.flowable.engine.repository.ProcessDefinitionQuery;
+import org.flowable.image.ProcessDiagramGenerator;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import com.ycl.system.domain.Process;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.zip.ZipInputStream;
+
+/**
+ * 娴佺▼绠$悊
+ */
+@Api(value = "閮ㄧ讲绠$悊鎺ュ彛")
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/flow/manage")
+public class FlowController extends BaseController {
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final RepositoryService repositoryService;
+
+ private final ProcessEngineConfiguration configuration;
+
+ private static final String prefix = "flowable/manage";
+
+ @GetMapping("")
+ public String processList()
+ {
+ return prefix + "/processList";
+ }
+
+ @GetMapping("deploy")
+ public String deploy()
+ {
+ return prefix + "/deployProcess";
+ }
+
+ @ApiOperation("涓婁紶涓�涓伐浣滄祦鏂囦欢")
+ @RequestMapping(value = "/uploadworkflow", method = RequestMethod.POST)
+ @ResponseBody
+ public AjaxResult fileupload(@RequestParam MultipartFile uploadfile) {
+ try {
+ String filename = uploadfile.getOriginalFilename();
+ InputStream is = uploadfile.getInputStream();
+ if (filename.endsWith("zip")) {
+ repositoryService.createDeployment().name(filename).addZipInputStream(new ZipInputStream(is)).deploy();
+ } else if (filename.endsWith("bpmn") || filename.endsWith("xml")) {
+ repositoryService.createDeployment().name(filename).addInputStream(filename, is).deploy();
+ } else {
+ return AjaxResult.error("鏂囦欢鏍煎紡閿欒");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return AjaxResult.error("閮ㄧ讲澶辫触");
+ }
+ return AjaxResult.success("閮ㄧ讲鎴愬姛");
+ }
+
+ @ApiOperation("鏌ヨ宸查儴缃插伐浣滄祦鍒楄〃")
+ @RequestMapping(value = "/getprocesslists", method = RequestMethod.POST)
+ @ResponseBody
+ public TableDataInfo getlist(@RequestParam(required = false) String key, @RequestParam(required = false) String name,
+ @RequestParam(required = false) Boolean latest, Integer pageSize, Integer pageNum) {
+ ProcessDefinitionQuery queryCondition = repositoryService.createProcessDefinitionQuery();
+ if (StringUtils.isNotEmpty(key)) {
+ queryCondition.processDefinitionKey(key);
+ }
+ if (StringUtils.isNotEmpty(name)) {
+ queryCondition.processDefinitionName(name);
+ }
+ if (latest) {
+ queryCondition.latestVersion();
+ }
+ int total = queryCondition.list().size();
+ int start = (pageNum - 1) * pageSize;
+ List<ProcessDefinition> pageList = queryCondition.orderByDeploymentId().desc().listPage(start, pageSize);
+ List<Process> mylist = new ArrayList<Process>();
+ for (int i = 0; i < pageList.size(); i++) {
+ Process p = new Process();
+ p.setDeploymentId(pageList.get(i).getDeploymentId());
+ p.setId(pageList.get(i).getId());
+ p.setKey(pageList.get(i).getKey());
+ p.setName(pageList.get(i).getName());
+ p.setResourceName(pageList.get(i).getResourceName());
+ p.setDiagramresourceName(pageList.get(i).getDiagramResourceName());
+ p.setSuspended(pageList.get(i).isSuspended());
+ p.setVersion(pageList.get(i).getVersion());
+ mylist.add(p);
+ }
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(0);
+ rspData.setRows(mylist);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+ @ApiOperation("鍒犻櫎涓�娆¢儴缃茬殑宸ヤ綔娴�")
+ @RequestMapping(value = "/remove/{deploymentId}", method = RequestMethod.POST)
+ @ResponseBody
+ public AjaxResult remove(@PathVariable String deploymentId) {
+ repositoryService.deleteDeployment(deploymentId, true);
+ return AjaxResult.success();
+ }
+
+
+ @ApiOperation("鏌ョ湅宸ヤ綔娴佸浘鐗�")
+ @RequestMapping(value = "/showresource", method = RequestMethod.GET)
+ public void showresource(@RequestParam("pdid") String pdid,
+ HttpServletResponse response) throws Exception {
+ response.setContentType("image/jpeg;charset=UTF-8");
+ response.setHeader("Content-Disposition","inline;filename=process.jpg");
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(pdid);
+ ProcessDiagramGenerator diagramGenerator = configuration.getProcessDiagramGenerator();
+ InputStream is = diagramGenerator.generateDiagram(bpmnModel, "png", "瀹嬩綋", "瀹嬩綋", "瀹嬩綋", configuration.getClassLoader(), true);
+ ServletOutputStream output = response.getOutputStream();
+ IOUtils.copy(is, output);
+ }
+
+ @ApiOperation("鏌ョ湅宸ヤ綔娴佸畾涔�")
+ @RequestMapping(value = "/showProcessDefinition/{pdid}/{resource}", method = RequestMethod.GET)
+ public void showProcessDefinition(@PathVariable("pdid") String pdid, @PathVariable(value="resource") String resource,
+ HttpServletResponse response) throws Exception {
+ response.setContentType("application/xml");
+ response.setHeader("Content-Disposition","inline;filename=process.bpmn20.xml");
+ InputStream is = repositoryService.getResourceAsStream(pdid, resource);
+ ServletOutputStream output = response.getOutputStream();
+ IOUtils.copy(is, output);
+ }
+
+ @ApiOperation("灏嗘祦绋嬪畾涔夎浆涓烘ā鍨�")
+ @RequestMapping(value = "/exchangeProcessToModel/{pdid}", method = RequestMethod.GET)
+ @ResponseBody
+ public String exchangeProcessToModel(@PathVariable("pdid") String pdid, HttpServletResponse response) throws Exception {
+ ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pdid).singleResult();
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(definition.getId());
+ ObjectNode objectNode = new BpmnJsonConverter().convertToJson(bpmnModel);
+ Model modelData = repositoryService.newModel();
+ modelData.setKey(definition.getKey());
+ modelData.setName(definition.getName());
+ modelData.setCategory(definition.getCategory());
+ ObjectNode modelJson = new ObjectMapper().createObjectNode();
+ modelJson.put(ModelDataJsonConstants.MODEL_NAME, definition.getName());
+ modelJson.put(ModelDataJsonConstants.MODEL_DESCRIPTION, definition.getDescription());
+ List<Model> models = repositoryService.createModelQuery().modelKey(definition.getKey()).list();
+ if (models.size() > 0) {
+ Integer version = models.get(0).getVersion();
+ version++;
+ modelJson.put(ModelDataJsonConstants.MODEL_REVISION, version);
+ // 鍒犻櫎鏃фā鍨�
+ repositoryService.deleteModel(models.get(0).getId());
+ modelData.setVersion(version);
+ } else {
+ modelJson.put(ModelDataJsonConstants.MODEL_REVISION, 1);
+ }
+ modelData.setMetaInfo(modelJson.toString());
+ modelData.setDeploymentId(definition.getDeploymentId());
+ // 淇濆瓨鏂版ā鍨�
+ repositoryService.saveModel(modelData);
+ // 淇濆瓨妯″瀷json
+ repositoryService.addModelEditorSource(modelData.getId(), objectNode.toString().getBytes(StandardCharsets.UTF_8));
+ return objectNode.toString();
+ }
+
+ @ApiOperation("鎸傝捣涓�涓祦绋嬪畾涔�")
+ @RequestMapping(value = "/suspendProcessDefinition", method = RequestMethod.GET)
+ @ResponseBody
+ public AjaxResult suspendProcessDefinition(@RequestParam("pdid") String pdid, @RequestParam("flag") Boolean flag,
+ @RequestParam(value="date", required = false) String date) throws Exception {
+ if (StringUtils.isNotEmpty(date)) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ repositoryService.suspendProcessDefinitionById(pdid, flag, sdf.parse(date));
+ } else {
+ repositoryService.suspendProcessDefinitionById(pdid, flag, null);
+ }
+ return AjaxResult.success();
+ }
+
+ @ApiOperation("婵�娲讳竴涓祦绋嬪畾涔�")
+ @RequestMapping(value = "/activateProcessDefinition", method = RequestMethod.GET)
+ @ResponseBody
+ public AjaxResult activateProcessDefinition(@RequestParam("pdid") String pdid, @RequestParam("flag") Boolean flag, @RequestParam(value="date", required = false) String date) throws Exception {
+ if (StringUtils.isNotEmpty(date)) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ repositoryService.activateProcessDefinitionById(pdid, flag, sdf.parse(date));
+ } else {
+ repositoryService.activateProcessDefinitionById(pdid, flag, null);
+ }
+ return AjaxResult.success();
+ }
+}
diff --git a/flowable/src/main/java/com/ycl/controller/FlowDesignerController.java b/flowable/src/main/java/com/ycl/controller/FlowDesignerController.java
new file mode 100644
index 0000000..ba2d4b7
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/FlowDesignerController.java
@@ -0,0 +1,139 @@
+package com.ycl.controller;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.editor.constants.ModelDataJsonConstants;
+import org.flowable.editor.language.json.converter.BpmnJsonConverter;
+import org.flowable.engine.IdentityService;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.repository.Model;
+import org.flowable.validation.ProcessValidator;
+import org.flowable.validation.ProcessValidatorFactory;
+import org.flowable.validation.ValidationError;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Collections;
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/app/rest/")
+public class FlowDesignerController {
+
+ private final RepositoryService repositoryService;
+
+ private final IdentityService identityService;
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final ObjectMapper objectMapper;
+
+ /**
+ * 鑾峰緱
+ * @param modelId
+ * @return
+ */
+ @RequestMapping(value = "/models/{modelId}/editor/json", method = RequestMethod.GET, produces = "application/json")
+ public ObjectNode getModelJSON(@PathVariable String modelId) {
+ Model model = repositoryService.getModel(modelId);
+ ObjectNode modelNode = objectMapper.createObjectNode();
+ modelNode.put("modelId", model.getId());
+ modelNode.put("name", model.getName());
+ modelNode.put("key", model.getKey());
+ modelNode.put("description", JSONObject.parseObject(model.getMetaInfo()).getString("description"));
+ modelNode.putPOJO("lastUpdated", model.getLastUpdateTime());
+ byte[] modelEditorSource = repositoryService.getModelEditorSource(modelId);
+ if (null != modelEditorSource && modelEditorSource.length > 0) {
+ try {
+ ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(modelEditorSource);
+ editorJsonNode.put("modelType", "model");
+ modelNode.put("model", editorJsonNode);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ } else {
+ ObjectNode editorJsonNode = objectMapper.createObjectNode();
+ editorJsonNode.put("id", "canvas");
+ editorJsonNode.put("resourceId", "canvas");
+ ObjectNode stencilSetNode = objectMapper.createObjectNode();
+ stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
+ editorJsonNode.put("modelType", "model");
+ modelNode.put("model", editorJsonNode);
+ }
+ return modelNode;
+ }
+
+ /**
+ * 淇濆瓨
+ * @param modelId
+ * @param values
+ */
+ @RequestMapping(value = "models/{modelId}/editor/json", method = RequestMethod.POST)
+ public void saveModel(@PathVariable String modelId, @RequestBody MultiValueMap<String, String> values) {
+
+ String json = values.getFirst("json_xml");
+ String name = values.getFirst("name");
+ String description = values.getFirst("description");
+ String key = values.getFirst("key");
+
+ Model modelData = repositoryService.getModel(modelId);
+ if (null == modelData) {
+ modelData = repositoryService.newModel();
+ }
+
+ ObjectNode modelNode = null;
+ try {
+ modelNode = (ObjectNode) new ObjectMapper().readTree(json);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ ObjectNode modelObjectNode = objectMapper.createObjectNode();
+ modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, name);
+ modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
+ description = StringUtils.defaultString(description);
+ modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
+ modelData.setMetaInfo(modelObjectNode.toString());
+ modelData.setName(name);
+ modelData.setKey(StringUtils.defaultString(key));
+ // 鏄剧ず鍙戝竷鎸夐挳
+ modelData.setDeploymentId(null);
+ repositoryService.saveModel(modelData);
+ try {
+ repositoryService.addModelEditorSource(modelData.getId(), modelNode.toString().getBytes("utf-8"));
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 鏍¢獙娴佺▼鍥�
+ */
+ @PostMapping(value = "/model/validate", consumes = MediaType.APPLICATION_JSON_VALUE)
+ public List<ValidationError> validate(@RequestBody JsonNode body) {
+ if (body != null && body.has("stencilset")) {
+ BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(body);
+ ProcessValidator validator = new ProcessValidatorFactory().createDefaultProcessValidator();
+ List<ValidationError> errors = validator.validate(bpmnModel);
+ return errors;
+ }
+ return Collections.emptyList();
+ }
+
+
+}
diff --git a/flowable/src/main/java/com/ycl/controller/FlowMonitorController.java b/flowable/src/main/java/com/ycl/controller/FlowMonitorController.java
new file mode 100644
index 0000000..eaa271f
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/FlowMonitorController.java
@@ -0,0 +1,403 @@
+package com.ycl.controller;
+
+import com.ycl.common.core.controller.BaseController;
+import com.ycl.common.core.domain.AjaxResult;
+import com.ycl.common.core.page.TableDataInfo;
+import com.ycl.common.utils.StringUtils;
+import com.ycl.common.utils.bean.BeanUtils;
+import com.ycl.system.domain.*;
+import com.ycl.mapper.ActRuExecutionMapper;
+import com.ycl.util.ActivitiTracingChart;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.bpmn.model.FlowElement;
+import org.flowable.engine.*;
+import org.flowable.engine.history.HistoricActivityInstance;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.history.HistoricProcessInstanceQuery;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.engine.runtime.ProcessInstanceQuery;
+import org.flowable.engine.task.Comment;
+import org.flowable.job.api.*;
+import org.flowable.task.api.Task;
+import org.flowable.variable.api.history.HistoricVariableInstance;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 娴佺▼鐩戞帶
+ */
+@Api(value = "娴佺▼鐩戞帶鎺ュ彛")
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/flow/monitor")
+public class FlowMonitorController extends BaseController {
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final HistoryService historyService;
+
+ private final ManagementService managementService;
+
+ private final RepositoryService repositoryService;
+
+ private final ProcessEngineConfiguration configuration;
+
+ private final ActivitiTracingChart activitiTracingChart;
+
+ private final ActRuExecutionMapper actRuExecutionMapper;
+
+ private static final String prefix = "flowable/monitor";
+
+ @GetMapping("/instance")
+ public String processList() {
+ return prefix + "/processInstance";
+ }
+
+ @GetMapping("/history")
+ public String processHistory() {
+ return prefix + "/processHistory";
+ }
+
+ @GetMapping("/execution")
+ public String execution() {
+ return prefix + "/execution";
+ }
+
+ @GetMapping("/historyDetail")
+ public String historyDetail(String processInstanceId, ModelMap mmap) {
+ mmap.put("processInstanceId", processInstanceId);
+ return prefix + "/processHistoryDetail";
+ }
+
+ @GetMapping("/processVariablesDetail")
+ public String processVariablesDetail(String processInstanceId, ModelMap mmap) {
+ mmap.put("processInstanceId", processInstanceId);
+ return prefix + "/processVariablesDetail";
+ }
+
+ @ApiOperation("鏌ヨ鎵�鏈夋鍦ㄨ繍琛岀殑娴佺▼瀹炰緥鍒楄〃")
+ @RequestMapping(value = "/listProcess", method = RequestMethod.POST)
+ @ResponseBody
+ public TableDataInfo getlist(@RequestParam(required = false) String bussinesskey, @RequestParam(required = false) String name,
+ Integer pageSize, Integer pageNum) {
+ int start = (pageNum - 1) * pageSize;
+ ProcessInstanceQuery condition = runtimeService.createProcessInstanceQuery();
+ if (StringUtils.isNotEmpty(bussinesskey)) {
+ condition.processInstanceBusinessKey(bussinesskey);
+ }
+ if (StringUtils.isNotEmpty(name)) {
+ condition.processDefinitionName(name);
+ }
+ int total = condition.orderByProcessDefinitionId().desc().list().size();
+ List<ProcessInstance> processList = condition.orderByProcessDefinitionId().desc().listPage(start, pageSize);
+ List<FlowInfo> flows = new ArrayList<>();
+ processList.stream().forEach(p -> {
+ FlowInfo info = new FlowInfo();
+ info.setProcessInstanceId(p.getProcessInstanceId());
+ info.setBusinessKey(p.getBusinessKey());
+ info.setName(p.getProcessDefinitionName());
+ info.setStartTime(p.getStartTime());
+ info.setStartUserId(p.getStartUserId());
+ info.setSuspended(p.isSuspended());
+ info.setEnded(p.isEnded());
+ // 鏌ョ湅褰撳墠娲诲姩浠诲姟
+ List<Task> tasks = taskService.createTaskQuery().processInstanceId(p.getProcessInstanceId()).list();
+ String taskName = "";
+ String assignee = "";
+ for (Task t : tasks) {
+ taskName += t.getName() + ",";
+ assignee += t.getAssignee() + ",";
+ }
+ taskName = taskName.substring(0, taskName.length() -1);
+ assignee = assignee.substring(0, assignee.length() -1);
+ info.setCurrentTask(taskName);
+ info.setAssignee(assignee);
+ flows.add(info);
+ });
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(0);
+ rspData.setRows(flows);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+ @ApiOperation("鏌ヨ鎵�鏈夋祦绋嬪疄渚嬪垪琛�-鍖呭惈鍦ㄨ繍琛屽拰宸茬粨鏉�")
+ @RequestMapping(value = "/listHistoryProcess", method = RequestMethod.POST)
+ @ResponseBody
+ public TableDataInfo listHistoryProcess(@RequestParam(required = false) String bussinesskey, @RequestParam(required = false) String name,
+ Integer pageSize, Integer pageNum) {
+ int start = (pageNum - 1) * pageSize;
+ HistoricProcessInstanceQuery condition = historyService.createHistoricProcessInstanceQuery();
+ if (StringUtils.isNotEmpty(bussinesskey)) {
+ condition.processInstanceBusinessKey(bussinesskey);
+ }
+ if (StringUtils.isNotEmpty(name)) {
+ condition.processDefinitionName(name);
+ }
+ int total = condition.orderByProcessInstanceStartTime().desc().list().size();
+ List<HistoricProcessInstance> processList = condition.orderByProcessInstanceStartTime().desc().listPage(start, pageSize);
+ List<FlowInfo> flows = new ArrayList<>();
+ processList.stream().forEach(p -> {
+ FlowInfo info = new FlowInfo();
+ info.setProcessInstanceId(p.getId());
+ info.setBusinessKey(p.getBusinessKey());
+ info.setName(p.getProcessDefinitionName());
+ info.setStartTime(p.getStartTime());
+ info.setEndTime(p.getEndTime());
+ info.setStartUserId(p.getStartUserId());
+ if (p.getEndTime() == null) {
+ info.setEnded(false);
+ // 鏌ョ湅褰撳墠娲诲姩浠诲姟
+ List<Task> tasks = taskService.createTaskQuery().processInstanceId(p.getId()).list();
+ String taskName = "";
+ String assignee = "";
+ for (Task t : tasks) {
+ taskName += t.getName() + ",";
+ assignee += t.getAssignee() + ",";
+ }
+ taskName = taskName.substring(0, taskName.length() -1);
+ assignee = assignee.substring(0, assignee.length() -1);
+ info.setCurrentTask(taskName);
+ info.setAssignee(assignee);
+ } else {
+ info.setEnded(true);
+ }
+ flows.add(info);
+ });
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(0);
+ rspData.setRows(flows);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+ @ApiOperation("鏌ヨ涓�涓祦绋嬬殑娲诲姩鍘嗗彶")
+ @RequestMapping(value = "/history/{processInstanceId}", method = RequestMethod.POST)
+ @ResponseBody
+ public TableDataInfo history(@PathVariable String processInstanceId, Integer pageSize, Integer pageNum) {
+ int start = (pageNum - 1) * pageSize;
+ List<HistoricActivityInstance> history = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).activityType("userTask").orderByHistoricActivityInstanceStartTime().asc().listPage(start, pageSize);
+ int total = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).activityType("userTask").orderByHistoricActivityInstanceStartTime().asc().list().size();
+ List<TaskInfo> infos = new ArrayList<>();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ history.stream().forEach(h->{
+ TaskInfo info = new TaskInfo();
+ info.setProcessInstanceId(h.getProcessInstanceId());
+ info.setStartTime(sdf.format(h.getStartTime()));
+ if (h.getEndTime() != null) {
+ info.setEndTime(sdf.format(h.getEndTime()));
+ }
+ info.setAssignee(h.getAssignee());
+ info.setTaskName(h.getActivityName());
+ List<Comment> comments = taskService.getTaskComments(h.getTaskId());
+ if (comments.size() > 0) {
+ info.setComment(comments.get(0).getFullMessage());
+ }
+ infos.add(info);
+ });
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(0);
+ rspData.setRows(infos);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+ @ApiOperation("鏌ヨ鎵�鏈夋鍦ㄨ繍琛岀殑鎵ц瀹炰緥鍒楄〃")
+ @RequestMapping(value = "/listExecutions", method = RequestMethod.POST)
+ @ResponseBody
+ public List<FlowInfo> listExecutions(@RequestParam(required = false) String name) {
+ List<ActRuExecution> executionList = actRuExecutionMapper.selectActRuExecutionListByProcessName(name);
+ List<FlowInfo> flows = new ArrayList<>();
+ executionList.stream().forEach(p -> {
+ FlowInfo info = new FlowInfo();
+ info.setProcessInstanceId(p.getProcInstId());
+ if (p.getSuspensionState() == 1L) {
+ info.setSuspended(false);
+ } else {
+ info.setSuspended(true);
+ }
+ if (p.getIsActive() == 0) {
+ info.setActive(false);
+ } else {
+ info.setActive(true);
+ }
+ if (p.getActId() != null) {
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(p.getProcInstId()).singleResult();
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(process.getProcessDefinitionId());
+ Map<String, FlowElement> nodes = bpmnModel.getMainProcess().getFlowElementMap();
+ info.setCurrentTask(nodes.get(p.getActId()).getName());
+ info.setName(process.getProcessDefinitionName());
+ } else {
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(p.getProcInstId()).singleResult();
+ info.setStartTime(process.getStartTime());
+ info.setStartUserId(process.getStartUserId());
+ info.setName(process.getProcessDefinitionName());
+ List<Task> tasks = taskService.createTaskQuery().processInstanceId(p.getProcInstId()).list();
+ String taskName = "";
+ for (Task t : tasks) {
+ taskName += t.getName() + ",";
+ }
+ taskName = taskName.substring(0, taskName.length() -1);
+ info.setCurrentTask(taskName);
+ }
+ info.setStartTime(p.getStartTime());
+ info.setExecutionId(p.getId());
+ if (p.getParentId() == null) {
+ info.setParentExecutionId("0");
+ } else {
+ info.setParentExecutionId(p.getParentId());
+ }
+ flows.add(info);
+ });
+ return flows;
+ }
+
+ @ApiOperation("娴佺▼鍥捐繘搴﹁拷韪�")
+ @RequestMapping(value = {"/traceProcess/{processInstanceId}"}, method = RequestMethod.GET)
+ public void traceprocess(@PathVariable String processInstanceId, HttpServletResponse response) throws IOException {
+ response.setContentType("image/jpeg;charset=UTF-8");
+ response.setHeader("Content-Disposition", "inline; filename= trace.png");
+ activitiTracingChart.generateFlowChart(processInstanceId, response.getOutputStream());
+ }
+
+ @ApiOperation("鎸傝捣涓�涓祦绋嬪疄渚�")
+ @RequestMapping(value = "/suspend/{processInstanceId}", method = RequestMethod.GET)
+ @ResponseBody
+ public AjaxResult suspend(@PathVariable String processInstanceId) {
+ runtimeService.suspendProcessInstanceById(processInstanceId);
+ return AjaxResult.success();
+ }
+
+ @ApiOperation("鍞ら啋涓�涓寕璧风殑娴佺▼瀹炰緥")
+ @RequestMapping(value = "/run/{processInstanceId}", method = RequestMethod.GET)
+ @ResponseBody
+ public AjaxResult rerun(@PathVariable String processInstanceId) {
+ runtimeService.activateProcessInstanceById(processInstanceId);
+ return AjaxResult.success();
+ }
+
+ @ApiOperation("鏌ヨ涓�涓祦绋嬬殑鍙橀噺")
+ @RequestMapping(value = "/variables/{processInstanceId}", method = RequestMethod.POST)
+ @ResponseBody
+ public TableDataInfo variables(@PathVariable String processInstanceId, Integer pageSize, Integer pageNum) {
+ int start = (pageNum - 1) * pageSize;
+ List<HistoricVariableInstance> variables = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).orderByVariableName().asc().listPage(start, pageSize);
+ int total = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).orderByVariableName().asc().list().size();
+ List<VariableInfo> infos = new ArrayList<>();
+ variables.forEach(v->{
+ VariableInfo info = new VariableInfo();
+ BeanUtils.copyBeanProp(info, v);
+ if (v.getValue() != null) {
+ info.setValue(v.getValue().toString());
+ }
+ infos.add(info);
+ });
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(0);
+ rspData.setRows(infos);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+ @ApiOperation("鎸夌被鍨嬫煡璇㈡墍鏈夌殑浣滀笟鍒楄〃:瀹氭椂浣滀笟銆佸紓姝ヤ綔涓氥�佹寕璧蜂綔涓氥�佹浜′綔涓�")
+ @PostMapping(value = "/listJobs")
+ @ResponseBody
+ public TableDataInfo listJobs(@RequestParam(required = false) String processDefinitionId, @RequestParam(required = false) String startDate,
+ @RequestParam(required = false) String endDate,@RequestParam Integer type, Integer pageSize, Integer pageNum) throws Exception {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ int start = (pageNum - 1) * pageSize;
+ int total = 0;
+ List<Job> jobList = null;
+ ArrayList<DeadLetterJob> jobs = new ArrayList<>();
+ TableDataInfo rspData = new TableDataInfo();
+ if (type == 1) {
+ // 瀹氭椂浣滀笟
+ TimerJobQuery condition = managementService.createTimerJobQuery();
+ if (StringUtils.isNotEmpty(processDefinitionId)) {
+ condition.processDefinitionId(processDefinitionId);
+ }
+ if (StringUtils.isNotEmpty(startDate)) {
+ condition.duedateHigherThan(sdf.parse(startDate));
+ }
+ if (StringUtils.isNotEmpty(endDate)) {
+ condition.duedateLowerThan(sdf.parse(endDate));
+ }
+ total = condition.orderByJobDuedate().desc().list().size();
+ jobList = condition.orderByJobDuedate().desc().listPage(start, pageSize);
+ rspData.setRows(jobList);
+ } else if (type == 2) {
+ // 寮傛浣滀笟
+ JobQuery condition = managementService.createJobQuery();
+ if (StringUtils.isNotEmpty(processDefinitionId)) {
+ condition.processDefinitionId(processDefinitionId);
+ }
+ if (StringUtils.isNotEmpty(startDate)) {
+ condition.duedateHigherThan(sdf.parse(startDate));
+ }
+ if (StringUtils.isNotEmpty(endDate)) {
+ condition.duedateLowerThan(sdf.parse(endDate));
+ }
+ total = condition.orderByJobDuedate().desc().list().size();
+ jobList = condition.orderByJobDuedate().desc().listPage(start, pageSize);
+ rspData.setRows(jobList);
+ } else if (type == 3) {
+ // 鎸傝捣浣滀笟
+ SuspendedJobQuery condition = managementService.createSuspendedJobQuery();
+ if (StringUtils.isNotEmpty(processDefinitionId)) {
+ condition.processDefinitionId(processDefinitionId);
+ }
+ if (StringUtils.isNotEmpty(startDate)) {
+ condition.duedateHigherThan(sdf.parse(startDate));
+ }
+ if (StringUtils.isNotEmpty(endDate)) {
+ condition.duedateLowerThan(sdf.parse(endDate));
+ }
+ total = condition.orderByJobDuedate().desc().list().size();
+ jobList = condition.orderByJobDuedate().desc().listPage(start, pageSize);
+ rspData.setRows(jobList);
+ } else if (type == 4) {
+ // 姝讳骸浣滀笟
+ DeadLetterJobQuery condition = managementService.createDeadLetterJobQuery();
+ if (StringUtils.isNotEmpty(processDefinitionId)) {
+ condition.processDefinitionId(processDefinitionId);
+ }
+ if (StringUtils.isNotEmpty(startDate)) {
+ condition.duedateHigherThan(sdf.parse(startDate));
+ }
+ if (StringUtils.isNotEmpty(endDate)) {
+ condition.duedateLowerThan(sdf.parse(endDate));
+ }
+ total = condition.orderByJobDuedate().desc().list().size();
+ jobList = condition.orderByJobDuedate().desc().listPage(start, pageSize);
+
+ jobList.forEach(j->{
+ DeadLetterJob job = new DeadLetterJob();
+ job.setId(j.getId());
+ job.setDueDate(j.getDuedate());
+ job.setJobType(j.getJobType());
+ job.setExceptionMessage(j.getExceptionMessage());
+ job.setJobHandlerType(j.getJobHandlerType());
+ job.setProcessDefId(j.getProcessDefinitionId());
+ job.setProcessInstanceId(j.getProcessInstanceId());
+ job.setExecutionId(j.getExecutionId());
+ jobs.add(job);
+ });
+ rspData.setRows(jobs);
+ }
+ rspData.setCode(0);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+}
diff --git a/flowable/src/main/java/com/ycl/controller/LeaveapplyController.java b/flowable/src/main/java/com/ycl/controller/LeaveapplyController.java
new file mode 100644
index 0000000..3282bad
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/LeaveapplyController.java
@@ -0,0 +1,226 @@
+package com.ycl.controller;
+
+import com.ycl.common.annotation.Log;
+import com.ycl.common.core.controller.BaseController;
+import com.ycl.common.core.domain.AjaxResult;
+import com.ycl.common.core.domain.entity.SysUser;
+import com.ycl.common.core.page.TableDataInfo;
+import com.ycl.common.enums.BusinessType;
+import com.ycl.common.utils.SecurityUtils;
+import com.ycl.common.utils.poi.ExcelUtil;
+import com.ycl.system.domain.Leaveapply;
+import com.ycl.service.ILeaveapplyService;
+import com.ycl.system.service.ISysUserService;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 璇峰亣Controller
+ *
+ * @author shenzhanwang
+ * @date 2022-04-02
+ */
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/leaveapply")
+public class LeaveapplyController extends BaseController
+{
+ private static final String prefix = "flowable/leaveapply";
+
+ private final ILeaveapplyService leaveapplyService;
+
+ private final ISysUserService userService;
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ @GetMapping()
+ public String leaveapply()
+ {
+ return prefix + "/leaveapply";
+ }
+
+ /**
+ * 閮ㄩ棬棰嗗瀹℃壒
+ * @return
+ */
+ @ApiOperation("閮ㄩ棬棰嗗瀹℃壒")
+ @GetMapping("/deptleadercheck")
+ @ResponseBody
+ public AjaxResult deptleadercheck(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Leaveapply apply = leaveapplyService.selectLeaveapplyById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 浜轰簨瀹℃壒
+ * @return
+ */
+ @ApiOperation("浜轰簨瀹℃壒")
+ @GetMapping("/hrcheck")
+ @ResponseBody
+ public AjaxResult hrcheck(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Leaveapply apply = leaveapplyService.selectLeaveapplyById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 閿�鍋�
+ * @return
+ */
+ @ApiOperation("閿�鍋�")
+ @GetMapping("/destroyapply")
+ @ResponseBody
+ public AjaxResult destroyapply(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Leaveapply apply = leaveapplyService.selectLeaveapplyById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+
+ /**
+ * 璋冩暣鐢宠
+ * @return
+ */
+ @ApiOperation("璋冩暣鐢宠")
+ @GetMapping("/modifyapply")
+ @ResponseBody
+ public AjaxResult modifyapply(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Leaveapply apply = leaveapplyService.selectLeaveapplyById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 鍙戣捣璇峰亣鐢宠
+ * 椹冲洖鍚庝娇鐢�
+ * @return
+ */
+ @ApiOperation("鍙戣捣璇峰亣鐢宠-椹冲洖鍚庝娇鐢�")
+ @GetMapping("/addleave")
+ @ResponseBody
+ public AjaxResult addLeave(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Leaveapply apply = leaveapplyService.selectLeaveapplyById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 鏌ヨ璇峰亣鍒楄〃
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public TableDataInfo list(Leaveapply leaveapply)
+ {
+ String username = getUsername();
+ leaveapply.setUserId(username);
+ startPage();
+ List<Leaveapply> list = leaveapplyService.selectLeaveapplyList(leaveapply);
+ return getDataTable(list);
+ }
+
+ /**
+ * 瀵煎嚭璇峰亣鍒楄〃
+ */
+ @Log(title = "璇峰亣", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ @ResponseBody
+ public AjaxResult export(Leaveapply leaveapply)
+ {
+ SysUser user = SecurityUtils.getLoginUser().getUser();
+ String username = getUsername();
+ leaveapply.setUserId(username);
+ List<Leaveapply> list = leaveapplyService.selectLeaveapplyList(leaveapply);
+ ExcelUtil<Leaveapply> util = new ExcelUtil<Leaveapply>(Leaveapply.class);
+ return util.exportExcel(list, "璇峰亣鏁版嵁");
+ }
+
+ /**
+ * 褰撳墠鐧诲綍鐢ㄦ埛
+ */
+ @ApiOperation("褰撳墠鐧诲綍鐢ㄦ埛")
+ @GetMapping("/cuurentUser")
+ @ResponseBody
+ public AjaxResult cuurentUser()
+ {
+ SysUser user = SecurityUtils.getLoginUser().getUser();
+ return AjaxResult.success(user);
+ }
+
+
+ /**
+ * 鍙戣捣璇峰亣娴佺▼
+ */
+ @Log(title = "璇峰亣", businessType = BusinessType.INSERT)
+ @PostMapping("/add")
+ @ResponseBody
+ public AjaxResult addSave(Leaveapply leaveapply)
+ {
+ leaveapply.setApplyTime(new Date());
+ return toAjax(leaveapplyService.insertLeaveapply(leaveapply));
+ }
+
+ @PostMapping("/update")
+ @ResponseBody
+ public AjaxResult update(Leaveapply leaveapply)
+ {
+ return toAjax(leaveapplyService.updateLeaveapply(leaveapply));
+ }
+
+ /**
+ * 鍒犻櫎璇峰亣
+ */
+ @Log(title = "璇峰亣", businessType = BusinessType.DELETE)
+ @PostMapping( "/remove")
+ @ResponseBody
+ public AjaxResult remove(String ids)
+ {
+ return toAjax(leaveapplyService.deleteLeaveapplyByIds(ids));
+ }
+
+}
diff --git a/flowable/src/main/java/com/ycl/controller/MeetingController.java b/flowable/src/main/java/com/ycl/controller/MeetingController.java
new file mode 100644
index 0000000..7326a04
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/MeetingController.java
@@ -0,0 +1,128 @@
+package com.ycl.controller;
+
+import com.ycl.common.core.controller.BaseController;
+import com.ycl.common.core.domain.AjaxResult;
+import com.ycl.common.core.page.TableDataInfo;
+import com.ycl.common.utils.poi.ExcelUtil;
+import com.ycl.system.domain.Meeting;
+import com.ycl.service.IMeetingService;
+import com.ycl.system.service.ISysUserService;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/meeting")
+public class MeetingController extends BaseController {
+
+ private static final String prefix = "flowable/meeting";
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final ISysUserService userService;
+
+ private final IMeetingService meetingService;
+
+
+ /**
+ * 鏌ヨ浼氳鍒楄〃
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public TableDataInfo list(Meeting meeting)
+ {
+ startPage();
+ List<Meeting> list = meetingService.selectMeetingList(meeting);
+ return getDataTable(list);
+ }
+
+ /**
+ * 瀵煎嚭浼氳鍒楄〃
+ */
+ @PostMapping("/export")
+ @ResponseBody
+ public AjaxResult export(Meeting meeting)
+ {
+ List<Meeting> list = meetingService.selectMeetingList(meeting);
+ ExcelUtil<Meeting> util = new ExcelUtil<Meeting>(Meeting.class);
+ return util.exportExcel(list, "浼氳鏁版嵁");
+ }
+
+
+ /**
+ * 鏂板淇濆瓨浼氳
+ */
+ @ApiOperation("鏂板淇濆瓨浼氳")
+ @PostMapping("/add")
+ @ResponseBody
+ public AjaxResult addSave(Meeting meeting)
+ {
+ return toAjax(meetingService.insertMeeting(meeting));
+ }
+
+ @PostMapping("/edit")
+ @ResponseBody
+ public AjaxResult edit(Meeting meeting)
+ {
+ return toAjax(meetingService.updateMeeting(meeting));
+ }
+
+ /**
+ * 鍒犻櫎浼氳
+ */
+ @PostMapping( "/remove")
+ @ResponseBody
+ public AjaxResult remove(String ids)
+ {
+ return toAjax(meetingService.deleteMeetingByIds(ids));
+ }
+
+ /**
+ * 浼氳绛惧埌
+ */
+ @ApiOperation("浼氳绛惧埌")
+ @GetMapping("/signate")
+ @ResponseBody
+ public AjaxResult signate(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Meeting apply = meetingService.selectMeetingById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 濉啓浼氳绾
+ */
+ @ApiOperation("濉啓浼氳绾")
+ @GetMapping("/input")
+ @ResponseBody
+ public AjaxResult input(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Meeting apply = meetingService.selectMeetingById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+}
diff --git a/flowable/src/main/java/com/ycl/controller/ModelManageController.java b/flowable/src/main/java/com/ycl/controller/ModelManageController.java
new file mode 100644
index 0000000..d9c0959
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/ModelManageController.java
@@ -0,0 +1,161 @@
+package com.ycl.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.ycl.common.core.controller.BaseController;
+import com.ycl.common.core.domain.AjaxResult;
+import com.ycl.common.core.page.TableDataInfo;
+import com.ycl.common.utils.StringUtils;
+import com.ycl.system.domain.ModelParam;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.apache.poi.util.IOUtils;
+import org.flowable.bpmn.converter.BpmnXMLConverter;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.editor.constants.ModelDataJsonConstants;
+import org.flowable.editor.language.json.converter.BpmnJsonConverter;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.repository.Deployment;
+import org.flowable.engine.repository.Model;
+import org.flowable.engine.repository.ModelQuery;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+@Api(value = "妯″瀷绠$悊鎺ュ彛")
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/model/manage")
+public class ModelManageController extends BaseController {
+
+ private final RepositoryService repositoryService;
+
+ private final ObjectMapper objectMapper;
+
+ private static final String prefix = "flowable/manage";
+
+
+ @ApiOperation("鏌ヨ鎵�鏈夋ā鍨�")
+ @RequestMapping(value = "/modelLists", method = RequestMethod.POST)
+ @ResponseBody
+ public TableDataInfo modelLists(@RequestParam(required = false) String key, @RequestParam(required = false) String name,
+ Integer pageSize, Integer pageNum) {
+ ModelQuery query = repositoryService.createModelQuery();
+ if (StringUtils.isNotEmpty(key)) {
+ query.modelKey(key);
+ }
+ if (StringUtils.isNotEmpty(name)) {
+ query.modelName(name);
+ }
+ int start = (pageNum - 1) * pageSize;
+ List<Model> page = query.orderByCreateTime().desc().listPage(start, pageSize);
+ int total = repositoryService.createModelQuery().list().size();
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(0);
+ rspData.setRows(page);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+ /**
+ * 鏂板妯″瀷椤甸潰
+ * @return
+ */
+ @GetMapping("/add")
+ public String add()
+ {
+ return prefix + "/add";
+ }
+
+ /**
+ * 鏂板妯″瀷
+ */
+ @PostMapping("/add")
+ @ResponseBody
+ public AjaxResult addSave(ModelParam modelRequest) throws JsonProcessingException {
+ Model model = repositoryService.newModel();
+ model.setCategory(modelRequest.getCategory());
+ model.setKey(modelRequest.getKey());
+ ObjectNode modelNode = objectMapper.createObjectNode();
+ modelNode.put(ModelDataJsonConstants.MODEL_NAME, modelRequest.getName());
+ modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, modelRequest.getDescription());
+ modelNode.put(ModelDataJsonConstants.MODEL_REVISION, modelRequest.getVersion());
+ model.setMetaInfo(modelNode.toString());
+ model.setName(modelRequest.getName());
+ model.setVersion(modelRequest.getVersion());
+ ModelQuery modelQuery = repositoryService.createModelQuery();
+ List<Model> list = modelQuery.modelKey(modelRequest.getKey()).list();
+ if (list.size() > 0) {
+ return AjaxResult.error("妯″瀷鏍囪瘑涓嶈兘閲嶅");
+ } else {
+ // 淇濆瓨妯″瀷鍒癮ct_re_model琛�
+ repositoryService.saveModel(model);
+ HashMap<String, Object> content = new HashMap();
+ content.put("resourceId", model.getId());
+ HashMap<String, String> properties = new HashMap();
+ properties.put("process_id", modelRequest.getKey());
+ properties.put("name", modelRequest.getName());
+ properties.put("category", modelRequest.getCategory());
+ content.put("properties", properties);
+ HashMap<String, String> stencilset = new HashMap();
+ stencilset.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
+ content.put("stencilset", stencilset);
+ // 淇濆瓨妯″瀷鏂囦欢鍒癮ct_ge_bytearray琛�
+ repositoryService.addModelEditorSource(model.getId(), objectMapper.writeValueAsBytes(content));
+ return AjaxResult.success(model);
+ }
+ }
+
+ @RequestMapping("/deploy/{modelId}")
+ @ResponseBody
+ public AjaxResult modelDeployment(@PathVariable String modelId) {
+ try {
+ Model model = repositoryService.getModel(modelId);
+ byte[] modelData = repositoryService.getModelEditorSource(modelId);
+ JsonNode jsonNode = objectMapper.readTree(modelData);
+ BpmnModel bpmnModel = (new BpmnJsonConverter()).convertToBpmnModel(jsonNode);
+ Deployment deploy = repositoryService.createDeployment().category(model.getCategory())
+ .name(model.getName()).key(model.getKey())
+ .addBpmnModel(model.getKey() + ".bpmn20.xml", bpmnModel)
+ .deploy();
+ model.setDeploymentId(deploy.getId());
+ repositoryService.saveModel(model);
+ return AjaxResult.success();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return AjaxResult.error("娴佺▼鍥句笉鍚堣鑼冿紝璇烽噸鏂拌璁�");
+ }
+ }
+
+ @PostMapping("/remove/{modelId}")
+ @ResponseBody
+ public AjaxResult removeModel(@PathVariable String modelId) {
+ repositoryService.deleteModel(modelId);
+ return AjaxResult.success("鍒犻櫎鎴愬姛");
+ }
+
+ @GetMapping("/export/{modelId}")
+ public void modelExport(@PathVariable String modelId, HttpServletResponse response) throws IOException {
+ byte[] modelData = repositoryService.getModelEditorSource(modelId);
+ JsonNode jsonNode = objectMapper.readTree(modelData);
+ BpmnModel bpmnModel = (new BpmnJsonConverter()).convertToBpmnModel(jsonNode);
+ byte[] xmlBytes = (new BpmnXMLConverter()).convertToXML(bpmnModel, "UTF-8");
+ ByteArrayInputStream in = new ByteArrayInputStream(xmlBytes);
+ String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml";
+ response.setHeader("Content-Disposition","attachment;filename=" + filename);
+ response.setHeader("content-Type", "application/xml");
+ response.flushBuffer();
+ IOUtils.copy(in, response.getOutputStream());
+ }
+
+
+}
diff --git a/flowable/src/main/java/com/ycl/controller/PurchaseController.java b/flowable/src/main/java/com/ycl/controller/PurchaseController.java
new file mode 100644
index 0000000..558527f
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/PurchaseController.java
@@ -0,0 +1,217 @@
+package com.ycl.controller;
+
+import com.ycl.common.annotation.Log;
+import com.ycl.common.core.controller.BaseController;
+import com.ycl.common.core.domain.AjaxResult;
+import com.ycl.common.core.page.TableDataInfo;
+import com.ycl.common.enums.BusinessType;
+import com.ycl.common.utils.poi.ExcelUtil;
+import com.ycl.system.domain.Purchase;
+import com.ycl.service.IPurchaseService;
+import com.ycl.system.service.ISysUserService;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 閲囪喘Controller
+ *
+ * @author shenzhanwang
+ * @date 2022-05-28
+ */
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/purchase")
+public class PurchaseController extends BaseController
+{
+ private static final String prefix = "flowable/purchase";
+
+ private final IPurchaseService purchaseService;
+
+ private final ISysUserService userService;
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ @GetMapping()
+ public String purchase()
+ {
+ return prefix + "/purchase";
+ }
+
+ /**
+ * 鏌ヨ閲囪喘鍒楄〃
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public TableDataInfo list(Purchase purchase)
+ {
+ startPage();
+ List<Purchase> list = purchaseService.selectPurchaseList(purchase);
+ return getDataTable(list);
+ }
+
+ /**
+ * 瀵煎嚭閲囪喘鍒楄〃
+ */
+ @PostMapping("/export")
+ @ResponseBody
+ public AjaxResult export(Purchase purchase)
+ {
+ List<Purchase> list = purchaseService.selectPurchaseList(purchase);
+ ExcelUtil<Purchase> util = new ExcelUtil<Purchase>(Purchase.class);
+ return util.exportExcel(list, "閲囪喘鏁版嵁");
+ }
+
+
+ /**
+ * 鏂板淇濆瓨閲囪喘
+ */
+ @ApiOperation("鏂板淇濆瓨閲囪喘")
+ @Log(title = "閲囪喘", businessType = BusinessType.INSERT)
+ @PostMapping("/add")
+ @ResponseBody
+ public AjaxResult addSave(Purchase purchase)
+ {
+ purchase.setApplytime(new Date());
+ return toAjax(purchaseService.insertPurchase(purchase));
+ }
+
+ @PostMapping("/edit")
+ @ResponseBody
+ public AjaxResult edit(Purchase purchase)
+ {
+ return toAjax(purchaseService.updatePurchase(purchase));
+ }
+
+ /**
+ * 鍒犻櫎閲囪喘
+ */
+ @Log(title = "閲囪喘", businessType = BusinessType.DELETE)
+ @PostMapping( "/remove")
+ @ResponseBody
+ public AjaxResult remove(String ids)
+ {
+ return toAjax(purchaseService.deletePurchaseByIds(ids));
+ }
+
+ /**
+ * 閲囪喘缁忕悊瀹℃壒
+ */
+ @ApiOperation("閲囪喘缁忕悊瀹℃壒")
+ @GetMapping("/purchasemanager")
+ @ResponseBody
+ public AjaxResult purchasemanager(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Purchase apply = purchaseService.selectPurchaseById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 璐㈠姟瀹℃壒
+ */
+ @ApiOperation("璐㈠姟瀹℃壒")
+ @GetMapping("/finance")
+ @ResponseBody
+ public AjaxResult finance(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Purchase apply = purchaseService.selectPurchaseById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 鎬荤粡鐞嗗鎵�
+ */
+ @ApiOperation("鎬荤粡鐞嗗鎵�")
+ @GetMapping("/manager")
+ @ResponseBody
+ public AjaxResult manager(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Purchase apply = purchaseService.selectPurchaseById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 鍑虹撼浠樻
+ */
+ @ApiOperation("鍑虹撼浠樻")
+ @GetMapping("/pay")
+ @ResponseBody
+ public AjaxResult pay(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Purchase apply = purchaseService.selectPurchaseById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 鏀惰揣纭
+ */
+ @ApiOperation("鏀惰揣纭")
+ @GetMapping("/receiveitem")
+ @ResponseBody
+ public AjaxResult receiveitem(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Purchase apply = purchaseService.selectPurchaseById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+
+ /**
+ * 璋冩暣鐢宠
+ */
+ @ApiOperation("璋冩暣鐢宠")
+ @GetMapping("/updateapply")
+ @ResponseBody
+ public AjaxResult updateapply(String taskid)
+ {
+ Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
+ String processId = t.getProcessInstanceId();
+ ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ if (p != null) {
+ Purchase apply = purchaseService.selectPurchaseById(Long.parseLong(p.getBusinessKey()));
+ return AjaxResult.success(apply);
+ }
+ return AjaxResult.error("娴佺▼涓嶅瓨鍦�");
+ }
+}
diff --git a/flowable/src/main/java/com/ycl/controller/TaskController.java b/flowable/src/main/java/com/ycl/controller/TaskController.java
new file mode 100644
index 0000000..8746d9e
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/controller/TaskController.java
@@ -0,0 +1,208 @@
+package com.ycl.controller;
+
+import com.ycl.common.core.controller.BaseController;
+import com.ycl.common.core.domain.AjaxResult;
+import com.ycl.common.core.domain.entity.SysUser;
+import com.ycl.common.core.page.TableDataInfo;
+import com.ycl.common.utils.SecurityUtils;
+import com.ycl.common.utils.StringUtils;
+import com.ycl.system.domain.TaskInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.flowable.engine.FormService;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.history.HistoricActivityInstance;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.engine.task.Comment;
+import org.flowable.task.api.Task;
+import org.flowable.task.api.TaskQuery;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Api(value = "寰呭姙浠诲姟鎺ュ彛")
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/task/manage")
+public class TaskController extends BaseController {
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final FormService formService;
+
+ private final HistoryService historyService;
+
+ private static final String prefix = "flowable/task";
+
+ @GetMapping("/mytask")
+ public String mytasks()
+ {
+ return prefix + "/mytasks";
+ }
+
+ @GetMapping("/alltasks")
+ public String alltasks()
+ {
+ return prefix + "/alltasks";
+ }
+
+ /**
+ * 鏌ヨ鎴戠殑寰呭姙浠诲姟鍒楄〃
+ */
+ @ApiOperation("鏌ヨ鎴戠殑寰呭姙浠诲姟鍒楄〃")
+ @PostMapping("/mylist")
+ @ResponseBody
+ public TableDataInfo mylist(TaskInfo param)
+ {
+ SysUser user = SecurityUtils.getLoginUser().getUser();
+ String username = getUsername();
+ TaskQuery condition = taskService.createTaskQuery().taskAssignee(username);
+ if (StringUtils.isNotEmpty(param.getTaskName())) {
+ condition.taskName(param.getTaskName());
+ }
+ if (StringUtils.isNotEmpty(param.getProcessName())) {
+ condition.processDefinitionName(param.getProcessName());
+ }
+ // 杩囨护鎺夋祦绋嬫寕璧风殑寰呭姙浠诲姟
+ int total = condition.active().orderByTaskCreateTime().desc().list().size();
+ int start = (param.getPageNum()-1) * param.getPageSize();
+ List<Task> taskList = condition.active().orderByTaskCreateTime().desc().listPage(start, param.getPageSize());
+ List<TaskInfo> tasks = new ArrayList<>();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ taskList.stream().forEach(a->{
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(a.getProcessInstanceId()).singleResult();
+ TaskInfo info = new TaskInfo();
+ info.setAssignee(a.getAssignee());
+ info.setBusinessKey(process.getBusinessKey());
+ info.setCreateTime(sdf.format(a.getCreateTime()));
+ info.setTaskName(a.getName());
+ info.setExecutionId(a.getExecutionId());
+ info.setProcessInstanceId(a.getProcessInstanceId());
+ info.setProcessName(process.getProcessDefinitionName());
+ info.setStarter(process.getStartUserId());
+ info.setStartTime(sdf.format(process.getStartTime()));
+ info.setTaskId(a.getId());
+ String formKey = formService.getTaskFormData(a.getId()).getFormKey();
+ info.setFormKey(formKey);
+ tasks.add(info);
+ });
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(0);
+ rspData.setRows(tasks);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+ /**
+ * 鏌ヨ鎵�鏈夊緟鍔炰换鍔″垪琛�
+ */
+ @ApiOperation("鏌ヨ鎵�鏈夊緟鍔炰换鍔″垪琛�")
+ @PostMapping("/alllist")
+ @ResponseBody
+ public TableDataInfo alllist(TaskInfo param)
+ {
+ TaskQuery condition = taskService.createTaskQuery();
+ if (StringUtils.isNotEmpty(param.getTaskName())) {
+ condition.taskName(param.getTaskName());
+ }
+ if (StringUtils.isNotEmpty(param.getProcessName())) {
+ condition.processDefinitionName(param.getProcessName());
+ }
+ int total = condition.active().orderByTaskCreateTime().desc().list().size();
+ int start = (param.getPageNum()-1) * param.getPageSize();
+ List<Task> taskList = condition.active().orderByTaskCreateTime().desc().listPage(start, param.getPageSize());
+ List<TaskInfo> tasks = new ArrayList<>();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ taskList.stream().forEach(a->{
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(a.getProcessInstanceId()).singleResult();
+ TaskInfo info = new TaskInfo();
+ info.setAssignee(a.getAssignee());
+ info.setBusinessKey(process.getBusinessKey());
+ info.setCreateTime(sdf.format(a.getCreateTime()));
+ info.setTaskName(a.getName());
+ info.setExecutionId(a.getExecutionId());
+ info.setProcessInstanceId(a.getProcessInstanceId());
+ info.setProcessName(process.getProcessDefinitionName());
+ info.setStarter(process.getStartUserId());
+ info.setStartTime(sdf.format(process.getStartTime()));
+ info.setTaskId(a.getId());
+ String formKey = formService.getTaskFormData(a.getId()).getFormKey();
+ info.setFormKey(formKey);
+ tasks.add(info);
+ });
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(0);
+ rspData.setRows(tasks);
+ rspData.setTotal(total);
+ return rspData;
+ }
+
+ /**
+ * 鐢╰askid鏌ヨformkey
+ **/
+ @ApiOperation("鐢╰askid鏌ヨformkey")
+ @PostMapping("/forminfo/{taskId}")
+ @ResponseBody
+ public AjaxResult alllist(@PathVariable String taskId)
+ {
+ String formKey = formService.getTaskFormData(taskId).getFormKey();
+ return AjaxResult.success(formKey);
+ }
+
+ @ApiOperation("鍔炵悊涓�涓敤鎴蜂换鍔�")
+ @RequestMapping(value = "/completeTask/{taskId}", method = RequestMethod.POST)
+ @ResponseBody
+ public AjaxResult completeTask(@PathVariable("taskId") String taskId, @RequestBody(required=false) Map<String, Object> variables) {
+ SysUser user = SecurityUtils.getLoginUser().getUser();
+ String username = getUsername();
+ taskService.setAssignee(taskId, username);
+ // 鏌ュ嚭娴佺▼瀹炰緥id
+ String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();
+ if (variables == null) {
+ taskService.complete(taskId);
+ } else {
+ // 娣诲姞瀹℃壒鎰忚
+ if (variables.get("comment") != null) {
+ taskService.addComment(taskId, processInstanceId, (String) variables.get("comment"));
+ variables.remove("comment");
+ }
+ taskService.complete(taskId, variables);
+ }
+ return AjaxResult.success();
+ }
+
+ @ApiOperation("浠诲姟鍔炵悊鏃堕棿杞�")
+ @RequestMapping(value = "/history/{taskId}", method = RequestMethod.GET)
+ @ResponseBody
+ public List<TaskInfo> history(@PathVariable String taskId) {
+ String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();
+ List<HistoricActivityInstance> history = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).activityType("userTask").orderByHistoricActivityInstanceStartTime().asc().list();
+ List<TaskInfo> infos = new ArrayList<>();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ history.stream().forEach(h->{
+ TaskInfo info = new TaskInfo();
+ info.setProcessInstanceId(h.getProcessInstanceId());
+ info.setStartTime(sdf.format(h.getStartTime()));
+ if (h.getEndTime() != null) {
+ info.setEndTime(sdf.format(h.getEndTime()));
+ }
+ info.setAssignee(h.getAssignee());
+ info.setTaskName(h.getActivityName());
+ List<Comment> comments = taskService.getTaskComments(h.getTaskId());
+ if (comments.size() > 0) {
+ info.setComment(comments.get(0).getFullMessage());
+ }
+ infos.add(info);
+ });
+ return infos;
+ }
+}
diff --git a/system/src/main/java/com/ycl/system/mapper/ActRuExecutionMapper.java b/flowable/src/main/java/com/ycl/mapper/ActRuExecutionMapper.java
similarity index 97%
rename from system/src/main/java/com/ycl/system/mapper/ActRuExecutionMapper.java
rename to flowable/src/main/java/com/ycl/mapper/ActRuExecutionMapper.java
index 3ecaced..e1ac6b7 100644
--- a/system/src/main/java/com/ycl/system/mapper/ActRuExecutionMapper.java
+++ b/flowable/src/main/java/com/ycl/mapper/ActRuExecutionMapper.java
@@ -1,4 +1,4 @@
-package com.ycl.system.mapper;
+package com.ycl.mapper;
import java.util.List;
import com.ycl.system.domain.ActRuExecution;
diff --git a/system/src/main/java/com/ycl/system/mapper/LeaveapplyMapper.java b/flowable/src/main/java/com/ycl/mapper/LeaveapplyMapper.java
similarity index 96%
rename from system/src/main/java/com/ycl/system/mapper/LeaveapplyMapper.java
rename to flowable/src/main/java/com/ycl/mapper/LeaveapplyMapper.java
index 442cc67..21946c5 100644
--- a/system/src/main/java/com/ycl/system/mapper/LeaveapplyMapper.java
+++ b/flowable/src/main/java/com/ycl/mapper/LeaveapplyMapper.java
@@ -1,4 +1,4 @@
-package com.ycl.system.mapper;
+package com.ycl.mapper;
import java.util.List;
import com.ycl.system.domain.Leaveapply;
diff --git a/system/src/main/java/com/ycl/system/mapper/MeetingMapper.java b/flowable/src/main/java/com/ycl/mapper/MeetingMapper.java
similarity index 96%
rename from system/src/main/java/com/ycl/system/mapper/MeetingMapper.java
rename to flowable/src/main/java/com/ycl/mapper/MeetingMapper.java
index f0ba6a4..5c1209d 100644
--- a/system/src/main/java/com/ycl/system/mapper/MeetingMapper.java
+++ b/flowable/src/main/java/com/ycl/mapper/MeetingMapper.java
@@ -1,4 +1,4 @@
-package com.ycl.system.mapper;
+package com.ycl.mapper;
import java.util.List;
import com.ycl.system.domain.Meeting;
diff --git a/system/src/main/java/com/ycl/system/mapper/PurchaseMapper.java b/flowable/src/main/java/com/ycl/mapper/PurchaseMapper.java
similarity index 96%
rename from system/src/main/java/com/ycl/system/mapper/PurchaseMapper.java
rename to flowable/src/main/java/com/ycl/mapper/PurchaseMapper.java
index e390398..54e0a7a 100644
--- a/system/src/main/java/com/ycl/system/mapper/PurchaseMapper.java
+++ b/flowable/src/main/java/com/ycl/mapper/PurchaseMapper.java
@@ -1,4 +1,4 @@
-package com.ycl.system.mapper;
+package com.ycl.mapper;
import java.util.List;
import com.ycl.system.domain.Purchase;
diff --git a/system/src/main/java/com/ycl/system/service/ILeaveapplyService.java b/flowable/src/main/java/com/ycl/service/ILeaveapplyService.java
similarity index 96%
rename from system/src/main/java/com/ycl/system/service/ILeaveapplyService.java
rename to flowable/src/main/java/com/ycl/service/ILeaveapplyService.java
index 50a76a3..85fe0dc 100644
--- a/system/src/main/java/com/ycl/system/service/ILeaveapplyService.java
+++ b/flowable/src/main/java/com/ycl/service/ILeaveapplyService.java
@@ -1,4 +1,4 @@
-package com.ycl.system.service;
+package com.ycl.service;
import java.util.List;
import com.ycl.system.domain.Leaveapply;
diff --git a/system/src/main/java/com/ycl/system/service/IMeetingService.java b/flowable/src/main/java/com/ycl/service/IMeetingService.java
similarity index 96%
rename from system/src/main/java/com/ycl/system/service/IMeetingService.java
rename to flowable/src/main/java/com/ycl/service/IMeetingService.java
index 3d12e1c..bef2b9e 100644
--- a/system/src/main/java/com/ycl/system/service/IMeetingService.java
+++ b/flowable/src/main/java/com/ycl/service/IMeetingService.java
@@ -1,4 +1,4 @@
-package com.ycl.system.service;
+package com.ycl.service;
import java.util.List;
import com.ycl.system.domain.Meeting;
diff --git a/system/src/main/java/com/ycl/system/service/IPurchaseService.java b/flowable/src/main/java/com/ycl/service/IPurchaseService.java
similarity index 89%
rename from system/src/main/java/com/ycl/system/service/IPurchaseService.java
rename to flowable/src/main/java/com/ycl/service/IPurchaseService.java
index f553b3b..7986e61 100644
--- a/system/src/main/java/com/ycl/system/service/IPurchaseService.java
+++ b/flowable/src/main/java/com/ycl/service/IPurchaseService.java
@@ -1,19 +1,19 @@
-package com.ycl.system.service;
+package com.ycl.service;
import java.util.List;
import com.ycl.system.domain.Purchase;
/**
* 閲囪喘Service鎺ュ彛
- *
+ *
* @author shenzhanwang
* @date 2022-05-28
*/
-public interface IPurchaseService
+public interface IPurchaseService
{
/**
* 鏌ヨ閲囪喘
- *
+ *
* @param id 閲囪喘涓婚敭
* @return 閲囪喘
*/
@@ -21,7 +21,7 @@
/**
* 鏌ヨ閲囪喘鍒楄〃
- *
+ *
* @param purchase 閲囪喘
* @return 閲囪喘闆嗗悎
*/
@@ -29,7 +29,7 @@
/**
* 鏂板閲囪喘
- *
+ *
* @param purchase 閲囪喘
* @return 缁撴灉
*/
@@ -37,7 +37,7 @@
/**
* 淇敼閲囪喘
- *
+ *
* @param purchase 閲囪喘
* @return 缁撴灉
*/
@@ -45,7 +45,7 @@
/**
* 鎵归噺鍒犻櫎閲囪喘
- *
+ *
* @param ids 闇�瑕佸垹闄ょ殑閲囪喘涓婚敭闆嗗悎
* @return 缁撴灉
*/
@@ -53,7 +53,7 @@
/**
* 鍒犻櫎閲囪喘淇℃伅
- *
+ *
* @param id 閲囪喘涓婚敭
* @return 缁撴灉
*/
diff --git a/flowable/src/main/java/com/ycl/service/impl/LeaveapplyServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/LeaveapplyServiceImpl.java
new file mode 100644
index 0000000..9b77f5f
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/service/impl/LeaveapplyServiceImpl.java
@@ -0,0 +1,130 @@
+package com.ycl.service.impl;
+
+import com.ycl.common.core.text.Convert;
+import com.ycl.service.ILeaveapplyService;
+import com.ycl.system.domain.Leaveapply;
+import com.ycl.mapper.LeaveapplyMapper;
+import lombok.RequiredArgsConstructor;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.IdentityService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 璇峰亣Service涓氬姟灞傚鐞�
+ *
+ * @author shenzhanwang
+ * @date 2022-04-02
+ */
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class LeaveapplyServiceImpl implements ILeaveapplyService {
+
+ private final LeaveapplyMapper leaveapplyMapper;
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final IdentityService identityService;
+
+ private final HistoryService historyService;
+
+ /**
+ * 鏌ヨ璇峰亣
+ *
+ * @param id 璇峰亣涓婚敭
+ * @return 璇峰亣
+ */
+ @Override
+ public Leaveapply selectLeaveapplyById(Long id) {
+ return leaveapplyMapper.selectLeaveapplyById(id);
+ }
+
+ /**
+ * 鏌ヨ璇峰亣鍒楄〃
+ *
+ * @param leaveapply 璇峰亣
+ * @return 璇峰亣
+ */
+ @Override
+ public List<Leaveapply> selectLeaveapplyList(Leaveapply leaveapply) {
+ return leaveapplyMapper.selectLeaveapplyList(leaveapply);
+ }
+
+ /**
+ * 鏂板璇峰亣
+ *
+ * @param leaveapply 璇峰亣
+ * @return 缁撴灉
+ */
+ @Override
+ public int insertLeaveapply(Leaveapply leaveapply) {
+ int rows = leaveapplyMapper.insertLeaveapply(leaveapply);
+ // 鍙戣捣璇峰亣娴佺▼
+ identityService.setAuthenticatedUserId(leaveapply.getUserId());
+ HashMap<String, Object> variables = new HashMap<>();
+ variables.put("applyuserid", leaveapply.getUserId());
+ variables.put("deptleader", leaveapply.getDeptleader());
+ runtimeService.startProcessInstanceByKey("leave", String.valueOf(leaveapply.getId()), variables);
+ // 鑷姩瀹屾垚绗竴涓换鍔�
+ Task autoTask = taskService.createTaskQuery().processDefinitionKey("leave").processInstanceBusinessKey(String.valueOf(leaveapply.getId())).singleResult();
+ taskService.complete(autoTask.getId());
+ return rows;
+ }
+
+ /**
+ * 淇敼璇峰亣
+ *
+ * @param leaveapply 璇峰亣
+ * @return 缁撴灉
+ */
+ @Override
+ public int updateLeaveapply(Leaveapply leaveapply) {
+ return leaveapplyMapper.updateLeaveapply(leaveapply);
+ }
+
+ /**
+ * 鎵归噺鍒犻櫎璇峰亣
+ *
+ * @param ids 闇�瑕佸垹闄ょ殑璇峰亣涓婚敭
+ * @return 缁撴灉
+ */
+ @Override
+ public int deleteLeaveapplyByIds(String ids) {
+ String[] keys = Convert.toStrArray(ids);
+ for (String key : keys) {
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processDefinitionKey("leave").processInstanceBusinessKey(key).singleResult();
+ if (process != null) {
+ runtimeService.deleteProcessInstance(process.getId(), "鍒犻櫎");
+ }
+ // 鍒犻櫎鍘嗗彶鏁版嵁
+ HistoricProcessInstance history = historyService.createHistoricProcessInstanceQuery().processDefinitionKey("leave").processInstanceBusinessKey(key).singleResult();
+ if (history != null) {
+ historyService.deleteHistoricProcessInstance(history.getId());
+ }
+ leaveapplyMapper.deleteLeaveapplyById(Long.parseLong(key));
+ }
+ return keys.length;
+ }
+
+ /**
+ * 鍒犻櫎璇峰亣淇℃伅
+ *
+ * @param id 璇峰亣涓婚敭
+ * @return 缁撴灉
+ */
+ @Override
+ public int deleteLeaveapplyById(Long id) {
+ return leaveapplyMapper.deleteLeaveapplyById(id);
+ }
+}
diff --git a/flowable/src/main/java/com/ycl/service/impl/MeetingServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/MeetingServiceImpl.java
new file mode 100644
index 0000000..98793b9
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/service/impl/MeetingServiceImpl.java
@@ -0,0 +1,131 @@
+package com.ycl.service.impl;
+
+import com.ycl.common.core.text.Convert;
+import com.ycl.service.IMeetingService;
+import com.ycl.system.domain.Meeting;
+import com.ycl.mapper.MeetingMapper;
+import com.ycl.mapper.PurchaseMapper;
+import lombok.RequiredArgsConstructor;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.IdentityService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 浼氳Service涓氬姟灞傚鐞�
+ *
+ * @author shenzhanwang
+ * @date 2022-05-30
+ */
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class MeetingServiceImpl implements IMeetingService {
+
+ private final MeetingMapper meetingMapper;
+
+ private final PurchaseMapper purchaseMapper;
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final IdentityService identityService;
+
+ private final HistoryService historyService;
+
+ /**
+ * 鏌ヨ浼氳
+ *
+ * @param id 浼氳涓婚敭
+ * @return 浼氳
+ */
+ @Override
+ public Meeting selectMeetingById(Long id) {
+ return meetingMapper.selectMeetingById(id);
+ }
+
+ /**
+ * 鏌ヨ浼氳鍒楄〃
+ *
+ * @param meeting 浼氳
+ * @return 浼氳
+ */
+ @Override
+ public List<Meeting> selectMeetingList(Meeting meeting) {
+ return meetingMapper.selectMeetingList(meeting);
+ }
+
+ /**
+ * 鏂板浼氳
+ *
+ * @param meeting 浼氳
+ * @return 缁撴灉
+ */
+ @Override
+ public int insertMeeting(Meeting meeting) {
+ int row = meetingMapper.insertMeeting(meeting);
+ // 鍚姩浼氳娴佺▼
+ identityService.setAuthenticatedUserId(meeting.getHost());
+ HashMap<String, Object> variables = new HashMap<>();
+ variables.put("host", meeting.getHost());
+ String[] person = meeting.getPeoplelist().split(",");
+ variables.put("people", Arrays.asList(person));
+ runtimeService.startProcessInstanceByKey("meeting", String.valueOf(meeting.getId()), variables);
+ return row;
+ }
+
+ /**
+ * 淇敼浼氳
+ *
+ * @param meeting 浼氳
+ * @return 缁撴灉
+ */
+ @Override
+ public int updateMeeting(Meeting meeting) {
+ return meetingMapper.updateMeeting(meeting);
+ }
+
+ /**
+ * 鎵归噺鍒犻櫎浼氳
+ *
+ * @param ids 闇�瑕佸垹闄ょ殑浼氳涓婚敭
+ * @return 缁撴灉
+ */
+ @Override
+ public int deleteMeetingByIds(String ids) {
+ String[] keys = Convert.toStrArray(ids);
+ for (String key : keys) {
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processDefinitionKey("meeting").processInstanceBusinessKey(key).singleResult();
+ if (process != null) {
+ runtimeService.deleteProcessInstance(process.getId(), "鍒犻櫎");
+ }
+ // 鍒犻櫎鍘嗗彶鏁版嵁
+ HistoricProcessInstance history = historyService.createHistoricProcessInstanceQuery().processDefinitionKey("meeting").processInstanceBusinessKey(key).singleResult();
+ if (history != null) {
+ historyService.deleteHistoricProcessInstance(history.getId());
+ }
+ meetingMapper.deleteMeetingByIds(Convert.toStrArray(ids));
+ }
+ return keys.length;
+ }
+
+ /**
+ * 鍒犻櫎浼氳淇℃伅
+ *
+ * @param id 浼氳涓婚敭
+ * @return 缁撴灉
+ */
+ @Override
+ public int deleteMeetingById(Long id) {
+ return meetingMapper.deleteMeetingById(id);
+ }
+}
diff --git a/flowable/src/main/java/com/ycl/service/impl/PurchaseServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/PurchaseServiceImpl.java
new file mode 100644
index 0000000..f9987db
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/service/impl/PurchaseServiceImpl.java
@@ -0,0 +1,130 @@
+package com.ycl.service.impl;
+
+import com.ycl.common.core.text.Convert;
+import com.ycl.service.IPurchaseService;
+import com.ycl.system.domain.Purchase;
+import com.ycl.mapper.PurchaseMapper;
+import lombok.RequiredArgsConstructor;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.IdentityService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 閲囪喘Service涓氬姟灞傚鐞�
+ *
+ * @author shenzhanwang
+ * @date 2022-05-28
+ */
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class PurchaseServiceImpl implements IPurchaseService {
+
+ private final PurchaseMapper purchaseMapper;
+
+ private final RuntimeService runtimeService;
+
+ private final TaskService taskService;
+
+ private final IdentityService identityService;
+
+ private final HistoryService historyService;
+
+ /**
+ * 鏌ヨ閲囪喘
+ *
+ * @param id 閲囪喘涓婚敭
+ * @return 閲囪喘
+ */
+ @Override
+ public Purchase selectPurchaseById(Long id) {
+ return purchaseMapper.selectPurchaseById(id);
+ }
+
+ /**
+ * 鏌ヨ閲囪喘鍒楄〃
+ *
+ * @param purchase 閲囪喘
+ * @return 閲囪喘
+ */
+ @Override
+ public List<Purchase> selectPurchaseList(Purchase purchase) {
+ return purchaseMapper.selectPurchaseList(purchase);
+ }
+
+ /**
+ * 鏂板閲囪喘
+ *
+ * @param purchase 閲囪喘
+ * @return 缁撴灉
+ */
+ @Override
+ public int insertPurchase(Purchase purchase) {
+ int row = purchaseMapper.insertPurchase(purchase);
+ // 鍚姩閲囪喘娴佺▼
+ identityService.setAuthenticatedUserId(purchase.getApplyer());
+ HashMap<String, Object> variables = new HashMap<>();
+ variables.put("starter", purchase.getApplyer());
+ variables.put("purchasemanager", purchase.getPurchasemanager());
+ variables.put("financeName", purchase.getFinanceName());
+ variables.put("pay", purchase.getPay());
+ variables.put("managerName", purchase.getManagerName());
+ variables.put("money", Double.parseDouble(purchase.getTotal()));
+ runtimeService.startProcessInstanceByKey("purchase", String.valueOf(purchase.getId()), variables);
+ return row;
+ }
+
+ /**
+ * 淇敼閲囪喘
+ *
+ * @param purchase 閲囪喘
+ * @return 缁撴灉
+ */
+ @Override
+ public int updatePurchase(Purchase purchase) {
+ return purchaseMapper.updatePurchase(purchase);
+ }
+
+ /**
+ * 鎵归噺鍒犻櫎閲囪喘
+ *
+ * @param ids 闇�瑕佸垹闄ょ殑閲囪喘涓婚敭
+ * @return 缁撴灉
+ */
+ @Override
+ public int deletePurchaseByIds(String ids) {
+ String[] keys = Convert.toStrArray(ids);
+ for (String key : keys) {
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processDefinitionKey("purchase").processInstanceBusinessKey(key).singleResult();
+ if (process != null) {
+ runtimeService.deleteProcessInstance(process.getId(), "鍒犻櫎");
+ }
+ // 鍒犻櫎鍘嗗彶鏁版嵁
+ HistoricProcessInstance history = historyService.createHistoricProcessInstanceQuery().processDefinitionKey("purchase").processInstanceBusinessKey(key).singleResult();
+ if (history != null) {
+ historyService.deleteHistoricProcessInstance(history.getId());
+ }
+ purchaseMapper.deletePurchaseByIds(Convert.toStrArray(ids));
+ }
+ return keys.length;
+ }
+
+ /**
+ * 鍒犻櫎閲囪喘淇℃伅
+ *
+ * @param id 閲囪喘涓婚敭
+ * @return 缁撴灉
+ */
+ @Override
+ public int deletePurchaseById(Long id) {
+ return purchaseMapper.deletePurchaseById(id);
+ }
+}
diff --git a/start/src/main/java/com/ycl/web/util/ActivitiTracingChart.java b/flowable/src/main/java/com/ycl/util/ActivitiTracingChart.java
similarity index 92%
rename from start/src/main/java/com/ycl/web/util/ActivitiTracingChart.java
rename to flowable/src/main/java/com/ycl/util/ActivitiTracingChart.java
index 080bd1f..bb40ff2 100644
--- a/start/src/main/java/com/ycl/web/util/ActivitiTracingChart.java
+++ b/flowable/src/main/java/com/ycl/util/ActivitiTracingChart.java
@@ -1,10 +1,7 @@
-package com.ycl.web.util;
+package com.ycl.util;
-import com.ycl.framework.web.domain.server.Sys;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.BpmnModel;
-import org.flowable.bpmn.model.FlowNode;
-import org.flowable.bpmn.model.SequenceFlow;
import org.flowable.common.engine.impl.util.IoUtil;
import org.flowable.engine.HistoryService;
import org.flowable.engine.ProcessEngineConfiguration;
@@ -15,16 +12,13 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
/**
* 娴佺▼杩借釜鍥�
diff --git a/system/src/main/resources/mapper/system/ActRuExecutionMapper.xml b/flowable/src/main/resources/mapper/ActRuExecutionMapper.xml
similarity index 99%
rename from system/src/main/resources/mapper/system/ActRuExecutionMapper.xml
rename to flowable/src/main/resources/mapper/ActRuExecutionMapper.xml
index d882dcf..cfab5de 100644
--- a/system/src/main/resources/mapper/system/ActRuExecutionMapper.xml
+++ b/flowable/src/main/resources/mapper/ActRuExecutionMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ycl.system.mapper.ActRuExecutionMapper">
+<mapper namespace="com.ycl.mapper.ActRuExecutionMapper">
<resultMap type="ActRuExecution" id="ActRuExecutionResult">
<result property="id" column="ID_" />
diff --git a/system/src/main/resources/mapper/system/LeaveapplyMapper.xml b/flowable/src/main/resources/mapper/LeaveapplyMapper.xml
similarity index 98%
rename from system/src/main/resources/mapper/system/LeaveapplyMapper.xml
rename to flowable/src/main/resources/mapper/LeaveapplyMapper.xml
index acee100..9fb53f6 100644
--- a/system/src/main/resources/mapper/system/LeaveapplyMapper.xml
+++ b/flowable/src/main/resources/mapper/LeaveapplyMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ycl.system.mapper.LeaveapplyMapper">
+<mapper namespace="com.ycl.mapper.LeaveapplyMapper">
<resultMap type="Leaveapply" id="LeaveapplyResult">
<result property="id" column="id" />
diff --git a/system/src/main/resources/mapper/system/MeetingMapper.xml b/flowable/src/main/resources/mapper/MeetingMapper.xml
similarity index 97%
rename from system/src/main/resources/mapper/system/MeetingMapper.xml
rename to flowable/src/main/resources/mapper/MeetingMapper.xml
index 3380442..617cf9a 100644
--- a/system/src/main/resources/mapper/system/MeetingMapper.xml
+++ b/flowable/src/main/resources/mapper/MeetingMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ycl.system.mapper.MeetingMapper">
+<mapper namespace="com.ycl.mapper.MeetingMapper">
<resultMap type="Meeting" id="MeetingResult">
<result property="id" column="id" />
diff --git a/system/src/main/resources/mapper/system/PurchaseMapper.xml b/flowable/src/main/resources/mapper/PurchaseMapper.xml
similarity index 97%
rename from system/src/main/resources/mapper/system/PurchaseMapper.xml
rename to flowable/src/main/resources/mapper/PurchaseMapper.xml
index bada1c2..73097d8 100644
--- a/system/src/main/resources/mapper/system/PurchaseMapper.xml
+++ b/flowable/src/main/resources/mapper/PurchaseMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ycl.system.mapper.PurchaseMapper">
+<mapper namespace="com.ycl.mapper.PurchaseMapper">
<resultMap type="Purchase" id="PurchaseResult">
<result property="id" column="id" />
--
Gitblit v1.8.0