From 52f87dc69a7a6f279ddc9f4b98c1e53664422d1a Mon Sep 17 00:00:00 2001 From: luozukai Date: Mon, 7 Jan 2019 19:29:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=91=E5=AE=A1=E6=89=B9=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mallinkAdmin/pom.xml | 1 + .../controller/FlowAbleController.java | 223 ++++++++++++++++++ .../controller/MallUserInfoController.java | 19 ++ .../iformall/flowable/BossTaskHandler.java | 12 + .../com/iformall/flowable/FlowableConfig.java | 22 ++ .../iformall/flowable/ManagerTaskHandler.java | 13 + .../src/main/resources/application-dev.yml | 2 + .../processes/ExpenseProcess.bpmn20.xml | 108 +++++++++ .../processes/contractflow.bpmn20.xml | 45 ++++ mallinkService/pom.xml | 12 +- .../com/iformall/domain/po/MallUserInfo.java | 18 +- .../java/com/iformall/enums/EnumFlowKey.java | 37 +++ .../enums/EnumFlowPermissionType.java | 38 +++ .../iformall/service/MallUserInfoService.java | 5 + .../service/impl/MallUserInfoServiceImpl.java | 6 + .../resources/mapper/MallUserInfoMapper.xml | 6 +- 16 files changed, 561 insertions(+), 6 deletions(-) create mode 100644 mallinkAdmin/src/main/java/com/iformall/controller/FlowAbleController.java create mode 100644 mallinkAdmin/src/main/java/com/iformall/flowable/BossTaskHandler.java create mode 100644 mallinkAdmin/src/main/java/com/iformall/flowable/FlowableConfig.java create mode 100644 mallinkAdmin/src/main/java/com/iformall/flowable/ManagerTaskHandler.java create mode 100644 mallinkAdmin/src/main/resources/processes/ExpenseProcess.bpmn20.xml create mode 100644 mallinkAdmin/src/main/resources/processes/contractflow.bpmn20.xml create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumFlowKey.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumFlowPermissionType.java diff --git a/mallinkAdmin/pom.xml b/mallinkAdmin/pom.xml index 02c1bf92c..e692e554e 100644 --- a/mallinkAdmin/pom.xml +++ b/mallinkAdmin/pom.xml @@ -49,6 +49,7 @@ core 3.3.3 + diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/FlowAbleController.java b/mallinkAdmin/src/main/java/com/iformall/controller/FlowAbleController.java new file mode 100644 index 000000000..52f94a82a --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/controller/FlowAbleController.java @@ -0,0 +1,223 @@ +package com.iformall.controller; + +import com.iformall.common.ResultData; +import com.iformall.enums.EnumFlowKey; +import com.iformall.service.FlowableService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.collections.map.HashedMap; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.common.engine.impl.identity.Authentication; +import org.flowable.engine.*; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.task.Comment; +import org.flowable.image.ProcessDiagramGenerator; +import org.flowable.task.api.Task; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.*; + +@RestController +@Api(description = "工作流相关接口") +@RequestMapping(value = "workflow") +public class FlowAbleController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private RuntimeService runtimeService; + @Autowired + private TaskService taskService; + @Autowired + private RepositoryService repositoryService; + @Autowired + private ProcessEngine processEngine; + + @ApiOperation("启动流程") + @PostMapping("/start") + public ResultData start(@RequestBody Map params) { + logger.debug("[" + getIpAddr() + "] FlowAbleController::start"); + + try{ + //设置发起人 + Authentication.setAuthenticatedUserId(super.getUser().getId().toString()); + String firstTaskUserId = params.get("firstTaskUserId"); + String secondTaskUserId = params.get("secondTaskUserId"); + String remark = params.get("remark"); + HashMap map = new HashMap<>(); + + // 设置节点处理人 + map.put("firstTaskUser", firstTaskUserId); + map.put("secondTaskUser", secondTaskUserId); + // map info + map.put("starterId", super.getUser().getId()); + map.put("starter", super.getUser().getName()); + map.put("startTime",new Date().getTime()); + map.put("remark",remark); + + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(EnumFlowKey.CONTRACT.getCode(), map); + logger.debug("流程启动,流程id:{}",processInstance.getId()); + return new ResultData(); + }catch (Exception e){ + logger.error("启动流程发生错误",e); + throw new RuntimeException(e); + }finally { + Authentication.setAuthenticatedUserId(null); + } + } + + /** + * 用户代办列表 + */ + @ApiOperation("用户代办列表") + @PostMapping(value = "/list") + @ResponseBody + public Object list(@RequestBody Map params) { + String userId = (String)params.get("userId"); + Integer flowType = (Integer)params.get("flowType"); //1合同审批 2账单审批 + String flowKey = ""; + if(1 == flowType){ + flowKey = EnumFlowKey.CONTRACT.getCode(); + }else if(2 == flowType){ + flowKey = EnumFlowKey.BILL.getCode(); + } + + List tasks = taskService.createTaskQuery().processDefinitionKey(flowKey).taskCandidateUser(userId).orderByTaskCreateTime().desc().list(); + List> result = new ArrayList<>(); + + for (Task task : tasks) { + Map taskInfoMap = new HashedMap(); + taskInfoMap.put("starter",taskService.getVariable(task.getId(),"starter")); + taskInfoMap.put("startTime",taskService.getVariable(task.getId(),"startTime")); + taskInfoMap.put("processInstanceId",task.getProcessInstanceId()); + taskInfoMap.put("taskId",task.getId()); + result.add(taskInfoMap); + } + return new ResultData(result); + } + + /** + * 审批 + */ + @ApiOperation("审批") + @PostMapping(value = "apply") + public ResultData apply(@RequestBody Map params) { + String taskId = params.get("taskId"); + String processInstanceId = params.get("processInstanceId"); + String remark = params.get("remark"); + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if (task == null) { + throw new RuntimeException("流程不存在"); + } + taskService.addComment(taskId,processInstanceId,remark); + taskService.complete(taskId); + + return new ResultData(); + } + + /** + * 驳回 + */ + @ApiOperation("驳回") + @PostMapping(value = "reject") + public ResultData reject(@RequestBody Map params) { + String taskId = params.get("taskId"); + String processInstanceId = params.get("processInstanceId"); + String remark = params.get("remark"); + + taskService.addComment(taskId,processInstanceId,remark); + runtimeService.deleteProcessInstance(processInstanceId, "驳回"); + return new ResultData(); + } + + /** + * 审批记录 + * + * @param processInstanceId 流程实例ID + */ + @ApiOperation("审批记录") + @PostMapping(value = "applyHistory") + @ResponseBody + public String applyHistory(String processInstanceId) { + List list = processEngine.getHistoryService() + .createHistoricTaskInstanceQuery() + .processInstanceId(processInstanceId) + .list(); + if (list != null && list.size() > 0) { + for (HistoricTaskInstance hti : list) { + System.out.print("taskId:" + hti.getId()+","); + System.out.print("name:" + hti.getName()+","); + System.out.print("pdId:" + hti.getProcessDefinitionId()+","); + System.out.print("assignee:" + hti.getAssignee()+","); + List commentList = taskService.getTaskComments(hti.getId()); + for (Comment c:commentList) { + System.out.println("备注:"+c.getFullMessage()); + } + System.out.println("===================================="); + } + } + return "ok!"; + } + + + + /** + * 生成流程图 + * + * @param processId 任务ID + */ + @GetMapping(value = "processDiagram") + public void genProcessDiagram(HttpServletResponse httpServletResponse, String processId) throws Exception { + ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); + + //流程走完的不显示图 + if (pi == null) { + return; + } + Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); + //使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象 + String InstanceId = task.getProcessInstanceId(); + List executions = runtimeService + .createExecutionQuery() + .processInstanceId(InstanceId) + .list(); + + //得到正在执行的Activity的Id + List activityIds = new ArrayList<>(); + List flows = new ArrayList<>(); + for (Execution exe : executions) { + List ids = runtimeService.getActiveActivityIds(exe.getId()); + activityIds.addAll(ids); + } + + //获取流程图 + BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId()); + ProcessEngineConfiguration engconf = processEngine.getProcessEngineConfiguration(); + ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator(); + InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0,true); + OutputStream out = null; + byte[] buf = new byte[1024]; + int legth = 0; + try { + out = httpServletResponse.getOutputStream(); + while ((legth = in.read(buf)) != -1) { + out.write(buf, 0, legth); + } + } finally { + if (in != null) { + in.close(); + } + if (out != null) { + out.close(); + } + } + } + + +} \ No newline at end of file diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/MallUserInfoController.java b/mallinkAdmin/src/main/java/com/iformall/controller/MallUserInfoController.java index 0c1f0bab0..81663a270 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/MallUserInfoController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/MallUserInfoController.java @@ -7,6 +7,7 @@ import com.iformall.common.ResultData; import com.iformall.domain.po.*; import com.iformall.enums.EnumMallUserStatus; import com.iformall.enums.EnumUserAdmin; +import com.iformall.enums.EnumFlowPermissionType; import com.iformall.service.*; import com.iformall.shiro.PasswordHelper; import com.iformall.shiro.UserSession; @@ -14,6 +15,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.slf4j.Logger; @@ -23,6 +25,7 @@ import org.springframework.util.Assert; import org.springframework.web.bind.annotation.*; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -372,4 +375,20 @@ public class MallUserInfoController extends BaseController { return new ResultData(Result.ERROR, e.getMessage()); } } + + @ApiOperation(value = "审批权限用户列表", response = String.class) + @GetMapping("getFlowPermissionList") + public ResultData getFlowPermissionList() { + logger.debug("[" + getIpAddr() + "] MallUserInfoController::getFlowPermissionList"); + MallUserInfo mallUserInfo = new MallUserInfo(); + mallUserInfo.setFlowPermission(EnumFlowPermissionType.CONTRACT.getCode()+""); + List contractUserList = userInfoService.findList(mallUserInfo); + + mallUserInfo.setFlowPermission(EnumFlowPermissionType.BILL.getCode()+""); + List billUserList = userInfoService.findList(mallUserInfo); + Map resultMap = new HashedMap(); + resultMap.put("contractUserList",contractUserList); + resultMap.put("billUserList",billUserList); + return new ResultData(resultMap); + } } diff --git a/mallinkAdmin/src/main/java/com/iformall/flowable/BossTaskHandler.java b/mallinkAdmin/src/main/java/com/iformall/flowable/BossTaskHandler.java new file mode 100644 index 000000000..2d7b8546f --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/flowable/BossTaskHandler.java @@ -0,0 +1,12 @@ +package com.iformall.flowable; + +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.service.delegate.DelegateTask; +public class BossTaskHandler implements TaskListener { + + @Override + public void notify(DelegateTask delegateTask) { + delegateTask.setAssignee("老板"); + } + +} diff --git a/mallinkAdmin/src/main/java/com/iformall/flowable/FlowableConfig.java b/mallinkAdmin/src/main/java/com/iformall/flowable/FlowableConfig.java new file mode 100644 index 000000000..0c71fc1d7 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/flowable/FlowableConfig.java @@ -0,0 +1,22 @@ +package com.iformall.flowable; + +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.context.annotation.Configuration; + +/** + * @author haiyangp + * date: 2018/4/7 + * desc: flowable配置----为放置生成的流程图中中文乱码 + */ +@Configuration +public class FlowableConfig implements EngineConfigurationConfigurer { + + + @Override + public void configure(SpringProcessEngineConfiguration engineConfiguration) { + engineConfiguration.setActivityFontName("宋体"); + engineConfiguration.setLabelFontName("宋体"); + engineConfiguration.setAnnotationFontName("宋体"); + } +} diff --git a/mallinkAdmin/src/main/java/com/iformall/flowable/ManagerTaskHandler.java b/mallinkAdmin/src/main/java/com/iformall/flowable/ManagerTaskHandler.java new file mode 100644 index 000000000..d82f596bb --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/flowable/ManagerTaskHandler.java @@ -0,0 +1,13 @@ +package com.iformall.flowable; + +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.service.delegate.DelegateTask; + +public class ManagerTaskHandler implements TaskListener { + + @Override + public void notify(DelegateTask delegateTask) { + delegateTask.setAssignee("经理"); + } + +} diff --git a/mallinkAdmin/src/main/resources/application-dev.yml b/mallinkAdmin/src/main/resources/application-dev.yml index 55d8b9612..12b2bd461 100644 --- a/mallinkAdmin/src/main/resources/application-dev.yml +++ b/mallinkAdmin/src/main/resources/application-dev.yml @@ -22,6 +22,8 @@ spring: connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000" #jackson: #date-format: yyyy-MM-dd HH:mm:ss + flowable: + async-executor-activate: false # REDIS redis: diff --git a/mallinkAdmin/src/main/resources/processes/ExpenseProcess.bpmn20.xml b/mallinkAdmin/src/main/resources/processes/ExpenseProcess.bpmn20.xml new file mode 100644 index 000000000..125b3cb2e --- /dev/null +++ b/mallinkAdmin/src/main/resources/processes/ExpenseProcess.bpmn20.xml @@ -0,0 +1,108 @@ + + + + 报销流程 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 500}]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mallinkAdmin/src/main/resources/processes/contractflow.bpmn20.xml b/mallinkAdmin/src/main/resources/processes/contractflow.bpmn20.xml new file mode 100644 index 000000000..8a14783bf --- /dev/null +++ b/mallinkAdmin/src/main/resources/processes/contractflow.bpmn20.xml @@ -0,0 +1,45 @@ + + + + 合同审批流程 + + + 初审 + + + + + + + 复审 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mallinkService/pom.xml b/mallinkService/pom.xml index 2ea9abea7..9dbdf8782 100644 --- a/mallinkService/pom.xml +++ b/mallinkService/pom.xml @@ -10,14 +10,22 @@ 4.0.0 mallinkService - + + + org.flowable + flowable-spring-boot-starter-basic + 6.4.0 + - --> + \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/domain/po/MallUserInfo.java b/mallinkService/src/main/java/com/iformall/domain/po/MallUserInfo.java index e1eed9ce6..8163e212a 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/MallUserInfo.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/MallUserInfo.java @@ -41,8 +41,8 @@ public class MallUserInfo implements Serializable { public void setIds(List ids) { this.ids = ids; } - - + + /**租户ID**/ @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") @@ -94,7 +94,19 @@ public class MallUserInfo implements Serializable { @Transient private String captcha; - + + /**1合同审批 2账单审批**/ + @io.swagger.annotations.ApiModelProperty(value="",name="flowPermission") + private String flowPermission; + + public String getFlowPermission() { + return flowPermission; + } + + public void setFlowPermission(String flowPermission) { + this.flowPermission = flowPermission; + } + public String getMenus() { return menus; } diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumFlowKey.java b/mallinkService/src/main/java/com/iformall/enums/EnumFlowKey.java new file mode 100644 index 000000000..bd4f6ce47 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumFlowKey.java @@ -0,0 +1,37 @@ +package com.iformall.enums; + +/** + * Created by luozukai + * 流程key + */ +public enum EnumFlowKey { + + CONTRACT("contract_flow", "合同审批流程key"), + BILL("bill_flow", "账单审批流程key") + ; + + public static EnumFlowKey getEnum(Integer code) { + for (EnumFlowKey value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private String code; + private String message; + + EnumFlowKey(String code, String message) { + this.code = code; + this.message = message; + } + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumFlowPermissionType.java b/mallinkService/src/main/java/com/iformall/enums/EnumFlowPermissionType.java new file mode 100644 index 000000000..16967bfe5 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumFlowPermissionType.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by luozukai + */ +public enum EnumFlowPermissionType { + + // 0无权限 1合同审批 2账单审批 + DEFAULT(0, "无权限"), + CONTRACT(1, "合同审批权限"), + BILL(2, "账单审批权限") + ; + + public static EnumFlowPermissionType getEnum(Integer code) { + for (EnumFlowPermissionType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumFlowPermissionType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java b/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java index 959be696f..3c2c9be82 100644 --- a/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java +++ b/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java @@ -96,4 +96,9 @@ public interface MallUserInfoService { */ MallUserInfo getByOpenId(String openId); + /** + * 根据条件用户列表 + * @return + */ + List findList(MallUserInfo record); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java index a7e7c9e86..4b3b9c9bc 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java @@ -147,4 +147,10 @@ public class MallUserInfoServiceImpl implements MallUserInfoService { return new ResultData(); } + @Override + public List findList(MallUserInfo record){ + return mallUserInfoMapper.findList(record); + } + + } diff --git a/mallinkService/src/main/resources/mapper/MallUserInfoMapper.xml b/mallinkService/src/main/resources/mapper/MallUserInfoMapper.xml index 65fa45a37..fdac39ba9 100644 --- a/mallinkService/src/main/resources/mapper/MallUserInfoMapper.xml +++ b/mallinkService/src/main/resources/mapper/MallUserInfoMapper.xml @@ -14,10 +14,11 @@ + - `id`,`tenant_id`,`username`,`name`,`password`,`create_time`,`last_login_time`,`status`,`is_admin`,`nick_name`,`phone`,`open_id` + `id`,`tenant_id`,`username`,`name`,`password`,`create_time`,`last_login_time`,`status`,`is_admin`,`nick_name`,`phone`,`open_id`,`flow_permission` @@ -67,6 +68,9 @@ and `open_id` = #{openId} + + and JSON_CONTAINS(flow_permission->'$[*]', #{flowPermission}, '$') + and id in