feat(file、requirement): 优化文件服务和需求管理功能
- 新增按配置ID和路径获取文件的方法 - 实现文件不存在时的404响应处理 - 优化文件上传路径生成逻辑,使用UUID确保文件名安全性 - 添加需求执行选项查询接口和实现 - 支持排除特定状态码的需求分页查询 - 重构需求模块过滤逻辑并提取公共方法 - 修复S3客户端对象键解析问题
This commit is contained in:
@@ -76,6 +76,13 @@ public class ProjectRequirementController {
|
||||
return success(requirementService.getRequirementTree(pageReqVO));
|
||||
}
|
||||
|
||||
@GetMapping("/execution-options")
|
||||
@Operation(summary = "获取执行可关联的项目需求下拉选项")
|
||||
public CommonResult<PageResult<ProjectRequirementRespVO>> getExecutionRequirementOptions(
|
||||
@Valid ProjectRequirementPageReqVO pageReqVO) {
|
||||
return success(requirementService.getExecutionRequirementOptions(pageReqVO));
|
||||
}
|
||||
|
||||
@PostMapping("/change-status")
|
||||
@Operation(summary = "变更需求状态")
|
||||
public CommonResult<Boolean> changeRequirementStatus(@Valid @RequestBody ProjectRequirementStatusActionReqVO reqVO) {
|
||||
|
||||
@@ -22,20 +22,28 @@ public interface ProjectRequirementMapper extends BaseMapperX<ProjectRequirement
|
||||
* 分页查询需求列表
|
||||
*/
|
||||
default PageResult<ProjectRequirementDO> selectPage(ProjectRequirementPageReqVO reqVO) {
|
||||
return selectPage(reqVO, buildQueryWrapper(reqVO));
|
||||
return selectPage(reqVO, buildQueryWrapper(reqVO, null));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询需求列表,并排除指定状态集合。
|
||||
*/
|
||||
default PageResult<ProjectRequirementDO> selectPage(ProjectRequirementPageReqVO reqVO, Collection<String> excludeStatusCodes) {
|
||||
return selectPage(reqVO, buildQueryWrapper(reqVO, excludeStatusCodes));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询所有符合条件的需求列表,用于树查询
|
||||
*/
|
||||
default List<ProjectRequirementDO> selectList(ProjectRequirementPageReqVO reqVO) {
|
||||
return selectList(buildQueryWrapper(reqVO));
|
||||
return selectList(buildQueryWrapper(reqVO, null));
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建查询条件
|
||||
*/
|
||||
private LambdaQueryWrapperX<ProjectRequirementDO> buildQueryWrapper(ProjectRequirementPageReqVO reqVO) {
|
||||
private LambdaQueryWrapperX<ProjectRequirementDO> buildQueryWrapper(ProjectRequirementPageReqVO reqVO,
|
||||
Collection<String> excludeStatusCodes) {
|
||||
LambdaQueryWrapperX<ProjectRequirementDO> queryWrapper = new LambdaQueryWrapperX<>();
|
||||
if (StringUtils.hasText(reqVO.getTitle())) {
|
||||
queryWrapper.like(ProjectRequirementDO::getTitle, reqVO.getTitle());
|
||||
@@ -49,8 +57,11 @@ public interface ProjectRequirementMapper extends BaseMapperX<ProjectRequirement
|
||||
.inIfPresent(ProjectRequirementDO::getModuleId, reqVO.getModuleIds())
|
||||
.eqIfPresent(ProjectRequirementDO::getModuleId, reqVO.getModuleId())
|
||||
.eqIfPresent(ProjectRequirementDO::getParentId, reqVO.getParentId())
|
||||
.eq(ProjectRequirementDO::getProjectId, reqVO.getProjectId())
|
||||
.orderByAsc(ProjectRequirementDO::getSort)
|
||||
.eq(ProjectRequirementDO::getProjectId, reqVO.getProjectId());
|
||||
if (excludeStatusCodes != null && !excludeStatusCodes.isEmpty()) {
|
||||
queryWrapper.notIn(ProjectRequirementDO::getStatusCode, excludeStatusCodes);
|
||||
}
|
||||
queryWrapper.orderByAsc(ProjectRequirementDO::getSort)
|
||||
.orderByDesc(ProjectRequirementDO::getCreateTime);
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,8 @@ public interface ProjectRequirementService {
|
||||
|
||||
PageResult<ProjectRequirementRespVO> getRequirementTree(ProjectRequirementPageReqVO pageReqVO);
|
||||
|
||||
PageResult<ProjectRequirementRespVO> getExecutionRequirementOptions(ProjectRequirementPageReqVO pageReqVO);
|
||||
|
||||
void changeRequirementStatus(ProjectRequirementStatusActionReqVO reqVO);
|
||||
|
||||
void changeRequirementStatusForReview(ProjectRequirementStatusActionReqVO reqVO);
|
||||
|
||||
@@ -255,21 +255,9 @@ public class ProjectRequirementServiceImpl implements ProjectRequirementService
|
||||
@Override
|
||||
@CheckObjectPermission(objectType = PROJECT_OBJECT_TYPE, objectId = "#pageReqVO.projectId", accessible = true)
|
||||
public PageResult<ProjectRequirementRespVO> getRequirementPage(ProjectRequirementPageReqVO pageReqVO) {
|
||||
if (pageReqVO.getModuleId() != null) {
|
||||
if (isAllRequirementsModule(pageReqVO.getModuleId())) {
|
||||
pageReqVO.setModuleId(null);
|
||||
} else {
|
||||
List<Long> moduleIds = getAllModuleIdsWithChildren(pageReqVO.getModuleId(), pageReqVO.getProjectId());
|
||||
pageReqVO.setModuleIds(moduleIds);
|
||||
pageReqVO.setModuleId(null);
|
||||
}
|
||||
}
|
||||
normalizePageModuleFilter(pageReqVO);
|
||||
PageResult<ProjectRequirementDO> pageResult = requirementMapper.selectPage(pageReqVO);
|
||||
Map<String, ObjectStatusModelDO> statusModelMap = getStatusModelMap();
|
||||
List<ProjectRequirementRespVO> list = pageResult.getList().stream()
|
||||
.map(requirement -> buildRequirementRespVO(requirement, statusModelMap))
|
||||
.collect(Collectors.toList());
|
||||
return new PageResult<>(list, pageResult.getTotal());
|
||||
return toRequirementRespPage(pageResult);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -325,6 +313,16 @@ public class ProjectRequirementServiceImpl implements ProjectRequirementService
|
||||
return new PageResult<>(list, (long) total);
|
||||
}
|
||||
|
||||
@Override
|
||||
@CheckObjectPermission(objectType = PROJECT_OBJECT_TYPE, objectId = "#pageReqVO.projectId", accessible = true)
|
||||
public PageResult<ProjectRequirementRespVO> getExecutionRequirementOptions(ProjectRequirementPageReqVO pageReqVO) {
|
||||
normalizePageModuleFilter(pageReqVO);
|
||||
Set<String> excludedStatusCodes = new HashSet<>(getTerminalStatusCodes());
|
||||
excludedStatusCodes.add(STATUS_REVIEW_REJECTED);
|
||||
PageResult<ProjectRequirementDO> pageResult = requirementMapper.selectPage(pageReqVO, excludedStatusCodes);
|
||||
return toRequirementRespPage(pageResult);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@CheckObjectPermission(objectType = PROJECT_OBJECT_TYPE, objectId = "#reqVO.projectId",
|
||||
@@ -749,6 +747,27 @@ public class ProjectRequirementServiceImpl implements ProjectRequirementService
|
||||
return childrenMap;
|
||||
}
|
||||
|
||||
private void normalizePageModuleFilter(ProjectRequirementPageReqVO pageReqVO) {
|
||||
if (pageReqVO.getModuleId() == null) {
|
||||
return;
|
||||
}
|
||||
if (isAllRequirementsModule(pageReqVO.getModuleId())) {
|
||||
pageReqVO.setModuleId(null);
|
||||
return;
|
||||
}
|
||||
List<Long> moduleIds = getAllModuleIdsWithChildren(pageReqVO.getModuleId(), pageReqVO.getProjectId());
|
||||
pageReqVO.setModuleIds(moduleIds);
|
||||
pageReqVO.setModuleId(null);
|
||||
}
|
||||
|
||||
private PageResult<ProjectRequirementRespVO> toRequirementRespPage(PageResult<ProjectRequirementDO> pageResult) {
|
||||
Map<String, ObjectStatusModelDO> statusModelMap = getStatusModelMap();
|
||||
List<ProjectRequirementRespVO> list = pageResult.getList().stream()
|
||||
.map(requirement -> buildRequirementRespVO(requirement, statusModelMap))
|
||||
.collect(Collectors.toList());
|
||||
return new PageResult<>(list, pageResult.getTotal());
|
||||
}
|
||||
|
||||
/**
|
||||
* 一次性加载当前对象类型下的状态模型,供列表和树查询复用。
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user