feat(项目管理产品需求重构): 完善产品中的需求规格功能开发

新增接口:新增需求规格

Signed-off-by: OTTO <731554297@qq.com>
This commit is contained in:
OTTO 2024-11-30 10:13:46 +08:00
parent be54bc56d8
commit 895be1aefe
8 changed files with 144 additions and 14 deletions

View File

@ -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));
}
/**

View File

@ -38,7 +38,7 @@ public class PmsProductRequirementInputVo
private Long pmsProductModuleId;
/** 关联产品模块标识 */
@ApiModelProperty(value = "关联产品模块标识")
@ApiModelProperty(value = "关联产品标识")
@NotNull
private String pmsProductIdentifier;

View File

@ -37,9 +37,6 @@ public class ProductReqSpecsDataVo {
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 关联产品模块
*/
@ApiModelProperty(value = "关联产品模块")
private PmsProductModule pmsProductModule;

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -153,4 +153,6 @@ public interface IPmsProductRequirementService
GenericsTableDataInfo<ProductReqSpecsDataVo> selectReqSpecsList(ProductReqSpecsSearchVo productReqSpecsSearchVo);
ProductReqSpecsDetailVo selectReqSpecsDetailById(Long id);
Long insertReqSpecs(ProductReqSpecsInputVo productReqSpecsInputVo);
}

View File

@ -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;
}