diff --git a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteFileService.java b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteFileService.java index 36cf769cf..9e3fd6f7b 100644 --- a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteFileService.java +++ b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteFileService.java @@ -107,4 +107,14 @@ public interface RemoteFileService { @RequestParam("type") String type, @RequestParam("hierarchy") String hierarchy, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 上传本地文件到Forge + * + * @param fileIdentifiers 文件标识列表,逗号分隔 + * @return Forge文件标识列表 + */ + @PostMapping(value = "/common/uploadFileToForge/{fileIdentifiers}") + R> uploadFileToForge(@PathVariable("fileIdentifiers") String fileIdentifiers, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteFileFallbackFactory.java b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteFileFallbackFactory.java index 915390c94..ea330cd94 100644 --- a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteFileFallbackFactory.java +++ b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteFileFallbackFactory.java @@ -70,6 +70,11 @@ public class RemoteFileFallbackFactory implements FallbackFactory packagedFile(HashMap packagedStructure, String zipFileName, String type, String hierarchy, String source) { return R.fail("打包文件失败:" + throwable.getMessage()); } + + @Override + public R> uploadFileToForge(String fileIdentifiers, String source) { + return R.fail("上传本地文件到Forge失败:" + throwable.getMessage()); + } }; } } diff --git a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/controller/CommonController.java b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/controller/CommonController.java index a066b679e..e248747bd 100644 --- a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/controller/CommonController.java +++ b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/controller/CommonController.java @@ -210,4 +210,17 @@ public class CommonController extends BaseController { sysFileInfo.setFilePath(""); return R.ok(sysFileInfo); } + + /** + * 上传本地文件到Forge + * + * @param fileIdentifiers 文件标识列表,逗号分隔 + * @return Forge文件标识列表 + */ + @InnerAuth + @PostMapping(value = "/uploadFileToForge/{fileIdentifiers}") + @ApiOperation(value = "上传本地文件到Forge", hidden = true) + R> uploadFileToForge(@PathVariable("fileIdentifiers") String fileIdentifiers) { + return R.ok(sysFileInfoService.uploadFileToForge(fileIdentifiers)); + } } diff --git a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/ISysFileInfoService.java b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/ISysFileInfoService.java index b5314ddb4..e9dac72bd 100644 --- a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/ISysFileInfoService.java +++ b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/ISysFileInfoService.java @@ -171,4 +171,6 @@ public interface ISysFileInfoService { * @return 压缩包文件标识 */ String packagedFile(HashMap packagedStructure, String zipFileName, String type, String hierarchy); + + List uploadFileToForge(String fileIdentifiers); } diff --git a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/impl/SysFileInfoServiceImpl.java b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/impl/SysFileInfoServiceImpl.java index 8913d17c4..25404a085 100644 --- a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/impl/SysFileInfoServiceImpl.java +++ b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/impl/SysFileInfoServiceImpl.java @@ -496,6 +496,30 @@ public class SysFileInfoServiceImpl implements ISysFileInfoService { return fileIdentifier; } + @Override + public List uploadFileToForge(String fileIdentifiers) { + List fileInfoList = getFileListByIdentifier(fileIdentifiers); + try { + List forgeFileIdentifierList = new ArrayList<>(); + for (SysFileInfo fileInfo : fileInfoList) { + String filePath = localFilePath + fileInfo.getFilePath(); + File file = new File(filePath); + if (!file.exists()) { + throw new ServiceException("该文件不存在"); + } + // 拷贝文件到打包目录 + FileInputStream fileInputStream = new FileInputStream(file); + MultipartFile multipartFile = FileUtils.createMultipartFile(fileInputStream, fileInfo.getFileOriginName()); + SysFileInfo sysFileInfo = upload(multipartFile, "pms-gitlink", null); + forgeFileIdentifierList.add(sysFileInfo.getFileIdentifier()); + } + return forgeFileIdentifierList; + } catch (IOException e) { + logger.error("上传本地文件到Forge失败{}", e.getMessage()); + throw new ServiceException("上传本地文件到Forge失败"); + } + } + private void fileDownload(SysFileInfo sysFileInfo, HttpServletResponse response) { try { String fileName = sysFileInfo.getFileOriginName(); diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/controller/ProductReqSpecsController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/controller/ProductReqSpecsController.java index fb7ebb2da..6dc2addde 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/controller/ProductReqSpecsController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/controller/ProductReqSpecsController.java @@ -82,7 +82,7 @@ public class ProductReqSpecsController extends BaseController { */ @RequiresPermissions("pms:pmsProductRequirement:edit") @Log(title = "需求规格", businessType = BusinessType.UPDATE) - @PutMapping + @PutMapping("/change") @ApiOperation(value = "变更需求规格") public AjaxResult change(@RequestBody @Validated ProductReqSpecsChangeVo productReqSpecsChangeVo) { return toAjax(pmsProductRequirementService.changeReqSpecs(productReqSpecsChangeVo)); @@ -109,4 +109,15 @@ public class ProductReqSpecsController extends BaseController { public AjaxResult review(@RequestBody @Validated ProductReqReviewVo productReqReviewVo) { return toAjax(pmsProductRequirementService.reviewReqSpecs(productReqReviewVo)); } + + /** + * 需求规格纳入计划 + */ + @RequiresPermissions("pms:pmsProductRequirement:edit") + @Log(title = "需求规格", businessType = BusinessType.UPDATE) + @PutMapping("/activePlan") + @ApiOperation(value = "需求规格纳入计划") + public AjaxResult activePlan(@RequestBody @Validated ProductReqSpecsActivePlanVo productReqSpecsActivePlanVo) { + return toAjax(pmsProductRequirementService.activePlan(productReqSpecsActivePlanVo)); + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/enums/ProductReqOperationType.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/enums/ProductReqOperationType.java index f01a6f446..980646eb8 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/enums/ProductReqOperationType.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/enums/ProductReqOperationType.java @@ -11,6 +11,7 @@ import lombok.Getter; public enum ProductReqOperationType { CONTENT_MODIFY("contentModify", "内容修改"), REVIEW_USER_REQ("reviewUserReq", "用户需求评审"), + ACTIVE_PLAN("activePlan", "纳入计划"), REVIEW_REQ_SPECS("reviewUserReq", "需求规格评审"); private final String key; private final String name; diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqReviewVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqReviewVo.java index 1f647ad52..5e9a38830 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqReviewVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqReviewVo.java @@ -16,7 +16,7 @@ import java.util.Date; * @date 2023-10-10 */ @Data -@ApiModel("用户需求评审对象") +@ApiModel("需求评审对象") public class ProductReqReviewVo { @ApiModelProperty(value = "需求Id", required = true) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsActivePlanVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsActivePlanVo.java new file mode 100644 index 000000000..7584d51d3 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsActivePlanVo.java @@ -0,0 +1,52 @@ +package com.microservices.pms.product.domain.vo; + +import com.microservices.pms.product.domain.PmsProductReqOperationRecord; +import com.microservices.pms.product.domain.PmsProductRequirement; +import com.microservices.pms.product.domain.enums.ProductReqOperationType; +import com.microservices.pms.project.domain.vo.PmsProjectIssuesInputVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 产品需求对象 pms_product_requirement + * + * @author otto + * @date 2023-10-10 + */ +@Data +@ApiModel("需求规格纳入计划对象") +public class ProductReqSpecsActivePlanVo { + @ApiModelProperty(value = "需求Id", required = true) + @NotNull + private Long id; + + @ApiModelProperty(value = "项目Id", required = true) + @NotNull + private Long projectId; + + public PmsProjectIssuesInputVo toPmsProjectIssuesInputVo(PmsProductRequirement reqSpecs, List forgeFileIdentifierList) { + PmsProjectIssuesInputVo issue = new PmsProjectIssuesInputVo(); + issue.setSubject(reqSpecs.getTitle()); + issue.setPmProjectId(projectId); + issue.setStatusId(1); + issue.setPmIssueType(1); + issue.setPriorityId(2); + issue.setDescription(reqSpecs.getContent()); + issue.setAttachmentIds(forgeFileIdentifierList); + return issue; + } + + public PmsProductReqOperationRecord toPmsProductReqOperationRecord(PmsProductRequirement pmsProductRequirement) { + PmsProductReqOperationRecord record = new PmsProductReqOperationRecord(); + record.setProductRequirementId(pmsProductRequirement.getId()); + record.setType(ProductReqOperationType.ACTIVE_PLAN.getKey()); + record.setOperation("激活"); + record.setOperator(pmsProductRequirement.getCreateBy()); + record.setOperatingTime(pmsProductRequirement.getCreateTime()); + return record; + } +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsChangeVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsChangeVo.java index 87bddaabd..1b787a672 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsChangeVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsChangeVo.java @@ -47,11 +47,13 @@ public class ProductReqSpecsChangeVo { } public boolean isReqChange(PmsProductRequirement oldPmsProductRequirement) { - if (StringUtils.isNotEmpty(this.getContent()) || StringUtils.isNotEmpty(this.getFileIdentifiers()) || StringUtils.isNotEmpty(this.getTitle())) { - return !oldPmsProductRequirement.getTitle().equals(this.title) - || !oldPmsProductRequirement.getContent().equals(this.content) - || !oldPmsProductRequirement.getFileIdentifiers().equals(this.fileIdentifiers); + + if (StringUtils.isNotEmpty(this.getContent()) && !this.content.equals(oldPmsProductRequirement.getContent())) { + return true; } - return false; + if (StringUtils.isNotEmpty(this.getTitle()) && !this.title.equals(oldPmsProductRequirement.getTitle())) { + return true; + } + return StringUtils.isNotEmpty(this.getFileIdentifiers()) && !this.getFileIdentifiers().equals(oldPmsProductRequirement.getFileIdentifiers()); } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductRequirementService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductRequirementService.java index 133706349..0d2709c18 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductRequirementService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductRequirementService.java @@ -162,4 +162,6 @@ public interface IPmsProductRequirementService int reviewReqSpecs(ProductReqReviewVo productReqReviewVo); int changeReqSpecs(ProductReqSpecsChangeVo productReqSpecsChangeVo); + + int activePlan(ProductReqSpecsActivePlanVo productReqSpecsActivePlanVo); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductRequirementServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductRequirementServiceImpl.java index dedbae217..9f46fc33a 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductRequirementServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductRequirementServiceImpl.java @@ -1,6 +1,7 @@ package com.microservices.pms.product.service.impl; import com.alibaba.fastjson2.JSONObject; +import com.microservices.common.core.constant.SecurityConstants; import com.microservices.common.core.exception.NotFoundException; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.*; @@ -16,11 +17,14 @@ import com.microservices.pms.product.domain.vo.*; import com.microservices.pms.product.mapper.PmsProductRequirementMapper; import com.microservices.pms.product.service.*; import com.microservices.pms.project.domain.PmsProject; +import com.microservices.pms.project.domain.vo.PmsProjectIssuesInputVo; import com.microservices.pms.project.service.IPmsProjectService; import com.microservices.pms.project.service.PmsProjectIssuesService; import com.microservices.pms.utils.PmsConstants; import com.microservices.pms.utils.PmsUtils; +import com.microservices.system.api.RemoteFileService; import com.microservices.system.api.domain.SysUser; +import com.microservices.system.api.utils.FeignUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -65,6 +69,8 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS @Autowired @Lazy private IPmsJournalsService pmsJournalsService; + @Autowired + private RemoteFileService remoteFileService; /** * 查询产品需求 @@ -560,6 +566,34 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS return success; } + @Override + public int activePlan(ProductReqSpecsActivePlanVo productReqSpecsActivePlanVo) { + // 通过id检查需修改的产品需求是否存在 + PmsProductRequirement reqSpecs = selectPmsProductRequirementById(productReqSpecsActivePlanVo.getId(), true); + if (!ProductReqStatus.REVIEWED_REQ_SPECS.getKey().equals(reqSpecs.getStatus())) { + throw new ServiceException("仅已评审状态的需求规格才能纳入计划"); + } + PmsProject project = pmsProjectService.selectAndCheckPmsProjectById(productReqSpecsActivePlanVo.getProjectId()); + List forgeFileIdentifierList = null; + if (StringUtils.isNotEmpty(reqSpecs.getFileIdentifiers())) { + // 需求规格文件上传至forge + forgeFileIdentifierList = FeignUtils.getReturnData( + remoteFileService.uploadFileToForge(reqSpecs.getFileIdentifiers(), SecurityConstants.INNER) + ); + } + PmsProjectIssuesInputVo pmsProjectIssuesInputVo = productReqSpecsActivePlanVo.toPmsProjectIssuesInputVo(reqSpecs, forgeFileIdentifierList); + + JSONObject projectIssue = pmsProjectIssuesService.insertPmsProjectIssues(pmsProjectIssuesInputVo); + reqSpecs.setPmsProjectId(project.getId()); + reqSpecs.setProjectReqId(projectIssue.getLong("id")); + reqSpecs.setStatus(ProductReqStatus.PLANNED_REQ_SPECS_CHANGING.getKey()); + int success = updateRequirement(reqSpecs, reqSpecs.getPmsProductIdentifier()); + pmsProductReqOperationRecordService.insertPmsProductReqOperationRecord( + productReqSpecsActivePlanVo.toPmsProductReqOperationRecord(reqSpecs) + ); + return success; + } + private ProductReqSpecsDetailVo toProductReqSpecsDetailVo(PmsProductRequirement pmsProductRequirement) { ProductReqSpecsDataVo productReqSpecsDataVo = toProductReqSpecsDataVo(pmsProductRequirement, null); ProductReqSpecsDetailVo productReqSpecsDetailVo = productReqSpecsDataVo.toProductReqSpecsDetailVo(); diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProductRequirementMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProductRequirementMapper.xml index 749d270f4..aa5b76378 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProductRequirementMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProductRequirementMapper.xml @@ -271,7 +271,7 @@ requirement_assignee_gitlink_ids = #{requirementAssigneeGitlinkIds}, pms_project_id = #{pmsProjectId}, from_id = #{fromId}, - project_req_id = #{project_req_id}, + project_req_id = #{projectReqId}, type = #{type}, identifier = #{identifier}, source_user = #{sourceUser},