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

1. 新增接口:查询用户需求列表
2. 新增产品需求状态枚举类(支持用户需求和需求规格)
3. 产品需求新增字段:需求来源用户、需求来源单位

Signed-off-by: OTTO <731554297@qq.com>
This commit is contained in:
OTTO 2024-11-29 09:59:34 +08:00
parent 60cf5b9cba
commit b987518add
10 changed files with 303 additions and 53 deletions

View File

@ -0,0 +1,49 @@
package com.microservices.pms.product.controller;
import com.microservices.common.core.web.controller.BaseController;
import com.microservices.common.core.web.page.GenericsTableDataInfo;
import com.microservices.common.security.annotation.RequiresPermissions;
import com.microservices.pms.product.domain.vo.ProductUserReqDataVo;
import com.microservices.pms.product.domain.vo.ProductUserReqSearchVo;
import com.microservices.pms.product.service.IPmsProductModuleService;
import com.microservices.pms.product.service.IPmsProductRequirementService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 产品用户需求相关接口
*
* @author otto
* @date 2023-10-10
*/
@RestController
@Api(tags = "项目管理-用户需求相关接口")
@RequestMapping("/{enterpriseIdentifier}/pmsProductUserRequirement")
@ApiImplicitParams({
@ApiImplicitParam(name = "enterpriseIdentifier", value = "企业标识", paramType = "path", dataType = "String")
})
public class PmsProductUserRequirementController extends BaseController {
@Autowired
private IPmsProductRequirementService pmsProductRequirementService;
@Autowired
private IPmsProductModuleService pmsProductModuleService;
/**
* 查询产品用户需求列表
*/
@ApiOperation(value = "查询用户需求列表")
@RequiresPermissions("pms:pmsProduct:show")
@GetMapping("/list")
public GenericsTableDataInfo<ProductUserReqDataVo> list(@PathVariable String enterpriseIdentifier, @Validated ProductUserReqSearchVo productUserReqSearchVo) {
startPage();
return pmsProductRequirementService.selectUserReqList(enterpriseIdentifier, productUserReqSearchVo);
}
}

View File

@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.microservices.common.core.utils.bean.BeanUtils;
import com.microservices.common.core.web.domain.BaseEntity;
import com.microservices.pms.product.domain.vo.PmsProductRequirementDataVo;
import com.microservices.pms.product.domain.vo.ProductUserReqDataVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -137,6 +138,12 @@ public class PmsProductRequirement extends BaseEntity
@ApiModelProperty(value = "产品需求类型")
private String type;
@ApiModelProperty(value = "需求来源用户")
private String sourceUser;
@ApiModelProperty(value = "需求来源单位")
private String sourceCompany;
@ApiModelProperty(value = "需求标识")
private String identifier;
@ -145,4 +152,10 @@ public class PmsProductRequirement extends BaseEntity
BeanUtils.copyProperties(this, target);
return target;
}
public ProductUserReqDataVo toProductUserReqDataVo() {
ProductUserReqDataVo target = new ProductUserReqDataVo();
BeanUtils.copyProperties(this, target);
return target;
}
}

View File

