From f537c6ff8e1a1a6303ff0f05987afb319eb1c654 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Thu, 5 Dec 2024 17:24:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E5=90=8E=E7=AB=AF-I?= =?UTF-8?q?T=E6=9C=8D=E5=8A=A1-=E6=9D=A1=E4=BB=B6=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E3=80=81=E8=87=AA=E5=8A=A8=E5=8C=96=E8=8A=82=E7=82=B9=E3=80=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BD=AC=E6=8D=A2=E8=8A=82=E7=82=B9=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E6=97=B6=E5=A2=9E=E5=8A=A0=E9=87=8D=E6=96=B0=E6=BF=80?= =?UTF-8?q?=E6=B4=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1305116722823168]后端-IT服务-条件节点、自动化节点、数据转换节点异常时增加重新激活功能 http://192.168.0.96:8090/demo/rdm.html#/task-detail/939050947543040/939050947543050/1305116722823168 --- .../ProcessTaskCanReactivateStepListApi.java | 87 +++++++++++++++++++ .../ActiveProcessTaskStepApi.java | 9 +- .../handler/StepOperateHandler.java | 58 +++++++++++++ .../handler/TaskOperateHandler.java | 58 +++++++++++++ 4 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCanReactivateStepListApi.java diff --git a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCanReactivateStepListApi.java b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCanReactivateStepListApi.java new file mode 100644 index 000000000..16c431eee --- /dev/null +++ b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCanReactivateStepListApi.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2024 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.process.api.processtask; + +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.auth.core.AuthAction; +import neatlogic.framework.common.constvalue.ApiParamType; +import neatlogic.framework.process.auth.PROCESS_BASE; +import neatlogic.framework.process.constvalue.ProcessTaskStepOperationType; +import neatlogic.framework.process.dto.ProcessTaskStepVo; +import neatlogic.framework.process.dto.ProcessTaskVo; +import neatlogic.framework.process.operationauth.core.IOperationType; +import neatlogic.framework.process.operationauth.core.ProcessAuthManager; +import neatlogic.framework.restful.annotation.*; +import neatlogic.framework.restful.constvalue.OperationTypeEnum; +import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; +import neatlogic.module.process.service.ProcessTaskService; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +@AuthAction(action = PROCESS_BASE.class) +@OperationType(type = OperationTypeEnum.SEARCH) +public class ProcessTaskCanReactivateStepListApi extends PrivateApiComponentBase { + + @Resource + private ProcessTaskMapper processTaskMapper; + + @Resource + private ProcessTaskService processTaskService; + @Override + public String getName() { + return "当前用户可以重新激活的步骤列表"; + } + + @Input({ + @Param(name = "processTaskId", type = ApiParamType.LONG, desc = "term.itsm.processtaskid", isRequired = true) + }) + @Output({ + @Param(name = "Return", explode = ProcessTaskStepVo[].class, desc = "common.tbodylist") + }) + @Description(desc = "当前用户可以重新激活的步骤列表") + @Override + public Object myDoService(JSONObject paramObj) throws Exception { + Long processTaskId = paramObj.getLong("processTaskId"); + ProcessTaskVo processTaskVo = processTaskService.checkProcessTaskParamsIsLegal(processTaskId); + List resultList = new ArrayList<>(); + List processTaskStepList = processTaskMapper.getProcessTaskStepBaseInfoByProcessTaskId(processTaskVo.getId()); + List processTaskStepIdList = processTaskStepList.stream().map(ProcessTaskStepVo::getId).collect(Collectors.toList()); + Map> operateMap = new ProcessAuthManager.Builder().addProcessTaskStepId(processTaskStepIdList).addOperationType(ProcessTaskStepOperationType.STEP_REACTIVATE).build().getOperateMap(); + for (ProcessTaskStepVo processTaskStepVo : processTaskStepList) { + Set operationTypeSet = operateMap.get(processTaskStepVo.getId()); + if (CollectionUtils.isNotEmpty(operationTypeSet) && operationTypeSet.contains(ProcessTaskStepOperationType.STEP_REACTIVATE)) { + resultList.add(processTaskStepVo); + } + } + return resultList; + } + + @Override + public String getToken() { + return "processtask/canreactivatestep/list"; + } +} diff --git a/src/main/java/neatlogic/module/process/api/processtask/manualintervention/ActiveProcessTaskStepApi.java b/src/main/java/neatlogic/module/process/api/processtask/manualintervention/ActiveProcessTaskStepApi.java index 6cf7fd31a..42fdf5e7f 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/manualintervention/ActiveProcessTaskStepApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/manualintervention/ActiveProcessTaskStepApi.java @@ -19,10 +19,14 @@ package neatlogic.module.process.api.processtask.manualintervention; import com.alibaba.fastjson.JSONObject; import neatlogic.framework.auth.core.AuthAction; +import neatlogic.framework.auth.core.AuthActionChecker; import neatlogic.framework.common.constvalue.ApiParamType; import neatlogic.framework.process.auth.PROCESSTASK_MODIFY; +import neatlogic.framework.process.auth.PROCESS_BASE; +import neatlogic.framework.process.constvalue.ProcessTaskStepOperationType; import neatlogic.framework.process.dto.ProcessTaskStepVo; import neatlogic.framework.process.dto.ProcessTaskVo; +import neatlogic.framework.process.operationauth.core.ProcessAuthManager; import neatlogic.framework.process.stephandler.core.IProcessStepHandler; import neatlogic.framework.process.stephandler.core.ProcessStepHandlerFactory; import neatlogic.framework.restful.annotation.*; @@ -35,7 +39,7 @@ import javax.annotation.Resource; @Service @OperationType(type = OperationTypeEnum.UPDATE) -@AuthAction(action = PROCESSTASK_MODIFY.class) +@AuthAction(action = PROCESS_BASE.class) public class ActiveProcessTaskStepApi extends PrivateApiComponentBase { @Resource @@ -57,6 +61,9 @@ public class ActiveProcessTaskStepApi extends PrivateApiComponentBase { Long processTaskId = paramObj.getLong("processTaskId"); Long processTaskStepId = paramObj.getLong("processTaskStepId"); ProcessTaskVo processTaskVo = processTaskService.checkProcessTaskParamsIsLegal(processTaskId, processTaskStepId); + if (!AuthActionChecker.check(PROCESSTASK_MODIFY.class)) { + new ProcessAuthManager.StepOperationChecker(processTaskStepId, ProcessTaskStepOperationType.STEP_REACTIVATE).build().checkAndNoPermissionThrowException(); + } ProcessTaskStepVo currentProcessTaskStep = processTaskVo.getCurrentProcessTaskStep(); IProcessStepHandler processStepHandler = ProcessStepHandlerFactory.getHandler(currentProcessTaskStep.getHandler()); processStepHandler.active(currentProcessTaskStep); diff --git a/src/main/java/neatlogic/module/process/operationauth/handler/StepOperateHandler.java b/src/main/java/neatlogic/module/process/operationauth/handler/StepOperateHandler.java index 0f71ab2ba..429cd23bb 100644 --- a/src/main/java/neatlogic/module/process/operationauth/handler/StepOperateHandler.java +++ b/src/main/java/neatlogic/module/process/operationauth/handler/StepOperateHandler.java @@ -1039,6 +1039,64 @@ public class StepOperateHandler extends OperationAuthHandlerBase { .put(operationType, new ProcessTaskStepNotMajorUserException()); return PredicateResult.DENY; }); + + /** + * 步骤重新激活权限 + */ + operationBiPredicateMap.put(ProcessTaskStepOperationType.STEP_REACTIVATE, + (processTaskVo, processTaskStepVo, userUuid, operationTypePermissionDeniedExceptionMap, extraParam) -> { + Long id = processTaskStepVo.getId(); + ProcessTaskStepOperationType operationType = ProcessTaskStepOperationType.STEP_REACTIVATE; + //1.判断工单是否被隐藏,如果isShow=0,则提示“工单已隐藏”; + if (processTaskVo.getIsShow() == 0) { + operationTypePermissionDeniedExceptionMap.computeIfAbsent(id, key -> new HashMap<>()) + .put(operationType, new ProcessTaskHiddenException()); + return PredicateResult.DENY; + } + //2.判断工单状态是否是“未提交”,如果是,则提示“工单未提交”; + //3.判断工单状态是否是“已完成”,如果是,则提示“工单已完成”; + //4.判断工单状态是否是“已取消”,如果是,则提示“工单已取消”; + //5.判断工单状态是否是“异常”,如果是,则提示“工单异常”; + //6.判断工单状态是否是“已挂起”,如果是,则提示“工单已挂起”; + //7.判断工单状态是否是“已评分”,如果是,则提示“工单已评分”; + ProcessTaskPermissionDeniedException exception = processTaskService.checkProcessTaskStatus(processTaskVo.getStatus(), + ProcessTaskStatus.DRAFT, + ProcessTaskStatus.SUCCEED, + ProcessTaskStatus.ABORTED, + ProcessTaskStatus.HANG, + ProcessTaskStatus.SCORED); + if (exception != null) { + operationTypePermissionDeniedExceptionMap.computeIfAbsent(id, key -> new HashMap<>()) + .put(operationType, exception); + return PredicateResult.DENY; + } + //8.判断步骤是否未激活,如果isActive=0,则提示“步骤未激活”; + if (processTaskStepVo.getIsActive() == 0) { + operationTypePermissionDeniedExceptionMap.computeIfAbsent(id, key -> new HashMap<>()) + .put(operationType, new ProcessTaskStepNotActiveException()); + return PredicateResult.DENY; + } + if (Objects.equals(processTaskStepVo.getHandler(), ProcessStepHandlerType.CONDITION.getHandler())) { + if (Objects.equals(processTaskStepVo.getStatus(), ProcessTaskStepStatus.FAILED.getValue())) { + if (AuthActionChecker.checkByUserUuid(userUuid, PROCESSTASK_MODIFY.class.getSimpleName())) { + return PredicateResult.ACCEPT; + } + } + } else if (Objects.equals(processTaskStepVo.getHandler(), "createjob")) { + if (Objects.equals(processTaskStepVo.getStatus(), ProcessTaskStepStatus.RUNNING.getValue())) { + if (checkIsProcessTaskStepUser(processTaskStepVo, ProcessUserType.MAJOR.getValue(), userUuid)) { + return PredicateResult.ACCEPT; + } + } + } else if (Objects.equals(processTaskStepVo.getHandler(), "dataconversion")) { + if (Objects.equals(processTaskStepVo.getStatus(), ProcessTaskStepStatus.RUNNING.getValue())) { + if (checkIsProcessTaskStepUser(processTaskStepVo, ProcessUserType.MAJOR.getValue(), userUuid)) { + return PredicateResult.ACCEPT; + } + } + } + return PredicateResult.DENY; + }); } @Override diff --git a/src/main/java/neatlogic/module/process/operationauth/handler/TaskOperateHandler.java b/src/main/java/neatlogic/module/process/operationauth/handler/TaskOperateHandler.java index 838830661..0f05bd46e 100644 --- a/src/main/java/neatlogic/module/process/operationauth/handler/TaskOperateHandler.java +++ b/src/main/java/neatlogic/module/process/operationauth/handler/TaskOperateHandler.java @@ -949,6 +949,64 @@ public class TaskOperateHandler extends OperationAuthHandlerBase { } return PredicateResult.DENY; }); + + /** + * 重新激活权限 + */ + operationBiPredicateMap.put(ProcessTaskOperationType.PROCESSTASK_REACTIVATE, + (processTaskVo, processTaskStepVo, userUuid, operationTypePermissionDeniedExceptionMap, extraParam) -> { + Long id = processTaskVo.getId(); + IOperationType operationType = ProcessTaskOperationType.PROCESSTASK_REACTIVATE; + //1.判断工单是否被隐藏,如果isShow=0,则提示“工单已隐藏”; + if (processTaskVo.getIsShow() == 0) { + operationTypePermissionDeniedExceptionMap.computeIfAbsent(id, key -> new HashMap<>()) + .put(operationType, new ProcessTaskHiddenException()); + return PredicateResult.DENY; + } + //2.判断工单状态是否是“未提交”,如果是,则提示“工单未提交”; + //3.判断工单状态是否是“已完成”,如果是,则提示“工单已完成”; + //4.判断工单状态是否是“已取消”,如果是,则提示“工单已取消”; + //5.判断工单状态是否是“异常”,如果是,则提示“工单异常”; + //6.判断工单状态是否是“已挂起”,如果是,则提示“工单已挂起”; + //7.判断工单状态是否是“已评分”,如果是,则提示“工单已评分”; + ProcessTaskPermissionDeniedException exception = processTaskService.checkProcessTaskStatus(processTaskVo.getStatus(), + ProcessTaskStatus.DRAFT, + ProcessTaskStatus.SUCCEED, + ProcessTaskStatus.ABORTED, + ProcessTaskStatus.HANG, + ProcessTaskStatus.SCORED); + if (exception != null) { + operationTypePermissionDeniedExceptionMap.computeIfAbsent(id, key -> new HashMap<>()) + .put(operationType, exception); + return PredicateResult.DENY; + } + for (ProcessTaskStepVo processTaskStep : processTaskVo.getStepList()) { + // 步骤状态为已激活的才能转交,否则跳过; + if (!Objects.equals(processTaskStep.getIsActive(), 1)) { + continue; + } + if (Objects.equals(processTaskStep.getHandler(), ProcessStepHandlerType.CONDITION.getHandler())) { + if (Objects.equals(processTaskStep.getStatus(), ProcessTaskStepStatus.FAILED.getValue())) { + if (AuthActionChecker.checkByUserUuid(userUuid, PROCESSTASK_MODIFY.class.getSimpleName())) { + return PredicateResult.ACCEPT; + } + } + } else if (Objects.equals(processTaskStep.getHandler(), "createjob")) { + if (Objects.equals(processTaskStep.getStatus(), ProcessTaskStepStatus.RUNNING.getValue())) { + if (checkIsProcessTaskStepUser(processTaskStep, ProcessUserType.MAJOR.getValue(), userUuid)) { + return PredicateResult.ACCEPT; + } + } + } else if (Objects.equals(processTaskStep.getHandler(), "dataconversion")) { + if (Objects.equals(processTaskStep.getStatus(), ProcessTaskStepStatus.RUNNING.getValue())) { + if (checkIsProcessTaskStepUser(processTaskStep, ProcessUserType.MAJOR.getValue(), userUuid)) { + return PredicateResult.ACCEPT; + } + } + } + } + return PredicateResult.DENY; + }); } @Override -- Gitee From fdabcf4f0afbdedbc4a3fda3eec14ec2c321c495 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Thu, 5 Dec 2024 17:26:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E5=90=8E=E7=AB=AF-I?= =?UTF-8?q?T=E6=9C=8D=E5=8A=A1-=E6=9D=A1=E4=BB=B6=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E3=80=81=E8=87=AA=E5=8A=A8=E5=8C=96=E8=8A=82=E7=82=B9=E3=80=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BD=AC=E6=8D=A2=E8=8A=82=E7=82=B9=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E6=97=B6=E5=A2=9E=E5=8A=A0=E9=87=8D=E6=96=B0=E6=BF=80?= =?UTF-8?q?=E6=B4=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1305116722823168]后端-IT服务-条件节点、自动化节点、数据转换节点异常时增加重新激活功能 http://192.168.0.96:8090/demo/rdm.html#/task-detail/939050947543040/939050947543050/1305116722823168 --- .../api/processtask/ProcessTaskCanReactivateStepListApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCanReactivateStepListApi.java b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCanReactivateStepListApi.java index 16c431eee..8484f2ad8 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCanReactivateStepListApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCanReactivateStepListApi.java @@ -53,7 +53,7 @@ public class ProcessTaskCanReactivateStepListApi extends PrivateApiComponentBase private ProcessTaskService processTaskService; @Override public String getName() { - return "当前用户可以重新激活的步骤列表"; + return "nmpap.processtaskcanreactivatesteplistapi.getname"; } @Input({ @@ -62,7 +62,7 @@ public class ProcessTaskCanReactivateStepListApi extends PrivateApiComponentBase @Output({ @Param(name = "Return", explode = ProcessTaskStepVo[].class, desc = "common.tbodylist") }) - @Description(desc = "当前用户可以重新激活的步骤列表") + @Description(desc = "nmpap.processtaskcanreactivatesteplistapi.getname") @Override public Object myDoService(JSONObject paramObj) throws Exception { Long processTaskId = paramObj.getLong("processTaskId"); -- Gitee