From 1930b4e59d60c015ffa7bfee92e4bc227b90dcb3 Mon Sep 17 00:00:00 2001 From: lyh <925863403@qq.com> Date: 星期三, 28 五月 2025 15:41:41 +0800 Subject: [PATCH] 1.Dnc产品结构树检索nc文件 2.新增批次功能 3.新增审签查询流程 4.修改刀具系统查询 --- lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java | 701 ++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 443 insertions(+), 258 deletions(-) diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java index 3fe1de0..fb5e489 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java @@ -1,20 +1,21 @@ 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.Process; 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; @@ -33,19 +34,18 @@ import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.api.history.HistoricTaskInstanceQuery; 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.entity.ActStatus; -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.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; @@ -69,6 +69,7 @@ import java.util.stream.Collectors; /** + * **/ @Service @Slf4j @@ -79,6 +80,7 @@ private IFlowThirdService iFlowThirdService; @Autowired FlowMyBusinessServiceImpl flowMyBusinessService; + /** * 瀹屾垚浠诲姟 * @@ -88,41 +90,46 @@ @Override public Result complete(FlowTaskVo taskVo) { Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult(); - if (Objects.isNull(task)){ + if (Objects.isNull(task)) { return Result.error("浠诲姟涓嶅瓨鍦�"); } - if(StringUtils.isNotEmpty(taskVo.getComment())){ + 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() ); + 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()); - //taskService.complete(taskVo.getTaskId(), taskVo.getValues()); } /*======================瀹℃壒缁撴潫 鍥炶皟浠ュ強鍏抽敭鏁版嵁淇濆瓨======================*/ //涓氬姟鏁版嵁id String dataId = taskVo.getDataId(); //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 - FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); + 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> flowBeforeParamsValues = flowCallBackService.flowValuesOfTask(business.getTaskNameId(), taskVo.getValues()); //璁剧疆鏁版嵁 Map<String, Object> values = taskVo.getValues(); - if (MapUtil.isNotEmpty(flowBeforeParamsValues)){ - // 涓氬姟灞傛湁璁剧疆鍙橀噺锛屼娇鐢ㄤ笟鍔″眰鐨勫彉閲� + if (MapUtil.isNotEmpty(flowBeforeParamsValues)) { + // 涓氬姟灞傛湁璁剧疆鍙橀噺锛屼娇鐢ㄤ笟鍔″眰鐨勫彉閲� values = flowBeforeParamsValues; } - FlowNextDto nextFlowNode = this.getNextFlowNode(task.getId(), values); + + //骞惰缃戝叧 澶氫换鍔� + List<FlowNextDto> nextFlowNodeList = this.getNextFlowNode(task.getId(), values); //涓嬩竴涓疄渚嬭妭鐐� if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.resolveTask(taskVo.getTaskId(), values); @@ -130,137 +137,218 @@ taskService.complete(taskVo.getTaskId(), values); } List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); - Task task2 = null; - if (CollUtil.isNotEmpty(task2List)){ - task2 = task2List.get(0); - } - - // 涓嬩釜鑺傜偣鍊欓�変汉 - List<String> beforeParamsCandidateUsernames = Lists.newArrayList(); - if(task2!=null){ - beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(),taskVo.getValues()); - } - List<String> candidateUsers = taskVo.getCandidateUsers(); - if (CollUtil.isNotEmpty(candidateUsers)){ - // 鍓嶇浼犲叆鍊欓�変汉 瑕嗙洊 - beforeParamsCandidateUsernames = candidateUsers; - } String doneUsers = business.getDoneUsers(); // 澶勭悊杩囨祦绋嬬殑浜� JSONArray doneUserList = new JSONArray(); - if (StrUtil.isNotBlank(doneUsers)){ + if (StrUtil.isNotBlank(doneUsers)) { doneUserList = JSON.parseArray(doneUsers); } - if (!doneUserList.contains(loginUser.getUsername())){ + if (!doneUserList.contains(loginUser.getUsername())) { doneUserList.add(loginUser.getUsername()); } - if (task2!=null && task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())){ - // * 褰撳墠鑺傜偣鏄細绛捐妭鐐癸紝娌℃湁璧板畬 - business.setActStatus(ActStatus.doing) - .setTaskId(task2.getId()) + if (CollectionUtils.isEmpty(nextFlowNodeList)) { + // **娌℃湁涓嬩竴涓妭鐐癸紝娴佺▼宸茬粡缁撴潫浜� + business .setDoneUsers(doneUserList.toJSONString()) + .setTodoUsers("") + .setTaskId("") + .setTaskNameId("") + .setTaskName("") ; - String todoUsersStr = business.getTodoUsers(); - JSONArray todosArr = JSON.parseArray(todoUsersStr); - // 鍒犻櫎鍚庨噸鍐� - for (Task task2One : task2List) { - for (Object oldUser : todosArr) { - taskService.deleteCandidateUser(task2One.getId(),oldUser.toString()); + 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 (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ - beforeParamsCandidateUsernames.remove(loginUser.getUsername()); - // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� - for (Task task2One : task2List) { - for (String newUser : beforeParamsCandidateUsernames) { - taskService.addCandidateUser(task2One.getId(),newUser); - } - } - business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); - } else { - todosArr.remove(loginUser.getUsername()); - for (Task task2One : task2List) { + 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.addCandidateUser(task2One.getId(),oldUser.toString()); + 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)); } } - business.setTodoUsers(todosArr.toJSONString()); } - - - } else { - // * 涓嬩竴鑺傜偣鏄細绛捐妭鐐� 鎴� 鏅�氱敤鎴疯妭鐐癸紝閫昏緫涓�鑷� - if (nextFlowNode!=null){ + flowMyBusinessService.updateById(business); + } + else { + for(FlowNextDto nextFlowNode : nextFlowNodeList) { //**鏈変笅涓�涓妭鐐� UserTask nextTask = nextFlowNode.getUserTask(); - //鑳藉澶勭悊涓嬩釜鑺傜偣鐨勫�欓�変汉 - List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); - List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(candidateUsers)){ - // 鍓嶇浼犲叆鍊欓�変汉 - collect_username = candidateUsers; + Task task2 = null; + Optional<Task> first = task2List.stream().filter(t -> t.getTaskDefinitionKey().equals(nextTask.getId())).findFirst(); + if (first.isPresent()) { + task2 = first.get(); } - business.setActStatus(ActStatus.doing) - .setTaskId(task2.getId()) - .setTaskNameId(nextTask.getId()) - .setTaskName(nextTask.getName()) - .setPriority(nextTask.getPriority()) - .setDoneUsers(doneUserList.toJSONString()) - .setTodoUsers(JSON.toJSONString(collect_username)) - ; - // 鍒犻櫎鍚庨噸鍐� - for (Task task2One : task2List) { - for (String oldUser : collect_username) { - taskService.deleteCandidateUser(task2One.getId(),oldUser); + 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 (CollUtil.isEmpty(candidateUsers)&&CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ - // 鍓嶇娌℃湁浼犲叆鍊欓�変汉 && 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� - for (Task task2One : task2List) { - for (String newUser : beforeParamsCandidateUsernames) { - taskService.addCandidateUser(task2One.getId(),newUser); + 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()); } - } - business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); - } else { - for (Task task2One : task2List) { - for (String oldUser : collect_username) { - taskService.addCandidateUser(task2One.getId(),oldUser); + // 閲嶅啓 + 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 { - // **娌℃湁涓嬩竴涓妭鐐癸紝娴佺▼宸茬粡缁撴潫浜� - business.setActStatus(ActStatus.pass) - .setDoneUsers(doneUserList.toJSONString()) - .setTodoUsers("") - .setTaskId("") - .setTaskNameId("") - .setTaskName("") - ; + } 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()); } - flowMyBusinessService.updateById(business); // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 business.setValues(values); - if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business); + if (flowCallBackService != null) { + flowCallBackService.afterFlowHandle(business); + } return Result.OK(); } + @Override @Transactional(rollbackFor = Exception.class) - public Result completeByDateId(FlowTaskVo flowTaskVo){ + public Result completeByDateId(FlowTaskVo flowTaskVo) { return this.complete(flowTaskVo); } + @Override - public void taskRejectByDataId(FlowTaskVo flowTaskVo){ + public void taskRejectByDataId(FlowTaskVo flowTaskVo) { FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); flowTaskVo.setTaskId(business.getTaskId()); this.taskReject(flowTaskVo); } + /** * 椹冲洖浠诲姟 * @@ -382,7 +470,7 @@ /*======================椹冲洖 鍥炶皟浠ュ強鍏抽敭鏁版嵁淇濆瓨======================*/ //涓氬姟鏁版嵁id String dataId = flowTaskVo.getDataId(); - if (dataId==null) return; + if (dataId == null) return; //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); // 椹冲洖鍒颁簡涓婁竴涓妭鐐圭瓑寰呭鐞� @@ -392,25 +480,26 @@ String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); Map<String, Object> values = flowTaskVo.getValues(); - if (values ==null){ + if (values == null) { values = MapUtil.newHashMap(); - values.put("dataId",dataId); + values.put("dataId", dataId); } else { - values.put("dataId",dataId); + values.put("dataId", dataId); } List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), values); //璁剧疆鏁版嵁 String doneUsers = business.getDoneUsers(); // 澶勭悊杩囨祦绋嬬殑浜� JSONArray doneUserList = new JSONArray(); - if (StrUtil.isNotBlank(doneUsers)){ + if (StrUtil.isNotBlank(doneUsers)) { doneUserList = JSON.parseArray(doneUsers); } - if (!doneUserList.contains(loginUser.getUsername())){ + if (!doneUserList.contains(loginUser.getUsername())) { doneUserList.add(loginUser.getUsername()); } - business.setActStatus(ActStatus.reject) + business .setTaskId(task2.getId()) +// .setActStatus(ActStatus.reject) .setTaskNameId(task2.getTaskDefinitionKey()) .setTaskName(task2.getName()) .setDoneUsers(doneUserList.toJSONString()) @@ -426,31 +515,31 @@ } } - if (targetElement!=null){ + if (targetElement != null) { UserTask targetTask = (UserTask) targetElement; business.setPriority(targetTask.getPriority()); - if (StrUtil.equals(business.getTaskNameId(),ProcessConstants.START_NODE)){ + if (StrUtil.equals(business.getTaskNameId(), ProcessConstants.START_NODE)) { // 寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉 business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer()))); - taskService.setAssignee(business.getTaskId(),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)){ + 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); + taskService.deleteCandidateUser(task2One.getId(), oldUser); } } - if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ - if (CollUtil.isNotEmpty(candidateUsers)){ + if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { + if (CollUtil.isNotEmpty(candidateUsers)) { beforeParamsCandidateUsernames = candidateUsers; } // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� @@ -471,9 +560,9 @@ } flowMyBusinessService.updateById(business); - // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 + // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 business.setValues(values); - if (flowCallBackService!=null) flowCallBackService.afterFlowHandle(business); + if (flowCallBackService != null) flowCallBackService.afterFlowHandle(business); } catch (FlowableObjectNotFoundException e) { throw new CustomException("鏈壘鍒版祦绋嬪疄渚嬶紝娴佺▼鍙兘宸插彂鐢熷彉鍖�"); } catch (FlowableException e) { @@ -481,13 +570,15 @@ } } + @Override - public void taskReturnByDataId(FlowTaskVo flowTaskVo){ + public void taskReturnByDataId(FlowTaskVo flowTaskVo) { //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); flowTaskVo.setTaskId(business.getTaskId()); taskReturn(flowTaskVo); } + /** * 閫�鍥炰换鍔� * @@ -568,7 +659,7 @@ /*======================閫�鍥� 鍥炶皟浠ュ強鍏抽敭鏁版嵁淇濆瓨======================*/ //涓氬姟鏁版嵁id String dataId = flowTaskVo.getDataId(); - if (dataId==null) return; + if (dataId == null) return; //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); //spring瀹瑰櫒绫诲悕 @@ -578,60 +669,61 @@ String doneUsers = business.getDoneUsers(); // 澶勭悊杩囨祦绋嬬殑浜� JSONArray doneUserList = new JSONArray(); - if (StrUtil.isNotBlank(doneUsers)){ + if (StrUtil.isNotBlank(doneUsers)) { doneUserList = JSON.parseArray(doneUsers); } - if (!doneUserList.contains(loginUser.getUsername())){ + 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.setActStatus(ActStatus.reject) - .setTaskId(targetTask.getId()) - .setTaskNameId(targetTask.getTaskDefinitionKey()) - .setTaskName(targetTask.getName()) - .setPriority(targetTask.getPriority()+"") - .setDoneUsers(doneUserList.toJSONString()) - ; - if (target!=null){ + 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)){ - // 寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉 + if (StrUtil.equals(business.getTaskNameId(), ProcessConstants.START_NODE)) { + // 寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉 business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer()))); - taskService.setAssignee(business.getTaskId(),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)){ + 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); + taskService.deleteCandidateUser(task2One.getId(), oldUser); } } Map<String, Object> values = flowTaskVo.getValues(); - if (values==null){ + if (values == null) { values = MapUtil.newHashMap(); - values.put("dataId",dataId); + values.put("dataId", dataId); } else { - values.put("dataId",dataId); + values.put("dataId", dataId); } List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(targetTask.getTaskDefinitionKey(), values); - if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ - if (CollUtil.isNotEmpty(candidateUsers)){ + if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) { + if (CollUtil.isNotEmpty(candidateUsers)) { beforeParamsCandidateUsernames = candidateUsers; } // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩� for (Task task2One : task2List) { for (String newUser : beforeParamsCandidateUsernames) { - taskService.addCandidateUser(task2One.getId(),newUser); + taskService.addCandidateUser(task2One.getId(), newUser); } } business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); @@ -647,7 +739,7 @@ flowMyBusinessService.updateById(business); // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 business.setValues(flowTaskVo.getValues()); - if (flowCallBackService!=null) flowCallBackService.afterFlowHandle(business); + if (flowCallBackService != null) flowCallBackService.afterFlowHandle(business); } catch (FlowableObjectNotFoundException e) { throw new CustomException("鏈壘鍒版祦绋嬪疄渚嬶紝娴佺▼鍙兘宸插彂鐢熷彉鍖�"); } catch (FlowableException e) { @@ -661,6 +753,30 @@ 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("娴佺▼宸茬粨鏉�"); + } + /** * 鑾峰彇鎵�鏈夊彲鍥為��鐨勮妭鐐� * @@ -710,7 +826,7 @@ @Override public void deleteTask(FlowTaskVo flowTaskVo) { // todo 寰呯‘璁ゅ垹闄や换鍔℃槸鐗╃悊鍒犻櫎浠诲姟 杩樻槸閫昏緫鍒犻櫎锛岃杩欎釜浠诲姟鐩存帴閫氳繃锛� - taskService.deleteTask(flowTaskVo.getTaskId(),flowTaskVo.getComment()); + taskService.deleteTask(flowTaskVo.getTaskId(), flowTaskVo.getComment()); } /** @@ -755,7 +871,7 @@ @Override @Transactional(rollbackFor = Exception.class) public void assignTask(FlowTaskVo flowTaskVo) { - taskService.setAssignee(flowTaskVo.getTaskId(),flowTaskVo.getAssignee()); + taskService.setAssignee(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); } /** @@ -773,7 +889,7 @@ .startedBy(username) .orderByProcessInstanceStartTime() .desc(); - List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage((pageNum - 1)*pageSize, pageSize); + List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage((pageNum - 1) * pageSize, pageSize); page.setTotal(historicProcessInstanceQuery.count()); List<FlowTaskDto> flowList = new ArrayList<>(); for (HistoricProcessInstance hisIns : historicProcessInstances) { @@ -872,7 +988,7 @@ String myTaskId = null; HistoricTaskInstance myTask = null; for (HistoricTaskInstance hti : htiList) { - if (loginUser.getUsername().toString().equals(hti.getAssignee())) { + if (loginUser.getUsername().equals(hti.getAssignee())) { myTaskId = hti.getId(); myTask = hti; break; @@ -909,6 +1025,64 @@ return Result.OK(); } + + /** + * 鍒ゆ柇澶氫釜浠诲姟鏄惁澶勪簬鍚屼竴娴佺▼鑺傜偣 + * + * @param taskIds 閫楀彿鍒嗛殧鐨勪换鍔D瀛楃涓� + * @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. 鍗曚换鍔$洿鎺ヨ繑鍥瀟rue + 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 鑾峰彇鑺傜偣鏍囪瘑锛圱askDefinitionKey锛� + 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); + } + /** * 浠e姙浠诲姟鍒楄〃 * @@ -926,7 +1100,7 @@ .taskAssignee(username) .orderByTaskCreateTime().desc(); page.setTotal(taskQuery.count()); - List<Task> taskList = taskQuery.listPage((pageNum - 1)*pageSize, pageSize); + List<Task> taskList = taskQuery.listPage((pageNum - 1) * pageSize, pageSize); List<FlowTaskDto> flowList = new ArrayList<>(); for (Task task : taskList) { FlowTaskDto flowTask = new FlowTaskDto(); @@ -953,7 +1127,7 @@ List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); flowTask.setStartUserId(startUser.getUsername()); flowTask.setStartUserName(startUser.getRealname()); - flowTask.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�")); + flowTask.setStartDeptName(CollUtil.join(departNamesByUsername, "锛�")); flowList.add(flowTask); } @@ -970,56 +1144,38 @@ * @return */ @Override - public Result finishedList(Integer pageNum, Integer pageSize) { - Page<FlowTaskDto> page = new Page<>(); + public Result finishedList(Integer pageNum, Integer pageSize, FlowMyBusinessDto flowMyBusinessDto) { + //淇敼鏌ヨ锛屾坊鍔犳煡璇㈡潯浠� + Page page = new Page(pageNum, pageSize); String username = iFlowThirdService.getLoginUser().getUsername(); - HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery() - .includeProcessVariables() - .finished() - .taskAssignee(username) - .orderByHistoricTaskInstanceEndTime() - .desc(); - List<HistoricTaskInstance> historicTaskInstanceList = taskInstanceQuery.listPage((pageNum - 1)*pageSize, pageSize); - List<FlowTaskDto> hisTaskList = Lists.newArrayList(); - for (HistoricTaskInstance histTask : historicTaskInstanceList) { - FlowTaskDto flowTask = new FlowTaskDto(); - // 褰撳墠娴佺▼淇℃伅 - flowTask.setTaskId(histTask.getId()); - // 瀹℃壒浜哄憳淇℃伅 - flowTask.setCreateTime(histTask.getCreateTime()); - flowTask.setFinishTime(histTask.getEndTime()); - flowTask.setDuration(getDate(histTask.getDurationInMillis())); - flowTask.setProcDefId(histTask.getProcessDefinitionId()); - flowTask.setTaskDefKey(histTask.getTaskDefinitionKey()); - flowTask.setTaskName(histTask.getName()); - flowTask.setDescription(flowMyBusinessService.getByProcessInstanceId(histTask.getProcessInstanceId()).getTitle()); - // 娴佺▼瀹氫箟淇℃伅 - ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() - .processDefinitionId(histTask.getProcessDefinitionId()) - .singleResult(); - flowTask.setDeployId(pd.getDeploymentId()); - flowTask.setProcDefName(pd.getName()); - flowTask.setProcDefVersion(pd.getVersion()); - flowTask.setProcInsId(histTask.getProcessInstanceId()); - flowTask.setHisProcInsId(histTask.getProcessInstanceId()); - + flowMyBusinessDto.setCurrentUser(username); + List<FlowTaskDto> list = flowMyBusinessService.ListMyBusiness(flowMyBusinessDto); + list.forEach(flowTaskDto -> { // 娴佺▼鍙戣捣浜轰俊鎭� HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(histTask.getProcessInstanceId()) + .processInstanceId(flowTaskDto.getProcInsId()) .singleResult(); - SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId()); - flowTask.setStartUserId(startUser.getUsername()); - flowTask.setStartUserName(startUser.getRealname()); - List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); - flowTask.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�")); - hisTaskList.add(flowTask); - } - page.setTotal(hisTaskList.size()); - page.setRecords(hisTaskList); -// Map<String, Object> result = new HashMap<>(); -// result.put("result",page); -// result.put("finished",true); - return Result.OK(page); + 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) { @@ -1058,9 +1214,9 @@ 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.setDeptName(CollUtil.join(departNamesByUsername, "锛�")); + if (StrUtil.equals(histIns.getActivityId(), ProcessConstants.START_NODE)) { + // 寮�濮嬭妭鐐癸紝鎶婂�欓�変汉璁剧疆涓哄彂璧蜂汉锛岃繖涓�煎凡琚叾浠栧湴鏂硅缃繃锛屼笌瀹為檯鍔炵悊浜轰竴鑷村嵆鍙� flowTask.setCandidate(sysUser.getRealname()); } } @@ -1102,9 +1258,9 @@ String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰 - if (flowCallBackService!=null){ + if (flowCallBackService != null) { Object businessDataById = flowCallBackService.getBusinessDataById(dataId); - map.put("formData",businessDataById); + map.put("formData", businessDataById); } return Result.OK(map); } @@ -1193,8 +1349,8 @@ for (FlowViewerDto viewerDto : flowViewerList) { String key = viewerDto.getKey(); - if (key.equals(flowViewerDto.getKey())){ - // 閲嶅鍒犻櫎鍚庨潰鏇存柊 + if (key.equals(flowViewerDto.getKey())) { + // 閲嶅鍒犻櫎鍚庨潰鏇存柊 flowViewerList.remove(viewerDto); break; } @@ -1209,7 +1365,7 @@ @Override public List<FlowViewerDto> getFlowViewerByDataId(String dataId) { LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); - flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId,dataId) + flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId, dataId) ; //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂 FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); @@ -1231,7 +1387,7 @@ String firstKey = stev.getId(); orderKeys.add(firstKey); //椤哄簭鑾峰彇鑺傜偣 - this.appendKeys(orderKeys, firstKey,flowElements); + this.appendKeys(orderKeys, firstKey, flowElements); } catch (Exception e) { break; } @@ -1240,11 +1396,11 @@ for (String key : orderKeys) { Optional<FlowViewerDto> any = flowViewers.stream().filter(o -> StrUtil.equals(o.getKey(), key)).findAny(); - if(any.isPresent()){ + if (any.isPresent()) { FlowViewerDto viewerDto = any.get(); reflowViewers.add(viewerDto); - if (!viewerDto.isCompleted()){ - // 宸插埌姝e湪绛夊緟鎵ц鐨勮妭鐐癸紝鍚庨潰鐨勪笉瑕佷簡 + if (!viewerDto.isCompleted()) { + // 宸插埌姝e湪绛夊緟鎵ц鐨勮妭鐐癸紝鍚庨潰鐨勪笉瑕佷簡 break; } } @@ -1260,8 +1416,9 @@ /** * 椤哄簭鎶藉彇鑺傜偣 - * @param orderKeys 瀹瑰櫒 - * @param sourceKey 婧� + * + * @param orderKeys 瀹瑰櫒 + * @param sourceKey 婧� * @param flowElements 鎵�鏈夌殑鑺傜偣瀵硅薄 */ private void appendKeys(List<String> orderKeys, String sourceKey, List<FlowElement> flowElements) { @@ -1270,9 +1427,9 @@ SequenceFlow sf = (SequenceFlow) flowElement; String sourceRef = sf.getSourceRef(); String targetRef = sf.getTargetRef(); - if (sourceKey.equals(sourceRef)&&targetRef!=null){ + if (sourceKey.equals(sourceRef) && targetRef != null) { orderKeys.add(targetRef); - this.appendKeys(orderKeys,targetRef,flowElements); + this.appendKeys(orderKeys, targetRef, flowElements); } } catch (Exception e) { continue; @@ -1306,89 +1463,116 @@ * @return */ @Override - public Result getNextFlowNode(FlowTaskVo flowTaskVo) { + public Result<List<FlowNextDto>> getNextFlowNode(FlowTaskVo flowTaskVo) { // todo 浼间箮閫昏緫鏈啓瀹岋紝寰呮鏌� - FlowNextDto flowNextDto = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues()); - if (flowNextDto==null) { + List<FlowNextDto> nextDtoList = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues()); + if (CollectionUtils.isEmpty(nextDtoList)) { return Result.OK("娴佺▼宸插畬缁�", null); } - return Result.OK(flowNextDto); + 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)) { + //娌℃湁鐖惰妭鐐� 浠h〃娌℃湁骞惰浠诲姟 + 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 FlowNextDto getNextFlowNode(String taskId, Map<String, Object> values) { + 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)) { - FlowNextDto flowNextDto = new FlowNextDto(); + 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); - - MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); - if (Objects.nonNull(multiInstance)) { - // 浼氱 澶氬疄渚� - String collectionString = multiInstance.getInputDataItem(); - Object colObj = values.get(collectionString); - List<String> userNameList = null; - if(colObj!=null){ - userNameList = (List) colObj; - } - if (CollUtil.isNotEmpty(userNameList)){ - // 寰呭姙浜哄憳浠庡彉閲忎腑鑾峰彇 鍚﹀垯灏辨槸鑺傜偣涓厤缃殑鐢ㄦ埛 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); - } + //澶氫换鍔″苟琛� + 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(collectionString,collect_username); } + flowNextDto.setUserList(userList); } else { - // todo 璇诲彇鑷畾涔夎妭鐐瑰睘鎬у仛浜涘暐锛� - //String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE); - String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE); + // 鍙橀噺涓病鏈変紶鍏ワ紝鍐欏叆鑺傜偣涓厤缃殑鐢ㄦ埛 + List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); + values.put(userTask.getId(), collect_username); } + nextDtoList.add(flowNextDto); } - return flowNextDto; + return nextDtoList; } } return null; } + public List<SysUser> getSysUserFromTask(UserTask userTask) { String assignee = userTask.getAssignee(); - if (StrUtil.isNotBlank(assignee)){ + if (StrUtil.isNotBlank(assignee)) { // 鎸囧畾鍗曚汉 SysUser userByUsername = iFlowThirdService.getUserByUsername(assignee); return Lists.newArrayList(userByUsername); } List<String> candidateUsers = userTask.getCandidateUsers(); - if (CollUtil.isNotEmpty(candidateUsers)){ + if (CollUtil.isNotEmpty(candidateUsers)) { // 鎸囧畾澶氫汉 List<SysUser> list = iFlowThirdService.getAllUser(); - return list.stream().filter(o->candidateUsers.contains(o.getUsername())).collect(Collectors.toList()); + return list.stream().filter(o -> candidateUsers.contains(o.getUsername())).collect(Collectors.toList()); } List<String> candidateGroups = userTask.getCandidateGroups(); - if (CollUtil.isNotEmpty(candidateGroups)){ - // 鎸囧畾澶氱粍 + if (CollUtil.isNotEmpty(candidateGroups)) { + // 鎸囧畾澶氱粍 List<SysUser> userList = Lists.newArrayList(); for (String candidateGroup : candidateGroups) { List<SysUser> usersByRoleId = iFlowThirdService.getUsersByRoleId(candidateGroup); @@ -1398,6 +1582,7 @@ } return Lists.newArrayList(); } + /** * 娴佺▼瀹屾垚鏃堕棿澶勭悊 * -- Gitblit v1.9.3