@ -4,17 +4,19 @@ import lombok.Getter;
/**
* 产品需求状态
* @author OTTO
*/
@Getter
public enum ProductReqStatus {
USER_REQ("userReq", "待评审", "待评审的用户需求"),
REJECTED_USER_REQ("rejectedUserReq", "评审失败", "已拒绝的用户需求"),
REJECTED_USER_REQ("rejectedUserReq", "已拒绝", "已拒绝的用户需求"),
REVIEWED_USER_REQ("reviewedUserReq", "已评审", "已评审的用户需求"),
PENDING_REVIEW_REQ_SPECS("pendingReviewReqSpecs", "待评审", "待评审的需求规格"),
REVIEWED_REQ_SPECS_CHANGING("reviewedReqSpecsChanging", "已评审", "已评审的需求规格(变更中)"),
PLANNED_REQ_SPECS("plannedReqSpecs", "计划中", "计划中的需求规格"),
PENDING_MODIFIED_REQ_SPECS("pendingModifiedReqSpecs", "待修正", "待修正的需求规格"),
REJECTED_REQ_SPECS("rejectedReqSpecs", "已拒绝", "已拒绝的需求规格"),
REVIEWED_REQ_SPECS("reviewedReqSpecs", "已评审", "已评审的需求规格");
REVIEWED_REQ_SPECS("reviewedReqSpecs", "已评审", "已评审的需求规格"),
COMPLETED_REQ_SPECS("completedReqSpecs", "已完成", "已完成的需求规格");
private final String key;
private final String name;
private final String remark;
@ -33,4 +35,13 @@ public enum ProductReqStatus {
}
return null;
}
public static String getNameByKey(String status) {
for (ProductReqStatus productReqStatus : ProductReqStatus.values()) {
if (productReqStatus.getKey().equals(status)) {
return productReqStatus.getName();
}
}
return null;
}
}

View File

@ -0,0 +1,30 @@
package com.microservices.pms.product.domain.vo;
import com.microservices.system.api.domain.SysFileInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 产品需求对象 pms_product_requirement
*
* @author otto
* @date 2023-10-10
*/
@Data
@ApiModel("用户需求详细数据对象")
public class ProductReqUserDetailVo extends ProductUserReqDataVo {
/**
* 正文
*/
@ApiModelProperty(value = "正文")
private String content;
/**
* 附件列表
*/
@ApiModelProperty(value = "附件列表")
private List<SysFileInfo> fileList;
}

View File

@ -0,0 +1,60 @@
package com.microservices.pms.product.domain.vo;
import com.microservices.common.core.utils.bean.BeanUtils;
import com.microservices.pms.product.domain.PmsProductModule;
import com.microservices.pms.project.domain.vo.BaseEntityVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 产品需求对象 pms_product_requirement
*
* @author otto
* @date 2023-10-10
*/
@Data
@ApiModel("用户需求数据对象")
public class ProductUserReqDataVo extends BaseEntityVo {
/**
* 需求标识
*/
@ApiModelProperty(value = "需求标识")
private Long id;
/**
* 索引
*/
@ApiModelProperty(value = "索引")
private Long index;
/**
* 标题
*/
@ApiModelProperty(value = "标题")
private String title;
/**
* 关联状态
*/
@ApiModelProperty(value = "需求状态")
private String status;
/**
* 关联产品模块
*/
@ApiModelProperty(value = "从属产品模块")
private PmsProductModule pmsProductModule;
@ApiModelProperty(value = "需求来源用户")
private String sourceUser;
@ApiModelProperty(value = "需求来源单位")
private String sourceCompany;
public PmsProductRequirementDetailVo toPmsProductRequirementDetailVo() {
PmsProductRequirementDetailVo target = new PmsProductRequirementDetailVo();
BeanUtils.copyProperties(this, target);
return target;
}
}

View File

@ -0,0 +1,38 @@
package com.microservices.pms.product.domain.vo;
import com.microservices.common.core.utils.bean.BeanUtils;
import com.microservices.pms.product.domain.PmsProductRequirement;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 产品需求对象 pms_product_requirement
*
* @author otto
* @date 2023-10-10
*/
@Data
@ApiModel("用户需求搜索对象")
public class ProductUserReqSearchVo {
/**
* 标题
*/
@ApiModelProperty(value = "模糊搜索标题、提出人或需求来源")
private String search;
/**
* 关联产品模块标识
*/
@ApiModelProperty(value = "关联产品标识", required = true)
@NotNull
private String pmsProductIdentifier;
public PmsProductRequirement toPmsProductRequirement() {
PmsProductRequirement target = new PmsProductRequirement();
BeanUtils.copyProperties(this, target);
return target;
}
}

View File

