feat(项目管理产品需求重构): 完善产品中的需求规格功能开发
新增接口:新增需求规格 Signed-off-by: OTTO <731554297@qq.com>
This commit is contained in:
parent
be54bc56d8
commit
895be1aefe
|
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ public class PmsProductRequirementInputVo
|
|||
private Long pmsProductModuleId;
|
||||
|
||||
/** 关联产品模块标识 */
|
||||
@ApiModelProperty(value = "关联产品模块标识")
|
||||
@ApiModelProperty(value = "关联产品标识")
|
||||
@NotNull
|
||||
private String pmsProductIdentifier;
|
||||
|
||||
|
|
|
|||
|
|
@ -37,9 +37,6 @@ public class ProductReqSpecsDataVo {
|
|||
@ApiModelProperty(value = "更新时间")
|
||||
private Date updateTime;
|
||||
|
||||
/**
|
||||
* 关联产品模块
|
||||
*/
|
||||
@ApiModelProperty(value = "关联产品模块")
|
||||
private PmsProductModule pmsProductModule;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -153,4 +153,6 @@ public interface IPmsProductRequirementService
|
|||
GenericsTableDataInfo<ProductReqSpecsDataVo> selectReqSpecsList(ProductReqSpecsSearchVo productReqSpecsSearchVo);
|
||||
|
||||
ProductReqSpecsDetailVo selectReqSpecsDetailById(Long id);
|
||||
|
||||
Long insertReqSpecs(ProductReqSpecsInputVo productReqSpecsInputVo);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue