From b9d87f9b3cb7c5e090b55d8a9772627fec6bd05f Mon Sep 17 00:00:00 2001 From: zhuxinru Date: Mon, 2 Feb 2026 15:44:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E4=BA=BA=E5=AF=B9=E7=AE=97=E4=BE=8B=E3=80=81=E5=85=B3=E8=81=94?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E6=96=87=E4=BB=B6=E5=A4=B9=E7=9A=84=E6=9D=83?= =?UTF-8?q?=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/enums/FilePermissionEnum.java | 3 +- .../impl/MinioFileIDataFileServiceImpl.java | 16 ++++- .../service/impl/DemandServiceImpl.java | 53 +++++++------- .../service/impl/ProjectServiceImpl.java | 42 ++++++++++- .../impl/SimulationRunServiceImpl.java | 42 +++++++++++ .../impl/SimulationTaskServiceImpl.java | 1 - .../project/service/impl/TaskServiceImpl.java | 72 ++++++++++++++++--- 7 files changed, 185 insertions(+), 44 deletions(-) diff --git a/common/src/main/java/com/sdm/common/entity/enums/FilePermissionEnum.java b/common/src/main/java/com/sdm/common/entity/enums/FilePermissionEnum.java index efcf7c13..6aa3ea04 100644 --- a/common/src/main/java/com/sdm/common/entity/enums/FilePermissionEnum.java +++ b/common/src/main/java/com/sdm/common/entity/enums/FilePermissionEnum.java @@ -8,7 +8,8 @@ public enum FilePermissionEnum { DOWNLOAD((byte) 0x10), ZERO((byte) 0), ALL((byte) (READ.value | WRITE.value | DELETE.value | DOWNLOAD.value | UPLOAD.value)), - BASE((byte) (READ.value | DOWNLOAD.value)); + BASE((byte) (READ.value | DOWNLOAD.value)), + ALL_EXCLUDE_DELETE((byte) (READ.value | WRITE.value | DOWNLOAD.value | UPLOAD.value)); byte value; FilePermissionEnum(byte i) { diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java index 33447bcf..402aeeac 100644 --- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java @@ -1406,12 +1406,22 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { String oldDirMinioObjectKey = sourceMetadataInfo.getObjectKey(); // 要挪到的task文件夹 FileMetadataInfo targetParentMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getRelatedResourceUuid, req.getParentUuid()).one(); + String originalName = sourceMetadataInfo.getOriginalName(); + + // 如果文件有后缀,则在文件名和后缀之间插入版本号 + int dotIndex = originalName.lastIndexOf('.'); // 新的路径名 - String newDirMinioObjectKey = getFileMinioObjectKey(targetParentMetadataInfo.getObjectKey() + sourceMetadataInfo.getOriginalName()); + String newDirMinioObjectKey = getFileMinioObjectKey(targetParentMetadataInfo.getObjectKey() + originalName.substring(0, dotIndex) + "_V1" + originalName.substring(dotIndex)); // 把以前归档的过同名文件删除 保留最新的 - Optional existingFileOptional = getFileMetadataInfoByObjectKey(newDirMinioObjectKey, ThreadLocalContext.getTenantId()); - existingFileOptional.ifPresent(existingFile -> fileMetadataInfoService.removeById(existingFile)); + Long tenantId = ThreadLocalContext.getTenantId(); + String currentTenantBucketName = minioService.getCurrentTenantBucketName(); + FileMetadataInfo existFile = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getBucketName, currentTenantBucketName) + .eq(FileMetadataInfo::getObjectKey, newDirMinioObjectKey) + .eq(ObjectUtils.isNotEmpty(tenantId), FileMetadataInfo::getTenantId, tenantId).one(); + if (existFile != null) { + fileMetadataInfoService.removeById(existFile); + } try { minioService.copyFile(oldDirMinioObjectKey, newDirMinioObjectKey,sourceMetadataInfo.getBucketName()); diff --git a/project/src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java index ee522516..16a84f87 100644 --- a/project/src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java @@ -688,7 +688,7 @@ public class DemandServiceImpl extends BaseService implements IDemandService { taskMemberNode.setUserId(userId); taskMemberNode.setType(MemberTypeEnum.PRINCIPAL.getCode()); projectNodeMemberList.add(taskMemberNode); - // 更新需求负责人对需求文件权限 + // 更新任务仿真负责人对任务文件夹的权限 BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); item.setUuid(task.getUuid()); Map userPermissions = new HashMap<>(); @@ -696,13 +696,13 @@ public class DemandServiceImpl extends BaseService implements IDemandService { item.setUserPermissions(userPermissions); filePermissions.add(item); - // 更新需求负责人对任务文件夹的权限 - BatchUpdatePermissionReq.FilePermissionItem demandItem = new BatchUpdatePermissionReq.FilePermissionItem(); - demandItem.setUuid(task.getUuid()); - Map demandUserPermissions = new HashMap<>(); - demandUserPermissions.put(demandCreator, FilePermissionEnum.BASE.getValue()); - demandItem.setUserPermissions(demandUserPermissions); - filePermissions.add(demandItem); + // 更新任务仿真负责人对关联的需求文件夹权限 + BatchUpdatePermissionReq.FilePermissionItem item1 = new BatchUpdatePermissionReq.FilePermissionItem(); + item1.setUuid(demandId); + Map userPermissions1 = new HashMap<>(); + userPermissions1.put(Long.valueOf(userId), FilePermissionEnum.BASE.getValue()); + item1.setUserPermissions(userPermissions1); + filePermissions.add(item1); } } if (StringUtils.isNotBlank(eUserIdStr)) { @@ -716,15 +716,31 @@ public class DemandServiceImpl extends BaseService implements IDemandService { projectNodeMemberList.add(taskMemberNode); // 发送消息通知 sendMessage(MessageTemplateEnum.TASK_ISSUE, task.getNodeName(), userId, task.getUuid()); - // 更新需求执行人对需求文件权限 + // 更新任务仿真执行人对任务文件夹权限 BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); item.setUuid(task.getUuid()); Map userPermissions = new HashMap<>(); - userPermissions.put(Long.valueOf(userId), FilePermissionEnum.ALL.getValue()); + userPermissions.put(Long.valueOf(userId), FilePermissionEnum.ALL_EXCLUDE_DELETE.getValue()); item.setUserPermissions(userPermissions); filePermissions.add(item); + + // 更新任务仿真执行人对关联的需求文件夹权限 + BatchUpdatePermissionReq.FilePermissionItem item1 = new BatchUpdatePermissionReq.FilePermissionItem(); + item1.setUuid(demandId); + Map userPermissions1 = new HashMap<>(); + userPermissions1.put(Long.valueOf(userId), FilePermissionEnum.BASE.getValue()); + item1.setUserPermissions(userPermissions1); + filePermissions.add(item1); } } + // 更新需求创建人对任务文件夹的权限 + BatchUpdatePermissionReq.FilePermissionItem demandItem = new BatchUpdatePermissionReq.FilePermissionItem(); + demandItem.setUuid(task.getUuid()); + Map demandUserPermissions = new HashMap<>(); + demandUserPermissions.put(demandCreator, FilePermissionEnum.BASE.getValue()); + demandItem.setUserPermissions(demandUserPermissions); + filePermissions.add(demandItem); + List extraList = task.getExtras(); if (CollectionUtils.isNotEmpty(extraList)) { for (TaskExtraNode extra : extraList) { @@ -793,23 +809,6 @@ public class DemandServiceImpl extends BaseService implements IDemandService { for (TaskNode taskNode : taskNodeList) { createDir(taskNode.getUuid(), parentUuid, taskNode.getNodeName()); } - for (TaskNode taskNode : taskNodeList) { - // 更新需求创建人对需求文件夹权限 - BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); - item.setUuid(taskNode.getUuid()); - Map userPermissions = new HashMap<>(); - userPermissions.put(jobNumber, FilePermissionEnum.ALL.getValue()); - item.setUserPermissions(userPermissions); - filePermissions.add(item); - - // 更新需求创建人对任务文件夹的权限 - BatchUpdatePermissionReq.FilePermissionItem demandItem = new BatchUpdatePermissionReq.FilePermissionItem(); - demandItem.setUuid(taskNode.getUuid()); - Map demandUserPermissions = new HashMap<>(); - demandUserPermissions.put(demandCreator, FilePermissionEnum.BASE.getValue()); - demandItem.setUserPermissions(demandUserPermissions); - filePermissions.add(demandItem); - } } if (CollectionUtils.isNotEmpty(projectNodeExtraList)) { projectNodeExtraList.forEach(projectNode -> projectNode.setCreateTime(createTime)); diff --git a/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java index 4a5aae1e..b26b8f53 100644 --- a/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java @@ -352,8 +352,32 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { // 7. 批量同步新成员权限(关注人无权限) if (!MemberTypeEnum.ATTENTION.equals(memberType)) { - // TODO 优化:替换为批量权限更新方法 updateBatchPermission(newMemberIdList, taskUuid) - newMemberIdList.forEach(userId -> updatePermission(userId, taskUuid)); + UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq(); + updatePermissionReq.setUuid(taskUuid); + Map userPermissions = new HashMap<>(); + for (Long userId : newMemberIdList) { + userPermissions.put(userId, MemberTypeEnum.EXECUTOR.equals(memberType) ? FilePermissionEnum.ALL_EXCLUDE_DELETE.getValue() : FilePermissionEnum.ALL.getValue()); + } + updatePermissionReq.setUserPermissions(userPermissions); + log.info("仿真策划时,更新用户权限的参数为:{}",updatePermissionReq); + SdmResponse updatePermissionResponse = dataClientFeignClient.updatePermission(updatePermissionReq); + log.info("仿真策划时,更新用户权限的返回值为:{}",updatePermissionResponse); +// newMemberIdList.forEach(userId -> updatePermission(userId, taskUuid)); + } + } + + private void batchUpdatePermission(List filePermissions) { + if (CollectionUtils.isNotEmpty(filePermissions)) { + BatchUpdatePermissionReq batchReq = new BatchUpdatePermissionReq(); + batchReq.setFilePermissions(filePermissions); + + log.info("仿真策划新增任务时,批量更新权限,任务数量:{}", filePermissions.size()); + SdmResponse response = dataClientFeignClient.batchUpdatePermission(batchReq); + log.info("仿真策划新增任务时,批量更新权限结果:{}", response); + + if (!response.isSuccess()) { + log.error("批量更新算例权限失败:{}", response.getMessage()); + } } } @@ -1465,6 +1489,7 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { TaskMemberNode taskMemberNode = new TaskMemberNode(); taskMemberNode.setUserId(String.valueOf(userId)); taskMemberNode.setTaskId(projectNode.getUuid()); + taskMemberNode.setType(MemberTypeEnum.EXECUTOR.getCode()); projectNodeMemberList.add(taskMemberNode); } } @@ -1477,6 +1502,7 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { TaskMemberNode taskMemberNode = new TaskMemberNode(); taskMemberNode.setUserId(String.valueOf(userId)); taskMemberNode.setTaskId(projectNode.getUuid()); + taskMemberNode.setType(MemberTypeEnum.PRINCIPAL.getCode()); projectNodeMemberList.add(taskMemberNode); } } @@ -2016,9 +2042,19 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { } log.info("taskNodeMemberList为:{}",taskNodeMemberList); if (CollectionUtils.isNotEmpty(taskNodeMemberList)) { + List filePermissions = new ArrayList<>(); + for (TaskMemberNode taskMemberNode : taskNodeMemberList) { - updatePermission(Long.valueOf(taskMemberNode.getUserId()),taskMemberNode.getTaskId()); + BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); + item.setUuid(taskMemberNode.getTaskId()); + + Map userPermissions = new HashMap<>(); + userPermissions.put(Long.valueOf(taskMemberNode.getUserId()), MemberTypeEnum.EXECUTOR.getCode().equals(taskMemberNode.getType()) ? FilePermissionEnum.ALL_EXCLUDE_DELETE.getValue() : FilePermissionEnum.ALL.getValue()); + item.setUserPermissions(userPermissions); + + filePermissions.add(item); } + batchUpdatePermission(filePermissions); } if (CollectionUtils.isNotEmpty(projectNodePerformanceList)) { projectNodePerformanceList.forEach(projectNode -> { diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 16cdb145..50fb264c 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -641,6 +641,33 @@ public class SimulationRunServiceImpl extends ServiceImpl filePermissions = new ArrayList<>(); + + // 1、任务执行人对任务下自己建的算例文件夹有所有权限 + BatchUpdatePermissionReq.FilePermissionItem currentUserRunItem = new BatchUpdatePermissionReq.FilePermissionItem(); + currentUserRunItem.setUuid(simulationRun.getUuid()); + Map userPermissions = new HashMap<>(); + userPermissions.put(userId, FilePermissionEnum.ALL.getValue()); + currentUserRunItem.setUserPermissions(userPermissions); + filePermissions.add(currentUserRunItem); + + // 2、任务执行人对其他执行人建的算例有预览、下载权限 + // 查询当前任务下其他算例 + List otherRuns = this.lambdaQuery().eq(SimulationRun::getTaskId, simulationTask.getUuid()) + .ne(SimulationRun::getCreator, userId).list(); + if (CollectionUtils.isNotEmpty(otherRuns)) { + for (SimulationRun otherRun : otherRuns) { + BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); + item.setUuid(otherRun.getUuid()); + Map permissions = new HashMap<>(); + permissions.put(userId, FilePermissionEnum.BASE.getValue()); + item.setUserPermissions(permissions); + filePermissions.add(item); + } + } + + batchUpdateRunPermission(filePermissions); + // 解析流程模板中的节点结构,初始化流程节点表 SdmResponse flowTemplateResp = flowFeignClient.queryFlowTemplateInfo(simulationRun.getFlowTemplate()); if (flowTemplateResp.getData() != null) { @@ -702,6 +729,21 @@ public class SimulationRunServiceImpl extends ServiceImpl filePermissions) { + if (CollectionUtils.isNotEmpty(filePermissions)) { + BatchUpdatePermissionReq batchReq = new BatchUpdatePermissionReq(); + batchReq.setFilePermissions(filePermissions); + + log.info("创建算例时,批量更新权限,任务数量:{}", filePermissions.size()); + SdmResponse response = dataFeignClient.batchUpdatePermission(batchReq); + log.info("创建算例时,批量更新权限结果:{}", response); + + if (!response.isSuccess()) { + log.error("批量更新算例权限失败:{}", response.getMessage()); + } + } + } + private SdmResponse createDir(String uuid, String parentUuid, String dirName, Integer dirType, String uuidOwnType) { CreateDirReq createDirReq = new CreateDirReq(); createDirReq.setUuId(uuid); diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java index 75393d25..ce0f098c 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java @@ -165,7 +165,6 @@ public class SimulationTaskServiceImpl extends ServiceImpl longUserIdList = Arrays.stream(userIdArr).filter(s -> !s.isEmpty()).map(Long::valueOf).collect(Collectors.toList()); simulationTaskMemberService.deleteTaskMemberList(req.getUuid(), MemberTypeEnum.EXECUTOR.getCode()); simulationTaskMemberService.saveTaskMemberList(req.getUuid(), MemberTypeEnum.EXECUTOR.getCode(), longUserIdList); - // 对关联的需求文件夹设置权限 } // 设置仿真负责人 if (StringUtils.isNotBlank(req.getPMemberList())) { diff --git a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java index ddc0edf7..bd745cc9 100644 --- a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java @@ -9,10 +9,7 @@ import com.sdm.common.common.ThreadLocalContext; import com.sdm.common.entity.ExportExcelFormat; import com.sdm.common.entity.constants.ProjectConstants; import com.sdm.common.entity.enums.*; -import com.sdm.common.entity.req.data.CreateDirReq; -import com.sdm.common.entity.req.data.DelDirReq; -import com.sdm.common.entity.req.data.QueryFileReq; -import com.sdm.common.entity.req.data.UpdatePermissionReq; +import com.sdm.common.entity.req.data.*; import com.sdm.common.entity.req.export.PerformanceAnalysisExportExcelFormat; import com.sdm.common.entity.req.export.RunAnalysisExportExcelFormat; import com.sdm.common.entity.req.export.TaskAnalysisExportExcelFormat; @@ -1292,6 +1289,21 @@ public class TaskServiceImpl implements ITaskService { log.info("编辑任务时,更新用户权限的返回值为:{}",updatePermissionResponse); } + private void batchUpdatePermission(List filePermissions) { + if (CollectionUtils.isNotEmpty(filePermissions)) { + BatchUpdatePermissionReq batchReq = new BatchUpdatePermissionReq(); + batchReq.setFilePermissions(filePermissions); + + log.info("编辑任务时,批量更新权限,任务数量:{}", filePermissions.size()); + SdmResponse response = dataClientFeignClient.batchUpdatePermission(batchReq); + log.info("编辑任务时,批量更新权限结果:{}", response); + + if (!response.isSuccess()) { + log.error("批量更新算例权限失败:{}", response.getMessage()); + } + } + } + @Override @Transactional(rollbackFor = Exception.class) @@ -1305,7 +1317,8 @@ public class TaskServiceImpl implements ITaskService { Long userId = ThreadLocalContext.getUserId(); for (String taskId : taskOpr.getTaskIds()) { req.setTaskId(taskId); - if (simulationTaskService.lambdaQuery().eq(SimulationTask::getUuid, taskId).count() <= 0) { + SimulationTask task = simulationTaskService.lambdaQuery().eq(SimulationTask::getUuid, taskId).one(); + if (task == null) { log.error("根据taskId:{},未查询到任务", taskId); return SdmResponse.failed("未查询到任务"); } @@ -1357,11 +1370,30 @@ public class TaskServiceImpl implements ITaskService { newUserIdList.forEach(i -> { sendMessage(MessageTemplateEnum.TASK_ISSUE, req.getNodeName(), String.valueOf(i), taskId); }); + + List filePermissions = new ArrayList<>(); // 保存当前的仿真执行人权限 for (Long currentUserId : currentUserIdList) { - updatePermission(currentUserId,taskId); + BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); + item.setUuid(task.getUuid()); + Map userPermissions = new HashMap<>(); + userPermissions.put(currentUserId, FilePermissionEnum.ALL_EXCLUDE_DELETE.getValue()); + item.setUserPermissions(userPermissions); + filePermissions.add(item); } - // 对关联的需求文件夹设置权限 + // 设置任务执行人对关联的需求文件夹设置权限 + if (StringUtils.isNotEmpty(task.getDemandId())) { + SpdmDemandVo demand = demandMapper.getDemandListById(Collections.singletonList(task.getDemandId())).get(0); + for (Long currentUserId : currentUserIdList) { + BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); + item.setUuid(demand.getUuid()); + Map userPermissions = new HashMap<>(); + userPermissions.put(currentUserId, FilePermissionEnum.BASE.getValue()); + item.setUserPermissions(userPermissions); + filePermissions.add(item); + } + } + batchUpdatePermission(filePermissions); // if (StringUtils.isNotBlank(req.getEMemberList())) { @@ -3679,7 +3711,8 @@ public class TaskServiceImpl implements ITaskService { Long userId = ThreadLocalContext.getUserId(); for (String taskId : taskOpr.getTaskIds()) { req.setTaskId(taskId); - if (simulationTaskService.lambdaQuery().eq(SimulationTask::getUuid, taskId).count() <= 0) { + SimulationTask task = simulationTaskService.lambdaQuery().eq(SimulationTask::getUuid, taskId).one(); + if (task == null) { log.error("根据taskId:{},未查询到任务", taskId); return SdmResponse.failed("未查询到任务"); } @@ -3731,10 +3764,31 @@ public class TaskServiceImpl implements ITaskService { newUserIdList.forEach(i -> { sendMessage(MessageTemplateEnum.TASK_ISSUE, req.getNodeName(), String.valueOf(i), taskId); }); + + List filePermissions = new ArrayList<>(); // 保存当前的仿真执行人权限 for (Long currentUserId : currentUserIdList) { - updatePermission(currentUserId,taskId); + BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); + item.setUuid(task.getUuid()); + Map userPermissions = new HashMap<>(); + userPermissions.put(currentUserId, FilePermissionEnum.ALL_EXCLUDE_DELETE.getValue()); + item.setUserPermissions(userPermissions); + filePermissions.add(item); } + // 设置任务执行人对关联的需求文件夹设置权限 + if (StringUtils.isNotEmpty(task.getDemandId())) { + SpdmDemandVo demand = demandMapper.getDemandListById(Collections.singletonList(task.getDemandId())).get(0); + for (Long currentUserId : currentUserIdList) { + BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); + item.setUuid(demand.getUuid()); + Map userPermissions = new HashMap<>(); + userPermissions.put(currentUserId, FilePermissionEnum.BASE.getValue()); + item.setUserPermissions(userPermissions); + filePermissions.add(item); + } + } + batchUpdatePermission(filePermissions); + // 新增拓展属性 List extraList = req.getExtras(); if (CollectionUtils.isEmpty(extraList)) {