@ -2,6 +2,7 @@ package com.microservices.pms.product.mapper;
import com.microservices.pms.product.domain.PmsProductRequirement;
import com.microservices.pms.product.domain.vo.PmsProductRequirementBatchUpdateVo;
import com.microservices.pms.product.domain.vo.ProductUserReqSearchVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -102,4 +103,6 @@ public interface PmsProductRequirementMapper
* @return 产品标识列表
*/
List<String> selectProductIdentifierListInRequirementIdList(@Param("idList") List<Long> idList);
List<PmsProductRequirement> selectUserReqList(ProductUserReqSearchVo productUserReqSearchVo);
}

View File

@ -5,6 +5,8 @@ import com.microservices.common.core.web.page.GenericsTableDataInfo;
import com.microservices.pms.product.domain.PmsProductRequirement;
import com.microservices.pms.product.domain.vo.PmsProductRequirementDataVo;
import com.microservices.pms.product.domain.vo.PmsProductRequirementDetailVo;
import com.microservices.pms.product.domain.vo.ProductUserReqDataVo;
import com.microservices.pms.product.domain.vo.ProductUserReqSearchVo;
import java.util.List;
@ -131,4 +133,13 @@ public interface IPmsProductRequirementService
* @return 产品需求列表
*/
List<PmsProductRequirement> selectPmsProductRequirementList(PmsProductRequirement pmsProductRequirementSearch);
/**
* 查询用户需求列表
*
* @param enterpriseIdentifier 企业标识
* @param productUserReqSearchVo 查询条件
* @return 用户需求列表
*/
GenericsTableDataInfo<ProductUserReqDataVo> selectUserReqList(String enterpriseIdentifier, ProductUserReqSearchVo productUserReqSearchVo);
}

View File

