From ffc71ba7b635bf5ee8b6682aa18284d220ddd5ce Mon Sep 17 00:00:00 2001 From: liuhuazhong Date: Wed, 11 Dec 2024 16:35:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=B7=A5=E4=BD=9C=E5=8F=B0=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1):=20=E6=88=91=E7=9A=84=E4=BA=A7=E5=93=81=E3=80=81?= =?UTF-8?q?=E6=88=91=E7=9A=84=E4=BA=A7=E5=93=81=E6=95=B0=E6=8D=AE=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PmsDashboardController.java | 153 +++++++++++++++++- .../product/domain/vo/PmsProductStatVo.java | 18 +++ .../domain/vo/PmsRequirementStatResVo.java | 15 ++ .../product/domain/vo/ReqStatusStatVo.java | 15 ++ .../product/mapper/PmsProductPlanMapper.java | 9 ++ .../mapper/PmsProductRequirementMapper.java | 6 + .../service/IPmsProductPlanService.java | 10 ++ .../IPmsProductRequirementService.java | 9 ++ .../impl/PmsProductPlanServiceImpl.java | 8 + .../PmsProductRequirementServiceImpl.java | 26 ++- .../mapper/pms/PmsProductPlanMapper.xml | 10 ++ .../pms/PmsProductRequirementMapper.xml | 17 ++ 12 files changed, 293 insertions(+), 3 deletions(-) create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsProductStatVo.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsRequirementStatResVo.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ReqStatusStatVo.java diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/dashboard/controller/PmsDashboardController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/dashboard/controller/PmsDashboardController.java index 38debc5d0..455305287 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/dashboard/controller/PmsDashboardController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/dashboard/controller/PmsDashboardController.java @@ -1,6 +1,7 @@ package com.microservices.pms.dashboard.controller; import com.alibaba.fastjson2.JSONObject; +import com.microservices.common.core.domain.R; import com.microservices.common.core.utils.StringUtils; import com.microservices.common.core.utils.bean.BeanUtils; import com.microservices.common.core.web.controller.BaseController; @@ -11,9 +12,13 @@ import com.microservices.pms.dashboard.domain.vo.MyDashboardVo; import com.microservices.pms.dashboard.domain.vo.MyProjectIssuesSearchVo; import com.microservices.pms.product.domain.PmsProduct; import com.microservices.pms.product.domain.PmsProductRequirement; -import com.microservices.pms.product.domain.vo.PmsProductSearchVo; +import com.microservices.pms.product.domain.PmsProductStatus; +import com.microservices.pms.product.domain.enums.ProductReqStatus; +import com.microservices.pms.product.domain.vo.*; +import com.microservices.pms.product.service.IPmsProductPlanService; import com.microservices.pms.product.service.IPmsProductRequirementService; import com.microservices.pms.product.service.IPmsProductService; +import com.microservices.pms.product.service.IPmsProductStatusService; import com.microservices.pms.project.domain.PmsProject; import com.microservices.pms.project.domain.vo.*; import com.microservices.pms.project.service.IPmsProjectService; @@ -24,13 +29,16 @@ 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; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; @RestController @RequestMapping("/{enterpriseIdentifier}/dashboard") @@ -53,6 +61,12 @@ public class PmsDashboardController extends BaseController { @Autowired private IPmsProductService pmsProductService; + @Autowired + private IPmsProductPlanService pmsProductPlanService; + + @Autowired + private IPmsProductStatusService pmsProductStatusService; + /** * 我的工作台统计信息 @@ -128,4 +142,141 @@ public class PmsDashboardController extends BaseController { pmsProjectSprintSearchVo.setPmsProjectIds(StringUtils.join(projectList.stream().map(PmsProject::getId).toArray(), ",")); return pmsProjectSprintService.selectAllPmsProjectSprintList(pmsProjectSprintSearchVo); } + + /** + * 我的产品 + */ + @ApiOperation(value = "我的产品") + @GetMapping("/myProduct") + public GenericsTableDataInfo myProduct(@PathVariable String enterpriseIdentifier, + @Validated PmsProductSearchVo pmsProductSearchVo) { + startPage(); + pmsProductSearchVo.setPmsEnterpriseIdentifier(enterpriseIdentifier); + //获取组织下所有的产品信息 + GenericsTableDataInfo productsInfo = pmsProductService.selectPmsProductPageList(pmsProductSearchVo); + List rows = productsInfo.getRows(); + + // 统计需求数量 + List statVos = rows.stream().map(e -> { + PmsProductStatVo statVo = new PmsProductStatVo(); + String pmsProductIdentifier = e.getProductIdentifier(); + Integer requirementCount = pmsProductRequirementService.countByIdentifierAndStatus(pmsProductIdentifier, getUserReqList()); + Integer reqSpecsCount = pmsProductRequirementService.countByIdentifierAndStatus(pmsProductIdentifier, getReqSpecsList()); + BeanUtils.copyProperties(e, statVo); + statVo.setReqSpecsCount(reqSpecsCount); + statVo.setUserReqCount(requirementCount); + return statVo; + }).collect(Collectors.toList()); + + GenericsTableDataInfo result = new GenericsTableDataInfo<>(); + result.setRows(statVos); + result.setTotal(productsInfo.getTotal()); + return result; + } + + @ApiOperation(value = "我的产品数据统计-用户需求统计") + @ApiImplicitParam(name = "productIdentifier", value = "产品标识", paramType = "query", dataType = "String") + @GetMapping("/userRequirementStat") + public R UserRequirementStat(String productIdentifier){ + PmsRequirementStatResVo pmsRequirementStatResVo = buildPmsRequirementStatResVo( + productIdentifier, + getUserReqList(), + ProductReqStatus.REVIEWED_USER_REQ); + + return R.ok(pmsRequirementStatResVo); + } + + + @ApiOperation(value = "我的产品数据统计-需求规格统计") + @ApiImplicitParam(name = "productIdentifier", value = "产品标识", paramType = "query", dataType = "String") + @GetMapping("/productRequirementSpecsStat") + public R ProductRequirementSpecsStat(String productIdentifier){ + PmsRequirementStatResVo pmsRequirementStatResVo = buildPmsRequirementStatResVo( + productIdentifier, + getReqSpecsList(), + ProductReqStatus.REVIEWED_REQ_SPECS); + + return R.ok(pmsRequirementStatResVo); + } + + @ApiOperation(value = "我的产品数据统计-里程碑状态分布统计") + @ApiImplicitParam(name = "productIdentifier", value = "产品标识", paramType = "query", dataType = "String") + @GetMapping("/milestoneStatusStat") + public R milestoneStatusStat(String productIdentifier){ + Map status2NumMap = pmsProductPlanService.countPmsProductPlanGroupByStatus(productIdentifier) + .stream().collect(Collectors.toMap(EnumCommonVo::getKey, ReqStatusStatVo::getNum)); + PmsProductStatus pmsProductStatus = new PmsProductStatus(); + pmsProductStatus.setType(1); + List pmsTypeDataVos = pmsProductStatusService.selectPmsProductStatusList(pmsProductStatus); + List statusStatVos = pmsTypeDataVos.stream().map(e -> { + ReqStatusStatVo vo = new ReqStatusStatVo(); + vo.setKey(String.valueOf(e.getId())); + vo.setNum(status2NumMap.getOrDefault(String.valueOf(e.getId()), 0)); + vo.setName(e.getName()); + return vo; + }).collect(Collectors.toList()); + PmsRequirementStatResVo resVo = new PmsRequirementStatResVo(); + resVo.setPmsProductStatVos(statusStatVos); + resVo.setRatio(0); + return R.ok(resVo); + } + + + /** + * 获取 需求规格状态list + * @return 需求规格状态list + */ + private List getReqSpecsList() { + return Stream.of(ProductReqStatus.PENDING_REVIEW_REQ_SPECS.getKey(), + ProductReqStatus.PLANNED_REQ_SPECS.getKey(), + ProductReqStatus.REJECTED_CHANGE_REQ_SPECS.getKey(), + ProductReqStatus.REVIEWED_REQ_SPECS.getKey(), + ProductReqStatus.COMPLETED_REQ_SPECS.getKey(), + ProductReqStatus.CHANGED_REQ_SPECS.getKey()) + .collect(Collectors.toList()); + } + + /** + * 获取 用户需求状态list + * @return 用户需求状态list + */ + private List getUserReqList() { + return Stream.of(ProductReqStatus.PENDING_REVIEW_USER_REQ.getKey(), + ProductReqStatus.REJECTED_USER_REQ.getKey(), + ProductReqStatus.REVIEWED_USER_REQ.getKey()) + .collect(Collectors.toList()); + } + + /** + * 拼接统计返回结果 + * @param productIdentifier 产品标识 + * @param statusList 状态列表 + * @param productReqStatus x + * @return + */ + private PmsRequirementStatResVo buildPmsRequirementStatResVo(String productIdentifier,List statusList, ProductReqStatus productReqStatus) { + Map status2NumMap = pmsProductRequirementService + .selectReqCountGroupByStatus(productIdentifier, statusList) + .stream().collect(Collectors.toMap(EnumCommonVo::getKey, ReqStatusStatVo::getNum)); + + //组装各个状态的数量 + List statusStatVos = statusList.stream().map(e -> { + ReqStatusStatVo vo = new ReqStatusStatVo(); + vo.setKey(e); + vo.setNum(status2NumMap.getOrDefault(e, 0)); + vo.setName(ProductReqStatus.getByKey(e).getName()); + return vo; + }).collect(Collectors.toList()); + + PmsRequirementStatResVo resVo = new PmsRequirementStatResVo(); + resVo.setPmsProductStatVos(statusStatVos); + resVo.setRatio(0); + //计算 各自的比率 + int sum = statusStatVos.stream().mapToInt(ReqStatusStatVo::getNum).sum(); + if (sum > 0){ + Integer reviewedUserReqCount = status2NumMap.getOrDefault(productReqStatus.getName(), 0); + resVo.setRatio(reviewedUserReqCount/sum * 100); + } + return resVo; + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsProductStatVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsProductStatVo.java new file mode 100644 index 000000000..b551de243 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsProductStatVo.java @@ -0,0 +1,18 @@ +package com.microservices.pms.product.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@ApiModel("我的产品统计对象") +public class PmsProductStatVo extends PmsProductDataVo{ + + @ApiModelProperty(value = "用户需求数量") + private Integer userReqCount; + + @ApiModelProperty(value = "规格需求数量") + private Integer ReqSpecsCount; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsRequirementStatResVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsRequirementStatResVo.java new file mode 100644 index 000000000..16ac4b544 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/PmsRequirementStatResVo.java @@ -0,0 +1,15 @@ +package com.microservices.pms.product.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class PmsRequirementStatResVo { + @ApiModelProperty(value = "数据统计列表") + private List pmsProductStatVos; + + @ApiModelProperty(value = "统计的比率") + private Integer ratio; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ReqStatusStatVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ReqStatusStatVo.java new file mode 100644 index 000000000..2ab6bf0eb --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/domain/vo/ReqStatusStatVo.java @@ -0,0 +1,15 @@ +package com.microservices.pms.product.domain.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * @author OTTO + */ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public class ReqStatusStatVo extends EnumCommonVo { + private Integer num; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/mapper/PmsProductPlanMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/mapper/PmsProductPlanMapper.java index b9068ba7d..d129892e7 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/mapper/PmsProductPlanMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/mapper/PmsProductPlanMapper.java @@ -1,7 +1,9 @@ package com.microservices.pms.product.mapper; import com.microservices.pms.product.domain.PmsProductPlan; +import com.microservices.pms.product.domain.vo.ReqStatusStatVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; @@ -83,4 +85,11 @@ public interface PmsProductPlanMapper * @param productIdentifier 产品标识 */ void deletePmsProductPlanByProductIdentifier(String productIdentifier); + + /** + * 根据状态分组统计 + * @param productIdentifier 产品标识 + * @return 分组统计结果列表 + */ + List countPmsProductPlanGroupByStatus(@Param("productIdentifier") String productIdentifier); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/mapper/PmsProductRequirementMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/mapper/PmsProductRequirementMapper.java index 4e30160ae..3a06eab1f 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/mapper/PmsProductRequirementMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/mapper/PmsProductRequirementMapper.java @@ -4,10 +4,12 @@ import com.microservices.pms.product.domain.PmsProductRequirement; import com.microservices.pms.product.domain.vo.PmsProductRequirementBatchUpdateVo; import com.microservices.pms.product.domain.vo.ProductReqSpecsSearchVo; import com.microservices.pms.product.domain.vo.ProductUserReqSearchVo; +import com.microservices.pms.product.domain.vo.ReqStatusStatVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; /** * 产品需求Mapper接口 @@ -110,4 +112,8 @@ public interface PmsProductRequirementMapper List selectReqSpecsList(ProductReqSpecsSearchVo productReqSpecsSearchVo); Integer selectReqSpecsCountByIdentifier(@Param("identifier") String identifier); + + Integer countByIdentifierAndStatus(@Param("pmsProductIdentifier") String pmsProductIdentifier, @Param("statusList") List statusList); + + List selectReqCountGroupByStatus(@Param("pmsProductIdentifier") String pmsProductIdentifier, @Param("statusList") List statusList); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductPlanService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductPlanService.java index c1e130868..f6aad6fcf 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductPlanService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductPlanService.java @@ -3,6 +3,9 @@ package com.microservices.pms.product.service; import com.microservices.common.core.web.page.GenericsTableDataInfo; import com.microservices.pms.product.domain.PmsProductPlan; import com.microservices.pms.product.domain.vo.PmsProductPlanDataVo; +import com.microservices.pms.product.domain.vo.ReqStatusStatVo; + +import java.util.List; /** * 产品计划Service接口 @@ -89,4 +92,11 @@ public interface IPmsProductPlanService * @param productIdentifier 产品标识 */ void deletePmsProductPlanByProductIdentifier(String productIdentifier); + + /** + * 根据状态分组统计 + * @param productIdentifier 产品标识 + * @return 分组统计结果列表 + */ + List countPmsProductPlanGroupByStatus(String productIdentifier); } 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 c92053682..cafa329db 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 @@ -125,4 +125,13 @@ public interface IPmsProductRequirementService List selectReqSpecsTypeList(); JSONObject selectReqSpecsAssociatedPlanData(Long reqSpecsId); + + Integer countByIdentifierAndStatus(String pmsProductIdentifier, List statusList); + /** + * + * @param pmsProductIdentifier 项目标识 + * @param statusList 项目对应的类型 + * @return List + */ + List selectReqCountGroupByStatus(String pmsProductIdentifier, List statusList); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductPlanServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductPlanServiceImpl.java index 3636e6ec7..ba5024e71 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductPlanServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductPlanServiceImpl.java @@ -8,6 +8,7 @@ import com.microservices.common.security.utils.SecurityUtils; import com.microservices.pms.product.domain.PmsProduct; import com.microservices.pms.product.domain.PmsProductPlan; import com.microservices.pms.product.domain.vo.PmsProductPlanDataVo; +import com.microservices.pms.product.domain.vo.ReqStatusStatVo; import com.microservices.pms.product.mapper.PmsProductPlanMapper; import com.microservices.pms.product.service.*; import com.microservices.pms.utils.PmsConstants; @@ -19,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.HashMap; +import java.util.List; /** * 产品计划Service业务层处理 @@ -236,4 +238,10 @@ public class PmsProductPlanServiceImpl implements IPmsProductPlanService { , pmsProductPlan.getPmsProductIdentifier())); return pmsProductPlanDataVo; } + + + @Override + public List countPmsProductPlanGroupByStatus(String productIdentifier) { + return pmsProductPlanMapper.countPmsProductPlanGroupByStatus(productIdentifier); + } } 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 c19bd9d74..37b08146f 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 @@ -36,8 +36,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.HashMap; -import java.util.List; +import java.util.*; import java.util.regex.Pattern; import static com.microservices.common.core.utils.PageUtils.startPage; @@ -947,4 +946,27 @@ public class PmsProductRequirementServiceImpl implements IPmsProductRequirementS throw new ServiceException("该模块不属于当前产品(模块名称[%s],产品名称[%s])", pmsProductModule.getModuleName(), pmsProduct.getProductName()); } } + + @Override + public Integer countByIdentifierAndStatus(String pmsProductIdentifier, List statusList) { + if (StringUtils.isEmpty(pmsProductIdentifier)) { + throw new ServiceException("产品标识不能为空"); + } + if (StringUtils.isEmpty(statusList)) { + return 0; + } + return pmsProductRequirementMapper.countByIdentifierAndStatus(pmsProductIdentifier, statusList); + } + + @Override + public List selectReqCountGroupByStatus(String pmsProductIdentifier, List statusList) { + if (StringUtils.isEmpty(pmsProductIdentifier)) { + throw new ServiceException("产品标识不能为空"); + } + + if (StringUtils.isEmpty(statusList)) { + return new ArrayList<>(); + } + return pmsProductRequirementMapper.selectReqCountGroupByStatus(pmsProductIdentifier, statusList); + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProductPlanMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProductPlanMapper.xml index 16e948399..96d64f305 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProductPlanMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProductPlanMapper.xml @@ -161,4 +161,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from pms_product_plan where pms_product_identifier = #{productIdentifier} + + \ No newline at end of file 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 7afb4aad4..6f01550e0 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 @@ -359,4 +359,21 @@ #{id} + + + + \ No newline at end of file