| @@ -1,255 +0,0 @@ | |||||
| package com.iformall.controller; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.WxRentContract; | |||||
| import com.iformall.enums.EnumFlowKey; | |||||
| import com.iformall.enums.EnumRentContractAppStatus; | |||||
| import com.iformall.service.WxRentContractService; | |||||
| 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.history.HistoricProcessInstance; | |||||
| 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; | |||||
| @Autowired | |||||
| private WxRentContractService wxRentContractService; | |||||
| /** | |||||
| * 1合同 2账单 | |||||
| * @param flowType | |||||
| * @return | |||||
| */ | |||||
| public String getFlowKeyByType(int flowType){ | |||||
| if(1 == flowType){ | |||||
| return EnumFlowKey.CONTRACT.getCode(); | |||||
| }else if(2 == flowType){ | |||||
| return EnumFlowKey.BILL.getCode(); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| @ApiOperation("启动流程") | |||||
| @PostMapping("/start") | |||||
| public ResultData start(@RequestBody Map<String, String> 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"); | |||||
| Long businessId = Long.parseLong(params.get("businessId")); | |||||
| Integer flowType = Integer.parseInt(params.get("flowType")); | |||||
| HashMap<String, Object> 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); | |||||
| map.put("businessId",businessId); | |||||
| ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(getFlowKeyByType(flowType), map); | |||||
| logger.debug("流程启动,流程id:{}",processInstance.getId()); | |||||
| // 合同审核状态改为审核中 | |||||
| WxRentContract wxRentContract = new WxRentContract(); | |||||
| wxRentContract.setId(businessId); | |||||
| wxRentContract.setApplyStatus(EnumRentContractAppStatus.APPLYING.getCode()); | |||||
| wxRentContractService.updateApplyStatus(wxRentContract); | |||||
| 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<String, Object> params) { | |||||
| String userId = (String)params.get("userId"); | |||||
| Integer flowType = (Integer)params.get("flowType"); | |||||
| String flowKey = getFlowKeyByType(flowType); | |||||
| List<Task> tasks = taskService.createTaskQuery().processDefinitionKey(flowKey).taskCandidateUser(userId).orderByTaskCreateTime().desc().list(); | |||||
| List<Map<String,Object>> result = new ArrayList<>(); | |||||
| for (Task task : tasks) { | |||||
| Map<String,Object> 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<String, String> 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<String, String> params) { | |||||
| String taskId = params.get("taskId"); | |||||
| String processInstanceId = params.get("processInstanceId"); | |||||
| String remark = params.get("remark"); | |||||
| String businessId = params.get("businessId"); | |||||
| taskService.addComment(taskId,processInstanceId,remark); | |||||
| runtimeService.deleteProcessInstance(processInstanceId, "驳回"); | |||||
| // 修改合同审核状态为驳回 | |||||
| WxRentContract wxRentContract = new WxRentContract(); | |||||
| wxRentContract.setId(Long.parseLong(businessId)); | |||||
| wxRentContract.setApplyStatus(EnumRentContractAppStatus.REJECT.getCode()); | |||||
| wxRentContractService.updateApplyStatus(wxRentContract); | |||||
| return new ResultData(); | |||||
| } | |||||
| /** | |||||
| * 审批记录 | |||||
| * | |||||
| * @param processInstanceId 流程实例ID | |||||
| */ | |||||
| @ApiOperation("审批记录") | |||||
| @GetMapping(value = "applyHistory") | |||||
| @ResponseBody | |||||
| public String applyHistory(String processInstanceId) { | |||||
| List<HistoricTaskInstance> 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<Comment> 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<Execution> executions = runtimeService | |||||
| .createExecutionQuery() | |||||
| .processInstanceId(InstanceId) | |||||
| .list(); | |||||
| //得到正在执行的Activity的Id | |||||
| List<String> activityIds = new ArrayList<>(); | |||||
| List<String> flows = new ArrayList<>(); | |||||
| for (Execution exe : executions) { | |||||
| List<String> 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(); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,95 @@ | |||||
| package com.iformall.controller; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.service.WxFlowService; | |||||
| import io.swagger.annotations.Api; | |||||
| import io.swagger.annotations.ApiImplicitParam; | |||||
| import io.swagger.annotations.ApiImplicitParams; | |||||
| import io.swagger.annotations.ApiOperation; | |||||
| 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.util.*; | |||||
| @RestController | |||||
| @Api(description = "工作流相关接口") | |||||
| @RequestMapping(value = "workflow") | |||||
| public class WxFlowAbleController extends BaseController { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
| @Autowired | |||||
| private WxFlowService wxFlowService; | |||||
| @ApiOperation(value = "启动流程",notes = "{\"businessId\":\"215315084967149568\",\"businessType\":1,\"remark\":\"意见意见。\",\"taskAssignee\":[{\"taskKey\":\"firstTaskUser\",\"assignee\":204398756307664896},{\"taskKey\":\"secondTaskUser\",\"assignee\":204398756307664896}]}") | |||||
| @PostMapping("/start") | |||||
| public ResultData start(@RequestBody Map<String, Object> params) { | |||||
| logger.debug("[" + getIpAddr() + "] FlowAbleController::start"); | |||||
| return wxFlowService.start(params,super.getUser().getId(),super.getUser().getName(),super.getTenantId()); | |||||
| } | |||||
| /** | |||||
| * 用户代办列表 | |||||
| */ | |||||
| @ApiOperation("用户代办列表") | |||||
| @GetMapping(value = "/list") | |||||
| @ApiImplicitParams({ | |||||
| @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), | |||||
| @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true), | |||||
| @ApiImplicitParam(name = "flowType", value = "流程类型,1合同流程 2账单流程", dataType = "int", paramType = "query", required = true) | |||||
| }) | |||||
| public ResultData list(Integer flowType,Integer pageNum, Integer pageSize) { | |||||
| logger.debug("[" + getIpAddr() + "] FlowAbleController::list"); | |||||
| return wxFlowService.list(flowType,pageNum,pageSize,super.getUser().getId()); | |||||
| } | |||||
| /** | |||||
| * 审批历史 | |||||
| */ | |||||
| @ApiOperation("审批历史") | |||||
| @GetMapping(value = "/applyHistory") | |||||
| @ApiImplicitParams({ | |||||
| @ApiImplicitParam(name = "businessId", value = "业务id", dataType = "long", paramType = "query", required = true), | |||||
| }) | |||||
| public ResultData applyHistory(Long businessId) { | |||||
| logger.debug("[" + getIpAddr() + "] FlowAbleController::applyHistory"); | |||||
| return wxFlowService.applyHistory(businessId); | |||||
| } | |||||
| /** | |||||
| * 审批 | |||||
| */ | |||||
| @ApiOperation(value = "审批",notes = "{\"taskId\":\"\",\"processInstanceId\":\"\",\"remark\":\"\"}") | |||||
| @PostMapping(value = "apply") | |||||
| public ResultData apply(@RequestBody Map<String, String> params) { | |||||
| return wxFlowService.apply(params,super.getUser().getId(),super.getUser().getName(),super.getTenantId()); | |||||
| } | |||||
| /** | |||||
| * 驳回 | |||||
| */ | |||||
| @ApiOperation(value = "驳回",notes = "{\"taskId\":\"\",\"processInstanceId\":\"\",\"remark\":\"\"}") | |||||
| @PostMapping(value = "reject") | |||||
| public ResultData reject(@RequestBody Map<String, String> params) { | |||||
| return wxFlowService.reject(params,super.getUser().getId(),super.getUser().getName(),super.getTenantId()); | |||||
| } | |||||
| /** | |||||
| * 生成流程图 | |||||
| * | |||||
| */ | |||||
| @GetMapping(value = "processDiagram") | |||||
| @ApiImplicitParams({ | |||||
| @ApiImplicitParam(name = "processInstanceId", value = "流程id", dataType = "String", paramType = "query", required = true) | |||||
| }) | |||||
| public void genProcessDiagram(HttpServletResponse httpServletResponse, String processInstanceId) throws Exception { | |||||
| wxFlowService.genProcessDiagram(httpServletResponse,processInstanceId); | |||||
| } | |||||
| } | |||||
| @@ -1,7 +1,10 @@ | |||||
| package com.iformall.flowable; | package com.iformall.flowable; | ||||
| import com.iformall.domain.po.WxFlowRecord; | |||||
| import com.iformall.domain.po.WxRentContract; | import com.iformall.domain.po.WxRentContract; | ||||
| import com.iformall.enums.EnumFlowRecordStatus; | |||||
| import com.iformall.enums.EnumRentContractAppStatus; | import com.iformall.enums.EnumRentContractAppStatus; | ||||
| import com.iformall.service.WxFlowRecordService; | |||||
| import com.iformall.service.WxRentContractService; | import com.iformall.service.WxRentContractService; | ||||
| import org.flowable.engine.delegate.TaskListener; | import org.flowable.engine.delegate.TaskListener; | ||||
| import org.flowable.task.service.delegate.DelegateTask; | import org.flowable.task.service.delegate.DelegateTask; | ||||
| @@ -55,3 +55,5 @@ logging: | |||||
| tk.mybatis: debug | tk.mybatis: debug | ||||
| com.iformall: debug | com.iformall: debug | ||||
| path: ./logs/admin | path: ./logs/admin | ||||
| admin-page: http://admin.malls.iformall.com | |||||
| @@ -49,4 +49,6 @@ logging: | |||||
| level: | level: | ||||
| tk.mybatis: debug | tk.mybatis: debug | ||||
| com.iformall.mapper: debug | com.iformall.mapper: debug | ||||
| path: ./logs/admin | |||||
| path: ./logs/admin | |||||
| admin-page: http://admin.malls.iformall.com | |||||
| @@ -49,4 +49,6 @@ logging: | |||||
| level: | level: | ||||
| tk.mybatis: debug | tk.mybatis: debug | ||||
| com.iformall: debug | com.iformall: debug | ||||
| path: ./logs/admin | |||||
| path: ./logs/admin | |||||
| admin-page: http://admin.malls.iformall.com | |||||
| @@ -94,4 +94,6 @@ jasypt: | |||||
| encryptor: | encryptor: | ||||
| password: oRqdnDbK5pj3eMmB | password: oRqdnDbK5pj3eMmB | ||||
| version: @project.version@ | |||||
| version: @project.version@ | |||||
| admin-page: http://admin.malls.iformall.com | |||||
| @@ -0,0 +1,126 @@ | |||||
| package com.iformall.domain.po; | |||||
| import javax.persistence.Id; | |||||
| import javax.persistence.Table; | |||||
| import java.io.Serializable; | |||||
| import java.util.Date; | |||||
| @Table(name = "wx_flow_record") | |||||
| public class WxFlowRecord implements Serializable { | |||||
| private static final long serialVersionUID = 1849242743274278L; | |||||
| @Id | |||||
| private Long id; | |||||
| private Long businessId; //业务id | |||||
| private Integer businessType;//业务类型 1合同审批2账单审批 | |||||
| private Long userId;//用户id | |||||
| private String userName;//姓名 | |||||
| private String remark;//审批意见 | |||||
| private Integer status;//状态 1新建2审批3驳回4审批通过 | |||||
| private String taskId;//任务id | |||||
| private String processInstanceId;//流程实例id | |||||
| private Date createDate; | |||||
| private Date updateDate; | |||||
| private String tenantId; | |||||
| public WxFlowRecord(){} | |||||
| public WxFlowRecord(Long businessId){ | |||||
| this.businessId = businessId; | |||||
| } | |||||
| public String getTenantId() { | |||||
| return tenantId; | |||||
| } | |||||
| public void setTenantId(String tenantId) { | |||||
| this.tenantId = tenantId; | |||||
| } | |||||
| public String getUserName() { | |||||
| return userName; | |||||
| } | |||||
| public void setUserName(String userName) { | |||||
| this.userName = userName; | |||||
| } | |||||
| public Long getId() { | |||||
| return id; | |||||
| } | |||||
| public void setId(Long id) { | |||||
| this.id = id; | |||||
| } | |||||
| public Long getBusinessId() { | |||||
| return businessId; | |||||
| } | |||||
| public void setBusinessId(Long businessId) { | |||||
| this.businessId = businessId; | |||||
| } | |||||
| public Integer getBusinessType() { | |||||
| return businessType; | |||||
| } | |||||
| public void setBusinessType(Integer businessType) { | |||||
| this.businessType = businessType; | |||||
| } | |||||
| public Long getUserId() { | |||||
| return userId; | |||||
| } | |||||
| public void setUserId(Long userId) { | |||||
| this.userId = userId; | |||||
| } | |||||
| public String getRemark() { | |||||
| return remark; | |||||
| } | |||||
| public void setRemark(String remark) { | |||||
| this.remark = remark; | |||||
| } | |||||
| public Integer getStatus() { | |||||
| return status; | |||||
| } | |||||
| public void setStatus(Integer status) { | |||||
| this.status = status; | |||||
| } | |||||
| public String getTaskId() { | |||||
| return taskId; | |||||
| } | |||||
| public void setTaskId(String taskId) { | |||||
| this.taskId = taskId; | |||||
| } | |||||
| public String getProcessInstanceId() { | |||||
| return processInstanceId; | |||||
| } | |||||
| public void setProcessInstanceId(String processInstanceId) { | |||||
| this.processInstanceId = processInstanceId; | |||||
| } | |||||
| public Date getCreateDate() { | |||||
| return createDate; | |||||
| } | |||||
| public void setCreateDate(Date createDate) { | |||||
| this.createDate = createDate; | |||||
| } | |||||
| public Date getUpdateDate() { | |||||
| return updateDate; | |||||
| } | |||||
| public void setUpdateDate(Date updateDate) { | |||||
| this.updateDate = updateDate; | |||||
| } | |||||
| } | |||||
| @@ -48,8 +48,8 @@ public class WxMsgValidationcode implements Serializable { | |||||
| /***/ | /***/ | ||||
| @io.swagger.annotations.ApiModelProperty(value="",name="createtime") | @io.swagger.annotations.ApiModelProperty(value="",name="createtime") | ||||
| private Date createtime; | private Date createtime; | ||||
| /*场景 1 登录 2买券 3停车**/ | |||||
| @io.swagger.annotations.ApiModelProperty(value="场景 1 登录 2买券 3停车",name="type") | |||||
| /*场景 1 登录 2买券 3停车 4审批流通知**/ | |||||
| @io.swagger.annotations.ApiModelProperty(value="场景 1 登录 2买券 3停车 4审批流通知",name="type") | |||||
| private Integer type; | private Integer type; | ||||
| /***/ | /***/ | ||||
| @io.swagger.annotations.ApiModelProperty(value="",name="tenantId") | @io.swagger.annotations.ApiModelProperty(value="",name="tenantId") | ||||
| @@ -180,6 +180,7 @@ public class WxRentContract implements Serializable { | |||||
| @io.swagger.annotations.ApiModelProperty(value = "起租结束时间", name = "rentalEndDate") | @io.swagger.annotations.ApiModelProperty(value = "起租结束时间", name = "rentalEndDate") | ||||
| private Date endDate; | private Date endDate; | ||||
| //审核状态,0未审核 1审核中 2审核通过 3驳回 | |||||
| @io.swagger.annotations.ApiModelProperty(value = "审核状态", name = "applyStatus") | @io.swagger.annotations.ApiModelProperty(value = "审核状态", name = "applyStatus") | ||||
| private Integer applyStatus; | private Integer applyStatus; | ||||
| @@ -0,0 +1,40 @@ | |||||
| package com.iformall.enums; | |||||
| /** | |||||
| * Created by luozukai | |||||
| */ | |||||
| public enum EnumFlowRecordStatus { | |||||
| // 1发起申请2审批通过3审批驳回 | |||||
| NEW(1, "发起申请"), | |||||
| APPLY(2, "审批通过"), | |||||
| REJECT(3, "审批驳回"), | |||||
| ASSIGNEE(4, "待审批") | |||||
| //FINISH(4, "审批通过") | |||||
| ; | |||||
| public static EnumFlowRecordStatus getEnum(Integer code) { | |||||
| for (EnumFlowRecordStatus value : values()) { | |||||
| if (value.getCode().equals(code)) { | |||||
| return value; | |||||
| } | |||||
| } | |||||
| return null; | |||||
| } | |||||
| private Integer code; | |||||
| private String message; | |||||
| EnumFlowRecordStatus(Integer code, String message) { | |||||
| this.code = code; | |||||
| this.message = message; | |||||
| } | |||||
| public Integer getCode() { | |||||
| return code; | |||||
| } | |||||
| public String getMessage() { | |||||
| return message; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,37 @@ | |||||
| package com.iformall.enums; | |||||
| /** | |||||
| * Created by luozukai | |||||
| * 消息模板类型 1登录 2工作流通知 | |||||
| */ | |||||
| public enum EnumMsgModelType { | |||||
| LOGIN(1, "登录"), | |||||
| FLOW(2, "工作流通知") | |||||
| ; | |||||
| public static EnumMsgModelType getEnum(Integer code) { | |||||
| for (EnumMsgModelType value : values()) { | |||||
| if (value.getCode().equals(code)) { | |||||
| return value; | |||||
| } | |||||
| } | |||||
| return null; | |||||
| } | |||||
| private Integer code; | |||||
| private String message; | |||||
| EnumMsgModelType(Integer code, String message) { | |||||
| this.code = code; | |||||
| this.message = message; | |||||
| } | |||||
| public Integer getCode() { | |||||
| return code; | |||||
| } | |||||
| public String getMessage() { | |||||
| return message; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,12 @@ | |||||
| package com.iformall.mapper; | |||||
| import com.iformall.common.CommonMapper; | |||||
| import com.iformall.domain.po.WxFlowRecord; | |||||
| import java.util.List; | |||||
| public interface WxFlowRecordMapper extends CommonMapper<WxFlowRecord, Long> { | |||||
| List<WxFlowRecord> findList(WxFlowRecord flowRecord); | |||||
| } | |||||
| @@ -0,0 +1,26 @@ | |||||
| package com.iformall.service; | |||||
| import com.iformall.common.IdWorker; | |||||
| import com.iformall.domain.po.WxFlowRecord; | |||||
| import com.iformall.domain.po.WxMsgCallback; | |||||
| import java.util.List; | |||||
| /** | |||||
| * @author luozukai | |||||
| * 流程审批记录 | |||||
| */ | |||||
| public interface WxFlowRecordService { | |||||
| /** | |||||
| * 查询列表 | |||||
| * @param flowRecord | |||||
| * @return | |||||
| */ | |||||
| List<WxFlowRecord> findList(WxFlowRecord flowRecord); | |||||
| void saveOrUpdate(WxFlowRecord flowRecord); | |||||
| } | |||||
| @@ -0,0 +1,58 @@ | |||||
| package com.iformall.service; | |||||
| import com.iformall.common.ResultData; | |||||
| import org.springframework.web.bind.annotation.RequestBody; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.util.Map; | |||||
| /** | |||||
| * @author luozukai | |||||
| * 流程审批服务 | |||||
| */ | |||||
| public interface WxFlowService { | |||||
| /** | |||||
| * 启动流程 | |||||
| * @param params | |||||
| * @return | |||||
| */ | |||||
| ResultData start(Map<String, Object> params,Long userId,String userName,String tenantId); | |||||
| /** | |||||
| * 分页代办列表 | |||||
| * @param flowType | |||||
| * @param pageNum | |||||
| * @param pageSize | |||||
| * @return | |||||
| */ | |||||
| ResultData list(Integer flowType,Integer pageNum, Integer pageSize,Long userId); | |||||
| /** | |||||
| * 审批历史 | |||||
| * @param businessId | |||||
| * @return | |||||
| */ | |||||
| ResultData applyHistory(Long businessId); | |||||
| /** | |||||
| * 审批 | |||||
| * @param params | |||||
| * @return | |||||
| */ | |||||
| ResultData apply(@RequestBody Map<String, String> params,Long userId,String userName,String tenantId); | |||||
| /** | |||||
| * 驳回 | |||||
| * @param params | |||||
| * @return | |||||
| */ | |||||
| ResultData reject(@RequestBody Map<String, String> params,Long userId,String userName,String tenantId); | |||||
| /** | |||||
| * 生成流程图 | |||||
| * @param httpServletResponse | |||||
| * @param processInstanceId | |||||
| * @throws Exception | |||||
| */ | |||||
| void genProcessDiagram(HttpServletResponse httpServletResponse, String processInstanceId) throws Exception; | |||||
| } | |||||
| @@ -4,8 +4,18 @@ import com.github.pagehelper.PageInfo; | |||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.domain.po.WxMsgValidationcode; | import com.iformall.domain.po.WxMsgValidationcode; | ||||
| import java.util.Map; | |||||
| public interface WxMsgValidationcodeService { | public interface WxMsgValidationcodeService { | ||||
| /** | |||||
| * 发送审批流通知短信 | |||||
| * @param wxMsgValidationcode | |||||
| * @param dynamicContentMap 动态替换的内容 | |||||
| * @return | |||||
| */ | |||||
| ResultData sendWorkFlowNodify(WxMsgValidationcode wxMsgValidationcode, Map<String,String> dynamicContentMap); | |||||
| /** | /** | ||||
| * 根据实体查询分页列表 | * 根据实体查询分页列表 | ||||
| * | * | ||||
| @@ -0,0 +1,35 @@ | |||||
| package com.iformall.service.impl; | |||||
| import com.iformall.common.IdWorker; | |||||
| import com.iformall.domain.po.WxFlowRecord; | |||||
| import com.iformall.mapper.WxFlowRecordMapper; | |||||
| import com.iformall.service.WxFlowRecordService; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.stereotype.Service; | |||||
| import java.util.List; | |||||
| /** | |||||
| * @author luozukai | |||||
| * @date 2019/1/8 19:09 | |||||
| */ | |||||
| @Service | |||||
| public class WxFlowRecordServiceImpl implements WxFlowRecordService { | |||||
| @Autowired | |||||
| private WxFlowRecordMapper wxFlowRecordMapper; | |||||
| @Override | |||||
| public List<WxFlowRecord> findList(WxFlowRecord flowRecord) { | |||||
| return wxFlowRecordMapper.findList(flowRecord); | |||||
| } | |||||
| @Override | |||||
| public void saveOrUpdate(WxFlowRecord record) { | |||||
| if (record.getId() == null) { | |||||
| final IdWorker idWorker = IdWorker.get(); | |||||
| record.setId(idWorker.nextId()); | |||||
| wxFlowRecordMapper.insertSelective(record); | |||||
| } else { | |||||
| wxFlowRecordMapper.updateByPrimaryKeySelective(record); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,410 @@ | |||||
| package com.iformall.service.impl; | |||||
| import com.github.pagehelper.PageInfo; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.MallUserInfo; | |||||
| import com.iformall.domain.po.WxFlowRecord; | |||||
| import com.iformall.domain.po.WxMsgValidationcode; | |||||
| import com.iformall.domain.po.WxRentContract; | |||||
| import com.iformall.enums.EnumFlowKey; | |||||
| import com.iformall.enums.EnumFlowRecordStatus; | |||||
| import com.iformall.enums.EnumMsgModelType; | |||||
| import com.iformall.enums.EnumRentContractAppStatus; | |||||
| import com.iformall.service.*; | |||||
| import org.apache.commons.collections.CollectionUtils; | |||||
| import org.apache.commons.collections.map.HashedMap; | |||||
| import org.flowable.bpmn.model.BpmnModel; | |||||
| import org.flowable.engine.*; | |||||
| import org.flowable.engine.runtime.Execution; | |||||
| import org.flowable.engine.runtime.ProcessInstance; | |||||
| import org.flowable.identitylink.api.IdentityLink; | |||||
| import org.flowable.image.ProcessDiagramGenerator; | |||||
| import org.flowable.task.api.Task; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.beans.factory.annotation.Value; | |||||
| import org.springframework.stereotype.Service; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.io.InputStream; | |||||
| import java.io.OutputStream; | |||||
| import java.util.*; | |||||
| /** | |||||
| * @author luozukai | |||||
| * @date 2019/1/10 14:59 | |||||
| */ | |||||
| @Service | |||||
| public class WxFlowServiceImpl implements WxFlowService { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
| @Autowired | |||||
| private RuntimeService runtimeService; | |||||
| @Autowired | |||||
| private TaskService taskService; | |||||
| @Autowired | |||||
| private RepositoryService repositoryService; | |||||
| @Autowired | |||||
| private ProcessEngine processEngine; | |||||
| @Autowired | |||||
| private WxRentContractService wxRentContractService; | |||||
| @Autowired | |||||
| private WxFlowRecordService wxFlowRecordService; | |||||
| @Autowired | |||||
| private MallUserInfoService mallUserInfoService; | |||||
| @Autowired | |||||
| private WxMsgValidationcodeService wxMsgValidationcodeService; | |||||
| @Value("${admin-page}") | |||||
| private String adminPage; | |||||
| /** | |||||
| * 获取流程key,1合同 2账单 | |||||
| * @param flowType | |||||
| * @return | |||||
| */ | |||||
| public String getFlowKeyByType(int flowType){ | |||||
| if(1 == flowType){ | |||||
| return EnumFlowKey.CONTRACT.getCode(); | |||||
| }else if(2 == flowType){ | |||||
| return EnumFlowKey.BILL.getCode(); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| @Override | |||||
| public ResultData start(Map<String, Object> params,Long userId,String userName,String tenantId) { | |||||
| String remark = (String)params.get("remark"); | |||||
| Long businessId = Long.parseLong((String)params.get("businessId")); | |||||
| Integer flowType = (Integer)params.get("businessType"); | |||||
| List<Map<String,String>> taskAssignee = (List)params.get("taskAssignee"); | |||||
| // 设置节点处理人 | |||||
| HashMap<String, Object> map = new HashMap<>(); | |||||
| for (Map<String,String> taskAssigneeMap : taskAssignee) { | |||||
| map.put(taskAssigneeMap.get("taskKey"), taskAssigneeMap.get("assignee")); | |||||
| } | |||||
| // map info,设置发起人等信息 | |||||
| MallUserInfo starterInfo = this.mallUserInfoService.getById(userId); | |||||
| map.put("starter", starterInfo); | |||||
| map.put("startTime",new Date().getTime()); | |||||
| map.put("businessId",businessId); | |||||
| map.put("flowType",flowType); | |||||
| ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(getFlowKeyByType(flowType), map); | |||||
| logger.debug("流程启动,流程id:{}",processInstance.getId()); | |||||
| // 合同审核状态改为审核中 | |||||
| WxRentContract wxRentContract = new WxRentContract(); | |||||
| wxRentContract.setId(businessId); | |||||
| wxRentContract.setApplyStatus(EnumRentContractAppStatus.APPLYING.getCode()); | |||||
| wxRentContractService.updateApplyStatus(wxRentContract); | |||||
| // 保存wx_flow_record表审批记录 | |||||
| WxFlowRecord wxFlowRecord = new WxFlowRecord(); | |||||
| wxFlowRecord.setBusinessId(businessId); | |||||
| wxFlowRecord.setBusinessType(flowType); | |||||
| wxFlowRecord.setProcessInstanceId(processInstance.getId()); | |||||
| wxFlowRecord.setRemark(remark); | |||||
| wxFlowRecord.setUserId(userId); | |||||
| wxFlowRecord.setUserName(userName); | |||||
| wxFlowRecord.setStatus(EnumFlowRecordStatus.NEW.getCode()); | |||||
| wxFlowRecordService.saveOrUpdate(wxFlowRecord); | |||||
| // 给审批人发送代办通知短信 | |||||
| List<MallUserInfo> mallUserInfoList = getUserByProcessInstanceId(processInstance.getId()); | |||||
| for (MallUserInfo mallUserInfo:mallUserInfoList) { | |||||
| Map<String,String> content = new HashedMap(); | |||||
| content.put("userName",mallUserInfo.getName()); | |||||
| content.put("page",adminPage); | |||||
| content.put("modelName","代办通知"); | |||||
| WxMsgValidationcode wxMsgValidationcode = new WxMsgValidationcode(); | |||||
| wxMsgValidationcode.setTenantId(tenantId); | |||||
| wxMsgValidationcode.setPhone(mallUserInfo.getPhone()); | |||||
| wxMsgValidationcode.setType(EnumMsgModelType.FLOW.getCode()); | |||||
| wxMsgValidationcodeService.sendWorkFlowNodify(wxMsgValidationcode,content); | |||||
| } | |||||
| return new ResultData(); | |||||
| } | |||||
| @Override | |||||
| public ResultData list(Integer flowType, Integer pageNum, Integer pageSize,Long userId) { | |||||
| String flowKey = getFlowKeyByType(flowType); | |||||
| List<Task> tasks = taskService.createTaskQuery().processDefinitionKey(flowKey) | |||||
| .taskCandidateUser(userId.toString()).orderByTaskCreateTime().desc().listPage((pageNum -1) * pageSize,pageSize); | |||||
| List<Map<String,Object>> result = new ArrayList<>(); | |||||
| for (Task task : tasks) { | |||||
| Map<String,Object> taskInfoMap = new HashedMap(); | |||||
| Map<String,Object> mapInfo = taskService.getVariables(task.getId()); | |||||
| taskInfoMap.put("starter",((MallUserInfo)mapInfo.get("starter")).getName()); | |||||
| taskInfoMap.put("startTime",mapInfo.get("startTime")); | |||||
| taskInfoMap.put("processInstanceId",task.getProcessInstanceId()); | |||||
| taskInfoMap.put("taskId",task.getId()); | |||||
| taskInfoMap.put("businessId",mapInfo.get("businessId")); | |||||
| result.add(taskInfoMap); | |||||
| } | |||||
| PageInfo<Map<String,Object>> pageInfo = new PageInfo<>(result,pageSize); | |||||
| return new ResultData(pageInfo); | |||||
| } | |||||
| @Override | |||||
| public ResultData applyHistory(Long businessId) { | |||||
| List<WxFlowRecord> result = wxFlowRecordService.findList(new WxFlowRecord(businessId)); | |||||
| if(CollectionUtils.isNotEmpty(result)){ | |||||
| String processInstanceId = result.get(0).getProcessInstanceId(); | |||||
| List<MallUserInfo> mallUserInfoList = getUserByProcessInstanceId(processInstanceId); | |||||
| // 如果有代办,加一条待审批 | |||||
| if(CollectionUtils.isNotEmpty(mallUserInfoList)){ | |||||
| String assignee = ""; | |||||
| for (MallUserInfo mallUserInfo:mallUserInfoList) { | |||||
| assignee += mallUserInfo.getName()+" "; | |||||
| } | |||||
| WxFlowRecord wxFlowRecord = new WxFlowRecord(); | |||||
| wxFlowRecord.setUserName(assignee); | |||||
| wxFlowRecord.setStatus(EnumFlowRecordStatus.ASSIGNEE.getCode()); | |||||
| result.add(wxFlowRecord); | |||||
| } | |||||
| } | |||||
| return new ResultData(result); | |||||
| } | |||||
| @Override | |||||
| public ResultData apply(Map<String, String> params,Long userId,String userName,String tenantId) { | |||||
| 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("流程不存在"); | |||||
| } | |||||
| Map<String,Object> mapInfo = taskService.getVariables(task.getId()); | |||||
| Long businessId = (Long)mapInfo.get("businessId"); | |||||
| Integer flowType = (Integer)mapInfo.get("flowType"); | |||||
| MallUserInfo starter = (MallUserInfo)mapInfo.get("starter"); | |||||
| taskService.complete(taskId); | |||||
| //保存wx_flow_record表审批记录 | |||||
| WxFlowRecord wxFlowRecord = new WxFlowRecord(); | |||||
| wxFlowRecord.setTaskId(taskId); | |||||
| wxFlowRecord.setProcessInstanceId(processInstanceId); | |||||
| wxFlowRecord.setRemark(remark); | |||||
| wxFlowRecord.setUserId(userId); | |||||
| wxFlowRecord.setStatus(EnumFlowRecordStatus.APPLY.getCode()); | |||||
| wxFlowRecord.setBusinessId(businessId); | |||||
| wxFlowRecord.setBusinessType(flowType); | |||||
| wxFlowRecord.setUserName(userName); | |||||
| wxFlowRecordService.saveOrUpdate(wxFlowRecord); | |||||
| // 发送短信 | |||||
| Map<String,String> msgReplaceMap = new HashedMap(); | |||||
| WxMsgValidationcode wxMsgValidationcode = new WxMsgValidationcode(); | |||||
| wxMsgValidationcode.setTenantId(tenantId); | |||||
| wxMsgValidationcode.setType(EnumMsgModelType.FLOW.getCode()); | |||||
| // 判断流程是否结束 | |||||
| if(!isEnded(processInstanceId)){ | |||||
| String assignee = ""; | |||||
| // 给代办人发送通知短信 | |||||
| List<MallUserInfo> mallUserInfoList = getUserByProcessInstanceId(processInstanceId); | |||||
| for (MallUserInfo mallUserInfo:mallUserInfoList) { | |||||
| msgReplaceMap.put("userName",mallUserInfo.getName()); | |||||
| msgReplaceMap.put("page",adminPage); | |||||
| msgReplaceMap.put("modelName","代办通知"); | |||||
| assignee += mallUserInfo.getName()+" "; | |||||
| wxMsgValidationcode.setPhone(mallUserInfo.getPhone()); | |||||
| wxMsgValidationcodeService.sendWorkFlowNodify(wxMsgValidationcode,msgReplaceMap); | |||||
| } | |||||
| // 给发起人发送短信 | |||||
| msgReplaceMap = new HashedMap(); | |||||
| msgReplaceMap.put("userName",userName); | |||||
| msgReplaceMap.put("page",adminPage); | |||||
| msgReplaceMap.put("modelName","审批通知"); | |||||
| msgReplaceMap.put("contract",businessId+""); | |||||
| msgReplaceMap.put("toUserName",assignee.trim()); | |||||
| wxMsgValidationcode = new WxMsgValidationcode(); | |||||
| wxMsgValidationcode.setPhone(starter.getPhone()); | |||||
| wxMsgValidationcodeService.sendWorkFlowNodify(wxMsgValidationcode,msgReplaceMap); | |||||
| }else{ | |||||
| // 给发起人发送审批通过消息 | |||||
| msgReplaceMap = new HashedMap(); | |||||
| msgReplaceMap.put("modelName","通过审批通知"); | |||||
| msgReplaceMap.put("contract",businessId+""); | |||||
| msgReplaceMap.put("page",adminPage); | |||||
| wxMsgValidationcode = new WxMsgValidationcode(); | |||||
| wxMsgValidationcode.setPhone(starter.getPhone()); | |||||
| wxMsgValidationcodeService.sendWorkFlowNodify(wxMsgValidationcode,msgReplaceMap); | |||||
| } | |||||
| return new ResultData(); | |||||
| } | |||||
| @Override | |||||
| public ResultData reject(Map<String, String> params,Long userId,String userName,String tenantId) { | |||||
| String taskId = params.get("taskId"); | |||||
| String processInstanceId = params.get("processInstanceId"); | |||||
| String remark = params.get("remark"); | |||||
| Map<String,Object> mapInfo = taskService.getVariables(taskId); | |||||
| Long businessId = (Long)mapInfo.get("businessId"); | |||||
| Integer flowType = (Integer)mapInfo.get("flowType"); | |||||
| MallUserInfo starter = (MallUserInfo)mapInfo.get("starter"); | |||||
| runtimeService.deleteProcessInstance(processInstanceId, "驳回"); | |||||
| // 修改合同审核状态为驳回 | |||||
| WxRentContract wxRentContract = new WxRentContract(); | |||||
| wxRentContract.setId(businessId); | |||||
| wxRentContract.setApplyStatus(EnumRentContractAppStatus.REJECT.getCode()); | |||||
| wxRentContractService.updateApplyStatus(wxRentContract); | |||||
| //保存wx_flow_record表审批记录 | |||||
| WxFlowRecord wxFlowRecord = new WxFlowRecord(); | |||||
| wxFlowRecord.setBusinessId(businessId); | |||||
| wxFlowRecord.setTaskId(taskId); | |||||
| wxFlowRecord.setProcessInstanceId(processInstanceId); | |||||
| wxFlowRecord.setRemark(remark); | |||||
| wxFlowRecord.setUserId(userId); | |||||
| wxFlowRecord.setStatus(EnumFlowRecordStatus.REJECT.getCode()); | |||||
| wxFlowRecord.setBusinessType(flowType); | |||||
| wxFlowRecord.setUserName(userName); | |||||
| wxFlowRecordService.saveOrUpdate(wxFlowRecord); | |||||
| // 给发起人发送驳回消息 | |||||
| Map<String,String> msgReplaceMap = new HashedMap(); | |||||
| WxMsgValidationcode wxMsgValidationcode = new WxMsgValidationcode(); | |||||
| wxMsgValidationcode.setTenantId(tenantId); | |||||
| wxMsgValidationcode.setType(EnumMsgModelType.FLOW.getCode()); | |||||
| msgReplaceMap.put("modelName","驳回通知"); | |||||
| msgReplaceMap.put("contract",businessId+""); | |||||
| msgReplaceMap.put("page",adminPage); | |||||
| wxMsgValidationcode = new WxMsgValidationcode(); | |||||
| wxMsgValidationcode.setPhone(starter.getPhone()); | |||||
| wxMsgValidationcodeService.sendWorkFlowNodify(wxMsgValidationcode,msgReplaceMap); | |||||
| return new ResultData(); | |||||
| } | |||||
| /** | |||||
| * 判断流程是否结束 | |||||
| * @param processInstanceId | |||||
| * @return | |||||
| */ | |||||
| public boolean isEnded(String processInstanceId) { | |||||
| RuntimeService runtimeService = processEngine.getRuntimeService(); | |||||
| ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); | |||||
| if(processInstance == null){ | |||||
| return true; | |||||
| } | |||||
| return processInstance.isEnded(); | |||||
| } | |||||
| /** | |||||
| * 根据流程实例id获取当前节点的代办人信息 | |||||
| * @return | |||||
| */ | |||||
| public List<MallUserInfo> getUserByProcessInstanceId(String processInstanceId){ | |||||
| List<MallUserInfo> result = new ArrayList<>(); | |||||
| List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).orderByTaskCreateTime().desc().list(); | |||||
| if(CollectionUtils.isNotEmpty(tasks)){ | |||||
| for (Task task:tasks) { | |||||
| List<String> userIdList = getTaskCandidateUserId(task.getId()); | |||||
| for (String userId:userIdList) { | |||||
| MallUserInfo mallUserInfo = this.mallUserInfoService.getById(Long.parseLong(userId)); | |||||
| result.add(mallUserInfo); | |||||
| } | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** | |||||
| * 获得任务中的候选人 | |||||
| * @param taskId | |||||
| * @return | |||||
| */ | |||||
| private List<String> getTaskCandidateUserId(String taskId) { | |||||
| List<String> userIdList = new ArrayList<>(); | |||||
| List identityLinkList = taskService.getIdentityLinksForTask(taskId); | |||||
| if (identityLinkList != null && identityLinkList.size() > 0) { | |||||
| for (Iterator iterator = identityLinkList.iterator(); iterator.hasNext();) { | |||||
| IdentityLink identityLink = (IdentityLink) iterator.next(); | |||||
| if (identityLink.getUserId() != null) { | |||||
| userIdList.add(identityLink.getUserId()); | |||||
| } | |||||
| // if (identityLink.getGroupId() != null) { | |||||
| // // 根据组获得对应人员 | |||||
| // List userList = identityService.createUserQuery() | |||||
| // .memberOfGroup(identityLink.getGroupId()).list(); | |||||
| // if (userList != null && userList.size() > 0) | |||||
| // users.addAll(userList); | |||||
| // } | |||||
| } | |||||
| } | |||||
| return userIdList; | |||||
| } | |||||
| @Override | |||||
| public void genProcessDiagram(HttpServletResponse httpServletResponse, String processInstanceId) throws Exception { | |||||
| ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); | |||||
| //流程走完的不显示图 | |||||
| if (pi == null) { | |||||
| return; | |||||
| } | |||||
| Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); | |||||
| //使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象 | |||||
| String InstanceId = task.getProcessInstanceId(); | |||||
| List<Execution> executions = runtimeService | |||||
| .createExecutionQuery() | |||||
| .processInstanceId(InstanceId) | |||||
| .list(); | |||||
| //得到正在执行的Activity的Id | |||||
| List<String> activityIds = new ArrayList<>(); | |||||
| List<String> flows = new ArrayList<>(); | |||||
| for (Execution exe : executions) { | |||||
| List<String> 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(); | |||||
| } | |||||
| } | |||||
| } | |||||
| public String getAdminPage() { | |||||
| return adminPage; | |||||
| } | |||||
| public void setAdminPage(String adminPage) { | |||||
| this.adminPage = adminPage; | |||||
| } | |||||
| } | |||||
| @@ -48,6 +48,59 @@ public class WxMsgValidationcodeServiceImpl implements WxMsgValidationcodeServic | |||||
| @Autowired | @Autowired | ||||
| WxMsgCallbackMapper wxMsgCallbackMapper; | WxMsgCallbackMapper wxMsgCallbackMapper; | ||||
| @Override | |||||
| public ResultData sendWorkFlowNodify(WxMsgValidationcode wxMsgValidationcode,Map<String,String> dynamicContentMap) { | |||||
| //3、从短信配置中查询密钥 bid 等信息 | |||||
| WxMsgConfig wxMsgConfig = new WxMsgConfig(); | |||||
| wxMsgConfig.setTenantId(wxMsgValidationcode.getTenantId()); | |||||
| List<WxMsgConfig> wxMsgConfigs = wxMsgConfigMapper.findList(wxMsgConfig); | |||||
| if (wxMsgConfigs.size() == 0) new ResultData(ErrorCode.MSG_SEND_ERROR.getCode(),"发送失败"); | |||||
| wxMsgConfig = wxMsgConfigs.get(0); | |||||
| WxMsgValidationcodeModel wxMsgValidationcodeModel = new WxMsgValidationcodeModel(); | |||||
| wxMsgValidationcodeModel.setTenantId(wxMsgConfig.getTenantId()); | |||||
| wxMsgValidationcodeModel.setType(wxMsgValidationcode.getType()); | |||||
| wxMsgValidationcodeModel.setName(dynamicContentMap.get("modelName")); | |||||
| wxMsgValidationcodeModel = wxMsgValidationcodeModelMapper.findList(wxMsgValidationcodeModel).get(0); | |||||
| wxMsgValidationcode.setSignature(wxMsgValidationcodeModel.getSignature()); | |||||
| String secret = wxMsgConfig.getSecret(); | |||||
| String bid = wxMsgConfig.getBid(); | |||||
| String publickey = wxMsgConfig.getPublickey(); | |||||
| // 验证码 | |||||
| String phone = wxMsgValidationcode.getPhone(); | |||||
| String signature = wxMsgValidationcode.getSignature(); | |||||
| //替换内容 | |||||
| String msg = wxMsgValidationcodeModel.getContent(); | |||||
| for (Map.Entry<String, String> entry : dynamicContentMap.entrySet()) { | |||||
| msg = msg.replace("{"+entry.getKey()+"}", entry.getValue()); | |||||
| } | |||||
| // wxMsgValidationcode.setCode(String.valueOf(code)); | |||||
| wxMsgValidationcode.setMsg(msg); | |||||
| String notifyUrl = wxMsgConfig.getNotifyurl(); | |||||
| String result = WiwideUtil.sendMsg(secret, bid, publickey, phone, signature, msg, notifyUrl, EnumVerifyCode.YES.getCode().toString()); | |||||
| JSONObject jsonObjectResult = JSONObject.parseObject(result); | |||||
| String ret = jsonObjectResult.get("ret").toString(); | |||||
| String batchNo = jsonObjectResult.get("data").toString(); | |||||
| if (ret.equals("1")) { | |||||
| final IdWorker idWorker = IdWorker.get(); | |||||
| wxMsgValidationcode.setId(idWorker.nextId()); | |||||
| long currentTime = System.currentTimeMillis() ; | |||||
| Date createtime=new Date(currentTime); | |||||
| // Integer minutes = wxMsgValidationcodeModel.getMinutes(); | |||||
| // currentTime +=minutes*60*1000; | |||||
| // Date expiredate=new Date(currentTime); | |||||
| // wxMsgValidationcode.setExpiretime(expiredate); | |||||
| wxMsgValidationcode.setCreatetime(createtime); | |||||
| wxMsgValidationcodeMapper.insertSelective(wxMsgValidationcode); | |||||
| addMsgCallback(wxMsgValidationcode,batchNo); | |||||
| return new ResultData(Result.SUCCESS,"发送成功"); | |||||
| } | |||||
| return new ResultData(ErrorCode.MSG_SEND_ERROR.getCode(),"发送失败"); | |||||
| } | |||||
| @Override | @Override | ||||
| public PageInfo<WxMsgValidationcode> listAsPage(WxMsgValidationcode record, Integer pageIndex, Integer pageSize) { | public PageInfo<WxMsgValidationcode> listAsPage(WxMsgValidationcode record, Integer pageIndex, Integer pageSize) { | ||||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMsgValidationcodeMapper.findList(record)); | return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMsgValidationcodeMapper.findList(record)); | ||||
| @@ -111,6 +111,8 @@ public class WxRentContractServiceImpl implements WxRentContractService { | |||||
| } else { | } else { | ||||
| result.put("wxShops", Collections.EMPTY_LIST); | result.put("wxShops", Collections.EMPTY_LIST); | ||||
| } | } | ||||
| //设置审批流程状态 | |||||
| result.put("applyStatus", wxRentContract.getApplyStatus()); | |||||
| return new ResultData(Result.SUCCESS, "查询成功", result); | return new ResultData(Result.SUCCESS, "查询成功", result); | ||||
| } | } | ||||
| @@ -0,0 +1,48 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
| <mapper namespace="com.iformall.mapper.WxFlowRecordMapper"> | |||||
| <resultMap id="BaseResultMap" type="com.iformall.domain.po.WxFlowRecord"> | |||||
| <id column="id" property="id" /> | |||||
| <result column="business_id" property="businessId" /> | |||||
| <result column="business_type" property="businessType" /> | |||||
| <result column="user_id" property="userId" /> | |||||
| <result column="remark" property="remark" /> | |||||
| <result column="status" property="status" /> | |||||
| <result column="task_id" property="taskId" /> | |||||
| <result column="process_instance_id" property="processInstanceId" /> | |||||
| <result column="create_date" property="createDate" /> | |||||
| <result column="update_date" property="updateDate" /> | |||||
| <result column="tenant_id" property="tenantId" /> | |||||
| <result column="user_name" property="userName" /> | |||||
| </resultMap> | |||||
| <sql id="allColumns"> | |||||
| `id`,`business_id`,`business_type`,`user_id`,`remark`,`status`,`task_id`,`process_instance_id`,`create_date`,`update_date`,`tenant_id`,`user_name` | |||||
| </sql> | |||||
| <sql id="dynamicWhereConditions"> | |||||
| where 1 = 1 | |||||
| <if test=" null != id "> | |||||
| and `id` = #{id} | |||||
| </if> | |||||
| <if test=" null != tenantId "> | |||||
| and `tenant_id` like concat('%', #{tenantId},'%') | |||||
| </if> | |||||
| <if test=" null != businessId "> | |||||
| and `business_id` = #{businessId} | |||||
| </if> | |||||
| order by create_date desc | |||||
| </sql> | |||||
| <select id="findList" parameterType="com.iformall.domain.po.MallRole" resultMap="BaseResultMap"> | |||||
| select <include refid="allColumns" /> from wx_flow_record | |||||
| <include refid="dynamicWhereConditions" /> | |||||
| </select> | |||||
| </mapper> | |||||
| @@ -100,7 +100,7 @@ | |||||
| select rc.id,rc.merchant_name merchantName,rc.rental_start_date rentalStartDate,rc.rental_end_date rentalEndDate,rc.`status`, | select rc.id,rc.merchant_name merchantName,rc.rental_start_date rentalStartDate,rc.rental_end_date rentalEndDate,rc.`status`, | ||||
| rc.price,rc.contract_number contractNumber,s.shop_number shopNumber,f.floor_name floorName,b.building_name buildingName, | rc.price,rc.contract_number contractNumber,s.shop_number shopNumber,f.floor_name floorName,b.building_name buildingName, | ||||
| rc.lease,rc.filepath,rc.filename,rc.pay_account payAccount,rc.sign_date signDate,rc.merchant_id merchantId,rc.type, | rc.lease,rc.filepath,rc.filename,rc.pay_account payAccount,rc.sign_date signDate,rc.merchant_id merchantId,rc.type, | ||||
| rc.start_date startDate,rc.end_date endDate,br.`name` brandName | |||||
| rc.start_date startDate,rc.end_date endDate,br.`name` brandName,rc.apply_status applyStatus | |||||
| from wx_rent_contract rc | from wx_rent_contract rc | ||||
| left join wx_shop s on rc.shop_id=s.id | left join wx_shop s on rc.shop_id=s.id | ||||
| left join wx_mall_floor f on s.floor=f.id | left join wx_mall_floor f on s.floor=f.id | ||||