From 8b66e84f1e4929c5ffabe0153ca580b9dacaa8b4 Mon Sep 17 00:00:00 2001 From: wenc000 <450292408@qq.com> Date: Wed, 25 Mar 2020 10:37:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E7=A8=8Bdemo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/deploy/DeployController.java | 118 ++++++++++++++++++ .../service/deploy/IDeployProcessService.java | 26 ++++ .../deploy/impl/DeployProcessServiceImpl.java | 118 +++++++++++++++++- src/main/resources/application-test.yml | 10 +- src/main/resources/bpmn/leave.bpmn | 81 ++++++------ src/main/resources/bpmn/leave.png | Bin 8593 -> 0 bytes src/main/resources/bpmn/leavefull.bpmn | 118 ++++++++++++++++++ 7 files changed, 424 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/cm/inspection/controller/deploy/DeployController.java delete mode 100644 src/main/resources/bpmn/leave.png create mode 100644 src/main/resources/bpmn/leavefull.bpmn diff --git a/src/main/java/com/cm/inspection/controller/deploy/DeployController.java b/src/main/java/com/cm/inspection/controller/deploy/DeployController.java new file mode 100644 index 0000000..4a453b5 --- /dev/null +++ b/src/main/java/com/cm/inspection/controller/deploy/DeployController.java @@ -0,0 +1,118 @@ +package com.cm.inspection.controller.deploy; + +import com.alibaba.fastjson.JSONArray; +import com.cm.common.constants.ISystemConstant; +import com.cm.common.result.SuccessResult; +import com.cm.common.result.SuccessResultData; +import com.cm.inspection.service.deploy.IDeployProcessService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: DemoController + * @Description: + * @Author: WangGeng + * @Date: 2020/3/24 9:41 上午 + * @Version: 1.0 + **/ +@RestController +@RequestMapping(ISystemConstant.API_PREFIX + "/deploy") +public class DeployController { + + @Autowired + private IDeployProcessService deployProcessService; + + /** + * 部署流程 + * + * @param processName + * @return + */ + @GetMapping("getdeployprocess/{processName}") + public SuccessResult getDeployProcess(@PathVariable("processName") String processName) { + return deployProcessService.deployProcess(processName); + } + + /** + * 执行流程 + * + * @param processId + * @return + */ + @GetMapping("getstartprocess/{processId}") + public SuccessResult getStartProcess(@PathVariable("processId") String processId) { + return deployProcessService.startProcess(processId); + } + + /** + * 通过代理人查看任务 + * + * @param assignee + * @return + */ + @GetMapping("listtaskbyassignee") + public JSONArray listTaskByAssignee(String assignee) { + return deployProcessService.listTaskByAssignee(assignee); + } + + /** + * 完成任务 + * + * @param taskId + * @return + */ + @GetMapping("gettaskcompletebytaskid/{taskId}") + public SuccessResult getTaskCompleteByTaskId(@PathVariable("taskId") String taskId) { + return deployProcessService.saveTaskCompleteByTaskId(taskId); + } + + @PostMapping("saveleavefulltaskcompletebytaskidanddays/{taskId}") + public SuccessResult saveLeaveFullTaskCompleteByTaskIdAndDays(@PathVariable("taskId") String taskId, @RequestParam("days") Integer days) { + return deployProcessService.saveLeaveFullTaskCompleteByTaskIdAndDays(taskId, days); + } + + /** + * 正在运行的任务 + * + * @return + */ + @GetMapping("listtask") + public JSONArray listTask() { + return deployProcessService.listTask(); + } + + /** + * 实例状态 + * + * @param processId + * @return + */ + @GetMapping("getinstancestatus/{processId}") + public SuccessResultData getInstanceStatus(@PathVariable("processId") String processId) { + return deployProcessService.getInstanceStatus(processId); + } + + /** + * 历史流程 + * + * @return + */ + @GetMapping("listhistoryprocess") + public JSONArray listHistoryProcess() { + return deployProcessService.listHistoryProcess(); + } + + /** + * 历史任务 + * + * @return + */ + @GetMapping("listhistorytask") + public JSONArray listHistoryTask() { + return deployProcessService.listHistoryTask(); + } + +} diff --git a/src/main/java/com/cm/inspection/service/deploy/IDeployProcessService.java b/src/main/java/com/cm/inspection/service/deploy/IDeployProcessService.java index c9b8ab7..3896f8d 100644 --- a/src/main/java/com/cm/inspection/service/deploy/IDeployProcessService.java +++ b/src/main/java/com/cm/inspection/service/deploy/IDeployProcessService.java @@ -1,5 +1,12 @@ package com.cm.inspection.service.deploy; +import com.alibaba.fastjson.JSONArray; +import com.cm.common.result.SuccessResult; +import com.cm.common.result.SuccessResultData; +import org.activiti.engine.task.Task; + +import java.util.List; + /** * When you feel like quitting. Think about why you started * 当你想要放弃的时候,想想当初你为何开始 @@ -14,4 +21,23 @@ public interface IDeployProcessService { void deployProcess(); + SuccessResult deployProcess(String processName); + + SuccessResult startProcess(String processId); + + JSONArray listTaskByAssignee(String assignee); + + SuccessResult saveTaskCompleteByTaskId(String taskId); + + SuccessResult saveLeaveFullTaskCompleteByTaskIdAndDays(String taskId, Integer days); + + JSONArray listTask(); + + SuccessResultData getInstanceStatus(String processId); + + JSONArray listHistoryProcess(); + + JSONArray listHistoryTask(); + + } diff --git a/src/main/java/com/cm/inspection/service/deploy/impl/DeployProcessServiceImpl.java b/src/main/java/com/cm/inspection/service/deploy/impl/DeployProcessServiceImpl.java index 1c2352e..08f089d 100644 --- a/src/main/java/com/cm/inspection/service/deploy/impl/DeployProcessServiceImpl.java +++ b/src/main/java/com/cm/inspection/service/deploy/impl/DeployProcessServiceImpl.java @@ -1,10 +1,24 @@ package com.cm.inspection.service.deploy.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.cm.common.result.SuccessResult; +import com.cm.common.result.SuccessResultData; import com.cm.inspection.service.deploy.IDeployProcessService; import org.activiti.engine.*; +import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.repository.Deployment; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.activiti.engine.task.TaskQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * When you feel like quitting. Think about why you started * 当你想要放弃的时候,想想当初你为何开始 @@ -31,6 +45,108 @@ public class DeployProcessServiceImpl implements IDeployProcessService { @Override public void deployProcess() { - repositoryService.createDeployment().addClasspathResource("bpmn/leave.bpmn").addClasspathResource("bpmn/leave.png").name("test").deploy(); + repositoryService.createDeployment().addClasspathResource("bpmn/leave.bpmn").name("test").deploy(); + } + + @Override + public SuccessResult deployProcess(String processName) { + Deployment deployment = repositoryService.createDeployment() + .disableSchemaValidation() + .addClasspathResource("bpmn/" + processName + ".bpmn").name("请假").deploy(); + System.out.println("部署ID:" + deployment.getId()); + System.out.println("部署Name:" + deployment.getName()); + return new SuccessResult(); + } + + @Override + public SuccessResult startProcess(String processId) { + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processId); + System.out.println("流程实例id:" + processInstance.getId()); + System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); + return new SuccessResult(); + } + + @Override + public JSONArray listTaskByAssignee(String assignee) { + TaskQuery taskQuery = taskService.createTaskQuery(); + List taskList = taskQuery.taskAssignee(assignee).list(); + JSONArray jsonArray = new JSONArray(); + for (Task task : taskList) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("assignee", task.getAssignee()); + jsonObject.put("id", task.getId()); + jsonObject.put("name", task.getName()); + jsonArray.add(jsonObject); + } + return jsonArray; + } + + @Override + public SuccessResult saveTaskCompleteByTaskId(String taskId) { + taskService.complete(taskId); + return new SuccessResult(); + } + + @Override + public SuccessResult saveLeaveFullTaskCompleteByTaskIdAndDays(String taskId, Integer days) { + Map params = new HashMap<>(1); + params.put("days", days); + taskService.complete(taskId, params); + return new SuccessResult(); + } + + @Override + public JSONArray listTask() { + TaskQuery taskQuery = taskService.createTaskQuery(); + List taskList = taskQuery.list(); + JSONArray jsonArray = new JSONArray(); + for (Task task : taskList) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("assignee", task.getAssignee()); + jsonObject.put("id", task.getId()); + jsonObject.put("name", task.getName()); + jsonArray.add(jsonObject); + } + return jsonArray; + } + + @Override + public SuccessResultData getInstanceStatus(String processId) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processDefinitionKey(processId).singleResult(); + return new SuccessResultData<>(processInstance == null ? 1 : 0); + } + + @Override + public JSONArray listHistoryProcess() { + List list = historyService.createHistoricProcessInstanceQuery().list(); + JSONArray jsonArray = new JSONArray(); + for (HistoricProcessInstance historicProcessInstance : list) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", historicProcessInstance.getId()); + jsonObject.put("name", historicProcessInstance.getName()); + jsonObject.put("startTime", historicProcessInstance.getStartTime()); + jsonObject.put("endTime", historicProcessInstance.getEndTime()); + jsonArray.add(jsonObject); + } + return jsonArray; + } + + @Override + public JSONArray listHistoryTask() { + List taskInstanceList = historyService.createHistoricTaskInstanceQuery().list(); + JSONArray jsonArray = new JSONArray(); + for (HistoricTaskInstance historicTaskInstance : taskInstanceList) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", historicTaskInstance.getId()); + jsonObject.put("name", historicTaskInstance.getName()); + jsonObject.put("startTime", historicTaskInstance.getStartTime()); + jsonObject.put("endTime", historicTaskInstance.getEndTime()); + jsonObject.put("processId", historicTaskInstance.getProcessDefinitionId()); + jsonObject.put("assignee", historicTaskInstance.getAssignee()); + jsonObject.put("executionId", historicTaskInstance.getExecutionId()); + jsonObject.put("parentTaskId", historicTaskInstance.getParentTaskId()); + jsonArray.add(jsonObject); + } + return jsonArray; } } diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index da2d3a4..59459a2 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -1,7 +1,7 @@ server: port: 7006 - url: http://192.168.0.113:7006/inspection - title: inspection + url: http://192.168.0.106:7006/inspection + title: 隐患上报系统 servlet: context-path: /inspection @@ -78,11 +78,11 @@ file: # 安全 security: oauth2: - oauth-server: http://192.168.0.113:7001/usercenter + oauth-server: http://192.168.0.106:7001/usercenter oauth-logout: ${security.oauth2.oauth-server}/logout?redirect_uri=${server.url} client: - client-id: 89e9c099c0a24e7f90d3cdc0447a86b3 - client-secret: VlQ1WE53RDZ6QVJLaHd2b1dGMUdEdGFjYTRhVHUyOHNpQzZoVzE3V1NDOG1ac2wwZTJHWk5NbXh3L3h3U2c4Rg== + client-id: 32ec344a5fd04fd9911586df5d1dc36b + client-secret: a2NORTAyZmthdTNtVHNwLytGVVo0ckFhNktHQU9JWVFmUks0TGw5L2hQRW1ac2wwZTJHWk5NbXh3L3h3U2c4Rg== user-authorization-uri: ${security.oauth2.oauth-server}/oauth/authorize access-token-uri: ${security.oauth2.oauth-server}/oauth/token grant-type: authorization_code diff --git a/src/main/resources/bpmn/leave.bpmn b/src/main/resources/bpmn/leave.bpmn index 330b420..7ba400f 100644 --- a/src/main/resources/bpmn/leave.bpmn +++ b/src/main/resources/bpmn/leave.bpmn @@ -12,77 +12,76 @@ name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema"> - - - - - - - - - - + + + + + + + + + + - - - + + + - - + + + + + + + + - - - - - - - - - - - - - + - - - + + + + + + + + + - - - + + + - - - + + + - - - + + + diff --git a/src/main/resources/bpmn/leave.png b/src/main/resources/bpmn/leave.png deleted file mode 100644 index 6d27a67e82699157d53e240c280ff79edf6d675e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8593 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 + + + + + + + + + + + ${days <= 3} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file