From 746b5e9aad1298a034ec789176bc41f2a09105a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E8=88=B0?= <28569050@qq.com> Date: Mon, 14 Sep 2020 11:19:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=B3=BB=E7=BB=9F=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activitiweb/ActivitiwebApplication.java | 21 + .../DemoApplicationConfiguration.java | 2 - .../controller/ActivitiHistoryController.java | 207 +- .../controller/HelloController.java | 30 +- .../ProcessDefinitionController.java | 52 +- .../controller/ProcessInstanceController.java | 45 +- .../controller/TaskController.java | 201 +- .../controller/UserController.java | 38 + .../listener/ErrServiceTaskListener.java | 13 + .../listener/MultInstancesStartListener.java | 23 + .../listener/MultInstancesTKListener.java | 13 + .../activitiweb/listener/PiListener.java | 25 + .../listener/ServiceTaskListener1.java | 17 + .../listener/ServiceTaskListener2.java | 15 + .../activitiweb/listener/TkListener1.java | 13 + .../activitiweb/listener/TkListener2.java | 13 + .../activitiweb/mapper/ActivitiMapper.java | 40 +- ...onfig.java => ActivitiSecurityConfig.java} | 2 +- ...r.java => ActivitiSecurityController.java} | 2 +- .../security/MyUserDetailsService.java | 2 +- .../activitiweb/security/SimpleResponse.java | 2 +- src/main/resources/application.yml | 9 +- .../resources/resources/bpmnjs/.gitignore | 3 +- .../resources/resources/bpmnjs/app/index.html | 22 +- .../resources/resources/bpmnjs/app/index.js | 92 +- .../resources/bpmnjs/dist/index.html | 22 +- .../resources/resources/bpmnjs/dist/index.js | 3337 ++--------------- .../resources/bpmnjs/resources/activiti.json | 8 +- .../bpmnjs/resources/newDiagram.bpmn | 2 +- .../resources/bpmnjs/resources/tools.js | 99 +- .../resources/layuimini/api/init.json | 6 +- .../resources/layuimini/css/public.css | 3 + .../resources/resources/layuimini/index.html | 6 +- .../layuimini/page/HistoryTasks.html | 9 +- .../layuimini/page/ProcessDefinition.html | 302 +- .../layuimini/page/ProcessInstance.html | 192 + .../resources/layuimini/page/ToDoTasks.html | 77 +- .../resources/layuimini/page/login-1.html | 2 +- .../resources/layuimini/page/login-2.html | 2 +- .../layuimini/page/table/FormDataShow.html | 166 + user.sql | 12 + ...\256\345\255\227\345\205\270activiti7.pdm" | 2228 +++++++---- 42 files changed, 3130 insertions(+), 4245 deletions(-) create mode 100644 src/main/java/com/imooc/activitiweb/controller/UserController.java create mode 100644 src/main/java/com/imooc/activitiweb/listener/ErrServiceTaskListener.java create mode 100644 src/main/java/com/imooc/activitiweb/listener/MultInstancesStartListener.java create mode 100644 src/main/java/com/imooc/activitiweb/listener/MultInstancesTKListener.java create mode 100644 src/main/java/com/imooc/activitiweb/listener/PiListener.java create mode 100644 src/main/java/com/imooc/activitiweb/listener/ServiceTaskListener1.java create mode 100644 src/main/java/com/imooc/activitiweb/listener/ServiceTaskListener2.java create mode 100644 src/main/java/com/imooc/activitiweb/listener/TkListener1.java create mode 100644 src/main/java/com/imooc/activitiweb/listener/TkListener2.java rename src/main/java/com/imooc/activitiweb/security/{BrowserSecurityConfig.java => ActivitiSecurityConfig.java} (97%) rename src/main/java/com/imooc/activitiweb/security/{BrowserSecurityController.java => ActivitiSecurityController.java} (97%) create mode 100644 src/main/resources/resources/layuimini/page/ProcessInstance.html create mode 100644 src/main/resources/resources/layuimini/page/table/FormDataShow.html diff --git a/src/main/java/com/imooc/activitiweb/ActivitiwebApplication.java b/src/main/java/com/imooc/activitiweb/ActivitiwebApplication.java index 461e085..af72077 100644 --- a/src/main/java/com/imooc/activitiweb/ActivitiwebApplication.java +++ b/src/main/java/com/imooc/activitiweb/ActivitiwebApplication.java @@ -11,3 +11,24 @@ public class ActivitiwebApplication { } } + + +/* + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +@SpringBootApplication(scanBasePackages = {"com.imooc.activitiweb"}) +public class ActivitiwebApplication extends SpringBootServletInitializer { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(ActivitiwebApplication.class); + } + + public static void main(String[] args) { + SpringApplication.run(ActivitiwebApplication.class, args); + } + +}*/ diff --git a/src/main/java/com/imooc/activitiweb/DemoApplicationConfiguration.java b/src/main/java/com/imooc/activitiweb/DemoApplicationConfiguration.java index a5ebf84..89a6c87 100644 --- a/src/main/java/com/imooc/activitiweb/DemoApplicationConfiguration.java +++ b/src/main/java/com/imooc/activitiweb/DemoApplicationConfiguration.java @@ -2,8 +2,6 @@ package com.imooc.activitiweb; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; diff --git a/src/main/java/com/imooc/activitiweb/controller/ActivitiHistoryController.java b/src/main/java/com/imooc/activitiweb/controller/ActivitiHistoryController.java index 7af0bbf..b3b2ca7 100644 --- a/src/main/java/com/imooc/activitiweb/controller/ActivitiHistoryController.java +++ b/src/main/java/com/imooc/activitiweb/controller/ActivitiHistoryController.java @@ -1,18 +1,22 @@ package com.imooc.activitiweb.controller; import com.imooc.activitiweb.SecurityUtil; +import com.imooc.activitiweb.pojo.UserInfoBean; import com.imooc.activitiweb.util.AjaxResponse; import com.imooc.activitiweb.util.GlobalConfig; -import org.activiti.bpmn.model.*; import org.activiti.bpmn.model.Process; +import org.activiti.bpmn.model.*; import org.activiti.engine.HistoryService; import org.activiti.engine.RepositoryService; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.history.HistoricTaskInstance; -import org.activiti.engine.history.HistoricTaskInstanceQuery; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import java.util.*; @@ -69,112 +73,125 @@ public class ActivitiHistoryController { } -//流程图高亮 - @RequestMapping("/highLine") - @ResponseBody - public Map getApplyStatus(String instanceId){ - - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(instanceId).singleResult(); - //获取bpmnModel对象 - BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); - //因为我们这里只定义了一个Process 所以获取集合中的第一个即可 - Process process = bpmnModel.getProcesses().get(0); - //获取所有的FlowElement信息 - Collection flowElements = process.getFlowElements(); - - Map map = new HashMap<>(); - for (FlowElement flowElement : flowElements) { - //判断是否是连线 - if (flowElement instanceof SequenceFlow) { - SequenceFlow sequenceFlow = (SequenceFlow) flowElement; - String ref = sequenceFlow.getSourceRef(); - String targetRef = sequenceFlow.getTargetRef(); - map.put(ref+targetRef,sequenceFlow.getId()); + //流程图高亮 + @GetMapping("/gethighLine") + public AjaxResponse gethighLine(@RequestParam("instanceId") String instanceId, @AuthenticationPrincipal UserInfoBean UuserInfoBean) { + try { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(instanceId).singleResult(); + //获取bpmnModel对象 + BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); + //因为我们这里只定义了一个Process 所以获取集合中的第一个即可 + Process process = bpmnModel.getProcesses().get(0); + //获取所有的FlowElement信息 + Collection flowElements = process.getFlowElements(); + + Map map = new HashMap<>(); + for (FlowElement flowElement : flowElements) { + //判断是否是连线 + if (flowElement instanceof SequenceFlow) { + SequenceFlow sequenceFlow = (SequenceFlow) flowElement; + String ref = sequenceFlow.getSourceRef(); + String targetRef = sequenceFlow.getTargetRef(); + map.put(ref + targetRef, sequenceFlow.getId()); + } } - } - //获取流程实例 历史节点(全部) - List list = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(instanceId) - .list(); - //各个历史节点 两两组合 key - Set keyList = new HashSet<>(); - for (HistoricActivityInstance i: list) { - for(HistoricActivityInstance j : list){ - if(i!=j){ - keyList.add(i.getActivityId()+j.getActivityId()); + //获取流程实例 历史节点(全部) + List list = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(instanceId) + .list(); + //各个历史节点 两两组合 key + Set keyList = new HashSet<>(); + for (HistoricActivityInstance i : list) { + for (HistoricActivityInstance j : list) { + if (i != j) { + keyList.add(i.getActivityId() + j.getActivityId()); + } } } - } - //高亮连线ID - Set highLine = new HashSet<>(); - keyList.forEach(s->highLine.add(map.get(s))); - - - //获取流程实例 历史节点(已完成) - List listFinished = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(instanceId) - .finished() - .list(); - //高亮节点ID - Set highPoint = new HashSet<>(); - listFinished.forEach(s->highPoint.add(s.getActivityId())); - - //获取流程实例 历史节点(待办节点) - List listUnFinished = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(instanceId) - .unfinished() - .list(); - - //需要移除的高亮连线 - Set set = new HashSet<>(); - //待办高亮节点 - Set waitingToDo = new HashSet<>(); - listUnFinished.forEach(s->{ - waitingToDo.add(s.getActivityId()); + //高亮连线ID + Set highLine = new HashSet<>(); + keyList.forEach(s -> highLine.add(map.get(s))); - for (FlowElement flowElement : flowElements) { - //判断是否是 用户节点 - if (flowElement instanceof UserTask) { - UserTask userTask = (UserTask) flowElement; - - if(userTask.getId().equals(s.getActivityId())){ - List outgoingFlows = userTask.getOutgoingFlows(); - //因为 高亮连线查询的是所有节点 两两组合 把待办 之后 往外发出的连线 也包含进去了 所以要把高亮待办节点 之后 即出的连线去掉 - if(outgoingFlows!=null&& outgoingFlows.size()>0){ - outgoingFlows.forEach(a-> { - if(a.getSourceRef().equals(s.getActivityId())){ - set.add(a.getId()); - } - }); + + //获取流程实例 历史节点(已完成) + List listFinished = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(instanceId) + .finished() + .list(); + //高亮节点ID + Set highPoint = new HashSet<>(); + listFinished.forEach(s -> highPoint.add(s.getActivityId())); + + //获取流程实例 历史节点(待办节点) + List listUnFinished = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(instanceId) + .unfinished() + .list(); + + //需要移除的高亮连线 + Set set = new HashSet<>(); + //待办高亮节点 + Set waitingToDo = new HashSet<>(); + listUnFinished.forEach(s -> { + waitingToDo.add(s.getActivityId()); + + for (FlowElement flowElement : flowElements) { + //判断是否是 用户节点 + if (flowElement instanceof UserTask) { + UserTask userTask = (UserTask) flowElement; + + if (userTask.getId().equals(s.getActivityId())) { + List outgoingFlows = userTask.getOutgoingFlows(); + //因为 高亮连线查询的是所有节点 两两组合 把待办 之后 往外发出的连线 也包含进去了 所以要把高亮待办节点 之后 即出的连线去掉 + if (outgoingFlows != null && outgoingFlows.size() > 0) { + outgoingFlows.forEach(a -> { + if (a.getSourceRef().equals(s.getActivityId())) { + set.add(a.getId()); + } + }); + } } } } - } - }); + }); - highLine.removeAll(set); + highLine.removeAll(set); - //获取当前用户 - //User sysUser = getSysUser(); - Set iDo = new HashSet<>(); //存放 高亮 我的办理节点 - //当前用户已完成的任务 - List taskInstanceList = historyService.createHistoricTaskInstanceQuery() - .taskAssignee("bajie") - .finished() - .processInstanceId(instanceId).list(); + //获取当前用户 + //User sysUser = getSysUser(); + Set iDo = new HashSet<>(); //存放 高亮 我的办理节点 + //当前用户已完成的任务 + + String AssigneeName = null; + if (GlobalConfig.Test) { + AssigneeName = "bajie"; + } else { + AssigneeName = UuserInfoBean.getUsername(); + } + + List taskInstanceList = historyService.createHistoricTaskInstanceQuery() + .taskAssignee(AssigneeName) + .finished() + .processInstanceId(instanceId).list(); - taskInstanceList.forEach(a->iDo.add(a.getTaskDefinitionKey())); + taskInstanceList.forEach(a -> iDo.add(a.getTaskDefinitionKey())); - Map reMap = new HashMap<>(); - reMap.put("highPoint",highPoint); - reMap.put("highLine",highLine); - reMap.put("waitingToDo",waitingToDo); - reMap.put("iDo",iDo); + Map reMap = new HashMap<>(); + reMap.put("highPoint", highPoint); + reMap.put("highLine", highLine); + reMap.put("waitingToDo", waitingToDo); + reMap.put("iDo", iDo); - return reMap; + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), + GlobalConfig.ResponseCode.SUCCESS.getDesc(), reMap); + + } catch (Exception e) { + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(), + "渲染历史流程失败", e.toString()); + } } diff --git a/src/main/java/com/imooc/activitiweb/controller/HelloController.java b/src/main/java/com/imooc/activitiweb/controller/HelloController.java index 03da9c3..4f43bd6 100644 --- a/src/main/java/com/imooc/activitiweb/controller/HelloController.java +++ b/src/main/java/com/imooc/activitiweb/controller/HelloController.java @@ -3,8 +3,8 @@ package com.imooc.activitiweb.controller; import com.imooc.activitiweb.SecurityUtil; import com.imooc.activitiweb.mapper.ActivitiMapper; -import com.imooc.activitiweb.pojo.UserInfoBean; import com.imooc.activitiweb.pojo.Act_ru_task; +import com.imooc.activitiweb.pojo.UserInfoBean; import com.imooc.activitiweb.util.AjaxResponse; import com.imooc.activitiweb.util.GlobalConfig; import org.activiti.api.process.model.ProcessInstance; @@ -13,11 +13,11 @@ import org.activiti.api.process.runtime.ProcessRuntime; import org.activiti.api.runtime.shared.query.Page; import org.activiti.api.runtime.shared.query.Pageable; import org.activiti.api.task.model.Task; +import org.activiti.api.task.model.builders.TaskPayloadBuilder; import org.activiti.api.task.runtime.TaskRuntime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.context.SecurityContextHolder; - import org.springframework.web.bind.annotation.*; import java.util.List; @@ -37,6 +37,8 @@ public class HelloController { private ProcessRuntime processRuntime; + + @RequestMapping(value = "/hello", method = RequestMethod.GET) public String say() { return "你好"; @@ -94,6 +96,7 @@ public class HelloController { .withProcessDefinitionKey(processDefinitionKey) .withName(instanceName) .withVariable("assignee", "bajie") + .withVariable("day", "4") .withBusinessKey("自定义BusinessKey") .build()); return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), @@ -104,4 +107,27 @@ public class HelloController { } } + + //完成待办任务带参数 + @GetMapping(value = "/testcompleteTask") + public AjaxResponse testcompleteTask(@RequestParam("taskID") String taskID) { + try { + if (GlobalConfig.Test) { + securityUtil.logInAs("bajie"); + } + Task task = taskRuntime.task(taskID); + taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()) + .withVariable("day", "2")//执行环节设置变量 + .build()); + + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), + GlobalConfig.ResponseCode.SUCCESS.getDesc(), null); + } catch (Exception e) { + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(), + "完成失败", e.toString()); + } + } + + + } diff --git a/src/main/java/com/imooc/activitiweb/controller/ProcessDefinitionController.java b/src/main/java/com/imooc/activitiweb/controller/ProcessDefinitionController.java index a272dbf..f58224c 100644 --- a/src/main/java/com/imooc/activitiweb/controller/ProcessDefinitionController.java +++ b/src/main/java/com/imooc/activitiweb/controller/ProcessDefinitionController.java @@ -1,9 +1,9 @@ package com.imooc.activitiweb.controller; import com.imooc.activitiweb.SecurityUtil; +import com.imooc.activitiweb.mapper.ActivitiMapper; import com.imooc.activitiweb.util.AjaxResponse; import com.imooc.activitiweb.util.GlobalConfig; - import org.activiti.api.process.runtime.ProcessRuntime; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; @@ -12,9 +12,11 @@ import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.InputStream; - import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; @@ -23,10 +25,6 @@ import java.util.UUID; import java.util.zip.ZipInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - - @RestController @RequestMapping("/processDefinition") public class ProcessDefinitionController { @@ -40,6 +38,9 @@ public class ProcessDefinitionController { @Autowired private SecurityUtil securityUtil; + @Autowired + ActivitiMapper mapper; + @PostMapping(value = "/uploadStreamAndDeployment") public AjaxResponse uploadStreamAndDeployment(@RequestParam("processFile") MultipartFile multipartFile) { @@ -118,14 +119,14 @@ public class ProcessDefinitionController { * @return */ @PostMapping(value = "/addDeploymentByFileNameBPMN") - public AjaxResponse addDeploymentByFileNameBPMN(@RequestParam("deploymentFileUUID") String deploymentFileUUID,@RequestParam("deploymentName") String deploymentName) { + public AjaxResponse addDeploymentByFileNameBPMN(@RequestParam("deploymentFileUUID") String deploymentFileUUID, @RequestParam("deploymentName") String deploymentName) { try { String filename = "resources/bpmn/" + deploymentFileUUID; Deployment deployment = repositoryService.createDeployment()//初始化流程 .addClasspathResource(filename) .name(deploymentName) .deploy(); - System.out.println(deployment.getName()); + //System.out.println(deployment.getName()); return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), GlobalConfig.ResponseCode.SUCCESS.getDesc(), deployment.getId()); } catch (Exception e) { @@ -136,13 +137,13 @@ public class ProcessDefinitionController { } @PostMapping(value = "/addDeploymentByString") - public AjaxResponse addDeploymentByString(@RequestParam("stringBPMN") String stringBPMN,@RequestParam("deploymentName") String deploymentName) { + public AjaxResponse addDeploymentByString(@RequestParam("stringBPMN") String stringBPMN) { try { Deployment deployment = repositoryService.createDeployment() - .addString("OnLine.bpmn",stringBPMN) - .name(deploymentName) + .addString("CreateWithBPMNJS.bpmn",stringBPMN) + .name("不知道在哪显示的部署名称") .deploy(); - System.out.println(deployment.getName()); + //System.out.println(deployment.getName()); return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), GlobalConfig.ResponseCode.SUCCESS.getDesc(), deployment.getId()); } catch (Exception e) { @@ -190,12 +191,13 @@ public class ProcessDefinitionController { for (ProcessDefinition pd : list) { HashMap hashMap = new HashMap<>(); - System.out.println("流程定义ID:"+pd.getId()); - hashMap.put("Name", pd.getName()); - hashMap.put("Key", pd.getKey()); - hashMap.put("ResourceName", pd.getResourceName()); - hashMap.put("DeploymentId", pd.getDeploymentId()); - hashMap.put("Version", pd.getVersion()); + //System.out.println("流程定义ID:"+pd.getId()); + hashMap.put("processDefinitionID", pd.getId()); + hashMap.put("name", pd.getName()); + hashMap.put("key", pd.getKey()); + hashMap.put("resourceName", pd.getResourceName()); + hashMap.put("deploymentID", pd.getDeploymentId()); + hashMap.put("version", pd.getVersion()); listMap.add(hashMap); } @@ -235,13 +237,14 @@ public class ProcessDefinitionController { @GetMapping(value = "/getDeployments") public AjaxResponse getDeployments() { try { + List> listMap= new ArrayList>(); List list = repositoryService.createDeploymentQuery().list(); for (Deployment dep : list) { HashMap hashMap = new HashMap<>(); - hashMap.put("ID", dep.getId()); - hashMap.put("Name", dep.getName()); - hashMap.put("DeploymentTime", dep.getDeploymentTime()); + hashMap.put("id", dep.getId()); + hashMap.put("name", dep.getName()); + hashMap.put("deploymentTime", dep.getDeploymentTime()); listMap.add(hashMap); } @@ -258,10 +261,13 @@ public class ProcessDefinitionController { //删除流程定义 @GetMapping(value = "/delDefinition") - public AjaxResponse delDefinition(@RequestParam("pdID") String pdID) { + public AjaxResponse delDefinition(@RequestParam("depID") String depID, @RequestParam("pdID") String pdID) { try { - repositoryService.deleteDeployment(pdID, true); + //删除数据 + int result = mapper.DeleteFormData(pdID); + + repositoryService.deleteDeployment(depID, true); return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), "删除成功", null); diff --git a/src/main/java/com/imooc/activitiweb/controller/ProcessInstanceController.java b/src/main/java/com/imooc/activitiweb/controller/ProcessInstanceController.java index 3de0abe..9dd2c8a 100644 --- a/src/main/java/com/imooc/activitiweb/controller/ProcessInstanceController.java +++ b/src/main/java/com/imooc/activitiweb/controller/ProcessInstanceController.java @@ -1,20 +1,27 @@ package com.imooc.activitiweb.controller; import com.imooc.activitiweb.SecurityUtil; +import com.imooc.activitiweb.pojo.UserInfoBean; import com.imooc.activitiweb.util.AjaxResponse; import com.imooc.activitiweb.util.GlobalConfig; -import com.imooc.activitiweb.pojo.UserInfoBean; import org.activiti.api.model.shared.model.VariableInstance; import org.activiti.api.process.model.ProcessInstance; import org.activiti.api.process.model.builders.ProcessPayloadBuilder; import org.activiti.api.process.runtime.ProcessRuntime; import org.activiti.api.runtime.shared.query.Page; import org.activiti.api.runtime.shared.query.Pageable; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.ProcessDefinition; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; @RestController @@ -27,6 +34,9 @@ public class ProcessInstanceController { @Autowired private SecurityUtil securityUtil; + @Autowired + private RepositoryService repositoryService; + @@ -42,22 +52,32 @@ public class ProcessInstanceController { // securityUtil.logInAs(userInfoBean.getUsername());//这句不需要 // } processInstances=processRuntime.processInstances(Pageable.of(0, 50)); - System.out.println("流程实例数量: " + processInstances.getTotalItems()); + //System.out.println("流程实例数量: " + processInstances.getTotalItems()); List list = processInstances.getContent(); //list.sort((y,x)->x.getProcessDefinitionVersion()-y.getProcessDefinitionVersion()); list.sort((y,x)->x.getStartDate().toString().compareTo(y.getStartDate().toString())); + List> listMap = new ArrayList>(); for(ProcessInstance pi:list){ - System.out.println("getId:"+pi.getId()); - System.out.println("getName:"+pi.getName()); - System.out.println("getStatus:"+pi.getStatus()); - System.out.println("getProcessDefinitionId:"+pi.getProcessDefinitionId()); - System.out.println("getProcessDefinitionKey:"+pi.getProcessDefinitionKey()); - System.out.println("getStartDate:"+pi.getStartDate()); + HashMap hashMap = new HashMap<>(); + hashMap.put("id", pi.getId()); + hashMap.put("name", pi.getName()); + hashMap.put("status", pi.getStatus()); + hashMap.put("processDefinitionId", pi.getProcessDefinitionId()); + hashMap.put("processDefinitionKey", pi.getProcessDefinitionKey()); + hashMap.put("startDate", pi.getStartDate()); + hashMap.put("processDefinitionVersion", pi.getProcessDefinitionVersion()); + //因为processRuntime.processDefinition("流程部署ID")查询的结果没有部署流程与部署ID,所以用repositoryService查询 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(pi.getProcessDefinitionId()) + .singleResult(); + hashMap.put("resourceName", pd.getResourceName()); + hashMap.put("deploymentId", pd.getDeploymentId()); + listMap.add(hashMap); } return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), - GlobalConfig.ResponseCode.SUCCESS.getDesc(),processInstances.getContent()); + GlobalConfig.ResponseCode.SUCCESS.getDesc(),listMap); } catch (Exception e) { return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(), "获取流程实例失败", e.toString()); @@ -78,13 +98,12 @@ public class ProcessInstanceController { }else{ securityUtil.logInAs(SecurityContextHolder.getContext().getAuthentication().getName()); } - ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder .start() .withProcessDefinitionKey(processDefinitionKey) .withName(instanceName) - .withVariable("content", instanceVariable) - .withVariable("参数2", "参数2的值") + //.withVariable("content", instanceVariable) + //.withVariable("参数2", "参数2的值") .withBusinessKey("自定义BusinessKey") .build()); return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), diff --git a/src/main/java/com/imooc/activitiweb/controller/TaskController.java b/src/main/java/com/imooc/activitiweb/controller/TaskController.java index db719ce..3ce17db 100644 --- a/src/main/java/com/imooc/activitiweb/controller/TaskController.java +++ b/src/main/java/com/imooc/activitiweb/controller/TaskController.java @@ -1,6 +1,7 @@ package com.imooc.activitiweb.controller; import com.imooc.activitiweb.SecurityUtil; +import com.imooc.activitiweb.mapper.ActivitiMapper; import com.imooc.activitiweb.util.AjaxResponse; import com.imooc.activitiweb.util.GlobalConfig; import org.activiti.api.process.model.ProcessInstance; @@ -10,16 +11,19 @@ import org.activiti.api.runtime.shared.query.Pageable; import org.activiti.api.task.model.Task; import org.activiti.api.task.model.builders.TaskPayloadBuilder; import org.activiti.api.task.runtime.TaskRuntime; +import org.activiti.bpmn.model.FormProperty; +import org.activiti.bpmn.model.UserTask; +import org.activiti.engine.RepositoryService; +import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; + @RestController @RequestMapping("/task") public class TaskController { @@ -32,6 +36,12 @@ public class TaskController { @Autowired private ProcessRuntime processRuntime; + @Autowired + private RepositoryService repositoryService; + + @Autowired + ActivitiMapper mapper; + //获取我的代办任务 @GetMapping(value = "/getTasks") public AjaxResponse getTasks() { @@ -46,17 +56,17 @@ public class TaskController { for (Task tk : tasks.getContent()) { ProcessInstance processInstance = processRuntime.processInstance(tk.getProcessInstanceId()); HashMap hashMap = new HashMap<>(); - hashMap.put("ID", tk.getId()); - hashMap.put("Name", tk.getName()); - hashMap.put("Status", tk.getStatus()); - hashMap.put("CreatedDate", tk.getCreatedDate()); - if(tk.getAssignee() == null){//执行人,null时前台显示未拾取 - hashMap.put("Assignee", "待拾取任务"); - }else { - hashMap.put("Assignee", tk.getAssignee());// + hashMap.put("id", tk.getId()); + hashMap.put("name", tk.getName()); + hashMap.put("status", tk.getStatus()); + hashMap.put("createdDate", tk.getCreatedDate()); + if (tk.getAssignee() == null) {//执行人,null时前台显示未拾取 + hashMap.put("assignee", "待拾取任务"); + } else { + hashMap.put("assignee", tk.getAssignee());// } - hashMap.put("InstanceName", processInstance.getName()); + hashMap.put("instanceName", processInstance.getName()); listMap.add(hashMap); } @@ -84,7 +94,9 @@ public class TaskController { if (task.getAssignee() == null) { taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build()); } - taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()).build()); + taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()) + //.withVariable("num", "2")//执行环节设置变量 + .build()); return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), @@ -127,4 +139,165 @@ public class TaskController { } } + + //渲染表单 + @GetMapping(value = "/formDataShow") + public AjaxResponse formDataShow(@RequestParam("taskID") String taskID) { + try { + if (GlobalConfig.Test) { + securityUtil.logInAs("bajie"); + } + Task task = taskRuntime.task(taskID); + +//-----------------------构建表单控件历史数据字典------------------------------------------------ + //本实例所有保存的表单数据HashMap,为了快速读取控件以前环节存储的值 + HashMap controlistMap = new HashMap<>(); + //本实例所有保存的表单数据 + List> tempControlList = mapper.selectFormData(task.getProcessInstanceId()); + + for (HashMap ls : tempControlList) { + //String Control_ID = ls.get("Control_ID_").toString(); + //String Control_VALUE = ls.get("Control_VALUE_").toString(); + controlistMap.put(ls.get("Control_ID_").toString(), ls.get("Control_VALUE_").toString()); + } + //String controlistMapValue = controlistMap.get("控件ID"); + //controlistMap.containsKey() + + // + +/* ------------------------------------------------------------------------------ + FormProperty_0ueitp2-_!类型-_!名称-_!默认值-_!是否参数 + 例子: + FormProperty_0lovri0-_!string-_!姓名-_!请输入姓名-_!f + FormProperty_1iu6onu-_!int-_!年龄-_!请输入年龄-_!s + + 默认值:无、字符常量、FormProperty_开头定义过的控件ID + 是否参数:f为不是参数,s是字符,t是时间(不需要int,因为这里int等价于string) + 注:类型是可以获取到的,但是为了统一配置原则,都配置到 + */ + + //注意!!!!!!!!:表单Key必须要任务编号一模一样,因为参数需要任务key,但是无法获取,只能获取表单key“task.getFormKey()”当做任务key + UserTask userTask = (UserTask) repositoryService.getBpmnModel(task.getProcessDefinitionId()) + .getFlowElement(task.getFormKey()); + + if (userTask == null) { + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), + GlobalConfig.ResponseCode.SUCCESS.getDesc(), "无表单"); + } + List formProperties = userTask.getFormProperties(); + List> listMap = new ArrayList>(); + for (FormProperty fp : formProperties) { + String[] splitFP = fp.getId().split("-_!"); + + HashMap hashMap = new HashMap<>(); + hashMap.put("id", splitFP[0]); + hashMap.put("controlType", splitFP[1]); + hashMap.put("controlLable", splitFP[2]); + + + //默认值如果是表单控件ID + if (splitFP[3].startsWith("FormProperty_")) { + //控件ID存在 + if (controlistMap.containsKey(splitFP[3])) { + hashMap.put("controlDefValue", controlistMap.get(splitFP[3])); + } else { + //控件ID不存在 + hashMap.put("controlDefValue", "读取失败,检查" + splitFP[0] + "配置"); + } + } else { + //默认值如果不是表单控件ID则写入默认值 + hashMap.put("controlDefValue", splitFP[3]); + } + + + hashMap.put("controlIsParam", splitFP[4]); + listMap.add(hashMap); + } + + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), + GlobalConfig.ResponseCode.SUCCESS.getDesc(), listMap); + } catch (Exception e) { + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(), + "失败", e.toString()); + } + } + + //保存表单 + @PostMapping(value = "/formDataSave") + public AjaxResponse formDataSave(@RequestParam("taskID") String taskID, + @RequestParam("formData") String formData) { + try { + if (GlobalConfig.Test) { + securityUtil.logInAs("bajie"); + } + + Task task = taskRuntime.task(taskID); + + //formData:控件id-_!控件值-_!是否参数!_!控件id-_!控件值-_!是否参数 + //FormProperty_0lovri0-_!不是参数-_!f!_!FormProperty_1iu6onu-_!数字参数-_!s + + + HashMap variables = new HashMap(); + Boolean hasVariables = false;//没有任何参数 + + + List> listMap = new ArrayList<>(); + + //前端传来的字符串,拆分成每个控件 + String[] formDataList = formData.split("!_!");// + for (String controlItem : formDataList) { + String[] formDataItem = controlItem.split("-_!"); + + HashMap hashMap = new HashMap<>(); + hashMap.put("PROC_DEF_ID_", task.getProcessDefinitionId()); + hashMap.put("PROC_INST_ID_", task.getProcessInstanceId()); + hashMap.put("FORM_KEY_", task.getFormKey()); + hashMap.put("Control_ID_", formDataItem[0]); + hashMap.put("Control_VALUE_", formDataItem[1]); + listMap.add(hashMap); + + //构建参数集合 + switch (formDataItem[2]) { + case "f": + System.out.println("控件值不作为参数"); + break; + case "s": + variables.put(formDataItem[0], formDataItem[1]); + hasVariables = true; + break; + case "t": + SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + variables.put(formDataItem[0], timeFormat.parse(formDataItem[2])); + hasVariables = true; + break; + case "b": + variables.put(formDataItem[0], BooleanUtils.toBoolean(formDataItem[2])); + hasVariables = true; + break; + default: + System.out.println("控件参数类型配置错误:" + formDataItem[0] + "的参数类型不存在," + formDataItem[2]); + } + }//for结束 + + if (hasVariables) { + //带参数完成任务 + taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskID) + .withVariables(variables) + .build()); + } else { + taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskID) + .build()); + } + + //写入数据库 + int result = mapper.insertFormData(listMap); + + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), + GlobalConfig.ResponseCode.SUCCESS.getDesc(), listMap); + } catch (Exception e) { + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(), + "失败", e.toString()); + } + } + } diff --git a/src/main/java/com/imooc/activitiweb/controller/UserController.java b/src/main/java/com/imooc/activitiweb/controller/UserController.java new file mode 100644 index 0000000..5eb29fd --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/controller/UserController.java @@ -0,0 +1,38 @@ +package com.imooc.activitiweb.controller; + +import com.imooc.activitiweb.mapper.ActivitiMapper; +import com.imooc.activitiweb.util.AjaxResponse; +import com.imooc.activitiweb.util.GlobalConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; + +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + ActivitiMapper mapper; + + //获取用户 + @GetMapping(value = "/getUsers") + public AjaxResponse getUsers() { + try { + List> userList = mapper.selectUser(); + + + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(), + GlobalConfig.ResponseCode.SUCCESS.getDesc(), userList); + + + } catch (Exception e) { + return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(), + "获取用户列表失败", e.toString()); + } + } + +} diff --git a/src/main/java/com/imooc/activitiweb/listener/ErrServiceTaskListener.java b/src/main/java/com/imooc/activitiweb/listener/ErrServiceTaskListener.java new file mode 100644 index 0000000..6cb024b --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/listener/ErrServiceTaskListener.java @@ -0,0 +1,13 @@ +package com.imooc.activitiweb.listener; + +import org.activiti.engine.delegate.BpmnError; +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.JavaDelegate; + +public class ErrServiceTaskListener implements JavaDelegate { + + @Override + public void execute(DelegateExecution execution) { + throw new BpmnError("Error_21ldg70"); + } +} diff --git a/src/main/java/com/imooc/activitiweb/listener/MultInstancesStartListener.java b/src/main/java/com/imooc/activitiweb/listener/MultInstancesStartListener.java new file mode 100644 index 0000000..b0403d9 --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/listener/MultInstancesStartListener.java @@ -0,0 +1,23 @@ +package com.imooc.activitiweb.listener; + +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.ExecutionListener; + +import java.util.ArrayList; + +public class MultInstancesStartListener implements ExecutionListener { + + @Override + public void notify(DelegateExecution execution) { + ArrayList assigneeList = new ArrayList<>(); + assigneeList.add("bajie"); + assigneeList.add("wukong"); + assigneeList.add("salaboy"); + + execution.setVariable("assigneeList",assigneeList); + + //execution.setVariable("isPass",0); + + } + +} diff --git a/src/main/java/com/imooc/activitiweb/listener/MultInstancesTKListener.java b/src/main/java/com/imooc/activitiweb/listener/MultInstancesTKListener.java new file mode 100644 index 0000000..c174d4d --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/listener/MultInstancesTKListener.java @@ -0,0 +1,13 @@ +package com.imooc.activitiweb.listener; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class MultInstancesTKListener implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + System.out.println("执行人:"+delegateTask.getAssignee()); + //根据任务节点逻辑查询实际需要的执行人是谁 + delegateTask.setAssignee("wukong"); + } +} diff --git a/src/main/java/com/imooc/activitiweb/listener/PiListener.java b/src/main/java/com/imooc/activitiweb/listener/PiListener.java new file mode 100644 index 0000000..0299047 --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/listener/PiListener.java @@ -0,0 +1,25 @@ +package com.imooc.activitiweb.listener; + +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.ExecutionListener; +import org.activiti.engine.delegate.Expression; +import org.springframework.beans.factory.annotation.Autowired; + +public class PiListener implements ExecutionListener { + @Autowired + + private Expression sendType; + @Override + public void notify(DelegateExecution execution) { + System.out.println(execution.getEventName()); + System.out.println(execution.getProcessDefinitionId()); + if("start".equals(execution.getEventName())){ + //记录节点开始时间 + }else if("end".equals(execution.getEventName())){ + //记录节点结束时间 + } + System.out.println("sendType:"+sendType.getValue(execution).toString()); + + + } +} diff --git a/src/main/java/com/imooc/activitiweb/listener/ServiceTaskListener1.java b/src/main/java/com/imooc/activitiweb/listener/ServiceTaskListener1.java new file mode 100644 index 0000000..0ab65b1 --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/listener/ServiceTaskListener1.java @@ -0,0 +1,17 @@ +package com.imooc.activitiweb.listener; + +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.JavaDelegate; + +public class ServiceTaskListener1 implements JavaDelegate { + + @Override + public void execute(DelegateExecution execution) { + + System.out.println(execution.getEventName()); + System.out.println(execution.getProcessDefinitionId()); + System.out.println(execution.getProcessInstanceId()); + + execution.setVariable("aa","bb"); + } +} diff --git a/src/main/java/com/imooc/activitiweb/listener/ServiceTaskListener2.java b/src/main/java/com/imooc/activitiweb/listener/ServiceTaskListener2.java new file mode 100644 index 0000000..4933bf6 --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/listener/ServiceTaskListener2.java @@ -0,0 +1,15 @@ +package com.imooc.activitiweb.listener; + +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.JavaDelegate; + +public class ServiceTaskListener2 implements JavaDelegate { + + @Override + public void execute(DelegateExecution execution) { + + execution.getVariable("aa"); +System.out.println(execution.getVariable("aa")); + + } +} diff --git a/src/main/java/com/imooc/activitiweb/listener/TkListener1.java b/src/main/java/com/imooc/activitiweb/listener/TkListener1.java new file mode 100644 index 0000000..2bd77e3 --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/listener/TkListener1.java @@ -0,0 +1,13 @@ +package com.imooc.activitiweb.listener; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class TkListener1 implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + System.out.println("执行人:"+delegateTask.getAssignee()); + //根据用户名查询用户电话并调用发送短信接口 + delegateTask.setVariable("delegateAssignee",delegateTask.getAssignee()); + } +} diff --git a/src/main/java/com/imooc/activitiweb/listener/TkListener2.java b/src/main/java/com/imooc/activitiweb/listener/TkListener2.java new file mode 100644 index 0000000..cd5a5ff --- /dev/null +++ b/src/main/java/com/imooc/activitiweb/listener/TkListener2.java @@ -0,0 +1,13 @@ +package com.imooc.activitiweb.listener; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class TkListener2 implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + System.out.println("执行人2:"+delegateTask.getVariable("delegateAssignee")); + //根据执行人username获取组织机构代码,加工后得到领导是wukong + delegateTask.setAssignee("wukong"); + } +} diff --git a/src/main/java/com/imooc/activitiweb/mapper/ActivitiMapper.java b/src/main/java/com/imooc/activitiweb/mapper/ActivitiMapper.java index bcc10f0..68af971 100644 --- a/src/main/java/com/imooc/activitiweb/mapper/ActivitiMapper.java +++ b/src/main/java/com/imooc/activitiweb/mapper/ActivitiMapper.java @@ -3,10 +3,10 @@ package com.imooc.activitiweb.mapper; import com.imooc.activitiweb.pojo.Act_ru_task; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Component; +import java.util.HashMap; import java.util.List; @@ -14,6 +14,42 @@ import java.util.List; @Component public interface ActivitiMapper { + //读取表单 + @Select("SELECT Control_ID_,Control_VALUE_ from formdata where PROC_INST_ID_ = #{PROC_INST_ID}") + List> selectFormData(@Param("PROC_INST_ID") String PROC_INST_ID); + + + //写入表单 + @Insert("") + int insertFormData(@Param("maps") List> maps); + + //删除表单 + @Delete("DELETE FROM formdata WHERE PROC_DEF_ID_ = #{PROC_DEF_ID}") + int DeleteFormData(@Param("PROC_DEF_ID") String PROC_DEF_ID); + + //获取用户名 + @Select("SELECT name,username from user") + List> selectUser(); + + //测试 @Select("select NAME_,TASK_DEF_KEY_ from act_ru_task") List selectName(); + + //流程定义数 + //SELECT COUNT(ID_) from ACT_RE_PROCDEF + + //进行中的流程实例 + //SELECT COUNT(DISTINCT PROC_INST_ID_) from act_ru_execution + + //查询流程定义产生的流程实例数 +/* SELECT p.NAME_,COUNT(DISTINCT e.PROC_INST_ID_) as PiNUM from act_ru_execution AS e + RIGHT JOIN ACT_RE_PROCDEF AS p on e.PROC_DEF_ID_ = p.ID_ + WHERE p.NAME_ IS NOT NULL GROUP BY p.NAME_*/ + + } diff --git a/src/main/java/com/imooc/activitiweb/security/BrowserSecurityConfig.java b/src/main/java/com/imooc/activitiweb/security/ActivitiSecurityConfig.java similarity index 97% rename from src/main/java/com/imooc/activitiweb/security/BrowserSecurityConfig.java rename to src/main/java/com/imooc/activitiweb/security/ActivitiSecurityConfig.java index 0f05383..50b9511 100644 --- a/src/main/java/com/imooc/activitiweb/security/BrowserSecurityConfig.java +++ b/src/main/java/com/imooc/activitiweb/security/ActivitiSecurityConfig.java @@ -6,7 +6,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration -public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter { +public class ActivitiSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private LoginSuccessHandler loginSuccessHandler; diff --git a/src/main/java/com/imooc/activitiweb/security/BrowserSecurityController.java b/src/main/java/com/imooc/activitiweb/security/ActivitiSecurityController.java similarity index 97% rename from src/main/java/com/imooc/activitiweb/security/BrowserSecurityController.java rename to src/main/java/com/imooc/activitiweb/security/ActivitiSecurityController.java index fbe5efd..828cbdb 100644 --- a/src/main/java/com/imooc/activitiweb/security/BrowserSecurityController.java +++ b/src/main/java/com/imooc/activitiweb/security/ActivitiSecurityController.java @@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @RestController -public class BrowserSecurityController { +public class ActivitiSecurityController { private Logger logger = LoggerFactory.getLogger(getClass()); private RequestCache requestCache = new HttpSessionRequestCache(); private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); diff --git a/src/main/java/com/imooc/activitiweb/security/MyUserDetailsService.java b/src/main/java/com/imooc/activitiweb/security/MyUserDetailsService.java index 970e4d3..eb77455 100644 --- a/src/main/java/com/imooc/activitiweb/security/MyUserDetailsService.java +++ b/src/main/java/com/imooc/activitiweb/security/MyUserDetailsService.java @@ -1,8 +1,8 @@ package com.imooc.activitiweb.security; -import com.imooc.activitiweb.pojo.UserInfoBean; import com.imooc.activitiweb.mapper.UserInfoBeanMapper; +import com.imooc.activitiweb.pojo.UserInfoBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/com/imooc/activitiweb/security/SimpleResponse.java b/src/main/java/com/imooc/activitiweb/security/SimpleResponse.java index e22502b..d46aedc 100644 --- a/src/main/java/com/imooc/activitiweb/security/SimpleResponse.java +++ b/src/main/java/com/imooc/activitiweb/security/SimpleResponse.java @@ -15,7 +15,7 @@ public class SimpleResponse { this.content = content; } - private Object content; + private Object content; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f24c528..13dfd0e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,11 +2,13 @@ server: port: 8080 servlet: context-path: / + session: + timeout: 9000 spring: datasource: username: root - password: YourPassWord_NiDeMiMa - url: jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true + password: 666666 + url: jdbc:mysql://192.168.1.196:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver #日志的相关配置 logging: @@ -17,5 +19,4 @@ spring.activiti.history-level: full spring.activiti.db-history-used: true # spring-activiti # 自动部署验证设置:true-开启(默认)、false-关闭 -spring.activiti.check-process-definitions: false - +spring.activiti.check-process-definitions: false \ No newline at end of file diff --git a/src/main/resources/resources/bpmnjs/.gitignore b/src/main/resources/resources/bpmnjs/.gitignore index 104d999..dc93b12 100644 --- a/src/main/resources/resources/bpmnjs/.gitignore +++ b/src/main/resources/resources/bpmnjs/.gitignore @@ -1,2 +1,3 @@ node_modules/ -tmp/ \ No newline at end of file +tmp/ +dist/ \ No newline at end of file diff --git a/src/main/resources/resources/bpmnjs/app/index.html b/src/main/resources/resources/bpmnjs/app/index.html index cb1f8ff..0aa8b05 100644 --- a/src/main/resources/resources/bpmnjs/app/index.html +++ b/src/main/resources/resources/bpmnjs/app/index.html @@ -12,6 +12,7 @@
+
-
+
+ + + + diff --git a/src/main/resources/resources/layuimini/page/ProcessInstance.html b/src/main/resources/resources/layuimini/page/ProcessInstance.html new file mode 100644 index 0000000..dc6b7f0 --- /dev/null +++ b/src/main/resources/resources/layuimini/page/ProcessInstance.html @@ -0,0 +1,192 @@ + + + + + layui + + + + + + + +
+
+ + +
+ +
+
+
+ + + +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/resources/layuimini/page/ToDoTasks.html b/src/main/resources/resources/layuimini/page/ToDoTasks.html index 37d525a..3839733 100644 --- a/src/main/resources/resources/layuimini/page/ToDoTasks.html +++ b/src/main/resources/resources/layuimini/page/ToDoTasks.html @@ -49,11 +49,12 @@ //处理时间 for(var i = 0 ; i< res.obj.length ; i++){ for(k in res.obj[i]) { - res.obj[i]["CreatedDate"] = renderTime(res.obj[i].CreatedDate) + res.obj[i]["createdDate"] = renderTime(res.obj[i].createdDate); + res.obj[i]['status']=judgeState(res.obj[i].status) } } return { - "code": res.status === 1 ? 0 : res.status, //解析接口状态,默认成功是0 + "code": res.status, //解析接口状态,默认成功是0 "msg": res.msg, //解析提示文本 "count": res.obj.length, //解析数据长度 "data": res.obj //解析数据列表 @@ -61,11 +62,13 @@ }, cols: [[ {type: "checkbox", width:'5%',align:"center"}, - {field: 'ID', width:'25%', title: 'ID',align:"center"}, - {field: 'InstanceName', width:'25%', title: '流程名称',align:"center"}, - {field: 'Assignee', width:'15%', title: '办理人',align:"center"}, - {field: 'CreatedDate', title: '创建时间', width:'15%',align:"center"}, - {title: '操作', width:'15%', toolbar: '#currentTableBar', align: "center"} + {field: 'id', width:'13%', title: 'ID',align:"center"}, + {field: 'instanceName', width:'22%', title: '流程名称',align:"center"}, + {field: 'name', width:'15%', title: '任务节点名称',align:"center"}, + {field: 'status', width:'12%', title: '任务状态',align:"center"}, + {field: 'assignee', width:'8%', title: '办理人',align:"center"}, + {field: 'createdDate', title: '创建时间', width:'15%',align:"center"}, + {title: '操作', width:'10%', toolbar: '#currentTableBar', align: "center"} ]], limits: [10, 15, 20, 25, 50, 100], limit: 10, @@ -73,6 +76,13 @@ skin: 'line', // id:'ToDoTasksTableId', done:function (res, curr, count) { + if(res.code==1){ + layer.alert(res.msg+'
'+res.data, { + icon: 2, + title:"提示" + }); + } + if(count>0){ goPage(1); } @@ -84,7 +94,8 @@ */ table.on('tool(currentTableFilter)', function (obj) { if (obj.event === 'handle') { // 监听办理操作 - doHandle(obj); + // console.log(obj); + creatFormTable(obj); } }); @@ -92,10 +103,58 @@ var dateee = new Date(date).toJSON(); return new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '') } + function judgeState(state) { + var stateText=''; + if(state == 'ASSIGNED'){ + stateText='执行中'; + }else { + stateText = state + } + return stateText + } //监听表格复选框选择 table.on('checkbox(currentTableFilter)', function (obj) { console.log(obj) }); + //动态生成表单 + function creatFormTable(obj) { + var loadIndex = layer.load(2); + $.get( ''+publicurl+'task/formDataShow', { + taskID: obj.data ? obj.data.id : '', + }, function (res) { + layer.close(loadIndex); + if (res.obj != '无表单' && res.status == 0) { + var index = layer.open({ + title: '办理任务', + type: 2, + shade: 0.2, + maxmin:true, + shadeClose: true, + area: ['100%', '100%'], + content: '../page/table/FormDataShow.html', + success: function (layero, index) { + var iframe = window['layui-layer-iframe' + index]; + iframe.child(JSON.stringify(res.obj),obj.data.id) + localStorage.setItem("ID",obj.data.id); + }, + end:function(){ + insTb.reload(); + } + }); + $(window).on("resize", function () { + layer.full(index); + }); + } else if(res.status == 1){ + parent.layer.msg(res.obj, { + icon: 0, + time: 2000 + }); + }else { + doHandle(obj); + } + }, 'json'); + + } /* 挂起流程定义 */ function doHandle(obj) { console.log(obj,"单条数据"); @@ -106,7 +165,7 @@ layer.close(i); var loadIndex = layer.load(2); $.get( ''+publicurl+'task/completeTask', { - taskID: obj.data ? obj.data.ID : '', + taskID: obj.data ? obj.data.id : '', }, function (res) { layer.close(loadIndex); if (res.status === 0) { diff --git a/src/main/resources/resources/layuimini/page/login-1.html b/src/main/resources/resources/layuimini/page/login-1.html index de17d01..8479311 100644 --- a/src/main/resources/resources/layuimini/page/login-1.html +++ b/src/main/resources/resources/layuimini/page/login-1.html @@ -37,7 +37,7 @@