From 895be1aefe1fabf04d89c57cc4b4983d4d90fa37 Mon Sep 17 00:00:00 2001 From: OTTO <731554297@qq.com> Date: Sat, 30 Nov 2024 10:13:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E9=9C=80=E6=B1=82=E9=87=8D=E6=9E=84):=20?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=A7=E5=93=81=E4=B8=AD=E7=9A=84=E9=9C=80?= =?UTF-8?q?=E6=B1=82=E8=A7=84=E6=A0=BC=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增接口:新增需求规格 Signed-off-by: OTTO <731554297@qq.com> --- .../controller/ProductReqSpecsController.java | 6 +- .../vo/PmsProductRequirementInputVo.java | 2 +- .../domain/vo/ProductReqSpecsDataVo.java | 3 - .../domain/vo/ProductReqSpecsDetailVo.java | 4 ++ .../domain/vo/ProductReqSpecsInputVo.java | 69 +++++++++++++++++++ .../domain/vo/ProductUserReqInputVo.java | 6 +- .../IPmsProductRequirementService.java | 2 + .../PmsProductRequirementServiceImpl.java | 66 ++++++++++++++++-- 8 files changed, 144 insertions(+), 14 deletions(-) create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsInputVo.java 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 a9b682f60..ca6a301ae 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 @@ -61,9 +61,9 @@ public class ProductReqSpecsController extends BaseController { @PostMapping @ApiOperation(value = "新增需求规格") public AjaxResult add(@PathVariable String enterpriseIdentifier, - @RequestBody @Validated ProductUserReqInputVo productUserReqInputVo) { - productUserReqInputVo.setEnterpriseIdentifier(enterpriseIdentifier); - return success(pmsProductRequirementService.insertUserReq(productUserReqInputVo)); + @RequestBody @Validated ProductReqSpecsInputVo productReqSpecsInputVo) { + productReqSpecsInputVo.setEnterpriseIdentifier(enterpriseIdentifier); + return success(pmsProductRequirementService.insertReqSpecs(productReqSpecsInputVo)); } /** diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsProductRequirementInputVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsProductRequirementInputVo.java index 1c725eaa3..f21d336f7 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsProductRequirementInputVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsProductRequirementInputVo.java @@ -38,7 +38,7 @@ public class PmsProductRequirementInputVo private Long pmsProductModuleId; /** 关联产品模块标识 */ - @ApiModelProperty(value = "关联产品模块标识") + @ApiModelProperty(value = "关联产品标识") @NotNull private String pmsProductIdentifier; diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsDataVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsDataVo.java index 214fab718..b97e1e222 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsDataVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsDataVo.java @@ -37,9 +37,6 @@ public class ProductReqSpecsDataVo { @ApiModelProperty(value = "更新时间") private Date updateTime; - /** - * 关联产品模块 - */ @ApiModelProperty(value = "关联产品模块") private PmsProductModule pmsProductModule; diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsDetailVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsDetailVo.java index 1c6e62257..feadfa130 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsDetailVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsDetailVo.java @@ -1,6 +1,7 @@ package com.microservices.pms.product.domain.vo; import com.alibaba.fastjson2.JSONObject; +import com.microservices.pms.product.domain.PmsProductPlan; import com.microservices.pms.project.domain.PmsProject; import com.microservices.system.api.domain.SysFileInfo; import io.swagger.annotations.ApiModel; @@ -29,4 +30,7 @@ public class ProductReqSpecsDetailVo extends ProductReqSpecsDataVo { @ApiModelProperty(value = "关联项目") private PmsProject project; + + @ApiModelProperty(value = "关联产品计划") + private PmsProductPlan pmsProductPlan; } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsInputVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsInputVo.java new file mode 100644 index 000000000..9828a6004 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductReqSpecsInputVo.java @@ -0,0 +1,69 @@ +package com.microservices.pms.product.domain.vo; + +import com.microservices.common.core.utils.bean.BeanUtils; +import com.microservices.pms.product.domain.PmsProductReqOperationRecord; +import com.microservices.pms.product.domain.PmsProductRequirement; +import com.microservices.pms.product.domain.enums.ProductContentModifyOperation; +import com.microservices.pms.product.domain.enums.ProductReqOperationType; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 用户需求输入对象 + * + * @author otto + * @date 2023-10-10 + */ +@Data +@ApiModel("需求规格输入对象") +public class ProductReqSpecsInputVo { + @ApiModelProperty(value = "标题", required = true) + @NotBlank + @Size(max = 200, message = "长度需要小于200") + private String title; + + @ApiModelProperty(value = "关联产品模块ID") + private Long pmsProductModuleId; + + @ApiModelProperty(value = "关联产品标识", required = true) + @NotNull + private String pmsProductIdentifier; + + @ApiModelProperty(value = "正文", required = true) + @NotBlank + private String content; + + @ApiModelProperty(value = "附件标识列表") + private String fileIdentifiers; + + @ApiModelProperty(value = "企业标识", hidden = true) + private String enterpriseIdentifier; + + @ApiModelProperty(value = "产品需求类型") + private String type; + + @ApiModelProperty(value = "关联产品计划ID") + private Long pmsProductPlanId; + + + public PmsProductRequirement toPmsProductRequirement() { + PmsProductRequirement target = new PmsProductRequirement(); + BeanUtils.copyProperties(this, target); + return target; + } + + public PmsProductReqOperationRecord toPmsProductReqOperationRecord(PmsProductRequirement pmsProductRequirement) { + PmsProductReqOperationRecord record = new PmsProductReqOperationRecord(); + record.setProductRequirementId(pmsProductRequirement.getId()); + record.setType(ProductReqOperationType.CONTENT_MODIFY.getKey()); + record.setOperation(ProductContentModifyOperation.CREATE.getKey()); + 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/ProductUserReqInputVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductUserReqInputVo.java index 199874638..914d56e23 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductUserReqInputVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ProductUserReqInputVo.java @@ -25,7 +25,7 @@ public class ProductUserReqInputVo { /** * 标题 */ - @ApiModelProperty(value = "标题") + @ApiModelProperty(value = "标题", required = true) @NotBlank @Size(max = 200, message = "长度需要小于200") private String title; @@ -39,14 +39,14 @@ public class ProductUserReqInputVo { /** * 关联产品模块标识 */ - @ApiModelProperty(value = "关联产品标识") + @ApiModelProperty(value = "关联产品标识", required = true) @NotNull private String pmsProductIdentifier; /** * 正文 */ - @ApiModelProperty(value = "正文") + @ApiModelProperty(value = "正文", required = true) @NotBlank private String content; 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 50fedf95b..b11fe1fa5 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 @@ -153,4 +153,6 @@ public interface IPmsProductRequirementService GenericsTableDataInfo selectReqSpecsList(ProductReqSpecsSearchVo productReqSpecsSearchVo); ProductReqSpecsDetailVo selectReqSpecsDetailById(Long id); + + Long insertReqSpecs(ProductReqSpecsInputVo productReqSpecsInputVo); } 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 d664ba584..6aac70e6c 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 @@ -205,11 +205,14 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS } @Override + @Transactional(rollbackFor = ServiceException.class) public Long insertUserReq(ProductUserReqInputVo productUserReqInputVo) { // 校验产品是否存在 PmsProduct pmsProduct = pmsProductService.selectPmsProductByIdentifier(productUserReqInputVo.getPmsProductIdentifier()); pmsProductService.checkManageRole(pmsProduct); PmsProductRequirement pmsProductRequirement = productUserReqInputVo.toPmsProductRequirement(); + // 校验参数 + checkUserReqParameter(pmsProductRequirement, pmsProduct); if (StringUtils.isEmpty(productUserReqInputVo.getSourceCompany())) { PmsEnterprise pmsEnterprise = pmsEnterpriseService.selectPmsEnterpriseByIdentifier(productUserReqInputVo.getEnterpriseIdentifier()); pmsProductRequirement.setSourceCompany(pmsEnterprise.getEnterpriseName()); @@ -236,16 +239,43 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS } PmsProduct pmsProduct = pmsProductService.selectPmsProductByIdentifier(oldPmsProductRequirement.getPmsProductIdentifier()); + checkUserReqParameter(pmsProductRequirement, pmsProduct); + int success = updateRequirement(pmsProductRequirement, oldPmsProductRequirement.getPmsProductIdentifier()); + pmsProductReqOperationRecordService.insertPmsProductReqOperationRecord( + productUserReqUpdateVo.toPmsProductReqOperationRecord(pmsProductRequirement)); + return success; + } + + private void checkReqSpecsParameter(PmsProductRequirement pmsProductRequirement, PmsProduct pmsProduct, PmsProductRequirement oldPmsProductRequirement) { + // 校验产品计划是否存在 + if (pmsProductRequirement.getPmsProductPlanId() != null) { + PmsProductPlan pmsProductPlan = pmsProductPlanService.selectPmsProductPlanById(pmsProductRequirement.getPmsProductPlanId(), false); + if (!pmsProductPlan.getPmsProductIdentifier().equals(pmsProduct.getProductIdentifier())) { + throw new ServiceException("该产品计划不属于当前产品(计划标题[%s],产品名称[%s])", pmsProductPlan.getPlanTitle(), pmsProduct.getProductName()); + } + + if (oldPmsProductRequirement == null || oldPmsProductRequirement.getPmsProductPlanId() == null) { + // 当原需求没有计划时,此操作相当于将该需求移入该计划,需要更新计划的更新时间 + pmsProductPlanService.updatePmsProductPlanChange(pmsProductRequirement.getPmsProductPlanId()); + } else if (!oldPmsProductRequirement.getPmsProductPlanId().equals(pmsProductRequirement.getPmsProductPlanId())) { + // 当原需求有计划且该计划id与原计划id不同时,此操作相当于从原计划移入新计划,需要更新原计划和新计划的更新时间 + pmsProductPlanService.updatePmsProductPlanChange(pmsProductRequirement.getPmsProductPlanId()); + pmsProductPlanService.updatePmsProductPlanChange(oldPmsProductRequirement.getPmsProductPlanId()); + } + } else if (oldPmsProductRequirement != null && oldPmsProductRequirement.getPmsProductPlanId() != null) { + // 当原需求有计划且当前设置计划为空时,此操作相当于将该需求从原计划中移除,需更新原计划的更新时间 + pmsProductPlanService.updatePmsProductPlanChange(oldPmsProductRequirement.getPmsProductPlanId()); + } + checkUserReqParameter(pmsProductRequirement, pmsProduct); + } + + private void checkUserReqParameter(PmsProductRequirement pmsProductRequirement, PmsProduct pmsProduct) { // 校验模块是否存在 if (pmsProductRequirement.getPmsProductModuleId() != null) { checkModuleId(pmsProductRequirement.getPmsProductModuleId(), pmsProduct); } // 检查附件列表是否有异常数据 pmsCommonService.getAllFileByFileIdentifiers(pmsProductRequirement.getFileIdentifiers()); - int success = updateRequirement(pmsProductRequirement, oldPmsProductRequirement.getPmsProductIdentifier()); - pmsProductReqOperationRecordService.insertPmsProductReqOperationRecord( - productUserReqUpdateVo.toPmsProductReqOperationRecord(pmsProductRequirement)); - return success; } private int updateRequirement(PmsProductRequirement pmsProductRequirement, String productIdentifier) { @@ -324,6 +354,29 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS return toProductReqSpecsDetailVo(pmsProductRequirement); } + @Override + @Transactional(rollbackFor = ServiceException.class) + public Long insertReqSpecs(ProductReqSpecsInputVo productReqSpecsInputVo) { + // 校验产品是否存在 + PmsProduct pmsProduct = pmsProductService.selectPmsProductByIdentifier(productReqSpecsInputVo.getPmsProductIdentifier()); + pmsProductService.checkManageRole(pmsProduct); + PmsProductRequirement pmsProductRequirement = productReqSpecsInputVo.toPmsProductRequirement(); + + // 校验参数 + checkReqSpecsParameter(pmsProductRequirement, pmsProduct, null); + + // 设置默认需求状态 + pmsProductRequirement.setStatus(ProductReqStatus.PENDING_REVIEW_REQ_SPECS.getKey()); + + pmsProductRequirement.setCreateAndUpdate(SecurityUtils.getUsername()); + + pmsProductService.updatePmsProductChange(pmsProductRequirement.getPmsProductIdentifier()); + pmsProductRequirementMapper.insertPmsProductRequirement(pmsProductRequirement); + pmsProductReqOperationRecordService.insertPmsProductReqOperationRecord( + productReqSpecsInputVo.toPmsProductReqOperationRecord(pmsProductRequirement)); + return pmsProductRequirement.getId(); + } + private ProductReqSpecsDetailVo toProductReqSpecsDetailVo(PmsProductRequirement pmsProductRequirement) { ProductReqSpecsDataVo productReqSpecsDataVo = toProductReqSpecsDataVo(pmsProductRequirement, null); ProductReqSpecsDetailVo productReqSpecsDetailVo = productReqSpecsDataVo.toProductReqSpecsDetailVo(); @@ -338,6 +391,11 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS pmsProjectIssuesService.selectPmsProjectIssueById(pmsProductRequirement.getProjectReqId(), pmsProductRequirement.getPmsProjectId())); } } + // 设置产品计划 + if (pmsProductRequirement.getPmsProductPlanId() != null) { + productReqSpecsDetailVo.setPmsProductPlan( + pmsProductPlanService.selectPmsProductPlanById(pmsProductRequirement.getPmsProductPlanId(), false)); + } return productReqSpecsDetailVo; }