From 209ba136019b3df05752c5172410c16c17debc4f Mon Sep 17 00:00:00 2001 From: yxt_djz Date: Wed, 31 Aug 2022 08:37:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B5=81=E7=A8=8B=E7=9A=84?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=EF=BC=8C=E5=AF=B9=E6=B5=81=E7=A8=8B=E7=9B=B8?= =?UTF-8?q?=E9=82=BB=E7=8E=AF=E8=8A=82=E8=AE=BE=E7=BD=AE=E7=9B=B8=E5=90=8C?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=E4=BA=BA=E7=9A=84=E6=83=85=E5=86=B5=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E8=87=AA=E5=8A=A8=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseOutsourcingApplicationService.java | 31 +++- .../flowable/api/flowtask/TaskUserInfo.java | 9 + .../anrui/flowable/biz/flow/FlowableRest.java | 70 ++++++-- .../biz/flowtask/FlowTaskService.java | 155 +++++++++++++++--- anrui-system-ui/src/views/Home/Home.vue | 2 +- 5 files changed, 225 insertions(+), 42 deletions(-) diff --git a/anrui-base/anrui-base-biz/src/main/java/com/yxt/anrui/base/biz/baseoutsourcingapplication/BaseOutsourcingApplicationService.java b/anrui-base/anrui-base-biz/src/main/java/com/yxt/anrui/base/biz/baseoutsourcingapplication/BaseOutsourcingApplicationService.java index 8314104404..817434aa27 100644 --- a/anrui-base/anrui-base-biz/src/main/java/com/yxt/anrui/base/biz/baseoutsourcingapplication/BaseOutsourcingApplicationService.java +++ b/anrui-base/anrui-base-biz/src/main/java/com/yxt/anrui/base/biz/baseoutsourcingapplication/BaseOutsourcingApplicationService.java @@ -515,8 +515,24 @@ public class BaseOutsourcingApplicationService extends MybatisBaseService> nextNodesForSubmit = getNextNodesForSubmit(dto); + List datas = nextNodesForSubmit.getData(); + GetNodeVo getNodeVo = datas.get(0); + List candidateGroups = getNodeVo.getCandidateGroups(); + UserQuery userQuery = new UserQuery(); + userQuery.setRoleSid(candidateGroups.get(0)); + userQuery.setOrgSidPath(bv.getOrgSidPath()); + List sysUserVos = sysUserFeign.getUserByRole(userQuery).getData(); ResultBean rb = flowableFeign.handleProsess(bv); - String taskDefKey = rb.getData().getTaskDefKey(); + if(sysUserVos.size()==0){ + bv.setTaskDefKey(rb.getData().getTaskDefKey()); + bv.setTaskId(rb.getData().getTaskId()); + return complete(bv); + }*/ + BaseOutsourcingApplicationDto dto= baseMapper.getBySid(bv.getBusinessSid()); + ResultBean rb = complete_handleProsess(bv,dto); + /* String taskDefKey = rb.getData().getTaskDefKey(); Map stringObjectMap = BeanUtil.beanToMap(rb.getData()); updateFlowFiled(stringObjectMap); if ("Event_end".equals(taskDefKey)) { @@ -567,12 +583,23 @@ public class BaseOutsourcingApplicationService extends MybatisBaseService complete_handleProsess(BusinessVariables bv, BaseOutsourcingApplicationDto dto) { + ResultBean> nextNodesForSubmit = getNextNodesForSubmit(dto); + List datas = nextNodesForSubmit.getData(); + GetNodeVo getNodeVo = datas.get(0); + List candidateGroups = getNodeVo.getCandidateGroups(); + ResultBean rb = flowableFeign.handleProsess(bv); + Map stringObjectMap = BeanUtil.beanToMap(rb.getData()); + updateFlowFiled(stringObjectMap); + return rb; + } /** * 创建采购入库单 * @return diff --git a/anrui-flowable/anrui-flowable-api/src/main/java/com/yxt/anrui/flowable/api/flowtask/TaskUserInfo.java b/anrui-flowable/anrui-flowable-api/src/main/java/com/yxt/anrui/flowable/api/flowtask/TaskUserInfo.java index 79b9363720..c05dfa8739 100644 --- a/anrui-flowable/anrui-flowable-api/src/main/java/com/yxt/anrui/flowable/api/flowtask/TaskUserInfo.java +++ b/anrui-flowable/anrui-flowable-api/src/main/java/com/yxt/anrui/flowable/api/flowtask/TaskUserInfo.java @@ -3,6 +3,15 @@ package com.yxt.anrui.flowable.api.flowtask; public class TaskUserInfo { private String assigneeName; private String assigneeHeadImage; + private String assigneeSid; + + public String getAssigneeSid() { + return assigneeSid; + } + + public void setAssigneeSid(String assigneeSid) { + this.assigneeSid = assigneeSid; + } public String getAssigneeName() { return assigneeName; diff --git a/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flow/FlowableRest.java b/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flow/FlowableRest.java index 76db12ec30..c2c648df4a 100644 --- a/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flow/FlowableRest.java +++ b/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flow/FlowableRest.java @@ -28,13 +28,14 @@ package com.yxt.anrui.flowable.biz.flow; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.yxt.anrui.flowable.api.flow.*; import com.yxt.anrui.flowable.api.flowcomment.FlowComment; +import com.yxt.anrui.flowable.api.flowtask.FlowRecordVo; import com.yxt.anrui.flowable.api.flowtask.LatestTaskVo; import com.yxt.anrui.flowable.biz.flowtask.FlowTaskService; +import com.yxt.anrui.flowable.biz.process.ProcessService; import com.yxt.anrui.flowable.sqloperationsymbol.BusinessVariables; -import com.yxt.anrui.portal.api.sysorganization.SysOrganizationFeign; -import com.yxt.anrui.portal.api.sysstafforg.SysStaffOrgFeign; import com.yxt.anrui.portal.api.sysuser.SysUserFeign; import com.yxt.anrui.portal.api.sysuser.SysUserVo; import com.yxt.anrui.portal.api.sysuser.UserQuery; @@ -43,6 +44,9 @@ import com.yxt.common.core.query.PagerQuery; import com.yxt.common.core.result.ResultBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiParam; +import org.flowable.bpmn.model.ExtensionAttribute; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.UserTask; import org.flowable.engine.TaskService; import org.flowable.task.api.DelegationState; import org.flowable.task.api.Task; @@ -52,10 +56,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; /** * Project: anrui-parent
@@ -83,10 +84,8 @@ public class FlowableRest implements FlowableFeign { private SysUserFeign sysUserFeign; @Resource protected TaskService taskService; - @Autowired - private SysStaffOrgFeign sysStaffOrgFeign; - @Autowired - private SysOrganizationFeign sysOrganizationFeign; + @Resource + private ProcessService processService; @Override public ResultBean businessStart(BusinessVariables bv) { return flowableService.businessStart( bv); @@ -221,9 +220,19 @@ public class FlowableRest implements FlowableFeign { Logger log= LoggerFactory.getLogger(FlowableRest.class); @Override public ResultBean handleProsess(BusinessVariables dto) { + return handleProsess(dto,true); + } + + /** + * + * @param dto + * @param b 是否连续跳转环节 + * @return + */ + public ResultBean handleProsess(BusinessVariables dto,boolean b) { UpdateFlowFieldVo vo = new UpdateFlowFieldVo(); ResultBean rb = ResultBean.fireFail(); - // Map formVariables = dto.getFormVariables(); + // Map formVariables = dto.getFormVariables(); String taskId = dto.getTaskId(); if (StringUtils.isBlank(taskId)) { @@ -271,7 +280,7 @@ public class FlowableRest implements FlowableFeign { return rb.setMsg("任务不存在"); } String assignee = task.getAssignee(); - if(StringUtils.isNotBlank(assignee)&& assignee.indexOf(userSid)<0){ + if(b&&(StringUtils.isNotBlank(assignee)&& assignee.indexOf(userSid)<0)){ return rb.setMsg("当前用户不是环节的待办人,不能进行办理操作!"); } String nodeState = ""; @@ -309,6 +318,42 @@ public class FlowableRest implements FlowableFeign { vo.setNodeState(FlowComment.SETTLE.getRemark()); } } + //ResultBean flowRecordVoResultBean = flowableService.flowRecord(dto.getInstanceId(), dto.getModelId()); + List flowElements = processService.calApprovePath(dto.getModelId(), dto.getModelId(), + dto.getFormVariables()); + boolean contains=false; + for(int i=0;i candidateGroups = userTask.getCandidateGroups(); + List sysUserVoLists=new ArrayList<>(); + for(String roleSid:candidateGroups){ + UserQuery userQuery = new UserQuery(); + userQuery.setRoleSid(roleSid); + userQuery.setOrgSidPath(dto.getOrgSidPath()); + List sysUserVos = sysUserFeign.getUserByRole(userQuery).getData(); + sysUserVoLists.addAll(sysUserVos); + } + if(sysUserVoLists.size()==1&&sysUserVoLists.get(0).getSid().equals(nextUserSid)){ + contains=true; + break; + } + } + } + if(contains){ + break; + } + } + if(contains){ + dto.setUserSid(nextUserSid); + dto.setTaskId(vo.getTaskId()); + dto.setTaskDefKey(taskDefKey); + return handleProsess(dto,false); + } vo.setProcInsId(instanceId); vo.setProcDefId(task.getProcessDefinitionId()); vo.setNodeState(nodeState); @@ -316,7 +361,6 @@ public class FlowableRest implements FlowableFeign { vo.setNextNodeUserSids(nextUserSid); return rb.success().setData(vo); } - @Override public ResultBean revokeProcess(com.yxt.anrui.flowable.api.flowtask.FlowTaskVo fl) { ResultBean rb = ResultBean.fireFail(); diff --git a/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flowtask/FlowTaskService.java b/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flowtask/FlowTaskService.java index 2496694ced..4a1331c39d 100644 --- a/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flowtask/FlowTaskService.java +++ b/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flowtask/FlowTaskService.java @@ -10,6 +10,7 @@ import com.yxt.anrui.flowable.api.flowcomment.FlowCommentDto; import com.yxt.anrui.flowable.api.flowtask.*; import com.yxt.anrui.flowable.api.sysform.SysForm; import com.yxt.anrui.flowable.api.sysprourl.SysProUrlVo; +import com.yxt.anrui.flowable.biz.flow.FlowableService; import com.yxt.anrui.flowable.biz.process.ProcessService; import com.yxt.anrui.flowable.biz.sysdeployform.SysDeployFormService; import com.yxt.anrui.flowable.biz.sysprourl.SysProUrlService; @@ -110,7 +111,8 @@ public class FlowTaskService extends MybatisBaseService> taskReject(FlowTaskVo flowTaskVo) { + return taskReject_(flowTaskVo,false); + } + /** + * 驳回任务 + * + * @param flowTaskVo + */ + public ResultBean> taskReject_(FlowTaskVo flowTaskVo,boolean b) { // 当前任务 task Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); if (task.isSuspended()) { @@ -1230,18 +1241,38 @@ public class FlowTaskService extends MybatisBaseService { + Map map2 = flowTaskMapper.getTaskByDefKey(task.getProcessInstanceId(), targetIds.get(0)); + Map map = flowTaskMapper.getHistTaskByID(task.getProcessInstanceId(), targetIds.get(0)); + String assignee_ =item.getAssignee(); + if(map.get("ASSIGNEE_")!=null){ + assignee_ = map.get("ASSIGNEE_").toString(); + } + // String assignee_ = map.get("ASSIGNEE_").toString(); + String id_ = map2.get("id_").toString(); + /* List flowElements = processService.calApprovePath(flowTaskVo.getInstanceId(), flowTaskVo.getInstanceId(), + flowTaskVo.getValues()); + for(int i=0;i> listResultBean_2=null; + if(flowTaskVo.getUserSid().equals(assignee_)){ + flowTaskVo.setTaskId(id_); + flowTaskVo.setUserSid(assignee_); + flowTaskVo.setTargetKey(item.getId()); + listResultBean_2= taskReject_(flowTaskVo, true); + }else{taskService.setAssignee(id_, assignee_);} LatestTaskVo latestTaskVo = new LatestTaskVo(); latestTaskVo.setASSIGNEE_(item.getAssignee()); // latestTaskVo.setId_(item.getId()); - Map map = flowTaskMapper.getHistTaskByID(task.getProcessInstanceId(), targetIds.get(0)); - Map map2 = flowTaskMapper.getTaskByDefKey(task.getProcessInstanceId(), targetIds.get(0)); - String id_ = map2.get("id_").toString(); - latestTaskVo.setId_(id_); - String assignee_ = map.get("ASSIGNEE_").toString(); - taskService.setAssignee(id_, assignee_); - latestTaskVo.setName_(item.getName()); - latestTaskVo.setTask_def_key_(item.getId()); - latestTaskVo.setIncomingSourceRef(item.getIncomingFlows().get(0).getSourceRef()); + latestTaskVo.setId_(listResultBean_2!=null?listResultBean_2.getData().get(0).getId_():id_); + if(b){ + taskService.setAssignee(id_, assignee_); + } + latestTaskVo.setName_(listResultBean_2!=null?listResultBean_2.getData().get(0).getName_():item.getName()); + latestTaskVo.setTask_def_key_(listResultBean_2!=null?listResultBean_2.getData().get(0).getTask_def_key_():item.getId()); + latestTaskVo.setIncomingSourceRef(listResultBean_2!=null?listResultBean_2.getData().get(0).getIncomingSourceRef():item.getIncomingFlows().get(0).getSourceRef()); + latestTaskList.add(latestTaskVo); }); } catch (FlowableObjectNotFoundException e) { @@ -1335,13 +1366,11 @@ public class FlowTaskService extends MybatisBaseService> revokeProcess(FlowTaskVo flowTaskVo) { + public ResultBean> revokeProcess(FlowTaskVo flowTaskVo,int j) { HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskId(flowTaskVo.getTaskId()).singleResult(); Execution execution = runtimeService.createExecutionQuery().executionId(historicTaskInstance.getExecutionId()).singleResult(); DelegateExecution delegateExecution = (DelegateExecution) execution; - if(delegateExecution==null){ + if (delegateExecution == null) { return new ResultBean>().fail().setMsg("流程已办结,不能撤回!").setData(new ArrayList<>()); } // 获取当前节点的activityId,即xml中每个标签的ID @@ -1350,21 +1379,86 @@ public class FlowTaskService extends MybatisBaseService>().fail().setMsg("流程找不到上一环节,撤回操作失败!").setData(new ArrayList<>()); } HistoricTaskInstance historicTaskInstance1 = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult(); String assignee = historicTaskInstance1.getAssignee(); String userSid = flowTaskVo.getUserSid(); - if (!assignee.equals(userSid)) { + ResultBean flowRecordVoResultBean = flowableService.flowRecord(flowTaskVo.getInstanceId(), flowTaskVo.getInstanceId()); + List flowList = flowRecordVoResultBean.getData().getFlowList(); + String ybrsid=""; + int ii=0; + + FlowTask flowTask_1 = flowList.get(j+1); + List taskUserInfos_1 = flowTask_1.getTaskUserInfos(); + TaskUserInfo taskUserInfo_1 = taskUserInfos_1.get(0); + + FlowTask flowTask_0 = flowList.get(j); + List taskUserInfos_0 = flowTask_0.getTaskUserInfos(); + TaskUserInfo taskUserInfo_0 = taskUserInfos_0.get(0); + String assigneeSid1 = taskUserInfo_1.getAssigneeSid(); + String assigneeSid0 = taskUserInfo_0.getAssigneeSid(); + /* if(assigneeSid1.equals(assigneeSid0)){ + ii=1; + ybrsid=userSid; + }else{ + ybrsid=assigneeSid1; + }*/ + + if(!assigneeSid1.equals(assigneeSid0)){ + ybrsid=assignee; + }else{ + for(int i=1;i taskUserInfos = flowTask.getTaskUserInfos(); + TaskUserInfo taskUserInfo = taskUserInfos.get(0); + if(assigneeSid0.equals(taskUserInfo.getAssigneeSid())){ + ii++; + continue; + }else{ + ybrsid=flowList.get(i).getTaskUserInfos().get(0).getAssigneeSid(); + break; + } + } + } + + if (!ybrsid.equals(userSid)) { return new ResultBean>().fail().setMsg("您不是上一环节处理人,不能进行撤回操作!").setData(new ArrayList<>()); + } else { + ResultBean> listResultBean = null; + for(int i=0;i<=ii;i++){ + listResultBean = revokeProcess_(historicTaskInstance.getProcessInstanceId(),userSid); + } + return listResultBean; } + } + public ResultBean> revokeProcess(FlowTaskVo flowTaskVo) { + return revokeProcess(flowTaskVo,0); + } + + /* private ResultBean> getListResultBean(FlowTaskVo flowTaskVo, String assignee, ResultBean> listResultBean) { + List data = listResultBean.getData(); + LatestTaskVo latestTaskVo = data.get(0); + flowTaskVo.setTaskId(latestTaskVo.getId_()); + flowTaskVo.setUserSid(assignee); + // ResultBean> listResultBean1 = revokeProcess(flowTaskVo); + LatestTaskVo latestTaskVo2 = data.get(0); + String assignee_ = latestTaskVo2.getASSIGNEE_(); + if(!assignee_.equals(assignee)){ + return getListResultBean(flowTaskVo, assignee, listResultBean); + } + return listResultBean1; + }*/ + + // @Transactional(rollbackFor = Exception.class) + private ResultBean> revokeProcess_( String processInstanceId, + String assignee ) { // 流程回退到上一个节点,审批人继续审批 /* runtimeService.createChangeActivityStateBuilder().processInstanceId(historicTaskInstance.getProcessInstanceId()) .moveActivityIdTo(currentActivityId,sourceRef).changeState(); */ // 获取流程定义信息 - String processInstanceId = historicTaskInstance.getProcessInstanceId(); Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery() @@ -1395,7 +1489,7 @@ public class FlowTaskService extends MybatisBaseService 0) { + .processInstanceId(processInstanceId).count() > 0) { return new ResultBean>().fail().setMsg("当前已经结束不能撤回").setData(new ArrayList<>()); } // 获取活动 ID 即节点 Key @@ -1403,7 +1497,7 @@ public class FlowTaskService extends MybatisBaseService parentUserTaskKeyList.add(item.getId())); // 获取全部历史节点活动实例,即已经走过的节点历史,数据采用开始时间升序 List historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery() - .processInstanceId(task.getProcessInstanceId()) + .processInstanceId(processInstanceId) .orderByHistoricTaskInstanceStartTime().asc().list(); // 数据清洗,将回滚导致的脏数据清洗掉 List lastHistoricTaskInstanceList = FlowableUtils.historicTaskInstanceClean(allElements, historicTaskInstanceList); @@ -1437,7 +1531,7 @@ public class FlowTaskService extends MybatisBaseService runTaskList = taskService.createTaskQuery() - .processInstanceId(task.getProcessInstanceId()).list(); + .processInstanceId(processInstanceId).list(); List runTaskKeyList = new ArrayList<>(); runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); // 需驳回任务列表 @@ -1459,10 +1553,14 @@ public class FlowTaskService extends MybatisBaseService { - taskService.addComment(item, historicTaskInstance.getProcessInstanceId(), + taskService.addComment(item, processInstanceId, FlowComment.RECALL.getType(), "撤回办理"); // 设置实际办理人 - taskService.setAssignee(item, userSid); + /* if(assignee.equals("0d8d8119-d476-47ce-89c2-075cd809dda6")){ + taskService.setAssignee(item, assignee); + }else{*/ + taskService.setAssignee(item, assignee); + /* }*/ }); // 最近环节 @@ -1472,14 +1570,14 @@ public class FlowTaskService extends MybatisBaseService 1) { // 1 对 多任务跳转,currentIds 当前节点(1),targetIds 跳转到的节点(多) runtimeService.createChangeActivityStateBuilder() - .processInstanceId(task.getProcessInstanceId()). + .processInstanceId(processInstanceId). moveSingleActivityIdToActivityIds(currentIds.get(0), targetIds).changeState(); } // 如果父级任务只有一个,因此当前任务可能为网关中的任务 if (targetIds.size() == 1) { // 1 对 1 或 多 对 1 情况,currentIds 当前要跳转的节点列表(1或多),targetIds.get(0) 跳转到的节点(1) runtimeService.createChangeActivityStateBuilder() - .processInstanceId(task.getProcessInstanceId()) + .processInstanceId(processInstanceId) .moveActivityIdsToSingleActivityId(currentIds, targetIds.get(0)).changeState(); } // 最近环节 @@ -1491,8 +1589,13 @@ public class FlowTaskService extends MybatisBaseService task_map = flowTaskMapper.getTaskByDefKey(historicTaskInstance.getProcessInstanceId(), item.getId()); - taskService.setAssignee(task_map.get("id_").toString(), userSid); + Map task_map = flowTaskMapper.getTaskByDefKey(processInstanceId, item.getId()); + /* if(assignee.equals("0d8d8119-d476-47ce-89c2-075cd809dda6")){ + taskService.setAssignee(task_map.get("id_").toString(), assignee); + }else{*/ + taskService.setAssignee(task_map.get("id_").toString(), assignee); + /* }*/ + latestTaskVo.setId_(task_map.get("id_").toString()); latestTaskList.add(latestTaskVo); }); diff --git a/anrui-system-ui/src/views/Home/Home.vue b/anrui-system-ui/src/views/Home/Home.vue index 3a5168deed..0b213a88d3 100644 --- a/anrui-system-ui/src/views/Home/Home.vue +++ b/anrui-system-ui/src/views/Home/Home.vue @@ -283,7 +283,7 @@ } else if (index == '8') { let myPopup = window.open('http://120.46.172.184/message/#/' + '?token=' + getStorage(), '_blank') } else if (index == '1') { - let myPopup = window.open('http://120.46.172.184/scm/#/' + '?token=' + getStorage(), '_blank') + let myPopup = window.open('http://127.0.0.1:9531/scm/#/' + '?token=' + getStorage(), '_blank') } else if (index == '4') { let myPopup = window.open('http://120.46.172.184/fin/#/' + '?token=' + getStorage(), '_blank') } else if (index == '5') {