From 8aaf8bd3f1954a13375e20d1fb43ee1d1d19c439 Mon Sep 17 00:00:00 2001 From: lvzk <897706680@qq.com> Date: Fri, 4 Jul 2025 18:34:50 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E6=9D=83=E9=99=90=E4=BC=98=E5=8C=96=20#[1457?= =?UTF-8?q?884850782208]=E6=89=B9=E9=87=8F=E5=8F=91=E5=B8=83=E6=9D=83?= =?UTF-8?q?=E9=99=90=E4=BC=98=E5=8C=96=20http://192.168.0.96:8090/demo/rdm?= =?UTF-8?q?.html#/story-detail/939050947543040/939050947543042/14578848507?= =?UTF-8?q?82208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AddBatchDeployJobFromPipelineApi.java | 4 +- .../auth/core/BatchDeployAuthChecker.java | 2 +- .../dao/mapper/DeployBatchJobMapper.xml | 3 +- .../type/DeployJobSourceTypeHandler.java | 70 ++++++++++++++++--- .../service/DeployBatchJobServiceImpl.java | 8 ++- .../deploy/service/DeployCiServiceImpl.java | 2 +- 6 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/main/java/neatlogic/module/deploy/api/job/batch/AddBatchDeployJobFromPipelineApi.java b/src/main/java/neatlogic/module/deploy/api/job/batch/AddBatchDeployJobFromPipelineApi.java index 37f7d9d7..d4968482 100644 --- a/src/main/java/neatlogic/module/deploy/api/job/batch/AddBatchDeployJobFromPipelineApi.java +++ b/src/main/java/neatlogic/module/deploy/api/job/batch/AddBatchDeployJobFromPipelineApi.java @@ -26,8 +26,8 @@ import neatlogic.framework.autoexec.constvalue.JobStatus; import neatlogic.framework.autoexec.constvalue.JobTriggerType; import neatlogic.framework.autoexec.constvalue.ReviewStatus; import neatlogic.framework.common.constvalue.ApiParamType; -import neatlogic.framework.deploy.auth.BATCHDEPLOY_MODIFY; import neatlogic.framework.deploy.auth.BATCHDEPLOY_VERIFY; +import neatlogic.framework.deploy.auth.DEPLOY_BASE; import neatlogic.framework.deploy.constvalue.JobSource; import neatlogic.framework.deploy.dto.job.DeployJobVo; import neatlogic.framework.deploy.dto.pipeline.PipelineJobTemplateVo; @@ -54,7 +54,7 @@ import javax.annotation.Resource; import java.util.Objects; @Service -@AuthAction(action = BATCHDEPLOY_MODIFY.class) +@AuthAction(action = DEPLOY_BASE.class) @OperationType(type = OperationTypeEnum.UPDATE) @Transactional public class AddBatchDeployJobFromPipelineApi extends PrivateApiComponentBase { diff --git a/src/main/java/neatlogic/module/deploy/auth/core/BatchDeployAuthChecker.java b/src/main/java/neatlogic/module/deploy/auth/core/BatchDeployAuthChecker.java index 6b528139..aab8c5ff 100644 --- a/src/main/java/neatlogic/module/deploy/auth/core/BatchDeployAuthChecker.java +++ b/src/main/java/neatlogic/module/deploy/auth/core/BatchDeployAuthChecker.java @@ -67,7 +67,7 @@ public class BatchDeployAuthChecker { * @return 是|否 */ public static boolean isCanAbort(DeployJobVo deployJobVo) { - if (!Objects.equals(JobStatus.CHECKED.getValue(), deployJobVo.getStatus())) { + if (!Objects.equals(JobStatus.CHECKED.getValue(), deployJobVo.getStatus()) && Objects.equals(deployJobVo.getReviewStatus(), ReviewStatus.PASSED.getValue())) { return UserContext.get().getUserUuid().equals(deployJobVo.getExecUser()); } return false; diff --git a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBatchJobMapper.xml b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBatchJobMapper.xml index b27cf352..c9b6b343 100644 --- a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBatchJobMapper.xml +++ b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBatchJobMapper.xml @@ -88,7 +88,8 @@ along with this program. If not, see .--> e.start_time as startTime, e.end_time as endTime, e.source as source, - e.config_hash as configHash + e.config_hash as configHash, + e.parent_id as parentId from deploy_job_lane_group_job AS d LEFT JOIN autoexec_job AS e ON d.job_id = e.id where d.group_id = #{groupId} diff --git a/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java b/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java index 54f32fa3..39f613d4 100644 --- a/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java +++ b/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java @@ -33,26 +33,30 @@ import neatlogic.framework.autoexec.exception.AutoexecJobNotFoundException; import neatlogic.framework.autoexec.exception.AutoexecJobPhaseNotFoundException; import neatlogic.framework.autoexec.job.source.type.AutoexecJobSourceTypeHandlerBase; import neatlogic.framework.autoexec.util.AutoexecUtil; +import neatlogic.framework.cmdb.crossover.IAppSystemMapper; import neatlogic.framework.cmdb.crossover.ICiEntityCrossoverMapper; import neatlogic.framework.cmdb.crossover.IResourceCrossoverMapper; import neatlogic.framework.cmdb.dto.cientity.CiEntityVo; import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; +import neatlogic.framework.cmdb.dto.resourcecenter.entity.AppSystemVo; import neatlogic.framework.cmdb.exception.cientity.CiEntityNotFoundException; import neatlogic.framework.cmdb.exception.resourcecenter.AppEnvNotFoundException; +import neatlogic.framework.cmdb.exception.resourcecenter.AppSystemNotFoundException; import neatlogic.framework.common.constvalue.systemuser.SystemUser; import neatlogic.framework.crossover.CrossoverServiceFactory; import neatlogic.framework.dao.mapper.runner.RunnerMapper; import neatlogic.framework.deploy.auth.BATCHDEPLOY_MODIFY; import neatlogic.framework.deploy.auth.DEPLOY_MODIFY; import neatlogic.framework.deploy.auth.core.DeployAppAuthChecker; -import neatlogic.framework.deploy.constvalue.*; import neatlogic.framework.deploy.constvalue.JobSource; import neatlogic.framework.deploy.constvalue.JobSourceType; +import neatlogic.framework.deploy.constvalue.*; import neatlogic.framework.deploy.dto.app.*; import neatlogic.framework.deploy.dto.instance.DeployInstanceVersionVo; import neatlogic.framework.deploy.dto.job.DeployJobContentVo; import neatlogic.framework.deploy.dto.job.DeployJobVo; import neatlogic.framework.deploy.dto.pipeline.PipelineJobTemplateVo; +import neatlogic.framework.deploy.dto.pipeline.PipelineVo; import neatlogic.framework.deploy.dto.sql.DeploySqlJobPhaseVo; import neatlogic.framework.deploy.dto.sql.DeploySqlNodeDetailVo; import neatlogic.framework.deploy.dto.version.DeployVersionBuildNoVo; @@ -117,6 +121,9 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase @Resource DeployBlueGreenMapper deployBlueGreenMapper; + @Resource + DeployPipelineMapper deployPipelineMapper; + @Override public String getName() { return JobSourceType.DEPLOY.getValue(); @@ -553,8 +560,8 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase } @Override - public List getPhaseSqlStatusList(AutoexecJobPhaseVo jobPhaseVo,Long runnerMapId, List needCountStatusList) { - return deploySqlMapper.getDeployJobSqlStatusList(jobPhaseVo.getJobId(), jobPhaseVo.getName(),runnerMapId, needCountStatusList); + public List getPhaseSqlStatusList(AutoexecJobPhaseVo jobPhaseVo, Long runnerMapId, List needCountStatusList) { + return deploySqlMapper.getDeployJobSqlStatusList(jobPhaseVo.getJobId(), jobPhaseVo.getName(), runnerMapId, needCountStatusList); } @Override @@ -603,7 +610,8 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase @Override public void myExecuteAuthCheck(AutoexecJobVo jobVo) { - if (AuthActionChecker.checkByUserUuid(UserContext.get().getUserUuid(true), BATCHDEPLOY_MODIFY.class.getSimpleName()) || Objects.equals(UserContext.get().getUserUuid(), SystemUser.SYSTEM.getUserUuid())) { + //包含BATCHJOB_MODIFY 或 系统用户 则拥有所有应用的执行权限 + if (Boolean.TRUE.equals(AuthActionChecker.checkByUserUuid(UserContext.get().getUserUuid(true), BATCHDEPLOY_MODIFY.class.getSimpleName())) || Objects.equals(UserContext.get().getUserUuid(), SystemUser.SYSTEM.getUserUuid())) { return; } DeployJobVo deployJobVo; @@ -616,10 +624,41 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase } deployJobVo = deployJobTmp; } - //包含BATCHJOB_MODIFY 则拥有所有应用的执行权限 - if (!AuthActionChecker.checkByUserUuid(UserContext.get().getUserUuid(true), BATCHDEPLOY_MODIFY.class.getSimpleName()) && !Objects.equals(UserContext.get().getUserUuid(), SystemUser.SYSTEM.getUserUuid())) { - Set authSet = DeployAppAuthChecker.builder(deployJobVo.getAppSystemId()).addEnvAction(deployJobVo.getEnvId()).addScenarioAction(deployJobVo.getScenarioId()).check(); - if (!authSet.containsAll(Arrays.asList(deployJobVo.getEnvId().toString(), deployJobVo.getScenarioId().toString()))) { + //如果作业来源于批量发布则应该判断是否有对应超级流水线的执行权限 + if (JobSource.isBatch(jobVo.getSource()) && jobVo.getParentId() != null) { + AutoexecJobVo parentJob = autoexecJobMapper.getJobInfoWithInvoke(jobVo.getParentId()); + if (parentJob != null) { + PipelineVo pipelineVo = deployPipelineMapper.getPipelineById(parentJob.getInvokeId()); + if (pipelineVo != null) { + List pipelineIdList = deployPipelineMapper.checkHasAuthPipelineIdList(Collections.singletonList(pipelineVo.getId()), UserContext.get().getUserUuid(true)); + //“应用流水线” 需要 应用配置中的“流水线权限”或对应超级流水线里面的授权 + if (Objects.equals(pipelineVo.getType(), PipelineType.APPSYSTEM.getValue())) { + IAppSystemMapper appSystemMapper = CrossoverServiceFactory.getApi(IAppSystemMapper.class); + AppSystemVo appSystemVo = appSystemMapper.getAppSystemById(pipelineVo.getAppSystemId()); + if (appSystemVo == null) { + throw new AppSystemNotFoundException(pipelineVo.getAppSystemId()); + } + if (!pipelineIdList.contains(pipelineVo.getId())) { + Set actionSet = DeployAppAuthChecker.builder(pipelineVo.getAppSystemId()) + .addOperationAction(DeployAppConfigAction.PIPELINE.getValue()) + .check(); + if (!actionSet.contains(DeployAppConfigAction.PIPELINE.getValue())) { + throw new DeployAppPipelineAuthException(appSystemVo, pipelineVo); + } + } + //“全局流水线” 需要 对应超级流水线里面的授权 + } else if (Objects.equals(pipelineVo.getType(), PipelineType.GLOBAL.getValue()) && !pipelineIdList.contains(pipelineVo.getId())) { + throw new DeployAppPipelineAuthException(pipelineVo); + } + } + } + } else { + Set authSet = DeployAppAuthChecker.builder(deployJobVo.getAppSystemId()) + .addEnvAction(deployJobVo.getEnvId()) + .addScenarioAction(deployJobVo.getScenarioId()) + .addOperationAction(DeployAppConfigAction.EXECUTE.getValue()) + .check(); + if (!authSet.containsAll(Arrays.asList(deployJobVo.getEnvId().toString(), deployJobVo.getScenarioId().toString(), DeployAppConfigAction.EXECUTE.getValue()))) { throw new DeployJobCannotExecuteException(deployJobVo); } } @@ -634,14 +673,14 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase public void getJobActionAuth(AutoexecJobVo jobVo) { boolean isHasAuth = false; //包含BATCHJOB_MODIFY 则拥有所有应用的执行权限 - if (AuthActionChecker.checkByUserUuid(UserContext.get().getUserUuid(true), BATCHDEPLOY_MODIFY.class.getSimpleName())) { + if (Boolean.TRUE.equals(AuthActionChecker.checkByUserUuid(UserContext.get().getUserUuid(true), BATCHDEPLOY_MODIFY.class.getSimpleName()))) { isHasAuth = true; } else { if (!Objects.equals(jobVo.getSource(), JobSource.BATCHDEPLOY.getValue())) { DeployJobVo deployJobVo = deployJobMapper.getDeployJobByJobId(jobVo.getId()); if (deployJobVo != null) { - Set authSet = DeployAppAuthChecker.builder(deployJobVo.getAppSystemId()).addEnvAction(deployJobVo.getEnvId()).addScenarioAction(deployJobVo.getScenarioId()).check(); - if (authSet.containsAll(Arrays.asList(deployJobVo.getEnvId().toString(), deployJobVo.getScenarioId().toString()))) { + Set authSet = DeployAppAuthChecker.builder(deployJobVo.getAppSystemId()).addEnvAction(deployJobVo.getEnvId()).addScenarioAction(deployJobVo.getScenarioId()).addOperationAction(DeployAppConfigAction.EXECUTE.getValue()).check(); + if (authSet.containsAll(Arrays.asList(deployJobVo.getEnvId().toString(), deployJobVo.getScenarioId().toString(), DeployAppConfigAction.EXECUTE.getValue()))) { isHasAuth = true; } } @@ -885,4 +924,13 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase public void handleDeleteJobPhaseNodeEvent(Long jobPhaseId, Long updateTag) { //deployBlueGreenMapper.deleteJobPhaseNodeBlueGreenByJobPhaseIdAndUpdateTag(jobPhaseId, updateTag); } + + @Override + public void autoexecTakeOver(AutoexecJobVo jobVo) { + //如果是批量作业则需要自动接管作业 + if(JobSource.isBatch(jobVo.getSource())) { + autoexecJobMapper.updateJobExecUser(jobVo.getId(), UserContext.get().getUserUuid(true)); + jobVo.setExecUser(UserContext.get().getUserUuid(true)); + } + } } diff --git a/src/main/java/neatlogic/module/deploy/service/DeployBatchJobServiceImpl.java b/src/main/java/neatlogic/module/deploy/service/DeployBatchJobServiceImpl.java index e3bc5665..468e2f5d 100644 --- a/src/main/java/neatlogic/module/deploy/service/DeployBatchJobServiceImpl.java +++ b/src/main/java/neatlogic/module/deploy/service/DeployBatchJobServiceImpl.java @@ -78,6 +78,7 @@ public class DeployBatchJobServiceImpl implements DeployBatchJobService, IDeploy // parentId为-1时,代表该作业是父作业 deployJobVo.setParentId(-1L); deployJobMapper.insertAutoExecJob(deployJobVo); + deployJobMapper.insertJobInvoke(deployJobVo.getId(), deployJobVo.getInvokeId(), deployJobVo.getSource(), deployJobVo.getRouteId()); if (CollectionUtils.isNotEmpty(pipelineVo.getAuthList())) { for (PipelineAuthVo authVo : pipelineVo.getAuthList()) { DeployJobAuthVo deployAuthVo = new DeployJobAuthVo(); @@ -155,7 +156,6 @@ public class DeployBatchJobServiceImpl implements DeployBatchJobService, IDeploy } } - deployJobMapper.insertJobInvoke(deployJobVo.getId(), deployJobVo.getInvokeId(), deployJobVo.getSource(), deployJobVo.getRouteId()); if (isFire) { deployBatchJobService.fireBatch(deployJobVo.getId(), JobAction.RESET_REFIRE.getValue(), JobAction.RESET_REFIRE.getValue()); @@ -309,9 +309,11 @@ public class DeployBatchJobServiceImpl implements DeployBatchJobService, IDeploy jobVo.setAction(groupVo.getJobAction()); IAutoexecJobActionHandler refireAction = AutoexecJobActionHandlerFactory.getAction(JobAction.REFIRE.getValue()); jobVo.setPassThroughEnv(passThroughEnv); - jobVo.setIsTakeOver(1); jobVo.setExecUser(UserContext.get().getUserUuid(true)); refireAction.doService(jobVo); + } catch (ApiRuntimeException e) { + deployBatchJobMapper.updateGroupStatus(new LaneGroupVo(groupId, JobStatus.FAILED.getValue())); + throw new ApiRuntimeException(e.getMessage(),e); } catch (Exception ex) { deployBatchJobMapper.updateGroupStatus(new LaneGroupVo(groupId, JobStatus.FAILED.getValue())); logger.error("Fire job by batch failed," + ex.getMessage(), ex); @@ -401,7 +403,7 @@ public class DeployBatchJobServiceImpl implements DeployBatchJobService, IDeploy // groupStatus = nextGroupId == null ? groupStatus : JobPhaseStatus.WAIT_INPUT.getValue(); // } // if (groupStatus.equalsIgnoreCase(JobStatus.FAILED.getValue())) { - deployBatchJobMapper.updateBatchJobStatusByGroupId(groupVo.getId(), JobStatus.FAILED.getValue()); + deployBatchJobMapper.updateBatchJobStatusByGroupId(groupVo.getId(), JobStatus.FAILED.getValue()); // } } else if (groupStatus.equalsIgnoreCase(JobStatus.ABORTED.getValue())) { deployBatchJobMapper.updateBatchJobStatusByGroupId(groupVo.getId(), JobStatus.ABORTED.getValue()); diff --git a/src/main/java/neatlogic/module/deploy/service/DeployCiServiceImpl.java b/src/main/java/neatlogic/module/deploy/service/DeployCiServiceImpl.java index 7242e48e..0af775cf 100644 --- a/src/main/java/neatlogic/module/deploy/service/DeployCiServiceImpl.java +++ b/src/main/java/neatlogic/module/deploy/service/DeployCiServiceImpl.java @@ -252,7 +252,7 @@ public class DeployCiServiceImpl implements DeployCiService { } deployJobVo.setAppSystemModuleVersionList(Collections.singletonList(new DeploySystemModuleVersionVo(ci.getAppSystemId(), ci.getAppModuleId(), deployVersionId))); deployJobVo.setReviewStatus(ReviewStatus.PASSED.getValue()); - deployJobVo.setSource(JobSource.DEPLOY_CI.getValue());// 可能是 + deployJobVo.setSource(JobSource.DEPLOY_CI_PIPELINE.getValue());// 可能是 deployJobVo.setExecUser(UserContext.get().getUserUuid()); return deployJobVo; } -- Gitee From f7ad2f251084913d5c3fe057dd35cf186c1bcf62 Mon Sep 17 00:00:00 2001 From: lvzk <897706680@qq.com> Date: Tue, 12 Aug 2025 19:16:49 +0800 Subject: [PATCH 2/3] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E6=88=96=E5=8F=91=E5=B8=83=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E7=9A=84=E6=89=A7=E8=A1=8C=E4=BA=BA=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E6=98=AF=E7=82=B9=E5=87=BB=E6=89=A7=E8=A1=8C=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E7=9A=84=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deploy/schedule/plugin/DeployJobScheduleJob.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/neatlogic/module/deploy/schedule/plugin/DeployJobScheduleJob.java b/src/main/java/neatlogic/module/deploy/schedule/plugin/DeployJobScheduleJob.java index 428a2efc..a23937c9 100644 --- a/src/main/java/neatlogic/module/deploy/schedule/plugin/DeployJobScheduleJob.java +++ b/src/main/java/neatlogic/module/deploy/schedule/plugin/DeployJobScheduleJob.java @@ -43,6 +43,7 @@ import neatlogic.module.deploy.dao.mapper.DeployScheduleMapper; import neatlogic.module.deploy.service.DeployBatchJobService; import neatlogic.module.deploy.service.DeployJobService; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; import org.slf4j.Logger; @@ -137,10 +138,14 @@ public class DeployJobScheduleJob extends JobBase { schedulerManager.unloadJob(jobObject); return; } - UserVo execUser = userMapper.getUserBaseInfoByUuid(scheduleVo.getLcu()); + String execUserUuid = scheduleVo.getLcu(); + if(StringUtils.isNotBlank(jobObject.getTestUserUuid())){ + execUserUuid = jobObject.getTestUserUuid(); + } + UserVo execUser = userMapper.getUserBaseInfoByUuid(execUserUuid); if (execUser == null) { schedulerManager.unloadJob(jobObject); - logger.error("execUser: {} not exist!", scheduleVo.getLcu()); + logger.error("execUser: {} not exist!", execUserUuid); return; } AuthenticationInfoVo authenticationInfo = authenticationInfoService.getAuthenticationInfo(execUser.getUuid()); -- Gitee From d5a947979444de9570bbd42d4ecb9dbdf6dd9a5d Mon Sep 17 00:00:00 2001 From: lvzk <897706680@qq.com> Date: Tue, 12 Aug 2025 19:19:00 +0800 Subject: [PATCH 3/3] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E6=88=96=E5=8F=91=E5=B8=83=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E7=9A=84=E6=89=A7=E8=A1=8C=E4=BA=BA=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E6=98=AF=E7=82=B9=E5=87=BB=E6=89=A7=E8=A1=8C=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E7=9A=84=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/deploy/schedule/plugin/DeployJobScheduleJob.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/neatlogic/module/deploy/schedule/plugin/DeployJobScheduleJob.java b/src/main/java/neatlogic/module/deploy/schedule/plugin/DeployJobScheduleJob.java index a23937c9..85fc1c35 100644 --- a/src/main/java/neatlogic/module/deploy/schedule/plugin/DeployJobScheduleJob.java +++ b/src/main/java/neatlogic/module/deploy/schedule/plugin/DeployJobScheduleJob.java @@ -139,7 +139,7 @@ public class DeployJobScheduleJob extends JobBase { return; } String execUserUuid = scheduleVo.getLcu(); - if(StringUtils.isNotBlank(jobObject.getTestUserUuid())){ + if(jobObject.isTest() == 1 && StringUtils.isNotBlank(jobObject.getTestUserUuid())){ execUserUuid = jobObject.getTestUserUuid(); } UserVo execUser = userMapper.getUserBaseInfoByUuid(execUserUuid); -- Gitee