diff --git a/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java b/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java index 1ee72eb..78d621b 100644 --- a/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java +++ b/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java @@ -23,15 +23,8 @@ public class FlwInstanceController { @Lazy private FlwInstanceService instanceService; - /** - * 发起流程 - */ - @RequestMapping("/startFlowInstance") - public R startFlowInstance(@RequestParam Map params){ - instanceService.startFlowInstance(params); - return R.ok(); - } + /** * 我的待办 @@ -65,16 +58,29 @@ public class FlwInstanceController { } /** - * 审批通过 + * 提交审批 */ @PostMapping("/completeFlow") public R completeFlow(@RequestBody Map params){ - R r = instanceService.completeTaskById(params); + return r; + } + + + + /** + * 终结流程 + */ + @PostMapping("/deleteFlow") + public R deleteFlow(@RequestBody Map params){ + + R r = instanceService.deleteFlow(params); return r; } + + @RequestMapping("/claimTask/{id}") public R claimTask(@PathVariable("id") String id){ if(StringUtils.isBlank(id)){ diff --git a/base-fast/src/main/java/com/boge/modules/flow/service/FlwInstanceService.java b/base-fast/src/main/java/com/boge/modules/flow/service/FlwInstanceService.java index 06e8f09..72bc306 100644 --- a/base-fast/src/main/java/com/boge/modules/flow/service/FlwInstanceService.java +++ b/base-fast/src/main/java/com/boge/modules/flow/service/FlwInstanceService.java @@ -9,10 +9,12 @@ import java.util.Map; public interface FlwInstanceService { void startFlowInstance(Map params); + R getTodoTaskList(Map params); R completeTaskById(Map id); + void unclaimTask(String id); void claimTask(String id); @@ -26,4 +28,7 @@ public interface FlwInstanceService { R getMyCompleteTaskList(Map params); List getCompleteHiTaskInstance(String id); + + R deleteFlow(Map params); + } diff --git a/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwDeployServiceImpl.java b/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwDeployServiceImpl.java index 3d2cce4..60c3161 100644 --- a/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwDeployServiceImpl.java +++ b/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwDeployServiceImpl.java @@ -215,26 +215,7 @@ public class FlwDeployServiceImpl extends FlowServiceNoFactory implements FlwDep map.put("value", ""); map.put("key", findFlowDefUserOrGroup(assignee)); list.add(map); - } else if (candidateUsers != null && candidateUsers.size() > 0) { - // 指定的候选人 - String join = String.join(",", candidateUsers); - Map map = new HashMap<>(); - map.put("name", flowElement.getName()); - map.put("type", "candidateUsers"); - // ${user1} ${user2},${user3} ${group1} - map.put("value", ""); - map.put("key", findFlowDefUserOrGroup(join)); - list.add(map); - - } else if (candidateGroups != null && candidateGroups.size() > 0) { - String join = String.join(",", candidateGroups); - Map map = new HashMap<>(); - map.put("name", flowElement.getName()); - map.put("type", "candidateGroups"); - // ${user1} ${user2},${user3} ${group1} - map.put("value", ""); - map.put("key", findFlowDefUserOrGroup(join)); - list.add(map); + break; } } diff --git a/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwInstanceServiceImpl.java b/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwInstanceServiceImpl.java index fe46c6e..181097a 100644 --- a/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwInstanceServiceImpl.java +++ b/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwInstanceServiceImpl.java @@ -18,13 +18,16 @@ import com.boge.modules.sys.entity.SysUserEntity; import com.boge.modules.sys.service.SysRoleService; import com.boge.modules.sys.service.SysUserService; import com.boge.modules.sys.service.impl.SysUserServiceImpl; +import com.boge.modules.tickets.dao.TicketsDao; import com.boge.modules.tickets.entity.TicketsEntity; +import com.boge.modules.tickets.enums.TicketUserEnums; import com.boge.modules.tickets.enums.TicketsStatusEnums; import com.boge.modules.tickets.service.TicketsService; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.UserTask; +import org.flowable.common.engine.api.FlowableException; import org.flowable.engine.ProcessEngineConfiguration; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; @@ -68,7 +71,8 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI @Value("${ProcessInstance.defId}") private String defId; - + @Autowired + private TicketsDao ticketsDao; //发送消息的类型 private final static String MSGTYPE = "text"; //将消息发送给所有成员 @@ -83,12 +87,11 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI private final static String CREATE_SESSION_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="; - @Override public void startFlowInstance(Map params) { SysUserEntity loginUser = ShiroUtils.getUserEntity(); // 获取需要发起的流程信息 - String ticketsId = (String) params.get("ticketsId"); +// String ticketsId = (String) params.get("ticketsId"); Long userId = Long.valueOf((String) params.get("user1")); Map variable = new HashMap<>(); // 结合传递过来的数据动态的绑定流程变量 @@ -98,27 +101,33 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI // 记录流程的发起人 identityService.setAuthenticatedUserId(ShiroUtils.getUserId().toString()); // 启动流程 - ProcessInstance processInstance = runtimeService.startProcessInstanceById(defId, variable); + try { + ProcessInstance processInstance = runtimeService.startProcessInstanceById(defId, variable); + } catch (FlowableException e) { + e.printStackTrace(); + } SysUserEntity user = sysUserService.getById(userId); //更新工单审批id - TicketsEntity ticketsEntity = new TicketsEntity(); - ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); - ticketsEntity.setStatus(TicketsStatusEnums.CHECKED.getCode()); - ticketsEntity.setProcessInstance(processInstance.getProcessInstanceId()); - ticketsEntity.setDeptPeople(user.getNickname()); - ticketsEntity.setAssignUserId(userId); - ticketsService.updateById(ticketsEntity); +// TicketsEntity ticketsEntity = new TicketsEntity(); +// ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); +// ticketsEntity.setStatus(TicketsStatusEnums.CHECKED.getCode()); +// ticketsEntity.setProcessInstance(processInstance.getProcessInstanceId()); +// ticketsEntity.setDeptPeople(user.getNickname()); +// ticketsEntity.setAssignUserId(userId); +// ticketsService.updateById(ticketsEntity); - if (StrUtil.isEmpty(user.getWexinId())){ - throw new RRException("企业id为空,企业微信消息无法推送"); + if (StrUtil.isEmpty(user.getWexinId())) { + throw new RRException("企业id为空,企业微信消息无法推送"); } String accessToken = getAccessToken(); - sendWeChatMessage(user.getWexinId(),"工单已推送,请登入售后管理系统处理",accessToken,ticketsId); +// sendWeChatMessage(user.getWexinId(),"工单已推送,请登入售后管理系统处理",accessToken,ticketsId); } + + /** * 获取access_token */ @@ -162,7 +171,6 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI } - public static void sendWeChatMessage(String toUser, String content, String ACCESS_TOKEN, String ticketsId) { //请求串 String url = CREATE_SESSION_URL + ACCESS_TOKEN; @@ -173,7 +181,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI JSONObject contentJSon = new JSONObject(); contentJSon.put("title", "[协同提醒] - 工单审批待处理"); contentJSon.put("description", "点击查看详情"); - contentJSon.put("url", "http://localhost:8001/#/tickets-detail?id="+ticketsId); + contentJSon.put("url", "http://localhost:8001/#/tickets-detail?id=" + ticketsId); contentJSon.put("btntxt", "处理"); jsonObject.put("textcard", contentJSon); @@ -202,7 +210,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI JSONObject jsonObject1 = JSONObject.parseObject(result); int errcode = jsonObject1.getInteger("errcode"); if (Objects.equals(42001, errcode)) { - throw new RRException("发送企业微信 token 失效"); + throw new RRException("发送企业微信 token 失效"); } if (Objects.equals(0, errcode)) { System.out.println("消息发送成功"); @@ -225,33 +233,31 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI } - - private static void packageData(Map params, Set keys, Map variable) { - if(keys != null){ + if (keys != null) { for (String key : keys) { - if("id".equals(key) || "t".equals(key)){ + if ("id".equals(key) || "t".equals(key)) { continue; } String value = (String) params.get(key); - if(key.contains(",")){ + if (key.contains(",")) { String[] split = key.split(","); int i = 0; for (String s : split) { - if(value.contains(",")){ + if (value.contains(",")) { String[] split1 = value.split(","); - if(split1.length >= i){ - variable.put(s,split1[i]); - }else{ - variable.put(s,split1[0]); + if (split1.length >= i) { + variable.put(s, split1[i]); + } else { + variable.put(s, split1[0]); } - }else{ - variable.put(s,value); + } else { + variable.put(s, value); } i++; } - }else{ - variable.put(key,value); + } else { + variable.put(key, value); } } } @@ -259,9 +265,9 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI /** * 查询我的待办任务 - * 审批人 - * 候选人 - * 候选人组 + * 审批人 + * 候选人 + * 候选人组 * * @param params * @return @@ -269,8 +275,8 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI @Override public R getTodoTaskList(Map params) { // 获取到分页的信息 - Integer page = Integer.parseInt((String)params.getOrDefault(Constant.PAGE,1)); - Integer limit = Integer.parseInt((String) params.getOrDefault(Constant.LIMIT,5)); + Integer page = Integer.parseInt((String) params.getOrDefault(Constant.PAGE, 1)); + Integer limit = Integer.parseInt((String) params.getOrDefault(Constant.LIMIT, 5)); // 获取当前的登录用户 SysUserEntity loginUser = ShiroUtils.getUserEntity(); TaskQuery taskQuery = taskService.createTaskQuery() @@ -286,13 +292,13 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI List tasks = taskQuery.listPage((page - 1) * limit, page * limit); long count = taskQuery.count(); List list = new ArrayList<>(); - if(tasks != null && tasks.size() > 0){ + if (tasks != null && tasks.size() > 0) { for (Task task : tasks) { FlwTaskEntity entity = new FlwTaskEntity(); entity.setTaskId(task.getId()); entity.setCategory(task.getCategory()); entity.setAssigneeId(task.getAssignee()); - if(task.getAssignee() != null){ + if (task.getAssignee() != null) { SysUserEntity assigneeUser = userService.getById(task.getAssignee()); entity.setAssigneeName(assigneeUser.getNickname()); } @@ -310,46 +316,113 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI // 任务的发起人 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(entity.getProcInsId()).singleResult(); - if(historicProcessInstance != null){ + if (historicProcessInstance != null) { String startUserId = historicProcessInstance.getStartUserId(); entity.setStartTime(historicProcessInstance.getStartTime()); entity.setStartUserId(startUserId); - if(StringUtils.isNotBlank(startUserId)){ + if (StringUtils.isNotBlank(startUserId)) { SysUserEntity startUser = userService.getById(startUserId); entity.setStartUserName(startUser.getNickname()); } } // 通过 BpmnModel 对象来检查当前的节点的 定义信息 - entity.setStatus(getUserTaskStatus(task.getProcessDefinitionId(),task.getTaskDefinitionKey())); + entity.setStatus(getUserTaskStatus(task.getProcessDefinitionId(), task.getTaskDefinitionKey())); list.add(entity); } } - PageUtils pageUtils = new PageUtils(list,(int)count,limit,page); - return R.ok("操作成功").put("page",pageUtils); + PageUtils pageUtils = new PageUtils(list, (int) count, limit, page); + return R.ok("操作成功").put("page", pageUtils); } @Override public R completeTaskById(Map params) { String processInstance = (String) params.get("processInstance"); - Integer ticketsId = (Integer) params.get("ticketsId"); - if(StringUtils.isBlank(processInstance)){ + Integer ticketsId = (Integer) params.get("ticketsId"); + String result = (String) params.get("result"); + String opinion = (String) params.get("opinion"); + + if (StringUtils.isBlank(processInstance)) { return R.error("流程Id不能为空"); } - TaskQuery taskQuery = taskService.createTaskQuery().active().processInstanceId(processInstance); - List tasks = taskQuery.list(); - if (!tasks.isEmpty()){ - taskService.complete(tasks.get(0).getId()); + if (StringUtils.isBlank(processInstance)) { + return R.error("流程Id不能为空"); } - //更新工单审批id + Task secondTask = taskService.createTaskQuery() + .processInstanceId(processInstance) + .singleResult(); + Map secondApprovalVars = new HashMap<>(); TicketsEntity ticketsEntity = new TicketsEntity(); + // 完结流程 + if (Objects.nonNull(secondTask) && StrUtil.isNotEmpty(result) && result.equals("完结")) { + secondApprovalVars.put("approvalResult", true); + ticketsEntity.setStatus(TicketsStatusEnums.FINISH.getCode()); + ticketsEntity.setFinishTime(new Date()); + ticketsEntity.setAssignUserId(TicketUserEnums.SPECIALIST.getCode()); + taskService.complete(secondTask.getId(), secondApprovalVars); + } + // 继续流程 + if (Objects.nonNull(secondTask) && StrUtil.isNotEmpty(result) && result.equals("同意")) { + secondApprovalVars.put("approvalResult", false); + ticketsEntity.setAssignUserId(TicketUserEnums.MANAGER.getCode()); + taskService.complete(secondTask.getId(), secondApprovalVars); + } + + // 指派处理人 + if (Objects.nonNull(secondTask) && StrUtil.isNotEmpty(result) && result.equals("指派")) { + String userId = String.valueOf(params.get("userId")); + Map startVars = new HashMap<>(); + startVars.put("user1",userId); + ticketsEntity.setAssignUserId(Long.valueOf(userId)); + taskService.complete(secondTask.getId(), startVars); + } + + // 继续流程 + if (Objects.nonNull(secondTask) && StrUtil.isNotEmpty(result) && result.equals("提交")) { + ticketsEntity.setAssignUserId(TicketUserEnums.SPECIALIST.getCode()); + taskService.complete(secondTask.getId(), secondApprovalVars); + } + + String processName = ticketsDao.selectByProcessInstance(processInstance); + if (StringUtils.isNotBlank(processName)&& processName.contains("完结")){ + ticketsEntity.setStatus(TicketsStatusEnums.FINISH.getCode()); + } + + //更新工单审批id ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); - ticketsEntity.setStatus(TicketsStatusEnums.CANCEL.getCode()); ticketsEntity.setUpdateTime(new Date()); ticketsService.updateById(ticketsEntity); return R.ok("操作成功"); } + + + + @Override + public R deleteFlow(Map params) { + String processInstance = (String) params.get("processInstance"); +// Integer ticketsId = (Integer) params.get("ticketsId"); + if (StringUtils.isBlank(processInstance)) { + return R.error("流程Id不能为空"); + } + //查询活跃任务 + TaskQuery taskQuery = taskService.createTaskQuery().active().processInstanceId(processInstance); + List tasks = taskQuery.list(); + if (tasks.isEmpty()) { + return R.error("没有可终结的任务"); + } + runtimeService.deleteProcessInstance(processInstance, "测试终结流程"); + //更新工单审批id +// TicketsEntity ticketsEntity = new TicketsEntity(); +// ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); +// ticketsEntity.setStatus(TicketsStatusEnums.CANCEL.getCode()); +// ticketsEntity.setUpdateTime(new Date()); +// ticketsService.updateById(ticketsEntity); + + return R.ok("操作成功"); + } + + @Override public void unclaimTask(String id) { taskService.unclaim(id); @@ -357,7 +430,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI @Override public void claimTask(String id) { - taskService.claim(id,ShiroUtils.getUserId().toString()); + taskService.claim(id, ShiroUtils.getUserId().toString()); } @Override @@ -399,7 +472,6 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI } - //获取流程图 BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); ProcessEngineConfiguration configuration = processEngine.getProcessEngineConfiguration(); @@ -412,7 +484,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI byte[] b = new byte[in.available()]; in.read(b); return b; - }catch (IOException e){ + } catch (IOException e) { } return null; @@ -422,8 +494,8 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI @Override public R getMyStartTaskList(Map params) { // 获取到分页的信息 - Integer page = Integer.parseInt((String)params.getOrDefault(Constant.PAGE,1)); - Integer limit = Integer.parseInt((String) params.getOrDefault(Constant.LIMIT,5)); + Integer page = Integer.parseInt((String) params.getOrDefault(Constant.PAGE, 1)); + Integer limit = Integer.parseInt((String) params.getOrDefault(Constant.LIMIT, 5)); // 获取当前的登录用户 SysUserEntity loginUser = ShiroUtils.getUserEntity(); // 我们需要根据当前登录用户查询所有发起的流程 @@ -436,7 +508,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI List tasks = historicProcessInstanceQuery.listPage((page - 1) * limit, page * limit); long count = historicProcessInstanceQuery.count(); List list = new ArrayList<>(); - if(tasks != null && tasks.size() > 0){ + if (tasks != null && tasks.size() > 0) { for (HistoricProcessInstance historicProcessInstance : tasks) { HistoricProcessInstanceEntityImpl impl = (HistoricProcessInstanceEntityImpl) historicProcessInstance; FlwMyFlowEntity entity = new FlwMyFlowEntity(); @@ -449,7 +521,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI entity.setFlowProceId(impl.getProcessInstanceId()); // 任务的发起人 - if(historicProcessInstance != null){ + if (historicProcessInstance != null) { String startUserId = historicProcessInstance.getStartUserId(); entity.setStartDate(historicProcessInstance.getStartTime()); entity.setEndDate(historicProcessInstance.getEndTime()); @@ -459,12 +531,13 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI list.add(entity); } } - PageUtils pageUtils = new PageUtils(list,(int)count,limit,page); - return R.ok("操作成功").put("page",pageUtils); + PageUtils pageUtils = new PageUtils(list, (int) count, limit, page); + return R.ok("操作成功").put("page", pageUtils); } /** * 根据流程实例ID获取对应的流转记录 + * * @param id * @return */ @@ -474,7 +547,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI .processInstanceId(id).orderByTaskCreateTime().asc().list(); List ress = new ArrayList<>(); - if(list != null){ + if (list != null) { for (HistoricTaskInstance entity : list) { FlwHiTaskEntity task = new FlwHiTaskEntity(); task.setId(entity.getId()); @@ -483,26 +556,26 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI task.setAssignee(entity.getAssignee()); task.setStartTime(entity.getCreateTime()); Long durationInMillis = entity.getDurationInMillis(); - if(durationInMillis != null){ + if (durationInMillis != null) { task.setDuration(durationInMillis); } - if(StringUtils.isNotBlank(entity.getAssignee())){ + if (StringUtils.isNotBlank(entity.getAssignee())) { // 需要查询到用户的名称 SysUserEntity userEntity = userService.getById(entity.getAssignee()); String username = userEntity.getUsername(); String nickname = userEntity.getNickname(); - if(StringUtils.isNotBlank(nickname)){ + if (StringUtils.isNotBlank(nickname)) { task.setAssigneeName(nickname); - }else{ + } else { task.setAssigneeName(username); } } // 查询当前的节点的状态 - if(entity.getEndTime() != null){ + if (entity.getEndTime() != null) { // 这个节点已经审批完成了 task.setStatus("finish"); - }else{ + } else { task.setStatus("wait"); } ress.add(task); @@ -515,16 +588,16 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI @Override public R getMyCompleteTaskList(Map params) { // 获取到分页的信息 - Integer page = Integer.parseInt((String)params.getOrDefault(Constant.PAGE,1)); - Integer limit = Integer.parseInt((String) params.getOrDefault(Constant.LIMIT,5)); + Integer page = Integer.parseInt((String) params.getOrDefault(Constant.PAGE, 1)); + Integer limit = Integer.parseInt((String) params.getOrDefault(Constant.LIMIT, 5)); // 获取当前的登录用户 SysUserEntity loginUser = ShiroUtils.getUserEntity(); // 我的已办 可以通过当前登录用户 匹配 act_hi_taskinst 中的审批人来找到对应的流程实例id List taskInstances = historyService.createHistoricTaskInstanceQuery() .taskAssignee(loginUser.getUserId().toString()).list(); - if(taskInstances == null || taskInstances.size() == 0){ - PageUtils pageUtils = new PageUtils(null,0,limit,page); - return R.ok("操作成功").put("page",pageUtils); + if (taskInstances == null || taskInstances.size() == 0) { + PageUtils pageUtils = new PageUtils(null, 0, limit, page); + return R.ok("操作成功").put("page", pageUtils); } Set processInsIds = taskInstances.stream().map(item -> { return item.getProcessInstanceId(); @@ -539,7 +612,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI List tasks = historicProcessInstanceQuery.listPage((page - 1) * limit, page * limit); long count = historicProcessInstanceQuery.count(); List list = new ArrayList<>(); - if(tasks != null && tasks.size() > 0){ + if (tasks != null && tasks.size() > 0) { for (HistoricProcessInstance historicProcessInstance : tasks) { HistoricProcessInstanceEntityImpl impl = (HistoricProcessInstanceEntityImpl) historicProcessInstance; FlwMyFlowEntity entity = new FlwMyFlowEntity(); @@ -552,10 +625,10 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI entity.setFlowProceId(impl.getProcessInstanceId()); // 任务的发起人 - if(historicProcessInstance != null){ + if (historicProcessInstance != null) { String startUserId = historicProcessInstance.getStartUserId(); SysUserEntity userEntity = userService.getById(startUserId); - if(userEntity != null){ + if (userEntity != null) { entity.setUserName(userEntity.getNickname()); } entity.setStartDate(historicProcessInstance.getStartTime()); @@ -566,8 +639,8 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI list.add(entity); } } - PageUtils pageUtils = new PageUtils(list,(int)count,limit,page); - return R.ok("操作成功").put("page",pageUtils); + PageUtils pageUtils = new PageUtils(list, (int) count, limit, page); + return R.ok("操作成功").put("page", pageUtils); } @Override @@ -577,7 +650,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI List ress = new ArrayList<>(); SysUserEntity loginUser = ShiroUtils.getUserEntity(); - if(list != null){ + if (list != null) { for (HistoricTaskInstance entity : list) { FlwHiTaskEntity task = new FlwHiTaskEntity(); task.setId(entity.getId()); @@ -586,30 +659,30 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI task.setAssignee(entity.getAssignee()); task.setStartTime(entity.getCreateTime()); Long durationInMillis = entity.getDurationInMillis(); - if(durationInMillis != null){ + if (durationInMillis != null) { task.setDuration(durationInMillis); } - if(StringUtils.isNotBlank(entity.getAssignee())){ + if (StringUtils.isNotBlank(entity.getAssignee())) { // 需要查询到用户的名称 SysUserEntity userEntity = userService.getById(entity.getAssignee()); String username = userEntity.getUsername(); String nickname = userEntity.getNickname(); - if(StringUtils.isNotBlank(nickname)){ + if (StringUtils.isNotBlank(nickname)) { task.setAssigneeName(nickname); - }else{ + } else { task.setAssigneeName(username); } } // 查询当前的节点的状态 - if(entity.getEndTime() != null){ + if (entity.getEndTime() != null) { // 这个节点已经审批完成了 task.setStatus("finish"); - }else{ + } else { task.setStatus("wait"); } - if(entity.getAssignee() != null && entity.getAssignee().equals(loginUser.getUserId().toString())){ + if (entity.getAssignee() != null && entity.getAssignee().equals(loginUser.getUserId().toString())) { task.setStatus("success"); } ress.add(task); @@ -619,21 +692,21 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI return ress; } - private Integer getUserTaskStatus(String processDef,String taskDefKey){ + private Integer getUserTaskStatus(String processDef, String taskDefKey) { BpmnModel bpmnModel = repositoryService.getBpmnModel(processDef); Process mainProcess = bpmnModel.getMainProcess(); Collection flowElements = mainProcess.getFlowElements(); Integer status = 0; - if(flowElements != null && flowElements.size() > 0){ + if (flowElements != null && flowElements.size() > 0) { for (FlowElement flowElement : flowElements) { - if(flowElement instanceof UserTask){ + if (flowElement instanceof UserTask) { UserTask userTask = (UserTask) flowElement; - if(userTask.getId().equals(taskDefKey)){ + if (userTask.getId().equals(taskDefKey)) { String assignee = userTask.getAssignee(); - if(StringUtils.isNotBlank(assignee)){ + if (StringUtils.isNotBlank(assignee)) { // 说明是制定的审批人 status = 0; - }else{ + } else { status = 1; } break; diff --git a/base-fast/src/main/java/com/boge/modules/sys/controller/FileController.java b/base-fast/src/main/java/com/boge/modules/sys/controller/FileController.java index 6d2afc7..ed2a3a9 100644 --- a/base-fast/src/main/java/com/boge/modules/sys/controller/FileController.java +++ b/base-fast/src/main/java/com/boge/modules/sys/controller/FileController.java @@ -88,7 +88,6 @@ public class FileController { if(StringUtils.isBlank(procId)|| "null".equals(procId) || "undefined".equals(procId)){ return ; } - byte[] bytes = instanceService.diagram(procId); response.setContentType("image/png"); ServletOutputStream outputStream = response.getOutputStream(); diff --git a/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java b/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java index 3c702db..16ba182 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java @@ -75,11 +75,7 @@ public class TicketsController { @RequestMapping("/save") //@RequiresPermissions("tickets:tickets:save") public R save(@RequestBody TicketsEntity tickets){ - SysUserEntity loginUser = ShiroUtils.getUserEntity(); - tickets.setCreateTime(new Date()); - tickets.setCreateUser(loginUser.getNickname()); - ticketsService.save(tickets); - + ticketsService.saveTicket(tickets); return R.ok(); } diff --git a/base-fast/src/main/java/com/boge/modules/tickets/dao/TicketsDao.java b/base-fast/src/main/java/com/boge/modules/tickets/dao/TicketsDao.java index 2761149..bd5cb12 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/dao/TicketsDao.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/dao/TicketsDao.java @@ -17,4 +17,6 @@ public interface TicketsDao extends BaseMapper { TicketsDTO getTicketsDTOById(String ticketsId); + + String selectByProcessInstance(String processInstance); } diff --git a/base-fast/src/main/java/com/boge/modules/tickets/dto/TicketsDTO.java b/base-fast/src/main/java/com/boge/modules/tickets/dto/TicketsDTO.java index 57b6b5a..a84b73e 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/dto/TicketsDTO.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/dto/TicketsDTO.java @@ -1,5 +1,6 @@ package com.boge.modules.tickets.dto; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.util.Date; @@ -28,7 +29,7 @@ public class TicketsDTO { /** * 合同编号 */ - private String contractNumber; + private String contractCode; /** * 客户id */ @@ -51,9 +52,9 @@ public class TicketsDTO { */ private String deptPhone; /** - * 创建者ID + * 创建者 */ - private Long createUserId; + private String createUser; /** * 创建时间 */ @@ -65,14 +66,21 @@ public class TicketsDTO { /** * 工单状态 */ + private Integer status; /** * 工单关闭时间 */ private Date updateTime; + /** * 审批流id */ private String processInstance; + + /** + * 审批结点 + */ + private String processInstanceUser; } diff --git a/base-fast/src/main/java/com/boge/modules/tickets/entity/TicketsEntity.java b/base-fast/src/main/java/com/boge/modules/tickets/entity/TicketsEntity.java index 1b7e2a9..7d37175 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/entity/TicketsEntity.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/entity/TicketsEntity.java @@ -1,5 +1,6 @@ package com.boge.modules.tickets.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -75,10 +76,15 @@ public class TicketsEntity implements Serializable { */ private Integer status; /** - * 工单关闭时间 + * 更新时间 */ private Date updateTime; + /** + * 完结时间 + */ + private Date finishTime; + /** * 审批流id */ diff --git a/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketUserEnums.java b/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketUserEnums.java new file mode 100644 index 0000000..e883047 --- /dev/null +++ b/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketUserEnums.java @@ -0,0 +1,25 @@ +package com.boge.modules.tickets.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum TicketUserEnums { + + + SPECIALIST(2L, "专员"), + MANAGER(3L, "经理"); + + private Long code; + private String msg; + + public static String getStatus(String code) { + for (TicketUserEnums value : values()) { + if (value.code.equals(code)) { + return value.msg; + } + } + return null; + } +} diff --git a/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketsStatusEnums.java b/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketsStatusEnums.java index dee5b08..947af40 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketsStatusEnums.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketsStatusEnums.java @@ -10,7 +10,7 @@ import lombok.Getter; UNCHECK(0, "未开始"), CHECKED(1, "已指派"), REJECT(2, "处理中"), - CANCEL(3, "已完成"); + FINISH(3, "已完成"); private Integer code; private String msg; diff --git a/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java b/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java index 88f4f56..3845e5d 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java @@ -21,5 +21,7 @@ public interface TicketsService extends IService { TicketsDTO getTicketsById(String ticketsId); PageUtils queryPageByType(Map params); + + void saveTicket(TicketsEntity tickets); } diff --git a/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java b/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java index d819487..8a1292d 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java @@ -12,11 +12,19 @@ import com.boge.modules.sys.entity.SysUserEntity; import com.boge.modules.sys.service.SysUserRoleService; import com.boge.modules.sys.service.impl.SysUserServiceImpl; import com.boge.modules.tickets.dto.TicketsDTO; +import com.boge.modules.tickets.enums.TicketUserEnums; +import org.flowable.common.engine.api.FlowableException; +import org.flowable.engine.IdentityService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.runtime.ProcessInstance; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.boge.modules.tickets.enums.TicketsTypeEnums; import com.boge.modules.tickets.enums.TicketsStatusEnums; +import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,18 +53,28 @@ public class TicketsServiceImpl extends ServiceImpl i @Autowired private SysUserRoleService sysUserRoleService; + @Autowired + protected RuntimeService runtimeService; + + @Autowired + protected IdentityService identityService; + + @Value("${ProcessInstance.defId}") + private String defId; + @Override public PageUtils queryPage(Map params) { SysUserEntity loginUser = ShiroUtils.getUserEntity(); QueryWrapper ticketsEntityQueryWrapper = new QueryWrapper<>(); - if (ObjectUtil.isNotEmpty(loginUser)){ + if (ObjectUtil.isNotEmpty(loginUser)) { List longs = sysUserRoleService.queryRoleIdList(loginUser.getUserId()); //判断是否是超级管理员 - if (longs.contains(2L)){ - ticketsEntityQueryWrapper.orderBy(true, false,"create_time"); - }else { + if (longs.contains(2L)) { + ticketsEntityQueryWrapper.orderBy(true, false, "create_time"); + } else { ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()) - .orderBy(true, false,"create_time");; + .orderBy(true, false, "create_time"); + ; } } @@ -71,18 +89,18 @@ public class TicketsServiceImpl extends ServiceImpl i public PageUtils queryPageByType(Map params) { SysUserEntity loginUser = ShiroUtils.getUserEntity(); QueryWrapper ticketsEntityQueryWrapper = new QueryWrapper<>(); - if (ObjectUtil.isNotEmpty(loginUser)){ + if (ObjectUtil.isNotEmpty(loginUser)) { //判断是否是超级管理员 - ticketsEntityQueryWrapper.orderBy(true, false,"create_time"); - if (TicketsTypeEnums.ASSIGN.getCode().equals(params.get("type"))){ + ticketsEntityQueryWrapper.orderBy(true, false, "create_time"); + if (TicketsTypeEnums.ASSIGN.getCode().equals(params.get("type"))) { ticketsEntityQueryWrapper.eq("create_user", loginUser.getUsername()); } - if (TicketsTypeEnums.TO_BE_DONE.getCode().equals(params.get("type"))){ - ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()).eq("status",TicketsStatusEnums.CHECKED.getCode()); + if (TicketsTypeEnums.TO_BE_DONE.getCode().equals(params.get("type"))) { + ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()).eq("status", TicketsStatusEnums.REJECT.getCode()); } - if (TicketsTypeEnums.FINISH.getCode().equals(params.get("type"))){ - ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()).eq("status",TicketsStatusEnums.CANCEL.getCode()); + if (TicketsTypeEnums.FINISH.getCode().equals(params.get("type"))) { + ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()).eq("status", TicketsStatusEnums.FINISH.getCode()); } @@ -95,9 +113,32 @@ public class TicketsServiceImpl extends ServiceImpl i return new PageUtils(page); } + @Override + public void saveTicket(TicketsEntity tickets) { + // 启动流程 + try { + // 记录流程的发起人 + identityService.setAuthenticatedUserId(ShiroUtils.getUserId().toString()); + Map startVars = new HashMap<>(); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(defId, startVars); + SysUserEntity loginUser = ShiroUtils.getUserEntity(); + tickets.setCreateTime(new Date()); + tickets.setCreateUser(loginUser.getNickname()); + tickets.setStatus(TicketsStatusEnums.REJECT.getCode()); + tickets.setAssignUserId(TicketUserEnums.SPECIALIST.getCode()); + tickets.setProcessInstance(processInstance.getProcessInstanceId()); + ticketsDao.insert(tickets); + } catch (Exception e) { + e.printStackTrace(); + } + } + @Override public TicketsDTO getTicketsById(String ticketsId) { TicketsDTO tickets = ticketsDao.getTicketsDTOById(ticketsId); + + String processName = ticketsDao.selectByProcessInstance(tickets.getProcessInstance()); + tickets.setProcessInstanceUser(processName); return tickets; } diff --git a/base-fast/src/main/resources/application-dev.yml b/base-fast/src/main/resources/application-dev.yml index 208968a..a3397fb 100644 --- a/base-fast/src/main/resources/application-dev.yml +++ b/base-fast/src/main/resources/application-dev.yml @@ -3,7 +3,7 @@ spring: type: com.alibaba.druid.pool.DruidDataSource druid: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/basefast?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + url: jdbc:mysql://localhost:3306/flowable?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true username: root password: 123456 initial-size: 10 diff --git a/base-fast/src/main/resources/application.yml b/base-fast/src/main/resources/application.yml index 6cc6861..63b63e2 100644 --- a/base-fast/src/main/resources/application.yml +++ b/base-fast/src/main/resources/application.yml @@ -4,6 +4,7 @@ server: uri-encoding: UTF-8 max-threads: 1000 min-spare-threads: 30 + port: 8070 connection-timeout: 5000ms servlet: @@ -87,5 +88,8 @@ file: avatarMaxSize: 5 ProcessInstance: - defId: Process_1:2:05cb9af4-03a2-11f0-8846-e40d36456f42 + defId: Process_1:9:70cda2de-bb83-11f0-a10e-e60d36456f41 + + + diff --git a/base-fast/src/main/resources/mapper/tickets/TicketsDao.xml b/base-fast/src/main/resources/mapper/tickets/TicketsDao.xml index 83c1745..1e01262 100644 --- a/base-fast/src/main/resources/mapper/tickets/TicketsDao.xml +++ b/base-fast/src/main/resources/mapper/tickets/TicketsDao.xml @@ -8,12 +8,11 @@ - - + @@ -23,10 +22,12 @@ select * from sys_tickets as a left join sys_client as b on a.client_id = b.client_id left join sys_car as c on a.car_type = c.car_id - left join sys_contract as d on a.contract_id = d.contract_id - where a.tickets_id = #{ticketsId} + diff --git a/base-vue/src/views/modules/tickets/detail.vue b/base-vue/src/views/modules/tickets/detail.vue index e31f41a..30424cb 100644 --- a/base-vue/src/views/modules/tickets/detail.vue +++ b/base-vue/src/views/modules/tickets/detail.vue @@ -1,123 +1,670 @@ @@ -162,6 +170,16 @@ :total="totalPage" layout="total, sizes, prev, pager, next, jumper"> + + + + 流程进度图 + {}) }, - startFlowHandle(id){ - this.flowForm = {} - this.flowForm.ticketsId = id + startFlowHandle(processInstance) { + // 传递流程实例ID作为参数(假设后端需要的参数名为procid) this.$http({ - url: this.$http.adornUrl('/flow/deploy/flowDef'), + url: this.$http.adornUrl('/file/fileController/downloadFlowActiveImg'), method: 'get', - params: this.$http.adornParams() - }).then(({data}) => { - if (data && data.code === 0) { - this.dynamiForm = [...data.data] - this.users = [...data.users] - this.roles = [...data.roles] - this.dialogFormVisible = true + params: this.$http.adornParams({ + procId: processInstance // 关键:传递流程实例ID + }), + responseType: 'blob' // 关键:声明响应类型为二进制blob + }).then((response) => { + // 成功获取二进制图片数据 + this.flowImgUrl = URL.createObjectURL(response.data); // 转换为可展示的URL + this.dialogVisible = true; // 显示弹框 + }).catch((error) => { + // 错误处理(可能返回JSON格式的错误信息) + console.error('获取流程图失败', error); + // 尝试解析错误信息(若后端返回JSON错误) + if (error.response && error.response.data) { + const errorData = error.response.data; + this.$message.error(errorData.msg || '获取流程图失败,请稍后重试'); + } else { + this.$message.error('获取流程图失败,请稍后重试'); } - }) + }); }, submitStartFlow(){ // 提交表单数据