From 9f8b77867c4036f9b8b7ce9efae416a726f205c7 Mon Sep 17 00:00:00 2001 From: sangelxiu1 <15781802@163.com> Date: Thu, 12 Jun 2025 14:37:33 +0800 Subject: [PATCH] =?UTF-8?q?##=20Opt=20-=20=E9=87=8D=E6=9E=84=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E7=9B=92=E6=95=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/ApiRetailHomePageController.java | 11 +- .../mapper/CuMemberRetailRangeMapper.java | 8 + .../ICuMemberRetailAchieveService.java | 11 ++ .../CuMemberRetailAchieveServiceImpl.java | 38 ++++- .../member/utils/DataStatisticsUtil.java | 156 ++++++++++++++++++ .../CuMemberRetailDataStatisticsDetailVO.java | 104 ++++++++++++ .../CuMemberRetailDataStatisticsResultVO.java | 58 +++++++ .../achieve/CuMemberRetailRangeMapper.xml | 35 ++++ 8 files changed, 414 insertions(+), 7 deletions(-) create mode 100644 bd-business/bd-business-member/src/main/java/com/hzs/retail/member/utils/DataStatisticsUtil.java create mode 100644 bd-business/bd-business-member/src/main/java/com/hzs/retail/member/vo/CuMemberRetailDataStatisticsDetailVO.java create mode 100644 bd-business/bd-business-member/src/main/java/com/hzs/retail/member/vo/CuMemberRetailDataStatisticsResultVO.java diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/controller/api/ApiRetailHomePageController.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/controller/api/ApiRetailHomePageController.java index 3235dbbf..bb983bc3 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/controller/api/ApiRetailHomePageController.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/controller/api/ApiRetailHomePageController.java @@ -5,14 +5,13 @@ import com.hzs.common.core.web.controller.BaseController; import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.core.web.page.TableDataInfo; import com.hzs.common.security.utils.SecurityUtils; - import com.hzs.retail.member.service.ICuMemberRetailAchieveService; import com.hzs.retail.member.vo.CuMemberRetailAchieveVO; +import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsResultVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.math.BigDecimal; import java.util.List; /** @@ -44,7 +43,13 @@ public class ApiRetailHomePageController extends BaseController { Long pkMember = SecurityUtils.getUserId(); Integer pkCountry = SecurityUtils.getPkCountry(); Integer systemType = SecurityUtils.getSystemType(); - return AjaxResult.success(retailAchieveService.selectMemberSmallBox(pkMember, pkCountry, systemType)); + CuMemberRetailDataStatisticsResultVO result = retailAchieveService.getRetailDataStatisticsDetail(pkMember, pkCountry, systemType); + CuMemberRetailAchieveVO vo = CuMemberRetailAchieveVO.builder() + .totalBox(result.getTotalBoxNum()) + .smallAreaBox(result.getSmallRangeTotalBoxNum()) + .build(); + return AjaxResult.success(vo); +// return AjaxResult.success(retailAchieveService.selectMemberSmallBox(pkMember, pkCountry, systemType)); } /** diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/mapper/CuMemberRetailRangeMapper.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/mapper/CuMemberRetailRangeMapper.java index 9d3c99e7..b80d0219 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/mapper/CuMemberRetailRangeMapper.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/mapper/CuMemberRetailRangeMapper.java @@ -3,6 +3,7 @@ package com.hzs.retail.member.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hzs.common.domain.member.achieve.CuMemberRetailRange; import com.hzs.retail.member.vo.CuMemberRetailAchieveVO; +import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -166,6 +167,13 @@ public interface CuMemberRetailRangeMapper extends BaseMapper selectMemberSumAchieve(CuMemberRetailAchieveVO cuMemberAchieveVO); + /** + * 获取会员结算明细 + * @param cuMemberAchieveVO + * @return + */ + List getRetailDataStatisticsDetail(CuMemberRetailAchieveVO cuMemberAchieveVO); + /** * 查询当天自己新增盒数 * diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/service/ICuMemberRetailAchieveService.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/service/ICuMemberRetailAchieveService.java index 80c02448..1c7a795c 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/service/ICuMemberRetailAchieveService.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/service/ICuMemberRetailAchieveService.java @@ -3,8 +3,11 @@ package com.hzs.retail.member.service; import com.baomidou.mybatisplus.extension.service.IService; import com.hzs.common.domain.member.achieve.CuMemberRetailRange; import com.hzs.retail.member.vo.CuMemberRetailAchieveVO; +import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO; +import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsResultVO; import java.util.List; +import java.util.Map; public interface ICuMemberRetailAchieveService extends IService { @@ -100,4 +103,12 @@ public interface ICuMemberRetailAchieveService extends IService selectMemberSmallBoxList(CuMemberRetailAchieveVO param); + /** + * 获取会员结算明细 + * @param pkMember + * @param pkCountry + * @param systemType + * @return + */ + CuMemberRetailDataStatisticsResultVO getRetailDataStatisticsDetail(Long pkMember, Integer pkCountry, Integer systemType); } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/service/impl/CuMemberRetailAchieveServiceImpl.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/service/impl/CuMemberRetailAchieveServiceImpl.java index bff4597e..4c01b35d 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/service/impl/CuMemberRetailAchieveServiceImpl.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/service/impl/CuMemberRetailAchieveServiceImpl.java @@ -1,19 +1,26 @@ package com.hzs.retail.member.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hzs.common.core.constant.TableNameConstants; import com.hzs.common.core.enums.EGrade; import com.hzs.common.core.enums.EYesNo; import com.hzs.common.core.utils.DateUtils; import com.hzs.common.domain.member.achieve.CuMemberRetailRange; +import com.hzs.common.domain.member.achieve.CuMemberSettlePeriod; import com.hzs.common.domain.member.base.CuMember; +import com.hzs.common.security.utils.SecurityUtils; import com.hzs.member.account.service.ICuMemberBaseService; import com.hzs.member.achieve.service.ICuMemberSettlePeriodService; import com.hzs.member.base.service.ICuMemberService; import com.hzs.retail.member.mapper.CuMemberRetailRangeMapper; import com.hzs.retail.member.service.ICuMemberRetailAchieveService; +import com.hzs.retail.member.utils.DataStatisticsUtil; import com.hzs.retail.member.vo.CuMemberRetailAchieveVO; +import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO; +import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsResultVO; import com.hzs.system.config.IGradeServiceApi; import com.hzs.system.config.dto.GradeDTO; import lombok.extern.slf4j.Slf4j; @@ -388,9 +395,9 @@ public class CuMemberRetailAchieveServiceImpl extends ServiceImpl pkMemberList = baseMapper.selectDirectPushByPkMember(pkMember, systemType); + List pkMemberList = baseMapper.selectDirectPushByPkMember(pkMember, systemType); // 2025年6月11日 取伞下 + 自己的ID - List pkMemberList = baseMapper.selectSubMemberIdByRootMember(pkMember, systemType); +// List pkMemberList = baseMapper.selectSubMemberIdByRootMember(pkMember, systemType); //根据国家查汇率 BigDecimal rate = iCuMemberBaseService.getCurrency(pkCountry).getInExchangeRate(); //查询自己业绩 @@ -486,8 +493,12 @@ public class CuMemberRetailAchieveServiceImpl extends ServiceImpl(); } + @Override + public CuMemberRetailDataStatisticsResultVO getRetailDataStatisticsDetail(Long pkMember, Integer pkCountry, Integer systemType) { + Long userId = SecurityUtils.getUserId(); + String memberRetailTable = getTableName(); + String memberSecondTable = getDayTableName(); + //查询直推会员 + List pkMemberList = baseMapper.selectDirectPushByPkMember(pkMember, systemType); + pkMemberList.add(userId); + CuMemberRetailAchieveVO memberAchieveVO = CuMemberRetailAchieveVO.builder() + .memberRetailTable(memberRetailTable) + .memberRetailSTable(memberSecondTable) + .pkMemberList(pkMemberList).systemType(systemType).build(); + List statisticsDetailVOList = baseMapper.getRetailDataStatisticsDetail(memberAchieveVO); + CuMemberRetailDataStatisticsResultVO result = DataStatisticsUtil.getCalcMap(statisticsDetailVOList, userId); + log.info("statisticsDetailVOList: {}", JSONUtil.toJsonStr(statisticsDetailVOList)); + log.info("calcMap -> {}", JSONUtil.toJsonStr(result)); + return result; + } + /** * 查询会员是否激活 * diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/utils/DataStatisticsUtil.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/utils/DataStatisticsUtil.java new file mode 100644 index 00000000..5b27e322 --- /dev/null +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/utils/DataStatisticsUtil.java @@ -0,0 +1,156 @@ +package com.hzs.retail.member.utils; + +import cn.hutool.core.util.ObjectUtil; +import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO; +import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsResultVO; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 用户统计数据工具 + * 主要用户统计用户的业绩/盒数/明细等 + * 主要处理的类为 + * @link com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO + */ +public class DataStatisticsUtil { + private static final Long SELF_VIRTUAL_ID = -1000L; + private static final Long BIG_RANGE_VIRTUAL_ID = -2000L; + private static final Long SMALL_RANGE_VIRTUAL_ID = -3000L; + private static final String SELF_VIRTUAL_NAME = "个人消费虚拟分支"; + private static final String BIG_RANGE_VIRTUAL_NAME = "注水大区虚拟分支"; + private static final String SMALL_RANGE_VIRTUAL_NAME = "注水小区虚拟分支"; + + public static CuMemberRetailDataStatisticsResultVO getCalcMap(List detailVOList, Long pkId){ + calcDetailVOTotalField(detailVOList); + addVirtualBranch(detailVOList, pkId); + CuMemberRetailDataStatisticsDetailVO total = getDetailVOByPKID(detailVOList, pkId); + CuMemberRetailDataStatisticsDetailVO bigRange = getBigRangeDetailVO(detailVOList, pkId); + return CuMemberRetailDataStatisticsResultVO.builder() + .totalBoxNum(total.getTotalBoxNum()) + .totalPv(total.getTotalPv()) + .bigRangeTotalBoxNum(bigRange.getTotalBoxNum()) + .bigRangeTotalPv(bigRange.getTotalPv()) + .smallRangeTotalBoxNum(total.getTotalBoxNum() - bigRange.getTotalBoxNum()) + .smallRangeTotalPv(total.getTotalPv().subtract(bigRange.getTotalPv())) + .build(); + } + /** + * 计算集合内数据总数 + * @param detailVOList + */ + public static void calcDetailVOTotalField(List detailVOList){ + detailVOList.parallelStream().forEach(detailVO -> { + detailVO.setTotalBoxNum( + detailVO.getConsumeBoxNum() // 个人累计消费盒数(日结) + + detailVO.getNewBoxNum() // 个人新增盒数(日结) + + detailVO.getTeamBoxNum() // 团队累计消费盒数(日结) + + detailVO.getTeamNewBoxNum() // 团队新增盒数(日结) + + detailVO.getSNewBoxNum() // 个人新增消费盒数(秒结) + + detailVO.getSTeamNewBoxNum() // 团队新增盒数(秒结) +// - detailVO.getBigBoxNum() // 个人注水大区盒数(日结) +// - detailVO.getSmallBoxNum() // 个人注水小区盒数(日结) + ); + detailVO.setTotalPv(detailVO.getConsumePv() + .add(detailVO.getNewConsumePv()) + .add(detailVO.getTeamConsumePv()) + .add(detailVO.getTeamNewPv()) + .add(detailVO.getSNewConsumePv()) + .add(detailVO.getSTeamNewPv()) + ); + }); + } + + /** + * 增加虚拟分支 主要为 + * 1.自己的消费总数 + * 2.注水的大小区 + * + * @param detailVOList + */ + public static void addVirtualBranch(List detailVOList, Long pkId){ + CuMemberRetailDataStatisticsDetailVO detailVO = getDetailVOByPKID(detailVOList, pkId); + if(ObjectUtil.isNotEmpty(detailVO)){ + CuMemberRetailDataStatisticsDetailVO selfVirtualDetailVO = getCuMemberRetailDataStatisticsDetailVO(detailVO); + detailVOList.add(selfVirtualDetailVO); + if(detailVO.getBigBoxNum() >0 || detailVO.getSmallBoxNum() > 0){ + CuMemberRetailDataStatisticsDetailVO bigRangeVirtualDetailVO = CuMemberRetailDataStatisticsDetailVO.builder() + .pkId(BIG_RANGE_VIRTUAL_ID) + .memberCode(BIG_RANGE_VIRTUAL_NAME) + .totalBoxNum(detailVO.getBigBoxNum()) + .totalPv(BigDecimal.ZERO) + .build(); + CuMemberRetailDataStatisticsDetailVO smallRangeVirtualDetailVO = CuMemberRetailDataStatisticsDetailVO.builder() + .pkId(SMALL_RANGE_VIRTUAL_ID) + .memberCode(SMALL_RANGE_VIRTUAL_NAME) + .totalBoxNum(detailVO.getBigBoxNum()) + .totalPv(BigDecimal.ZERO) + .build(); + detailVOList.add(bigRangeVirtualDetailVO); + detailVOList.add(smallRangeVirtualDetailVO); + } + } + + } + + private static CuMemberRetailDataStatisticsDetailVO getCuMemberRetailDataStatisticsDetailVO(CuMemberRetailDataStatisticsDetailVO detailVO) { + return CuMemberRetailDataStatisticsDetailVO.builder() + .pkId(SELF_VIRTUAL_ID) + .memberCode(SELF_VIRTUAL_NAME) + .totalBoxNum( + detailVO.getConsumeBoxNum() + + detailVO.getNewBoxNum() + + detailVO.getSNewBoxNum() + ) + .totalPv( + detailVO.getConsumePv() + .add(detailVO.getNewConsumePv()) + .add(detailVO.getSNewConsumePv()) + ) + .build(); + } + + /** + * 移除总数Top1 + * @param detailVOList + */ + public static List getSmallRangeList(List detailVOList){ + List result = new ArrayList<>(); + Integer maxTotalBoxNum = getMaxTotalBoxNum(detailVOList); + if (maxTotalBoxNum == null) { + return new ArrayList<>(detailVOList); + } + boolean removed = false; + for (CuMemberRetailDataStatisticsDetailVO vo : detailVOList) { + if (!removed && Objects.equals(vo.getTotalBoxNum(), maxTotalBoxNum)) { + removed = true; + } else { + result.add(vo); + } + } + return result; + } + + /** + * 根据ID获取对应数据 + * @param detailVOList + * @return + */ + public static CuMemberRetailDataStatisticsDetailVO getDetailVOByPKID(List detailVOList, Long pkId){ + return detailVOList.stream().filter(o -> o.getPkId().equals(pkId)).findFirst().orElse(null); + } + + private static Integer getMaxTotalBoxNum(List detailVOList) { + return detailVOList.stream() + .map(CuMemberRetailDataStatisticsDetailVO::getTotalBoxNum) + .filter(Objects::nonNull) + .max(Integer::compare) + .orElse(null); + } + private static CuMemberRetailDataStatisticsDetailVO getBigRangeDetailVO(List detailVOList, Long pkId){ + return detailVOList.stream() + .filter(vo -> vo.getTotalBoxNum() != null && !vo.getPkId().equals(pkId)) + .max(Comparator.comparingInt(CuMemberRetailDataStatisticsDetailVO::getTotalBoxNum)) + .orElse(null); + } +} diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/vo/CuMemberRetailDataStatisticsDetailVO.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/vo/CuMemberRetailDataStatisticsDetailVO.java new file mode 100644 index 00000000..33f9c097 --- /dev/null +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/vo/CuMemberRetailDataStatisticsDetailVO.java @@ -0,0 +1,104 @@ +package com.hzs.retail.member.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * 会员数据统计 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CuMemberRetailDataStatisticsDetailVO implements Serializable { + + private static final long serialVersionUID = 4225390345989552207L; + + /** + * 用户主键 + */ + private Long pkId; + /** + * 用户编号 + */ + private String memberCode; + + /** + * 日结表-个人累计消费pv + */ + private BigDecimal consumePv; + /** + * 日结表-个人当日新消费PV + */ + private BigDecimal newConsumePv; + /** + * 日结表-个人伞下累计消费pv + */ + private BigDecimal teamConsumePv; + /** + * 日结表-个人伞下新消费pv + */ + private BigDecimal teamNewPv; + + /** + * 日结表-个人累计消费盒数 + */ + private Integer consumeBoxNum; + /** + * 日结表-个人当日新消费盒数 + */ + private Integer newBoxNum; + /** + * 日结表-个人伞下累计消费盒数 + */ + private Integer teamBoxNum; + /** + * 日结表-个人伞下新消费盒数 + */ + private Integer teamNewBoxNum; + + /** + * 秒结表-个人新消费盒数 + */ + private Integer sNewBoxNum; + /** + * 秒结表-团队新消费盒数 + */ + private Integer sTeamNewBoxNum; + /** + * 秒结表-个人新消费pv + */ + private BigDecimal sNewConsumePv; + /** + * 秒结表-团队新消费pv + */ + private BigDecimal sTeamNewPv; + + private Integer sTeamBoxNum; + + /** + * 个人总业绩 + */ + private BigDecimal totalPv; + /** + * 个人总盒数 + */ + private Integer totalBoxNum; + + /** + * 注水大区 + */ + private Integer bigBoxNum; + /** + * 注水小区 + */ + private Integer smallBoxNum; + +} + diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/vo/CuMemberRetailDataStatisticsResultVO.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/vo/CuMemberRetailDataStatisticsResultVO.java new file mode 100644 index 00000000..ce5b02e8 --- /dev/null +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/vo/CuMemberRetailDataStatisticsResultVO.java @@ -0,0 +1,58 @@ +package com.hzs.retail.member.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * 会员数据统计 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CuMemberRetailDataStatisticsResultVO implements Serializable { + + private static final long serialVersionUID = 747472786422852424L; + + /** + * 用户主键 + */ + private Long pkId; + /** + * 用户编号 + */ + private String memberCode; + + /** + * 总盒数 + */ + private Integer totalBoxNum; + /** + * 大区盒数 + */ + private Integer bigRangeTotalBoxNum; + /** + * 小区盒数 + */ + private Integer smallRangeTotalBoxNum; + + /** + * 总业绩 + */ + private BigDecimal totalPv; + /** + * 大区业绩 + */ + private BigDecimal bigRangeTotalPv; + /** + * 小区业绩 + */ + private BigDecimal smallRangeTotalPv; +} + diff --git a/bd-business/bd-business-member/src/main/resources/mapper/member/achieve/CuMemberRetailRangeMapper.xml b/bd-business/bd-business-member/src/main/resources/mapper/member/achieve/CuMemberRetailRangeMapper.xml index 4c1d2cea..acc59f50 100644 --- a/bd-business/bd-business-member/src/main/resources/mapper/member/achieve/CuMemberRetailRangeMapper.xml +++ b/bd-business/bd-business-member/src/main/resources/mapper/member/achieve/CuMemberRetailRangeMapper.xml @@ -836,4 +836,39 @@ connect by prior cm.pk_id = cm.pk_parent order by level +