@ -14,9 +14,7 @@ import com.microservices.pms.enterprise.domain.PmsEnterprise;
import com.microservices.pms.enterprise.service.IPmsEnterpriseService;
import com.microservices.pms.journals.service.IPmsJournalsService;
import com.microservices.pms.product.domain.*;
import com.microservices.pms.product.domain.vo.PmsProductRequirementBatchUpdateVo;
import com.microservices.pms.product.domain.vo.PmsProductRequirementDataVo;
import com.microservices.pms.product.domain.vo.PmsProductRequirementDetailVo;
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;
@ -37,13 +35,12 @@ import static com.microservices.common.core.utils.PageUtils.startPage;
/**
* 产品需求Service业务层处理
*
*
* @author otto
* @date 2023-10-10
*/
@Service
public class PmsProductRequirementServiceImpl implements IPmsProductRequirementService
{
public class PmsProductRequirementServiceImpl implements IPmsProductRequirementService {
@Autowired
private PmsProductRequirementMapper pmsProductRequirementMapper;
@Autowired
@ -70,20 +67,19 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
/**
* 查询产品需求
*
*
* @param id 产品需求主键
* @return 产品需求
*/
@Override
public PmsProductRequirementDetailVo selectPmsProductRequirementDetailById(Long id)
{
public PmsProductRequirementDetailVo selectPmsProductRequirementDetailById(Long id) {
PmsProductRequirement pmsProductRequirement = selectPmsProductRequirementById(id, false);
return toPmsProductRequirementDetailVo(pmsProductRequirement);
}
private PmsProductRequirementDetailVo toPmsProductRequirementDetailVo(PmsProductRequirement pmsProductRequirement){
private PmsProductRequirementDetailVo toPmsProductRequirementDetailVo(PmsProductRequirement pmsProductRequirement) {
PmsProductRequirementDataVo pmsProductRequirementDataVo = toPmsProductRequirementDataVo(pmsProductRequirement, null);
PmsProductRequirementDetailVo pmsProductRequirementDetailVo=pmsProductRequirementDataVo.toPmsProductRequirementDetailVo();
PmsProductRequirementDetailVo pmsProductRequirementDetailVo = pmsProductRequirementDataVo.toPmsProductRequirementDetailVo();
pmsProductRequirementDetailVo.setContent(pmsProductRequirement.getContent());
// 设置文件列表
pmsProductRequirementDetailVo.setFileList(pmsCommonService.getAllFileByFileIdentifiers(pmsProductRequirement.getFileIdentifiers())
@ -97,8 +93,8 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
@Override
public PmsProductRequirement selectPmsProductRequirementById(Long id, boolean checkRole) {
PmsProductRequirement pmsProductRequirement=pmsProductRequirementMapper.selectPmsProductRequirementById(id);
if(pmsProductRequirement==null){
PmsProductRequirement pmsProductRequirement = pmsProductRequirementMapper.selectPmsProductRequirementById(id);
if (pmsProductRequirement == null) {
throw new NotFoundException("该产品需求不存在(产品需求Id[%d])", id);
}
PmsProduct pmsProduct = pmsProductService.selectPmsProductByIdentifier(pmsProductRequirement.getPmsProductIdentifier());
@ -109,7 +105,7 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
}
private PmsProductRequirementDataVo toPmsProductRequirementDataVo(PmsProductRequirement pmsProductRequirement, HashMap<String, Object> hashMap) {
PmsProductRequirementDataVo pmsProductRequirementDataVo=pmsProductRequirement.toPmsProductRequirementDataVo();
PmsProductRequirementDataVo pmsProductRequirementDataVo = pmsProductRequirement.toPmsProductRequirementDataVo();
// 设置优先级
pmsProductRequirementDataVo.setPriority(
PmsUtils.getSelectObjectInCache(
@ -177,36 +173,52 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
return pmsProductRequirementDataVo;
}
@Override
public GenericsTableDataInfo<ProductUserReqDataVo> selectUserReqList(String enterpriseIdentifier, ProductUserReqSearchVo productUserReqSearchVo) {
pmsProductService.selectPmsProductByIdentifier(productUserReqSearchVo.getPmsProductIdentifier());
startPage();
List<PmsProductRequirement> userReqList = pmsProductRequirementMapper.selectUserReqList(productUserReqSearchVo);
HashMap<String, Object> selectCache = new HashMap<>();
return PageUtils.toPage(userReqList, x -> toProductUserReqDataVo(x, selectCache));
}
private ProductUserReqDataVo toProductUserReqDataVo(PmsProductRequirement pmsProductRequirement, HashMap<String, Object> hashMap) {
ProductUserReqDataVo productUserReqDataVo = pmsProductRequirement.toProductUserReqDataVo();
// 设置状态
productUserReqDataVo.setStatus(ProductReqStatus.getNameByKey(pmsProductRequirement.getStatus()));
return productUserReqDataVo;
}
/**
* 查询产品需求列表
*
*
* @param pmsProductRequirementSearch 产品需求
* @return 产品需求
*/
@Override
public GenericsTableDataInfo<PmsProductRequirementDataVo> selectPmsProductRequirementPageList(PmsProductRequirement pmsProductRequirementSearch)
{
public GenericsTableDataInfo<PmsProductRequirementDataVo> selectPmsProductRequirementPageList(PmsProductRequirement pmsProductRequirementSearch) {
pmsProductService.selectPmsProductByIdentifier(pmsProductRequirementSearch.getPmsProductIdentifier());
startPage();
List<PmsProductRequirement> pmsProductRequirementList=pmsProductRequirementMapper.selectPmsProductRequirementList(pmsProductRequirementSearch);
List<PmsProductRequirement> pmsProductRequirementList = pmsProductRequirementMapper.selectPmsProductRequirementList(pmsProductRequirementSearch);
HashMap<String, Object> selectCache = new HashMap<>();
return PageUtils.toPage(pmsProductRequirementList, x -> toPmsProductRequirementDataVo(x, selectCache));
}
/**
* 新增产品需求
*
*
* @param pmsProductRequirement 产品需求
* @return 结果
*/
@Override
public Long insertPmsProductRequirement(PmsProductRequirement pmsProductRequirement)
{
public Long insertPmsProductRequirement(PmsProductRequirement pmsProductRequirement) {
// 校验产品是否存在
PmsProduct pmsProduct = pmsProductService.selectPmsProductByIdentifier(pmsProductRequirement.getPmsProductIdentifier());
pmsProductService.checkManageRole(pmsProduct);
// 设置需求优先级若未传入则设置为默认优先级
Long priorityId=
Long priorityId =
pmsProductPriorityService.selectPmsProductPriorityIdByInputId(pmsProductRequirement.getPriorityId(), PmsConstants.PRODUCT_STATUS_OR_PRIORITY_REQUIREMENT_TYPE);
pmsProductRequirement.setPriorityId(priorityId);
// 设置默认需求状态
@ -214,14 +226,14 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
// pmsProductRequirement.setStatusId(statusId);
checkPmsProductRequirement(pmsProductRequirement, pmsProduct, null);
Date now=DateUtils.getNowDate();
String username=SecurityUtils.getUsername();
Date now = DateUtils.getNowDate();
String username = SecurityUtils.getUsername();
pmsProductRequirement.setCreateBy(username);
pmsProductRequirement.setCreateTime(now);
pmsProductRequirement.setUpdateBy(username);
pmsProductRequirement.setUpdateTime(now);
// 获取当前产品下需求的最大索引值
Long maxIndex=pmsProductRequirementMapper.selectPmsProductRequirementMaxIndexByProductIdentifier(pmsProductRequirement.getPmsProductIdentifier());
Long maxIndex = pmsProductRequirementMapper.selectPmsProductRequirementMaxIndexByProductIdentifier(pmsProductRequirement.getPmsProductIdentifier());
if (maxIndex == null) {
maxIndex = 1L;
}
@ -238,10 +250,10 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
}
// 校验产品计划是否存在
if(pmsProductRequirement.getPmsProductPlanId()!=null){
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 (!pmsProductPlan.getPmsProductIdentifier().equals(pmsProduct.getProductIdentifier())) {
throw new ServiceException("该产品计划不属于当前产品(计划标题[%s],产品名称[%s])", pmsProductPlan.getPlanTitle(), pmsProduct.getProductName());
}
if (oldPmsProductRequirement == null || oldPmsProductRequirement.getPmsProductPlanId() == null) {
@ -263,7 +275,7 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
// 校验模块是否存在
if(pmsProductRequirement.getPmsProductModuleId()!=null){
if (pmsProductRequirement.getPmsProductModuleId() != null) {
checkModuleId(pmsProductRequirement.getPmsProductModuleId(), pmsProduct);
}
@ -272,8 +284,8 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
pmsProductRequirement.setTagIds(pmsProductRequirement.getTags());
//校验结束时间需大于开始时间
if(pmsProductRequirement.getStartTime()!=null&&pmsProductRequirement.getEndTime()!=null){
if(pmsProductRequirement.getStartTime().after(pmsProductRequirement.getEndTime())){
if (pmsProductRequirement.getStartTime() != null && pmsProductRequirement.getEndTime() != null) {
if (pmsProductRequirement.getStartTime().after(pmsProductRequirement.getEndTime())) {
throw new ServiceException("结束时间不能早于开始时间");
}
}
@ -284,19 +296,18 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
/**
* 修改产品需求
*
*
* @param pmsProductRequirement 产品需求
* @return 结果
*/
@Override
public int updatePmsProductRequirement(PmsProductRequirement pmsProductRequirement)
{
public int updatePmsProductRequirement(PmsProductRequirement pmsProductRequirement) {
// 通过id检查需修改的产品需求是否存在
PmsProductRequirement oldPmsProductRequirement = selectPmsProductRequirementById(pmsProductRequirement.getId(), true);
pmsProductRequirement.setPmsProductIdentifier(oldPmsProductRequirement.getPmsProductIdentifier());
if(pmsProductRequirement.getPriorityId()!=null){
if (pmsProductRequirement.getPriorityId() != null) {
// 设置需求优先级
Long priorityId=
Long priorityId =
pmsProductPriorityService.selectPmsProductPriorityIdByInputId(pmsProductRequirement.getPriorityId(), PmsConstants.PRODUCT_STATUS_OR_PRIORITY_REQUIREMENT_TYPE);
pmsProductRequirement.setPriorityId(priorityId);
}
@ -304,7 +315,7 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
// 设置需求状态
// TODO:需要根据用户需求需求规格来判断需求状态
// pmsProductRequirement.setStatusId(statusId);
PmsProduct pmsProduct=pmsProductService.selectPmsProductByIdentifier(oldPmsProductRequirement.getPmsProductIdentifier());
PmsProduct pmsProduct = pmsProductService.selectPmsProductByIdentifier(oldPmsProductRequirement.getPmsProductIdentifier());
checkPmsProductRequirement(pmsProductRequirement, pmsProduct, oldPmsProductRequirement);
if (pmsProductRequirement.getStartTime() != null && pmsProductRequirement.getEndTime() == null) {
if (oldPmsProductRequirement.getEndTime() != null && pmsProductRequirement.getStartTime().after(oldPmsProductRequirement.getEndTime())) {
@ -333,14 +344,13 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
/**
* 批量删除产品需求
*
*
* @param ids 需要删除的产品需求主键
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int deletePmsProductRequirementByIds(Long[] ids)
{
public int deletePmsProductRequirementByIds(Long[] ids) {
int success = 0;
for (Long id : ids) {
success += deletePmsProductRequirementById(id);
@ -350,14 +360,13 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
/**
* 删除产品需求信息
*
*
* @param id 产品需求主键
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int deletePmsProductRequirementById(Long id)
{
public int deletePmsProductRequirementById(Long id) {
PmsProductRequirement oldPmsProductRequirement = selectPmsProductRequirementById(id, true);
if (oldPmsProductRequirement.getPmsProductPlanId() != null) {
pmsProductPlanService.updatePmsProductPlanChange(oldPmsProductRequirement.getPmsProductPlanId());
@ -374,9 +383,9 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
@Override
public PmsProductRequirementDetailVo selectPmsProductRequirementDetailByProductIdentifierAndIndex(String productIdentifier, Long index) {
PmsProductRequirement pmsProductRequirement=pmsProductRequirementMapper.selectPmsProductRequirementByProductIdentifierAndIndex(productIdentifier,index);
if(pmsProductRequirement==null){
throw new ServiceException("该产品需求不存在(产品标识[%s],产品需求索引[%d])",productIdentifier,index);
PmsProductRequirement pmsProductRequirement = pmsProductRequirementMapper.selectPmsProductRequirementByProductIdentifierAndIndex(productIdentifier, index);
if (pmsProductRequirement == null) {
throw new ServiceException("该产品需求不存在(产品标识[%s],产品需求索引[%d])", productIdentifier, index);
}
return toPmsProductRequirementDetailVo(pmsProductRequirement);
}
@ -446,16 +455,16 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
private int batchUpdatePmsProductRequirementByJsonObject(List<Long> idList, JSONObject jsonObject) {
PmsProductRequirementBatchUpdateVo pmsProductRequirementBatchUpdateVo = new PmsProductRequirementBatchUpdateVo();
pmsProductRequirementBatchUpdateVo.setIdList(idList);
if(jsonObject.containsKey("priorityId")){
if (jsonObject.containsKey("priorityId")) {
pmsProductRequirementBatchUpdateVo.setPriorityId(jsonObject.getLong("priorityId"));
pmsProductRequirementBatchUpdateVo.setPriorityIdIsChange(true);
}
// TODO:需考虑是否涉及状态的变更
if(jsonObject.containsKey("pmsProductModuleId")){
if (jsonObject.containsKey("pmsProductModuleId")) {
pmsProductRequirementBatchUpdateVo.setPmsProductModuleId(jsonObject.getLong("pmsProductModuleId"));
pmsProductRequirementBatchUpdateVo.setPmsProductModuleIdIsChange(true);
}
if(jsonObject.containsKey("tags")){
if (jsonObject.containsKey("tags")) {
pmsProductRequirementBatchUpdateVo.setTagIds(jsonObject.getString("tags"));
pmsProductRequirementBatchUpdateVo.setTagIdsIsChange(true);
}
@ -463,7 +472,7 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS
pmsProductRequirementBatchUpdateVo.setRequirementAssigneeGitlinkIds(jsonObject.getString("requirementAssigneeGitlinkIds"));
pmsProductRequirementBatchUpdateVo.setRequirementAssigneeGitlinkIdsIsChange(true);
}
if(jsonObject.containsKey("pmsProjectId")){
if (jsonObject.containsKey("pmsProjectId")) {
pmsProductRequirementBatchUpdateVo.setPmsProjectId(jsonObject.getLong("pmsProjectId"));
pmsProductRequirementBatchUpdateVo.setPmsProjectIdIsChange(true);
}

View File

@ -30,6 +30,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="projectReqId" column="project_req_id"/>
<result property="type" column="type"/>
<result property="identifier" column="identifier"/>
<result property="sourceUser" column="source_user"/>
<result property="sourceCompany" column="source_company"/>
</resultMap>
<sql id="selectPmsProductRequirementVo">
@ -57,6 +59,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from_id,
project_req_id,
type,
source_user,
source_company,
identifier
from pms_product_requirement
</sql>
@ -133,6 +137,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</select>
<select id="selectUserReqList" resultMap="PmsProductRequirementResult">
/*keep orderby*/
<include refid="selectPmsProductRequirementVo"/>
<where>
<if test="search != null and search != ''">and
(
title like concat('%', #{search}, '%')
or source_user like concat('%', #{search}, '%')
or source_company like concat('%', #{search}, '%')
)
</if>
<if test="pmsProductIdentifier != null ">and pms_product_identifier = #{pmsProductIdentifier}</if>
and (`status`= 'userReq' or `status`= 'rejectedUserReq' or `status` = 'reviewedUserReq')
</where>
order by update_time desc
</select>
<insert id="insertPmsProductRequirement" parameterType="PmsProductRequirement" useGeneratedKeys="true" keyProperty="id">
insert into pms_product_requirement
@ -161,6 +181,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="projectReqId != null">project_req_id,</if>
<if test="type != null and type != ''">type,</if>
<if test="identifier != null and identifier != ''">identifier,</if>
<if test="sourceUser != null and sourceUser != ''">source_user,</if>
<if test="sourceCompany != null and sourceCompany != ''">source_company,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="index != null">#{index},</if>
@ -187,6 +209,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="projectReqId != null">#{projectReqId},</if>
<if test="type != null and type != ''">#{type},</if>
<if test="identifier != null and identifier != ''">#{identifier},</if>
<if test="sourceUser != null and sourceUser != ''">#{sourceUser},</if>
<if test="sourceCompany != null and sourceCompany != ''">#{sourceCompany},</if>
</trim>
</insert>
@ -217,6 +241,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="projectReqId != null and projectReqId != ''">project_req_id = #{project_req_id},</if>
<if test="type != null and type != ''">type = #{type},</if>
<if test="identifier != null and identifier != ''">identifier = #{identifier},</if>
<if test="sourceUser != null and sourceUser != ''">source_user = #{sourceUser},</if>
<if test="sourceCompany != null and sourceCompany != ''">source_company = #{sourceCompany},</if>
</trim>
where id = #{id}
</update>