¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.jeecg.modules.flowable.service.impl; |
| | | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.map.MapUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.google.common.collect.Lists; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.collections4.CollectionUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.shiro.SecurityUtils; |
| | | import org.flowable.bpmn.model.*; |
| | | import org.flowable.bpmn.model.Process; |
| | | import org.flowable.common.engine.api.FlowableException; |
| | | import org.flowable.common.engine.api.FlowableObjectNotFoundException; |
| | | import org.flowable.common.engine.impl.identity.Authentication; |
| | | import org.flowable.engine.ProcessEngineConfiguration; |
| | | import org.flowable.engine.history.HistoricActivityInstance; |
| | | import org.flowable.engine.history.HistoricProcessInstance; |
| | | import org.flowable.engine.history.HistoricProcessInstanceQuery; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import org.flowable.engine.runtime.Execution; |
| | | import org.flowable.engine.runtime.ProcessInstance; |
| | | import org.flowable.engine.task.Comment; |
| | | import org.flowable.identitylink.api.IdentityLinkType; |
| | | import org.flowable.identitylink.api.history.HistoricIdentityLink; |
| | | import org.flowable.image.ProcessDiagramGenerator; |
| | | import org.flowable.task.api.DelegationState; |
| | | import org.flowable.task.api.Task; |
| | | import org.flowable.task.api.TaskQuery; |
| | | import org.flowable.task.api.history.HistoricTaskInstance; |
| | | import org.jeecg.common.api.vo.Result; |
| | | import org.jeecg.common.system.vo.LoginUser; |
| | | import org.jeecg.common.util.SpringContextUtils; |
| | | import org.jeecg.modules.flowable.apithird.business.dto.FlowMyBusinessDto; |
| | | import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; |
| | | import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl; |
| | | import org.jeecg.modules.flowable.apithird.common.constant.ProcessConstants; |
| | | import org.jeecg.modules.flowable.apithird.common.enums.FlowComment; |
| | | import org.jeecg.modules.flowable.apithird.common.exception.CustomException; |
| | | import org.jeecg.modules.flowable.apithird.entity.SysUser; |
| | | import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI; |
| | | import org.jeecg.modules.flowable.apithird.service.IFlowThirdService; |
| | | import org.jeecg.modules.flowable.domain.dto.FlowCommentDto; |
| | | import org.jeecg.modules.flowable.domain.dto.FlowNextDto; |
| | | import org.jeecg.modules.flowable.domain.dto.FlowTaskDto; |
| | | import org.jeecg.modules.flowable.domain.dto.FlowViewerDto; |
| | | import org.jeecg.modules.flowable.domain.vo.FlowTaskVo; |
| | | import org.jeecg.modules.flowable.factory.FlowServiceFactory; |
| | | import org.jeecg.modules.flowable.flow.CustomProcessDiagramGenerator; |
| | | import org.jeecg.modules.flowable.flow.FindNextNodeUtil; |
| | | import org.jeecg.modules.flowable.flow.FlowableUtils; |
| | | import org.jeecg.modules.flowable.service.IFlowTaskService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.io.InputStream; |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.function.Function; |
| | | import java.util.function.Predicate; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * |
| | | **/ |
| | | @Service |
| | | @Slf4j |
| | | @Transactional |
| | | public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTaskService { |
| | | |
| | | @Resource |
| | | private IFlowThirdService iFlowThirdService; |
| | | @Autowired |
| | | FlowMyBusinessServiceImpl flowMyBusinessService; |
| | | |
| | | /** |
| | | * å®æä»»å¡ |
| | | * |
| | | * @param taskVo 请æ±å®ä½åæ° |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Override |
| | | public Result complete(FlowTaskVo taskVo) { |
| | | Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult(); |
| | | if (Objects.isNull(task)) { |
| | | return Result.error("ä»»å¡ä¸åå¨"); |
| | | } |
| | | if (StringUtils.isNotEmpty(taskVo.getComment())) { |
| | | task.setDescription(taskVo.getComment()); |
| | | taskService.saveTask(task); |
| | | } |
| | | SysUser loginUser = iFlowThirdService.getLoginUser(); |
| | | //å¤æç¨æ·æ¯å¦ææé |
| | | if (!task.getAssignee().equals(loginUser.getUsername())) { |
| | | return Result.error("å½åç¨æ·æ æé"); |
| | | } |
| | | if (DelegationState.PENDING.equals(task.getDelegationState())) { |
| | | taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment()); |
| | | //taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues()); |
| | | } else { |
| | | System.out.println("taskVo.getTaskId()--->taskVo.getInstanceId()--->FlowComment.NORMAL.getType()--->taskVo.getComment()" + taskVo.getTaskId() + "---" + taskVo.getInstanceId() + "---" + FlowComment.NORMAL.getType() + "---" + taskVo.getComment()); |
| | | taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment()); |
| | | taskService.setAssignee(taskVo.getTaskId(), loginUser.getUsername()); |
| | | } |
| | | /*======================审æ¹ç»æ åè°ä»¥åå
³é®æ°æ®ä¿å======================*/ |
| | | //ä¸å¡æ°æ®id |
| | | String dataId = taskVo.getDataId(); |
| | | //妿ä¿åæ°æ®åæªè°ç¨å¿
è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ |
| | | FlowMyBusiness business = flowMyBusinessService.getFlowMyBusiness(taskVo.getInstanceId(), taskVo.getTaskId()); |
| | | //spring容å¨ç±»å |
| | | String serviceImplName = business.getServiceImplName(); |
| | | FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); |
| | | // æµç¨åé |
| | | Map<String, Object> flowBeforeParamsValues = flowCallBackService.flowValuesOfTask(business.getTaskNameId(), taskVo.getValues()); |
| | | |
| | | //è®¾ç½®æ°æ® |
| | | Map<String, Object> values = taskVo.getValues(); |
| | | if (MapUtil.isNotEmpty(flowBeforeParamsValues)) { |
| | | // ä¸å¡å±æè®¾ç½®åéï¼ä½¿ç¨ä¸å¡å±çåé |
| | | values = flowBeforeParamsValues; |
| | | } |
| | | |
| | | //å¹¶è¡ç½å
³ å¤ä»»å¡ |
| | | List<FlowNextDto> nextFlowNodeList = this.getNextFlowNode(task.getId(), values); |
| | | //ä¸ä¸ä¸ªå®ä¾èç¹ |
| | | if (DelegationState.PENDING.equals(task.getDelegationState())) { |
| | | taskService.resolveTask(taskVo.getTaskId(), values); |
| | | } else { |
| | | taskService.complete(taskVo.getTaskId(), values); |
| | | } |
| | | List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); |
| | | String doneUsers = business.getDoneUsers(); |
| | | // å¤çè¿æµç¨ç人 |
| | | JSONArray doneUserList = new JSONArray(); |
| | | if (StrUtil.isNotBlank(doneUsers)) { |
| | | doneUserList = JSON.parseArray(doneUsers); |
| | | } |
| | | if (!doneUserList.contains(loginUser.getUsername())) { |
| | | doneUserList.add(loginUser.getUsername()); |
| | | } |
| | | |
| | | if (CollectionUtils.isEmpty(nextFlowNodeList)) { |
| | | // **没æä¸ä¸ä¸ªèç¹ï¼æµç¨å·²ç»ç»æäº |
| | | business |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | .setTodoUsers("") |
| | | .setTaskId("") |
| | | .setTaskNameId("") |
| | | .setTaskName("") |
| | | ; |
| | | flowMyBusinessService.updateById(business); |
| | | } |
| | | else if (nextFlowNodeList.size() == 1) { |
| | | FlowNextDto nextFlowNode = nextFlowNodeList.get(0); |
| | | UserTask nextTask = nextFlowNode.getUserTask(); |
| | | Task task2 = null; |
| | | Optional<Task> first = task2List.stream().filter(t -> t.getTaskDefinitionKey().equals(nextTask.getId())).findFirst(); |
| | | task2 = first.orElseGet(() -> task2List.get(0)); |
| | | if (task2 != null) { |
| | | // ä¸ä¸ªèç¹åé人 |
| | | List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), taskVo.getValues()); |
| | | List<String> candidateUsers = taskVo.getCandidateUsers(); |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | // åç«¯ä¼ å
¥åé人 è¦ç |
| | | beforeParamsCandidateUsernames = candidateUsers; |
| | | } |
| | | if (task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())) { |
| | | //å¤å®ä¾ ä¼ç¾ TODO |
| | | // * å½åèç¹æ¯ä¼ç¾èç¹ï¼æ²¡æèµ°å® |
| | | business.setTaskId(task2.getId()) |
| | | // .setActStatus(ActStatus.doing) |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | ; |
| | | String todoUsersStr = business.getTodoUsers(); |
| | | JSONArray todosArr = JSON.parseArray(todoUsersStr); |
| | | // å é¤åéå |
| | | for (Object oldUser : todosArr) { |
| | | taskService.deleteCandidateUser(task2.getId(), oldUser.toString()); |
| | | } |
| | | // éå |
| | | if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { |
| | | beforeParamsCandidateUsernames.remove(loginUser.getUsername()); |
| | | // ä¸å¡å±ææå®åé人ï¼è¦ç |
| | | for (String newUser : beforeParamsCandidateUsernames) { |
| | | taskService.addCandidateUser(task2.getId(), newUser); |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | } else { |
| | | todosArr.remove(loginUser.getUsername()); |
| | | for (Object oldUser : todosArr) { |
| | | taskService.addCandidateUser(task2.getId(), oldUser.toString()); |
| | | } |
| | | business.setTodoUsers(todosArr.toJSONString()); |
| | | } |
| | | |
| | | } else { |
| | | //è½å¤å¤çä¸ä¸ªèç¹çåé人 |
| | | List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); |
| | | List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | // åç«¯ä¼ å
¥åé人 |
| | | collect_username = candidateUsers; |
| | | } |
| | | business |
| | | .setTaskId(task2.getId()) |
| | | // .setActStatus(ActStatus.doing) |
| | | .setTaskNameId(nextTask.getId()) |
| | | .setTaskName(nextTask.getName()) |
| | | .setPriority(nextTask.getPriority()) |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | .setTodoUsers(JSON.toJSONString(collect_username)) |
| | | ; |
| | | // å é¤åéå |
| | | for (String oldUser : collect_username) { |
| | | taskService.deleteCandidateUser(task2.getId(), oldUser); |
| | | } |
| | | if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { |
| | | // å端没æä¼ å
¥åé人 && ä¸å¡å±ææå®åé人ï¼è¦ç |
| | | for (String newUser : beforeParamsCandidateUsernames) { |
| | | taskService.addCandidateUser(task2.getId(), newUser); |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | } else { |
| | | for (String oldUser : collect_username) { |
| | | taskService.addCandidateUser(task2.getId(), oldUser); |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(collect_username)); |
| | | } |
| | | } |
| | | } |
| | | flowMyBusinessService.updateById(business); |
| | | } |
| | | else { |
| | | for(FlowNextDto nextFlowNode : nextFlowNodeList) { |
| | | //**æä¸ä¸ä¸ªèç¹ |
| | | UserTask nextTask = nextFlowNode.getUserTask(); |
| | | Task task2 = null; |
| | | Optional<Task> first = task2List.stream().filter(t -> t.getTaskDefinitionKey().equals(nextTask.getId())).findFirst(); |
| | | if (first.isPresent()) { |
| | | task2 = first.get(); |
| | | } |
| | | if (task2 != null) { |
| | | //æ°çä¸å¡æµç¨èç¹ |
| | | FlowMyBusiness newBusiness = BeanUtil.copyProperties(business, FlowMyBusiness.class, "id"); |
| | | // ä¸ä¸ªèç¹åé人 |
| | | List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), taskVo.getValues()); |
| | | List<String> candidateUsers = taskVo.getCandidateUsers(); |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | // åç«¯ä¼ å
¥åé人 è¦ç |
| | | beforeParamsCandidateUsernames = candidateUsers; |
| | | } |
| | | if (task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())) { |
| | | //å¤å®ä¾ ä¼ç¾ TODO |
| | | // * å½åèç¹æ¯ä¼ç¾èç¹ï¼æ²¡æèµ°å® |
| | | newBusiness.setTaskId(task2.getId()) |
| | | // .setActStatus(ActStatus.doing) |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | ; |
| | | String todoUsersStr = business.getTodoUsers(); |
| | | JSONArray todosArr = JSON.parseArray(todoUsersStr); |
| | | // å é¤åéå |
| | | for (Object oldUser : todosArr) { |
| | | taskService.deleteCandidateUser(task2.getId(), oldUser.toString()); |
| | | } |
| | | // éå |
| | | if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { |
| | | beforeParamsCandidateUsernames.remove(loginUser.getUsername()); |
| | | // ä¸å¡å±ææå®åé人ï¼è¦ç |
| | | for (String newUser : beforeParamsCandidateUsernames) { |
| | | taskService.addCandidateUser(task2.getId(), newUser); |
| | | } |
| | | newBusiness.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | } else { |
| | | todosArr.remove(loginUser.getUsername()); |
| | | for (Object oldUser : todosArr) { |
| | | taskService.addCandidateUser(task2.getId(), oldUser.toString()); |
| | | } |
| | | newBusiness.setTodoUsers(todosArr.toJSONString()); |
| | | } |
| | | |
| | | } else { |
| | | //è½å¤å¤çä¸ä¸ªèç¹çåé人 |
| | | List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); |
| | | List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | // åç«¯ä¼ å
¥åé人 |
| | | collect_username = candidateUsers; |
| | | } |
| | | newBusiness |
| | | .setTaskId(task2.getId()) |
| | | // .setActStatus(ActStatus.doing) |
| | | .setTaskNameId(nextTask.getId()) |
| | | .setTaskName(nextTask.getName()) |
| | | .setPriority(nextTask.getPriority()) |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | .setTodoUsers(JSON.toJSONString(collect_username)) |
| | | ; |
| | | // å é¤åéå |
| | | for (String oldUser : collect_username) { |
| | | taskService.deleteCandidateUser(task2.getId(), oldUser); |
| | | } |
| | | if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { |
| | | // å端没æä¼ å
¥åé人 && ä¸å¡å±ææå®åé人ï¼è¦ç |
| | | for (String newUser : beforeParamsCandidateUsernames) { |
| | | taskService.addCandidateUser(task2.getId(), newUser); |
| | | } |
| | | newBusiness.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | } else { |
| | | for (String oldUser : collect_username) { |
| | | taskService.addCandidateUser(task2.getId(), oldUser); |
| | | } |
| | | newBusiness.setTodoUsers(JSON.toJSONString(collect_username)); |
| | | } |
| | | } |
| | | flowMyBusinessService.save(newBusiness); |
| | | } |
| | | flowMyBusinessService.updateById(business); |
| | | } |
| | | //å é¤åæçä¸å¡æ°æ® |
| | | flowMyBusinessService.removeById(business.getId()); |
| | | } |
| | | |
| | | // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± |
| | | business.setValues(values); |
| | | if (flowCallBackService != null) { |
| | | flowCallBackService.afterFlowHandle(business); |
| | | } |
| | | return Result.OK(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result completeByDateId(FlowTaskVo flowTaskVo) { |
| | | return this.complete(flowTaskVo); |
| | | } |
| | | |
| | | @Override |
| | | public void taskRejectByDataId(FlowTaskVo flowTaskVo) { |
| | | FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); |
| | | flowTaskVo.setTaskId(business.getTaskId()); |
| | | this.taskReject(flowTaskVo); |
| | | } |
| | | |
| | | /** |
| | | * 驳åä»»å¡ |
| | | * |
| | | * @param flowTaskVo |
| | | */ |
| | | @Override |
| | | public void taskReject(FlowTaskVo flowTaskVo) { |
| | | if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { |
| | | throw new CustomException("ä»»å¡å¤äºæèµ·ç¶æ"); |
| | | } |
| | | // å½åä»»å¡ task |
| | | Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); |
| | | // è·åæµç¨å®ä¹ä¿¡æ¯ |
| | | ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); |
| | | // è·åææèç¹ä¿¡æ¯ |
| | | Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); |
| | | // è·åå
¨é¨èç¹å表ï¼å
å«åèç¹ |
| | | Collection<FlowElement> allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); |
| | | // è·åå½åä»»å¡èç¹å
ç´ |
| | | FlowElement source = null; |
| | | if (allElements != null) { |
| | | for (FlowElement flowElement : allElements) { |
| | | // ç±»åä¸ºç¨æ·èç¹ |
| | | if (flowElement.getId().equals(task.getTaskDefinitionKey())) { |
| | | // è·åèç¹ä¿¡æ¯ |
| | | source = flowElement; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // ç®çè·åææè·³è½¬å°çèç¹ targetIds |
| | | // è·åå½åèç¹çææç¶çº§ç¨æ·ä»»å¡èç¹ |
| | | // 深度ä¼å
ç®æ³ææ³ï¼å»¶è¾¹è¿ä»£æ·±å
¥ |
| | | List<UserTask> parentUserTaskList = FlowableUtils.iteratorFindParentUserTasks(source, null, null); |
| | | if (parentUserTaskList == null || parentUserTaskList.size() == 0) { |
| | | throw new CustomException("å½åèç¹ä¸ºåå§ä»»å¡èç¹ï¼ä¸è½é©³å"); |
| | | } |
| | | // è·åæ´»å¨ ID å³èç¹ Key |
| | | List<String> parentUserTaskKeyList = new ArrayList<>(); |
| | | parentUserTaskList.forEach(item -> parentUserTaskKeyList.add(item.getId())); |
| | | // è·åå
¨é¨åå²èç¹æ´»å¨å®ä¾ï¼å³å·²ç»èµ°è¿çèç¹åå²ï¼æ°æ®éç¨å¼å§æ¶é´ååº |
| | | List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().processInstanceId(task.getProcessInstanceId()).orderByHistoricTaskInstanceStartTime().asc().list(); |
| | | // æ°æ®æ¸
æ´ï¼å°åæ»å¯¼è´çèæ°æ®æ¸
æ´æ |
| | | List<String> lastHistoricTaskInstanceList = FlowableUtils.historicTaskInstanceClean(allElements, historicTaskInstanceList); |
| | | // æ¤æ¶åå²ä»»å¡å®ä¾ä¸ºååºï¼è·åæåèµ°çèç¹ |
| | | List<String> targetIds = new ArrayList<>(); |
| | | // 循ç¯ç»ææ è¯ï¼éå°å½åç®æ èç¹çæ¬¡æ° |
| | | int number = 0; |
| | | StringBuilder parentHistoricTaskKey = new StringBuilder(); |
| | | for (String historicTaskInstanceKey : lastHistoricTaskInstanceList) { |
| | | // å½ä¼ç¾æ¶åä¼åºç°ç¹æ®çï¼è¿ç»é½æ¯åä¸ä¸ªèç¹å岿°æ®çæ
åµï¼è¿ç§æ¶åè·³è¿ |
| | | if (parentHistoricTaskKey.toString().equals(historicTaskInstanceKey)) { |
| | | continue; |
| | | } |
| | | parentHistoricTaskKey = new StringBuilder(historicTaskInstanceKey); |
| | | if (historicTaskInstanceKey.equals(task.getTaskDefinitionKey())) { |
| | | number++; |
| | | } |
| | | // 卿°æ®æ¸
æ´åï¼åå²èç¹å°±æ¯å¯ä¸ä¸æ¡ä»èµ·å§å°å½åèç¹çåå²è®°å½ï¼çè®ºä¸æ¯ä¸ªç¹åªä¼åºç°ä¸æ¬¡ |
| | | // 卿µç¨ä¸å¦æåºç°å¾ªç¯ï¼é£ä¹æ¯æ¬¡å¾ªç¯ä¸é´çç¹ä¹åªä¼åºç°ä¸æ¬¡ï¼ååºç°å°±æ¯ä¸æ¬¡å¾ªç¯ |
| | | // number == 1ï¼ç¬¬ä¸æ¬¡éå°å½åèç¹ |
| | | // number == 2ï¼ç¬¬äºæ¬¡éå°ï¼ä»£è¡¨æå䏿¬¡ç循ç¯èå´ |
| | | if (number == 2) { |
| | | break; |
| | | } |
| | | // 妿å½ååå²èç¹ï¼å±äºç¶çº§çèç¹ï¼è¯´ææå䏿¬¡ç»è¿äºè¿ä¸ªç¹ï¼éè¦éåè¿ä¸ªç¹ |
| | | if (parentUserTaskKeyList.contains(historicTaskInstanceKey)) { |
| | | targetIds.add(historicTaskInstanceKey); |
| | | } |
| | | } |
| | | |
| | | |
| | | // ç®çè·åææéè¦è¢«è·³è½¬çèç¹ currentIds |
| | | // åå
¶ä¸ä¸ä¸ªç¶çº§ä»»å¡ï¼å 为åç»è¦ä¹åå¨å
Œ
񇫆
³ï¼è¦ä¹å°±æ¯ä¸²è¡å
Œ
±çº¿è·¯ |
| | | UserTask oneUserTask = parentUserTaskList.get(0); |
| | | // è·åæææ£å¸¸è¿è¡çä»»å¡èç¹ Keyï¼è¿äºä»»å¡ä¸è½ç´æ¥ä½¿ç¨ï¼éè¦æ¾åºå
¶ä¸éè¦æ¤åçä»»å¡ |
| | | List<Task> runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); |
| | | List<String> runTaskKeyList = new ArrayList<>(); |
| | | runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); |
| | | // é驳åä»»å¡å表 |
| | | List<String> currentIds = new ArrayList<>(); |
| | | // éè¿ç¶çº§ç½å
³çåºå£è¿çº¿ï¼ç»å runTaskList æ¯å¯¹ï¼è·åéè¦æ¤åçä»»å¡ |
| | | List<UserTask> currentUserTaskList = FlowableUtils.iteratorFindChildUserTasks(oneUserTask, runTaskKeyList, null, null); |
| | | currentUserTaskList.forEach(item -> currentIds.add(item.getId())); |
| | | |
| | | |
| | | // è§å®ï¼å¹¶è¡ç½å
³ä¹åèç¹å¿
é¡»éåå¨å¯ä¸ç¨æ·ä»»å¡èç¹ï¼å¦æåºç°å¤ä¸ªä»»å¡èç¹ï¼åå¹¶è¡ç½å
³èç¹é»è®¤ä¸ºç»æèç¹ï¼åå 为ä¸èèå¤å¯¹å¤æ
åµ |
| | | if (targetIds.size() > 1 && currentIds.size() > 1) { |
| | | throw new CustomException("ä»»å¡åºç°å¤å¯¹å¤æ
åµï¼æ æ³æ¤å"); |
| | | } |
| | | |
| | | // 循ç¯è·åé£äºéè¦è¢«æ¤åçèç¹çIDï¼ç¨æ¥è®¾ç½®é©³ååå |
| | | List<String> currentTaskIds = new ArrayList<>(); |
| | | currentIds.forEach(currentId -> runTaskList.forEach(runTask -> { |
| | | if (currentId.equals(runTask.getTaskDefinitionKey())) { |
| | | currentTaskIds.add(runTask.getId()); |
| | | } |
| | | })); |
| | | // 设置驳åæè§ |
| | | currentTaskIds.forEach(item -> taskService.addComment(item, task.getProcessInstanceId(), FlowComment.REJECT.getType(), flowTaskVo.getComment())); |
| | | SysUser loginUser = iFlowThirdService.getLoginUser(); |
| | | try { |
| | | // 设置å¤ç人 |
| | | taskService.setAssignee(task.getId(), loginUser.getUsername()); |
| | | // 妿ç¶çº§ä»»å¡å¤äº 1 个ï¼è¯´æå½åèç¹ä¸æ¯å¹¶è¡èç¹ï¼åå 为ä¸èèå¤å¯¹å¤æ
åµ |
| | | if (targetIds.size() > 1) { |
| | | // 1 对 å¤ä»»å¡è·³è½¬ï¼currentIds å½åèç¹(1)ï¼targetIds 跳转å°çèç¹(å¤) |
| | | runtimeService.createChangeActivityStateBuilder() |
| | | .processInstanceId(task.getProcessInstanceId()). |
| | | moveSingleActivityIdToActivityIds(currentIds.get(0), targetIds).changeState(); |
| | | } |
| | | // 妿ç¶çº§ä»»å¡åªæä¸ä¸ªï¼å æ¤å½åä»»å¡å¯è½ä¸ºç½å
³ä¸çä»»å¡ |
| | | if (targetIds.size() == 1) { |
| | | // 1 对 1 æ å¤ å¯¹ 1 æ
åµï¼currentIds å½åè¦è·³è½¬çèç¹å表(1æå¤)ï¼targetIds.get(0) 跳转å°çèç¹(1) |
| | | runtimeService.createChangeActivityStateBuilder() |
| | | .processInstanceId(task.getProcessInstanceId()) |
| | | .moveActivityIdsToSingleActivityId(currentIds, targetIds.get(0)).changeState(); |
| | | } |
| | | /*======================驳å åè°ä»¥åå
³é®æ°æ®ä¿å======================*/ |
| | | //ä¸å¡æ°æ®id |
| | | String dataId = flowTaskVo.getDataId(); |
| | | if (dataId == null) return; |
| | | //妿ä¿åæ°æ®åæªè°ç¨å¿
è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ |
| | | FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); |
| | | // 驳åå°äºä¸ä¸ä¸ªèç¹çå¾
å¤ç |
| | | List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); |
| | | Task task2 = task2List.get(0); |
| | | //spring容å¨ç±»å |
| | | String serviceImplName = business.getServiceImplName(); |
| | | FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); |
| | | Map<String, Object> values = flowTaskVo.getValues(); |
| | | if (values == null) { |
| | | values = MapUtil.newHashMap(); |
| | | values.put("dataId", dataId); |
| | | } else { |
| | | values.put("dataId", dataId); |
| | | } |
| | | List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), values); |
| | | //è®¾ç½®æ°æ® |
| | | String doneUsers = business.getDoneUsers(); |
| | | // å¤çè¿æµç¨ç人 |
| | | JSONArray doneUserList = new JSONArray(); |
| | | if (StrUtil.isNotBlank(doneUsers)) { |
| | | doneUserList = JSON.parseArray(doneUsers); |
| | | } |
| | | if (!doneUserList.contains(loginUser.getUsername())) { |
| | | doneUserList.add(loginUser.getUsername()); |
| | | } |
| | | business |
| | | .setTaskId(task2.getId()) |
| | | // .setActStatus(ActStatus.reject) |
| | | .setTaskNameId(task2.getTaskDefinitionKey()) |
| | | .setTaskName(task2.getName()) |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | ; |
| | | FlowElement targetElement = null; |
| | | if (allElements != null) { |
| | | for (FlowElement flowElement : allElements) { |
| | | // ç±»åä¸ºç¨æ·èç¹ |
| | | if (flowElement.getId().equals(task2.getTaskDefinitionKey())) { |
| | | // è·åèç¹ä¿¡æ¯ |
| | | targetElement = flowElement; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (targetElement != null) { |
| | | UserTask targetTask = (UserTask) targetElement; |
| | | business.setPriority(targetTask.getPriority()); |
| | | |
| | | if (StrUtil.equals(business.getTaskNameId(), ProcessConstants.START_NODE)) { |
| | | // å¼å§èç¹ã设置å¤ç人为ç³è¯·äºº |
| | | business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer()))); |
| | | taskService.setAssignee(business.getTaskId(), business.getProposer()); |
| | | } else { |
| | | List<SysUser> sysUserFromTask = getSysUserFromTask(targetTask); |
| | | List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); |
| | | // å端åå
¥çåé人 |
| | | List<String> candidateUsers = flowTaskVo.getCandidateUsers(); |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | collect_username = candidateUsers; |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(collect_username)); |
| | | // å é¤åéå |
| | | for (Task task2One : task2List) { |
| | | for (String oldUser : collect_username) { |
| | | taskService.deleteCandidateUser(task2One.getId(), oldUser); |
| | | } |
| | | } |
| | | if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | beforeParamsCandidateUsernames = candidateUsers; |
| | | } |
| | | // ä¸å¡å±ææå®åé人ï¼è¦ç |
| | | for (Task task2One : task2List) { |
| | | for (String newUser : beforeParamsCandidateUsernames) { |
| | | taskService.addCandidateUser(task2One.getId(), newUser); |
| | | } |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | } else { |
| | | for (Task task2One : task2List) { |
| | | for (String oldUser : collect_username) { |
| | | taskService.addCandidateUser(task2One.getId(), oldUser); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | flowMyBusinessService.updateById(business); |
| | | // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± |
| | | business.setValues(values); |
| | | if (flowCallBackService != null) flowCallBackService.afterFlowHandle(business); |
| | | } catch (FlowableObjectNotFoundException e) { |
| | | throw new CustomException("æªæ¾å°æµç¨å®ä¾ï¼æµç¨å¯è½å·²åçåå"); |
| | | } catch (FlowableException e) { |
| | | throw new CustomException("æ æ³åæ¶æå¼å§æ´»å¨"); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void taskReturnByDataId(FlowTaskVo flowTaskVo) { |
| | | //妿ä¿åæ°æ®åæªè°ç¨å¿
è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ |
| | | FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); |
| | | flowTaskVo.setTaskId(business.getTaskId()); |
| | | taskReturn(flowTaskVo); |
| | | } |
| | | |
| | | /** |
| | | * éåä»»å¡ |
| | | * |
| | | * @param flowTaskVo 请æ±å®ä½åæ° |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Override |
| | | public void taskReturn(FlowTaskVo flowTaskVo) { |
| | | if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { |
| | | throw new CustomException("ä»»å¡å¤äºæèµ·ç¶æ"); |
| | | } |
| | | // å½åä»»å¡ task |
| | | Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); |
| | | // è·åæµç¨å®ä¹ä¿¡æ¯ |
| | | ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); |
| | | // è·åææèç¹ä¿¡æ¯ |
| | | Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); |
| | | // è·åå
¨é¨èç¹å表ï¼å
å«åèç¹ |
| | | Collection<FlowElement> allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); |
| | | // è·åå½åä»»å¡èç¹å
ç´ |
| | | FlowElement source = null; |
| | | // è·å跳转çèç¹å
ç´ |
| | | FlowElement target = null; |
| | | if (allElements != null) { |
| | | for (FlowElement flowElement : allElements) { |
| | | // å½åä»»å¡èç¹å
ç´ |
| | | if (flowElement.getId().equals(task.getTaskDefinitionKey())) { |
| | | source = flowElement; |
| | | } |
| | | // 跳转çèç¹å
ç´ |
| | | if (flowElement.getId().equals(flowTaskVo.getTargetKey())) { |
| | | target = flowElement; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // ä»å½åèç¹ååæ«æ |
| | | // 妿åå¨è·¯çº¿ä¸ä¸åå¨ç®æ èç¹ï¼è¯´æç®æ èç¹æ¯å¨ç½å
³ä¸æéåä¸è·¯çº¿ä¸ï¼ä¸å¯è·³è½¬ |
| | | // å¦åç®æ èç¹ç¸å¯¹äºå½åèç¹ï¼å±äºä¸²è¡ |
| | | Boolean isSequential = FlowableUtils.iteratorCheckSequentialReferTarget(source, flowTaskVo.getTargetKey(), null, null); |
| | | if (!isSequential) { |
| | | throw new CustomException("å½åèç¹ç¸å¯¹äºç®æ èç¹ï¼ä¸å±äºä¸²è¡å
³ç³»ï¼æ æ³åé"); |
| | | } |
| | | |
| | | |
| | | // è·åæææ£å¸¸è¿è¡çä»»å¡èç¹ Keyï¼è¿äºä»»å¡ä¸è½ç´æ¥ä½¿ç¨ï¼éè¦æ¾åºå
¶ä¸éè¦æ¤åçä»»å¡ |
| | | List<Task> runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); |
| | | List<String> runTaskKeyList = new ArrayList<>(); |
| | | runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); |
| | | // ééåä»»å¡å表 |
| | | List<String> currentIds = new ArrayList<>(); |
| | | // éè¿ç¶çº§ç½å
³çåºå£è¿çº¿ï¼ç»å runTaskList æ¯å¯¹ï¼è·åéè¦æ¤åçä»»å¡ |
| | | List<UserTask> currentUserTaskList = FlowableUtils.iteratorFindChildUserTasks(target, runTaskKeyList, null, null); |
| | | currentUserTaskList.forEach(item -> { |
| | | currentIds.add(item.getId()); |
| | | }); |
| | | |
| | | // 循ç¯è·åé£äºéè¦è¢«æ¤åçèç¹çIDï¼ç¨æ¥è®¾ç½®é©³ååå |
| | | List<String> currentTaskIds = new ArrayList<>(); |
| | | currentIds.forEach(currentId -> runTaskList.forEach(runTask -> { |
| | | if (currentId.equals(runTask.getTaskDefinitionKey())) { |
| | | currentTaskIds.add(runTask.getId()); |
| | | } |
| | | })); |
| | | // 设置åéæè§ |
| | | for (String currentTaskId : currentTaskIds) { |
| | | taskService.addComment(currentTaskId, task.getProcessInstanceId(), FlowComment.REBACK.getType(), flowTaskVo.getComment()); |
| | | } |
| | | SysUser loginUser = iFlowThirdService.getLoginUser(); |
| | | try { |
| | | // 设置å¤ç人 |
| | | taskService.setAssignee(task.getId(), loginUser.getUsername()); |
| | | // 1 对 1 æ å¤ å¯¹ 1 æ
åµï¼currentIds å½åè¦è·³è½¬çèç¹å表(1æå¤)ï¼targetKey 跳转å°çèç¹(1) |
| | | runtimeService.createChangeActivityStateBuilder() |
| | | .processInstanceId(task.getProcessInstanceId()) |
| | | .moveActivityIdsToSingleActivityId(currentIds, flowTaskVo.getTargetKey()).changeState(); |
| | | |
| | | /*======================éå åè°ä»¥åå
³é®æ°æ®ä¿å======================*/ |
| | | //ä¸å¡æ°æ®id |
| | | String dataId = flowTaskVo.getDataId(); |
| | | if (dataId == null) return; |
| | | //妿ä¿åæ°æ®åæªè°ç¨å¿
è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ |
| | | FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); |
| | | //spring容å¨ç±»å |
| | | String serviceImplName = business.getServiceImplName(); |
| | | FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); |
| | | //è®¾ç½®æ°æ® |
| | | String doneUsers = business.getDoneUsers(); |
| | | // å¤çè¿æµç¨ç人 |
| | | JSONArray doneUserList = new JSONArray(); |
| | | if (StrUtil.isNotBlank(doneUsers)) { |
| | | doneUserList = JSON.parseArray(doneUsers); |
| | | } |
| | | |
| | | if (!doneUserList.contains(loginUser.getUsername())) { |
| | | doneUserList.add(loginUser.getUsername()); |
| | | } |
| | | //**跳转å°ç®æ èç¹ |
| | | List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); |
| | | Task targetTask = task2List.get(0); |
| | | business |
| | | .setTaskId(targetTask.getId()) |
| | | // .setActStatus(ActStatus.reject) |
| | | .setTaskNameId(targetTask.getTaskDefinitionKey()) |
| | | .setTaskName(targetTask.getName()) |
| | | .setPriority(targetTask.getPriority() + "") |
| | | .setDoneUsers(doneUserList.toJSONString()) |
| | | ; |
| | | if (target != null) { |
| | | UserTask target2 = (UserTask) target; |
| | | business.setPriority(target2.getPriority()); |
| | | if (StrUtil.equals(business.getTaskNameId(), ProcessConstants.START_NODE)) { |
| | | // å¼å§èç¹ã设置å¤ç人为ç³è¯·äºº |
| | | business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer()))); |
| | | taskService.setAssignee(business.getTaskId(), business.getProposer()); |
| | | } else { |
| | | List<SysUser> sysUserFromTask = getSysUserFromTask(target2); |
| | | List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); |
| | | List<String> candidateUsers = flowTaskVo.getCandidateUsers(); |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | collect_username = candidateUsers; |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(collect_username)); |
| | | // å é¤åéå |
| | | for (Task task2One : task2List) { |
| | | for (String oldUser : collect_username) { |
| | | taskService.deleteCandidateUser(task2One.getId(), oldUser); |
| | | } |
| | | } |
| | | Map<String, Object> values = flowTaskVo.getValues(); |
| | | if (values == null) { |
| | | values = MapUtil.newHashMap(); |
| | | values.put("dataId", dataId); |
| | | } else { |
| | | values.put("dataId", dataId); |
| | | } |
| | | List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(targetTask.getTaskDefinitionKey(), values); |
| | | if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | beforeParamsCandidateUsernames = candidateUsers; |
| | | } |
| | | // ä¸å¡å±ææå®åé人ï¼è¦ç |
| | | for (Task task2One : task2List) { |
| | | for (String newUser : beforeParamsCandidateUsernames) { |
| | | taskService.addCandidateUser(task2One.getId(), newUser); |
| | | } |
| | | } |
| | | business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); |
| | | } else { |
| | | for (Task task2One : task2List) { |
| | | for (String oldUser : collect_username) { |
| | | taskService.addCandidateUser(task2One.getId(), oldUser); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | flowMyBusinessService.updateById(business); |
| | | // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± |
| | | business.setValues(flowTaskVo.getValues()); |
| | | if (flowCallBackService != null) flowCallBackService.afterFlowHandle(business); |
| | | } catch (FlowableObjectNotFoundException e) { |
| | | throw new CustomException("æªæ¾å°æµç¨å®ä¾ï¼æµç¨å¯è½å·²åçåå"); |
| | | } catch (FlowableException e) { |
| | | throw new CustomException("æ æ³åæ¶æå¼å§æ´»å¨"); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public Result findReturnTaskListByDataId(FlowTaskVo flowTaskVo) { |
| | | FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); |
| | | flowTaskVo.setTaskId(business.getTaskId()); |
| | | return findReturnTaskList(flowTaskVo); |
| | | } |
| | | |
| | | /** |
| | | * ç»ææµç¨ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾ ID |
| | | * @param deleteReason å®ä¹å é¤åå |
| | | */ |
| | | public Result<?> end(String processInstanceId, String deleteReason) { |
| | | try { |
| | | // 强å¶ç»ææµç¨å®ä¾ |
| | | runtimeService.deleteProcessInstance(processInstanceId, deleteReason); |
| | | // å é¤å
³èæµç¨çä¸å¡ |
| | | FlowMyBusiness flowMyBusiness = flowMyBusinessService.getFlowMyBusiness(processInstanceId); |
| | | flowMyBusinessService.removeById(flowMyBusiness.getId()); |
| | | System.out.println("Process instance with ID " + processInstanceId + " has been forcefully ended."); |
| | | } catch (Exception e) { |
| | | System.err.println("Failed to force end process instance: " + e.getMessage()); |
| | | } |
| | | |
| | | // å
³éæµç¨å¼æ |
| | | processEngine.close(); |
| | | return Result.OK("æµç¨å·²ç»æ"); |
| | | } |
| | | |
| | | /** |
| | | * è·åææå¯åéçèç¹ |
| | | * |
| | | * @param flowTaskVo |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result findReturnTaskList(FlowTaskVo flowTaskVo) { |
| | | // å½åä»»å¡ task |
| | | Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); |
| | | // è·åæµç¨å®ä¹ä¿¡æ¯ |
| | | ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); |
| | | // è·åææèç¹ä¿¡æ¯ï¼æä¸èèåæµç¨æ
åµ |
| | | Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); |
| | | Collection<FlowElement> flowElements = process.getFlowElements(); |
| | | // è·åå½åä»»å¡èç¹å
ç´ |
| | | UserTask source = null; |
| | | if (flowElements != null) { |
| | | for (FlowElement flowElement : flowElements) { |
| | | // ç±»åä¸ºç¨æ·èç¹ |
| | | if (flowElement.getId().equals(task.getTaskDefinitionKey())) { |
| | | source = (UserTask) flowElement; |
| | | } |
| | | } |
| | | } |
| | | // è·åèç¹çææè·¯çº¿ |
| | | List<List<UserTask>> roads = FlowableUtils.findRoad(source, null, null, null); |
| | | // å¯åéçèç¹å表 |
| | | List<UserTask> userTaskList = new ArrayList<>(); |
| | | for (List<UserTask> road : roads) { |
| | | if (userTaskList.size() == 0) { |
| | | // è¿æ²¡æå¯åéèç¹ç´æ¥æ·»å |
| | | userTaskList = road; |
| | | } else { |
| | | // 妿已æåéèç¹ï¼åæ¯å¯¹å交éé¨å |
| | | userTaskList.retainAll(road); |
| | | } |
| | | } |
| | | return Result.OK(userTaskList); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä»»å¡ |
| | | * |
| | | * @param flowTaskVo 请æ±å®ä½åæ° |
| | | */ |
| | | @Override |
| | | public void deleteTask(FlowTaskVo flowTaskVo) { |
| | | // todo å¾
确认å é¤ä»»å¡æ¯ç©çå é¤ä»»å¡ è¿æ¯é»è¾å é¤ï¼è®©è¿ä¸ªä»»å¡ç´æ¥éè¿ï¼ |
| | | taskService.deleteTask(flowTaskVo.getTaskId(), flowTaskVo.getComment()); |
| | | } |
| | | |
| | | /** |
| | | * 认é¢/ç¾æ¶ä»»å¡ |
| | | * |
| | | * @param flowTaskVo 请æ±å®ä½åæ° |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void claim(FlowTaskVo flowTaskVo) { |
| | | taskService.claim(flowTaskVo.getTaskId(), flowTaskVo.getUserId()); |
| | | } |
| | | |
| | | /** |
| | | * åæ¶è®¤é¢/ç¾æ¶ä»»å¡ |
| | | * |
| | | * @param flowTaskVo 请æ±å®ä½åæ° |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void unClaim(FlowTaskVo flowTaskVo) { |
| | | taskService.unclaim(flowTaskVo.getTaskId()); |
| | | } |
| | | |
| | | /** |
| | | * å§æ´¾ä»»å¡ |
| | | * |
| | | * @param flowTaskVo 请æ±å®ä½åæ° |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void delegateTask(FlowTaskVo flowTaskVo) { |
| | | taskService.delegateTask(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 转åä»»å¡ |
| | | * |
| | | * @param flowTaskVo 请æ±å®ä½åæ° |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void assignTask(FlowTaskVo flowTaskVo) { |
| | | taskService.setAssignee(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); |
| | | } |
| | | |
| | | /** |
| | | * æåèµ·çæµç¨ |
| | | * |
| | | * @param pageNum |
| | | * @param pageSize |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result myProcess(Integer pageNum, Integer pageSize) { |
| | | Page<FlowTaskDto> page = new Page<>(); |
| | | String username = iFlowThirdService.getLoginUser().getUsername(); |
| | | HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() |
| | | .startedBy(username) |
| | | .orderByProcessInstanceStartTime() |
| | | .desc(); |
| | | List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage((pageNum - 1) * pageSize, pageSize); |
| | | page.setTotal(historicProcessInstanceQuery.count()); |
| | | List<FlowTaskDto> flowList = new ArrayList<>(); |
| | | for (HistoricProcessInstance hisIns : historicProcessInstances) { |
| | | FlowTaskDto flowTask = new FlowTaskDto(); |
| | | flowTask.setCreateTime(hisIns.getStartTime()); |
| | | flowTask.setFinishTime(hisIns.getEndTime()); |
| | | flowTask.setProcInsId(hisIns.getId()); |
| | | |
| | | // 计ç®èæ¶ |
| | | if (Objects.nonNull(hisIns.getEndTime())) { |
| | | long time = hisIns.getEndTime().getTime() - hisIns.getStartTime().getTime(); |
| | | flowTask.setDuration(getDate(time)); |
| | | } else { |
| | | long time = System.currentTimeMillis() - hisIns.getStartTime().getTime(); |
| | | flowTask.setDuration(getDate(time)); |
| | | } |
| | | // æµç¨å®ä¹ä¿¡æ¯ |
| | | ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() |
| | | .processDefinitionId(hisIns.getProcessDefinitionId()) |
| | | .singleResult(); |
| | | flowTask.setDeployId(pd.getDeploymentId()); |
| | | flowTask.setProcDefName(pd.getName()); |
| | | flowTask.setProcDefVersion(pd.getVersion()); |
| | | flowTask.setCategory(pd.getCategory()); |
| | | flowTask.setProcDefVersion(pd.getVersion()); |
| | | // å½åæå¤æµç¨ todo: æ¬å°å¯å¨æ¾å¼ä»¥ä¸æ³¨é |
| | | List<Task> taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).list(); |
| | | if (CollectionUtils.isNotEmpty(taskList)) { |
| | | flowTask.setTaskId(taskList.get(0).getId()); |
| | | } else { |
| | | List<HistoricTaskInstance> historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(hisIns.getId()).orderByHistoricTaskInstanceEndTime().desc().list(); |
| | | flowTask.setTaskId(historicTaskInstance.get(0).getId()); |
| | | } |
| | | flowList.add(flowTask); |
| | | } |
| | | page.setRecords(flowList); |
| | | return Result.OK(page); |
| | | } |
| | | |
| | | /** |
| | | * åæ¶ç³è¯· |
| | | * |
| | | * @param flowTaskVo |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result stopProcess(FlowTaskVo flowTaskVo) { |
| | | List<Task> task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).list(); |
| | | if (CollectionUtils.isEmpty(task)) { |
| | | throw new CustomException("æµç¨æªå¯å¨æå·²æ§è¡å®æï¼åæ¶ç³è¯·å¤±è´¥"); |
| | | } |
| | | |
| | | SysUser loginUser = iFlowThirdService.getLoginUser(); |
| | | ProcessInstance processInstance = |
| | | runtimeService.createProcessInstanceQuery().processInstanceId(flowTaskVo.getInstanceId()).singleResult(); |
| | | BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()); |
| | | if (Objects.nonNull(bpmnModel)) { |
| | | Process process = bpmnModel.getMainProcess(); |
| | | List<EndEvent> endNodes = process.findFlowElementsOfType(EndEvent.class, false); |
| | | if (CollectionUtils.isNotEmpty(endNodes)) { |
| | | Authentication.setAuthenticatedUserId(loginUser.getUsername()); |
| | | taskService.addComment(task.get(0).getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(), |
| | | StringUtils.isBlank(flowTaskVo.getComment()) ? "åæ¶ç³è¯·" : flowTaskVo.getComment()); |
| | | String endId = endNodes.get(0).getId(); |
| | | List<Execution> executions = |
| | | runtimeService.createExecutionQuery().parentId(processInstance.getProcessInstanceId()).list(); |
| | | List<String> executionIds = new ArrayList<>(); |
| | | executions.forEach(execution -> executionIds.add(execution.getId())); |
| | | runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, |
| | | endId).changeState(); |
| | | } |
| | | } |
| | | |
| | | return Result.OK(); |
| | | } |
| | | |
| | | /** |
| | | * æ¤åæµç¨ todo ç®ååå¨é误 |
| | | * |
| | | * @param flowTaskVo |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result revokeProcess(FlowTaskVo flowTaskVo) { |
| | | Task task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).singleResult(); |
| | | if (task == null) { |
| | | throw new CustomException("æµç¨æªå¯å¨æå·²æ§è¡å®æï¼æ æ³æ¤å"); |
| | | } |
| | | |
| | | LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); |
| | | List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery() |
| | | .processInstanceId(task.getProcessInstanceId()) |
| | | .orderByTaskCreateTime() |
| | | .asc() |
| | | .list(); |
| | | String myTaskId = null; |
| | | HistoricTaskInstance myTask = null; |
| | | for (HistoricTaskInstance hti : htiList) { |
| | | if (loginUser.getUsername().equals(hti.getAssignee())) { |
| | | myTaskId = hti.getId(); |
| | | myTask = hti; |
| | | break; |
| | | } |
| | | } |
| | | if (null == myTaskId) { |
| | | throw new CustomException("该任å¡éå½åç¨æ·æäº¤ï¼æ æ³æ¤å"); |
| | | } |
| | | |
| | | String processDefinitionId = myTask.getProcessDefinitionId(); |
| | | BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); |
| | | |
| | | //åé |
| | | // Map<String, VariableInstance> variables = runtimeService.getVariableInstances(currentTask.getExecutionId()); |
| | | String myActivityId = null; |
| | | List<HistoricActivityInstance> haiList = historyService.createHistoricActivityInstanceQuery() |
| | | .executionId(myTask.getExecutionId()).finished().list(); |
| | | for (HistoricActivityInstance hai : haiList) { |
| | | if (myTaskId.equals(hai.getTaskId())) { |
| | | myActivityId = hai.getActivityId(); |
| | | break; |
| | | } |
| | | } |
| | | FlowNode myFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId); |
| | | |
| | | Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult(); |
| | | String activityId = execution.getActivityId(); |
| | | FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId); |
| | | |
| | | //è®°å½åæ´»å¨æ¹å |
| | | List<SequenceFlow> oriSequenceFlows = new ArrayList<>(flowNode.getOutgoingFlows()); |
| | | |
| | | |
| | | return Result.OK(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 夿å¤ä¸ªä»»å¡æ¯å¦å¤äºå䏿µç¨èç¹ |
| | | * |
| | | * @param taskIds éå·åéçä»»å¡IDå符串 |
| | | * @return ç»ä¸ç»æå°è£
|
| | | */ |
| | | @Override |
| | | public Result isSameNode(String taskIds) { |
| | | // 1. åæ°æ ¡éª |
| | | if (StringUtils.isBlank(taskIds)) { |
| | | return Result.error("ä»»å¡IDä¸è½ä¸ºç©º"); |
| | | } |
| | | |
| | | // 2. åå²ä»»å¡ID |
| | | String[] taskIdArray = taskIds.split(","); |
| | | if (taskIdArray.length == 0) { |
| | | return Result.error("æªæä¾ææçä»»å¡ID"); |
| | | } |
| | | |
| | | // 3. åä»»å¡ç´æ¥è¿åtrue |
| | | if (taskIdArray.length == 1) { |
| | | return Result.ok(true); |
| | | } |
| | | |
| | | // 4. å¤ä»»å¡æ£æ¥é»è¾ |
| | | String referenceNodeId = null; |
| | | String currentNodeId = null; |
| | | for (String taskId : taskIdArray) { |
| | | // 4.1 æ¥è¯¢ä»»å¡å®ä¾ |
| | | Task task = taskService.createTaskQuery() |
| | | .taskId(taskId.trim()) |
| | | .singleResult(); |
| | | |
| | | // 4.2 ä»»å¡ä¸åå¨å¤ç |
| | | if (task == null) { |
| | | return Result.error("ä»»å¡ä¸åå¨: " + taskId); |
| | | } |
| | | |
| | | // 4.3 è·åèç¹æ è¯ï¼TaskDefinitionKeyï¼ |
| | | currentNodeId = task.getTaskDefinitionKey(); |
| | | |
| | | // 4.4 馿¬¡éååå§ååèèç¹ |
| | | if (referenceNodeId == null) { |
| | | referenceNodeId = currentNodeId; |
| | | continue; |
| | | } |
| | | |
| | | // 4.5 èç¹ä¸ä¸è´ç´æ¥è¿å |
| | | if (!referenceNodeId.equals(currentNodeId)) { |
| | | return Result.ok("èç¹ä¸ä¸è´"); |
| | | } |
| | | } |
| | | |
| | | // 5. ææä»»å¡èç¹ä¸è´ |
| | | return Result.ok(currentNodeId); |
| | | } |
| | | |
| | | /** |
| | | * 代åä»»å¡å表 |
| | | * |
| | | * @param pageNum å½å页ç |
| | | * @param pageSize æ¯é¡µæ¡æ° |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result todoList(Integer pageNum, Integer pageSize) { |
| | | Page<FlowTaskDto> page = new Page<>(); |
| | | String username = iFlowThirdService.getLoginUser().getUsername(); |
| | | TaskQuery taskQuery = taskService.createTaskQuery() |
| | | .active() |
| | | .includeProcessVariables() |
| | | .taskAssignee(username) |
| | | .orderByTaskCreateTime().desc(); |
| | | page.setTotal(taskQuery.count()); |
| | | List<Task> taskList = taskQuery.listPage((pageNum - 1) * pageSize, pageSize); |
| | | List<FlowTaskDto> flowList = new ArrayList<>(); |
| | | for (Task task : taskList) { |
| | | FlowTaskDto flowTask = new FlowTaskDto(); |
| | | // å½åæµç¨ä¿¡æ¯ |
| | | flowTask.setTaskId(task.getId()); |
| | | flowTask.setTaskDefKey(task.getTaskDefinitionKey()); |
| | | flowTask.setCreateTime(task.getCreateTime()); |
| | | flowTask.setProcDefId(task.getProcessDefinitionId()); |
| | | flowTask.setTaskName(task.getName()); |
| | | // æµç¨å®ä¹ä¿¡æ¯ |
| | | ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() |
| | | .processDefinitionId(task.getProcessDefinitionId()) |
| | | .singleResult(); |
| | | flowTask.setDeployId(pd.getDeploymentId()); |
| | | flowTask.setProcDefName(pd.getName()); |
| | | flowTask.setProcDefVersion(pd.getVersion()); |
| | | flowTask.setProcInsId(task.getProcessInstanceId()); |
| | | |
| | | // æµç¨åèµ·äººä¿¡æ¯ |
| | | HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() |
| | | .processInstanceId(task.getProcessInstanceId()) |
| | | .singleResult(); |
| | | SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId()); |
| | | List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); |
| | | flowTask.setStartUserId(startUser.getUsername()); |
| | | flowTask.setStartUserName(startUser.getRealname()); |
| | | flowTask.setStartDeptName(CollUtil.join(departNamesByUsername, "ï¼")); |
| | | flowList.add(flowTask); |
| | | } |
| | | |
| | | page.setRecords(flowList); |
| | | return Result.OK(page); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å·²åä»»å¡å表 |
| | | * |
| | | * @param pageNum å½å页ç |
| | | * @param pageSize æ¯é¡µæ¡æ° |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result finishedList(Integer pageNum, Integer pageSize, FlowMyBusinessDto flowMyBusinessDto) { |
| | | //ä¿®æ¹æ¥è¯¢ï¼æ·»å æ¥è¯¢æ¡ä»¶ |
| | | Page page = new Page(pageNum, pageSize); |
| | | String username = iFlowThirdService.getLoginUser().getUsername(); |
| | | flowMyBusinessDto.setCurrentUser(username); |
| | | List<FlowTaskDto> list = flowMyBusinessService.ListMyBusiness(flowMyBusinessDto); |
| | | list.forEach(flowTaskDto -> { |
| | | // æµç¨åèµ·äººä¿¡æ¯ |
| | | HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() |
| | | .processInstanceId(flowTaskDto.getProcInsId()) |
| | | .singleResult(); |
| | | if (historicProcessInstance != null) { |
| | | SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId()); |
| | | if (startUser != null) { |
| | | flowTaskDto.setStartUserId(startUser.getUsername()); |
| | | flowTaskDto.setStartUserName(startUser.getRealname()); |
| | | } |
| | | List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); |
| | | flowTaskDto.setStartDeptName(CollUtil.join(departNamesByUsername, "ï¼")); |
| | | if (flowTaskDto.getTodoUsers() == null) { |
| | | flowTaskDto.setTodoUsers(""); |
| | | } else { |
| | | //å»é¤[] |
| | | flowTaskDto.setTodoUsers(flowTaskDto.getTodoUsers().replaceAll("\\[", "").replaceAll("\\]", "")); |
| | | flowTaskDto.setTodoUsers(flowTaskDto.getTodoUsers().replaceAll("\"", "")); |
| | | } |
| | | } |
| | | }); |
| | | IPage<FlowTaskDto> flowTaskDtoIPage = new Page<>(); |
| | | flowTaskDtoIPage.setRecords(list); |
| | | flowTaskDtoIPage.setTotal(page.getTotal()); |
| | | return Result.OK(flowTaskDtoIPage); |
| | | } |
| | | |
| | | private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { |
| | | Set<Object> seen = ConcurrentHashMap.newKeySet(); |
| | | return t -> seen.add(keyExtractor.apply(t)); |
| | | } |
| | | |
| | | /** |
| | | * æµç¨å岿µè½¬è®°å½ |
| | | * |
| | | * @param dataId æµç¨æ°æ®Id |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result flowRecord(String dataId) { |
| | | FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); |
| | | String procInsId = business.getProcessInstanceId(); |
| | | Map<String, Object> map = new HashMap<String, Object>(); |
| | | if (StringUtils.isNotBlank(procInsId)) { |
| | | List<HistoricActivityInstance> list = historyService |
| | | .createHistoricActivityInstanceQuery() |
| | | .processInstanceId(procInsId) |
| | | .orderByHistoricActivityInstanceStartTime() |
| | | .desc().list(); |
| | | List<FlowTaskDto> hisFlowList = new ArrayList<>(); |
| | | for (HistoricActivityInstance histIns : list) { |
| | | if (StringUtils.isNotBlank(histIns.getTaskId())) { |
| | | FlowTaskDto flowTask = new FlowTaskDto(); |
| | | flowTask.setTaskId(histIns.getTaskId()); |
| | | flowTask.setTaskName(histIns.getActivityName()); |
| | | flowTask.setTaskDefKey(histIns.getActivityId()); |
| | | flowTask.setCreateTime(histIns.getStartTime()); |
| | | flowTask.setFinishTime(histIns.getEndTime()); |
| | | if (StringUtils.isNotBlank(histIns.getAssignee())) { |
| | | SysUser sysUser = iFlowThirdService.getUserByUsername(histIns.getAssignee()); |
| | | flowTask.setAssigneeId(sysUser.getUsername()); |
| | | flowTask.setAssigneeName(sysUser.getRealname()); |
| | | List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(histIns.getAssignee()); |
| | | flowTask.setDeptName(CollUtil.join(departNamesByUsername, "ï¼")); |
| | | if (StrUtil.equals(histIns.getActivityId(), ProcessConstants.START_NODE)) { |
| | | // å¼å§èç¹ï¼æåé人设置为å起人ï¼è¿ä¸ªå¼å·²è¢«å
¶ä»å°æ¹è®¾ç½®è¿ï¼ä¸å®é
åç人ä¸è´å³å¯ |
| | | flowTask.setCandidate(sysUser.getRealname()); |
| | | } |
| | | } |
| | | // å±ç¤ºå®¡æ¹äººå |
| | | List<HistoricIdentityLink> linksForTask = historyService.getHistoricIdentityLinksForTask(histIns.getTaskId()); |
| | | StringBuilder stringBuilder = new StringBuilder(); |
| | | for (HistoricIdentityLink identityLink : linksForTask) { |
| | | if (IdentityLinkType.CANDIDATE.equals(identityLink.getType())) { |
| | | if (StringUtils.isNotBlank(identityLink.getUserId())) { |
| | | SysUser sysUser = iFlowThirdService.getUserByUsername(identityLink.getUserId()); |
| | | stringBuilder.append(sysUser.getRealname()).append(","); |
| | | } |
| | | /*å·²ç»å
¨é¨è®¾ç½®å° CANDIDATE äºï¼ä¸æ¿ç»äº*/ |
| | | /*if (StringUtils.isNotBlank(identityLink.getGroupId())) { |
| | | List<SysRole> allRole = iFlowThirdService.getAllRole(); |
| | | SysRole sysRole = allRole.stream().filter(o -> StringUtils.equals(identityLink.getGroupId(), o.getId())).findAny().orElse(new SysRole()); |
| | | stringBuilder.append(sysRole.getRoleName()).append(","); |
| | | }*/ |
| | | } |
| | | } |
| | | if (StringUtils.isNotBlank(stringBuilder)) { |
| | | flowTask.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1)); |
| | | } |
| | | |
| | | flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); |
| | | // è·åæè§è¯è®ºå
容 |
| | | List<Comment> commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); |
| | | commentList.forEach(comment -> { |
| | | if (histIns.getTaskId().equals(comment.getTaskId())) { |
| | | flowTask.setComment(FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); |
| | | } |
| | | }); |
| | | hisFlowList.add(flowTask); |
| | | } |
| | | } |
| | | map.put("flowList", hisFlowList); |
| | | } |
| | | // è·ååå§å表å |
| | | String serviceImplName = business.getServiceImplName(); |
| | | FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); |
| | | // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± |
| | | if (flowCallBackService != null) { |
| | | Object businessDataById = flowCallBackService.getBusinessDataById(dataId); |
| | | map.put("formData", businessDataById); |
| | | } |
| | | return Result.OK(map); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡IDæ¥è¯¢æè½½ç表åä¿¡æ¯ |
| | | * |
| | | * @param taskId ä»»å¡Id |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Task getTaskForm(String taskId) { |
| | | Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); |
| | | return task; |
| | | } |
| | | |
| | | /** |
| | | * è·åæµç¨è¿ç¨å¾ |
| | | * |
| | | * @param processId |
| | | * @return |
| | | */ |
| | | @Override |
| | | public InputStream diagram(String processId) { |
| | | String processDefinitionId; |
| | | // è·åå½åçæµç¨å®ä¾ |
| | | ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); |
| | | // 妿æµç¨å·²ç»ç»æï¼åå¾å°ç»æèç¹ |
| | | if (Objects.isNull(processInstance)) { |
| | | HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult(); |
| | | |
| | | processDefinitionId = pi.getProcessDefinitionId(); |
| | | } else {// 妿æµç¨æ²¡æç»æï¼ååå½åæ´»å¨èç¹ |
| | | // æ ¹æ®æµç¨å®ä¾IDè·å¾å½åå¤äºæ´»å¨ç¶æçActivityIdåé |
| | | ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); |
| | | processDefinitionId = pi.getProcessDefinitionId(); |
| | | } |
| | | |
| | | // è·å¾æ´»å¨çèç¹ |
| | | List<HistoricActivityInstance> highLightedFlowList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).orderByHistoricActivityInstanceStartTime().asc().list(); |
| | | |
| | | List<String> highLightedFlows = new ArrayList<>(); |
| | | List<String> highLightedNodes = new ArrayList<>(); |
| | | //é«äº®çº¿ |
| | | for (HistoricActivityInstance tempActivity : highLightedFlowList) { |
| | | if ("sequenceFlow".equals(tempActivity.getActivityType())) { |
| | | //é«äº®çº¿ |
| | | highLightedFlows.add(tempActivity.getActivityId()); |
| | | } else { |
| | | //é«äº®èç¹ |
| | | highLightedNodes.add(tempActivity.getActivityId()); |
| | | } |
| | | } |
| | | |
| | | //è·åæµç¨å¾ |
| | | BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); |
| | | ProcessEngineConfiguration configuration = processEngine.getProcessEngineConfiguration(); |
| | | //è·åèªå®ä¹å¾ççæå¨ |
| | | ProcessDiagramGenerator diagramGenerator = new CustomProcessDiagramGenerator(); |
| | | InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodes, highLightedFlows, configuration.getActivityFontName(), |
| | | configuration.getLabelFontName(), configuration.getAnnotationFontName(), configuration.getClassLoader(), 1.0, true); |
| | | return in; |
| | | |
| | | } |
| | | |
| | | /** |
| | | * è·åæµç¨æ§è¡è¿ç¨ |
| | | * |
| | | * @param procInsId |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<FlowViewerDto> getFlowViewer(String procInsId) { |
| | | List<FlowViewerDto> flowViewerList = new ArrayList<>(); |
| | | FlowViewerDto flowViewerDto; |
| | | // è·å¾æ´»å¨çèç¹ |
| | | List<HistoricActivityInstance> hisActIns = historyService.createHistoricActivityInstanceQuery() |
| | | .processInstanceId(procInsId) |
| | | .orderByHistoricActivityInstanceStartTime() |
| | | .asc().list(); |
| | | for (HistoricActivityInstance activityInstance : hisActIns) { |
| | | if (!"sequenceFlow".equals(activityInstance.getActivityType())) { |
| | | flowViewerDto = new FlowViewerDto(); |
| | | flowViewerDto.setKey(activityInstance.getActivityId()); |
| | | flowViewerDto.setCompleted(!Objects.isNull(activityInstance.getEndTime())); |
| | | |
| | | for (FlowViewerDto viewerDto : flowViewerList) { |
| | | String key = viewerDto.getKey(); |
| | | if (key.equals(flowViewerDto.getKey())) { |
| | | // éå¤å é¤å颿´æ° |
| | | flowViewerList.remove(viewerDto); |
| | | break; |
| | | } |
| | | } |
| | | flowViewerList.add(flowViewerDto); |
| | | } |
| | | } |
| | | |
| | | return flowViewerList; |
| | | } |
| | | |
| | | @Override |
| | | public List<FlowViewerDto> getFlowViewerByDataId(String dataId) { |
| | | LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId, dataId) |
| | | ; |
| | | //妿ä¿åæ°æ®åæªè°ç¨å¿
è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ |
| | | FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); |
| | | // 1.æ§è¡è¿çæ¥éª¤ |
| | | List<FlowViewerDto> flowViewers = this.getFlowViewer(business.getProcessInstanceId()); |
| | | // 2.è·åææèç¹ä¿¡æ¯ï¼æ ¹æ®ææèç¹ æé¡ºåº åæ§è¡è¿çæ¯è¾ï¼é©³åçèç¹å°±è¢«è·³è¿ |
| | | Process process = repositoryService.getBpmnModel(business.getProcessDefinitionId()).getProcesses().get(0); |
| | | List<FlowElement> flowElements = Lists.newArrayList(process.getFlowElements()); |
| | | // è·åå½åä»»å¡èç¹å
ç´ |
| | | List<FlowViewerDto> reflowViewers = Lists.newArrayList(); |
| | | // *顺åºçKey |
| | | List<String> orderKeys = Lists.newArrayList(); |
| | | if (flowElements != null) { |
| | | for (FlowElement flowElement : flowElements) { |
| | | try { |
| | | // å¼å§èç¹ |
| | | StartEvent stev = (StartEvent) flowElement; |
| | | //第ä¸ä¸ªkeyèç¹ï¼ |
| | | String firstKey = stev.getId(); |
| | | orderKeys.add(firstKey); |
| | | //顺åºè·åèç¹ |
| | | this.appendKeys(orderKeys, firstKey, flowElements); |
| | | } catch (Exception e) { |
| | | break; |
| | | } |
| | | |
| | | } |
| | | |
| | | for (String key : orderKeys) { |
| | | Optional<FlowViewerDto> any = flowViewers.stream().filter(o -> StrUtil.equals(o.getKey(), key)).findAny(); |
| | | if (any.isPresent()) { |
| | | FlowViewerDto viewerDto = any.get(); |
| | | reflowViewers.add(viewerDto); |
| | | if (!viewerDto.isCompleted()) { |
| | | // 已尿£å¨çå¾
æ§è¡çèç¹ï¼åé¢çä¸è¦äº |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | for (FlowViewerDto flowViewer : flowViewers) { |
| | | boolean present = reflowViewers.stream().filter(o -> StrUtil.equals(o.getKey(), flowViewer.getKey())).findAny().isPresent(); |
| | | flowViewer.setBack(!present); |
| | | } |
| | | //return reflowViewers; |
| | | return flowViewers; |
| | | } |
| | | |
| | | /** |
| | | * é¡ºåºæ½åèç¹ |
| | | * |
| | | * @param orderKeys å®¹å¨ |
| | | * @param sourceKey æº |
| | | * @param flowElements ææçèç¹å¯¹è±¡ |
| | | */ |
| | | private void appendKeys(List<String> orderKeys, String sourceKey, List<FlowElement> flowElements) { |
| | | for (FlowElement flowElement : flowElements) { |
| | | try { |
| | | SequenceFlow sf = (SequenceFlow) flowElement; |
| | | String sourceRef = sf.getSourceRef(); |
| | | String targetRef = sf.getTargetRef(); |
| | | if (sourceKey.equals(sourceRef) && targetRef != null) { |
| | | orderKeys.add(targetRef); |
| | | this.appendKeys(orderKeys, targetRef, flowElements); |
| | | } |
| | | } catch (Exception e) { |
| | | continue; |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åæµç¨åé |
| | | * |
| | | * @param taskId |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result processVariables(String taskId) { |
| | | // æµç¨åé |
| | | HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().finished().taskId(taskId).singleResult(); |
| | | if (Objects.nonNull(historicTaskInstance)) { |
| | | return Result.OK(historicTaskInstance.getProcessVariables()); |
| | | } else { |
| | | Map<String, Object> variables = taskService.getVariables(taskId); |
| | | return Result.OK(variables); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åä¸ä¸èç¹ |
| | | * |
| | | * @param flowTaskVo ä»»å¡ |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result<List<FlowNextDto>> getNextFlowNode(FlowTaskVo flowTaskVo) { |
| | | // todo ä¼¼ä¹é»è¾æªåå®ï¼å¾
æ£æ¥ |
| | | List<FlowNextDto> nextDtoList = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues()); |
| | | if (CollectionUtils.isEmpty(nextDtoList)) { |
| | | return Result.OK("æµç¨å·²å®ç»", null); |
| | | } |
| | | return Result.OK(nextDtoList); |
| | | } |
| | | |
| | | @Override |
| | | public boolean checkParallelCompletion(String currentTaskId) { |
| | | //è·åå½åä»»å¡ |
| | | Task currentTask = taskService.createTaskQuery().taskId(currentTaskId).singleResult(); |
| | | if (currentTask == null) { |
| | | return false; |
| | | } |
| | | //è·åå½åæ§è¡ |
| | | Execution execution = runtimeService.createExecutionQuery().executionId(currentTask.getExecutionId()).singleResult(); |
| | | if (execution == null) { |
| | | return false; |
| | | } |
| | | String parentId = execution.getParentId(); |
| | | if (StringUtils.isBlank(parentId)) { |
| | | //没æç¶èç¹ ä»£è¡¨æ²¡æå¹¶è¡ä»»å¡ |
| | | return true; |
| | | } |
| | | // è·åææå
弿§è¡ |
| | | List<Execution> siblingExecutions = runtimeService.createExecutionQuery() |
| | | .parentId(parentId) |
| | | .list(); |
| | | |
| | | for (Execution siblingExecution : siblingExecutions) { |
| | | if (!siblingExecution.getId().equals(execution.getId())) { |
| | | //éèªèº«çå
å¼èç¹ |
| | | long count = runtimeService.createActivityInstanceQuery().executionId(siblingExecution.getId()).unfinished().count(); |
| | | if (count > 0) { |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * è·åä¸ä¸ä¸ªèç¹ä¿¡æ¯,æµç¨å®ä¹ä¸çèç¹ä¿¡æ¯ |
| | | * |
| | | * @param taskId å½åèç¹id |
| | | * @param values æµç¨åé |
| | | * @return 妿è¿ånullï¼è¡¨ç¤ºæ²¡æä¸ä¸ä¸ªèç¹ï¼æµç¨ç»æ |
| | | */ |
| | | public List<FlowNextDto> getNextFlowNode(String taskId, Map<String, Object> values) { |
| | | //å½åèç¹ |
| | | Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); |
| | | if (Objects.nonNull(task)) { |
| | | // ä¸ä¸ªä»»å¡èç¹ |
| | | List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values); |
| | | if (CollectionUtils.isNotEmpty(nextUserTask)) { |
| | | List<FlowNextDto> nextDtoList = Lists.newArrayList(); |
| | | FlowNextDto flowNextDto; |
| | | for (UserTask userTask : nextUserTask) { |
| | | flowNextDto = new FlowNextDto(); |
| | | flowNextDto.setUserTask(userTask); |
| | | //å¾
å人å |
| | | List<SysUser> sysUserFromTask = this.getSysUserFromTask(userTask); |
| | | flowNextDto.setUserList(sysUserFromTask); |
| | | //å¤ä»»å¡å¹¶è¡ |
| | | Object colObj = values.get(userTask.getId()); |
| | | if (Objects.nonNull(colObj)) { |
| | | List<String> userNameList = (List) colObj; |
| | | // å¾
å人åä»åéä¸è·å å¦åå°±æ¯èç¹ä¸é
ç½®çç¨æ· sysUserFromTask |
| | | List<SysUser> userList = Lists.newArrayList(); |
| | | for (String username : userNameList) { |
| | | SysUser userByUsername = iFlowThirdService.getUserByUsername(username); |
| | | if (userByUsername == null) { |
| | | throw new CustomException(username + " ç¨æ·åæªæ¾å°"); |
| | | } else { |
| | | userList.add(userByUsername); |
| | | } |
| | | } |
| | | flowNextDto.setUserList(userList); |
| | | } else { |
| | | // åé䏿²¡æä¼ å
¥ï¼åå
¥èç¹ä¸é
ç½®çç¨æ· |
| | | List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); |
| | | values.put(userTask.getId(), collect_username); |
| | | } |
| | | nextDtoList.add(flowNextDto); |
| | | } |
| | | return nextDtoList; |
| | | } |
| | | } |
| | | return null; |
| | | |
| | | } |
| | | |
| | | public List<SysUser> getSysUserFromTask(UserTask userTask) { |
| | | String assignee = userTask.getAssignee(); |
| | | if (StrUtil.isNotBlank(assignee)) { |
| | | // æå®å人 |
| | | SysUser userByUsername = iFlowThirdService.getUserByUsername(assignee); |
| | | return Lists.newArrayList(userByUsername); |
| | | } |
| | | List<String> candidateUsers = userTask.getCandidateUsers(); |
| | | if (CollUtil.isNotEmpty(candidateUsers)) { |
| | | // æå®å¤äºº |
| | | List<SysUser> list = iFlowThirdService.getAllUser(); |
| | | return list.stream().filter(o -> candidateUsers.contains(o.getUsername())).collect(Collectors.toList()); |
| | | } |
| | | List<String> candidateGroups = userTask.getCandidateGroups(); |
| | | if (CollUtil.isNotEmpty(candidateGroups)) { |
| | | // æå®å¤ç» |
| | | List<SysUser> userList = Lists.newArrayList(); |
| | | for (String candidateGroup : candidateGroups) { |
| | | List<SysUser> usersByRoleId = iFlowThirdService.getUsersByRoleId(candidateGroup); |
| | | userList.addAll(usersByRoleId); |
| | | } |
| | | return userList; |
| | | } |
| | | return Lists.newArrayList(); |
| | | } |
| | | |
| | | /** |
| | | * æµç¨å®ææ¶é´å¤ç |
| | | * |
| | | * @param ms |
| | | * @return |
| | | */ |
| | | private String getDate(long ms) { |
| | | |
| | | long day = ms / (24 * 60 * 60 * 1000); |
| | | long hour = (ms / (60 * 60 * 1000) - day * 24); |
| | | long minute = ((ms / (60 * 1000)) - day * 24 * 60 - hour * 60); |
| | | long second = (ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); |
| | | |
| | | if (day > 0) { |
| | | return day + "天" + hour + "å°æ¶" + minute + "åé"; |
| | | } |
| | | if (hour > 0) { |
| | | return hour + "å°æ¶" + minute + "åé"; |
| | | } |
| | | if (minute > 0) { |
| | | return minute + "åé"; |
| | | } |
| | | if (second > 0) { |
| | | return second + "ç§"; |
| | | } else { |
| | | return 0 + "ç§"; |
| | | } |
| | | } |
| | | } |