From 4d5e592019e620830af3c97cc7e17753c43d2f84 Mon Sep 17 00:00:00 2001 From: sangelxiu1 <15781802@163.com> Date: Fri, 13 Jun 2025 10:39:49 +0800 Subject: [PATCH] =?UTF-8?q?##=20Feat=20-=20=E6=96=B0=E5=A2=9E=E7=A7=92?= =?UTF-8?q?=E7=BB=93=E8=A1=A5=E5=81=BFMQ=E9=80=BB=E8=BE=91=20=E6=9F=A5?= =?UTF-8?q?=E5=BD=93=E5=89=8DID=E4=BC=9E=E4=B8=8B=E7=A7=92=E7=BB=93?= =?UTF-8?q?=E8=A1=A8=E7=9A=84sum(NEW=5FBOX=5FNUM)=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=E7=9A=84TEAM=5FNE?= =?UTF-8?q?W=5FBOX=5FNUM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bonus/mapper/CuMemberBonusMapper.java | 2 + .../bonus/service/ICuMemberBonusService.java | 12 ++++- .../impl/CuMemberBonusServiceImpl.java | 26 ++++++++-- ...derSecondActivateCompensationListener.java | 46 +++++++++++++++++ .../bonus/bonus/CuMemberBonusMapper.xml | 19 +++++++ .../api/RetailMemberController.java | 17 +++---- .../member/utils/DataStatisticsUtil.java | 50 ++++++++++++++----- 7 files changed, 143 insertions(+), 29 deletions(-) create mode 100644 bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/listener/SaOrderSecondActivateCompensationListener.java diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberBonusMapper.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberBonusMapper.java index 9f5ed6b0..53ef4e5d 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberBonusMapper.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberBonusMapper.java @@ -137,4 +137,6 @@ public interface CuMemberBonusMapper extends BaseMapper { * @param: null null **/ List queryWeekMemberBonus(@Param("startPeriod") int startPeriod, @Param("endPeriod") int endPeriod); + + void recalculateTeamNewBoxNum(@Param("pkId") Long pkId, @Param("retailsTableName") String retailsTableName); } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberBonusService.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberBonusService.java index e2d2c1de..2a57871e 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberBonusService.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberBonusService.java @@ -1,11 +1,11 @@ package com.hzs.bonus.bonus.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.hzs.bonus.bonus.param.BonusParam; +import com.hzs.bonus.bonus.vo.MemberBonusVO; import com.hzs.common.core.web.page.TableDataInfo; import com.hzs.common.domain.member.bonus.CuMemberBonus; import com.hzs.common.domain.member.ext.CuMemberBonusExt; -import com.hzs.bonus.bonus.param.BonusParam; -import com.hzs.bonus.bonus.vo.MemberBonusVO; import java.util.Date; import java.util.List; @@ -165,4 +165,12 @@ public interface ICuMemberBonusService extends IService { void calculateBonusTotal(CuMemberBonusExt cuMemberBonusExt, CuMemberBonusExt memberBonusExt); CuMemberBonusExt initCuMemberBonus(); + + /** + * 用户激活后会抛出MQ + * 在此需要补偿该用户的当日秒结的团队新增 + * + * @param pkIdList + */ + void recalculateTeamNewBoxNum(List pkIdList); } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java index ab59d7fe..f7a3f627 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java @@ -1,10 +1,12 @@ package com.hzs.bonus.bonus.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageInfo; +import com.hzs.bonus.achieve.service.ICuMemberSettlePeriodService; import com.hzs.bonus.achieve.service.ICuMemberTreeService; import com.hzs.bonus.achieve.service.impl.CuMemberBonusSettle; import com.hzs.bonus.bonus.mapper.*; @@ -14,10 +16,7 @@ import com.hzs.bonus.bonus.service.ICuMemberBonusService; import com.hzs.bonus.bonus.vo.MemberBonusDetailSerVO; import com.hzs.bonus.bonus.vo.MemberBonusDetailVO; import com.hzs.bonus.bonus.vo.MemberBonusVO; -import com.hzs.common.core.constant.HttpStatus; -import com.hzs.common.core.constant.MemberBonusFieldConstants; -import com.hzs.common.core.constant.MemberFieldConstants; -import com.hzs.common.core.constant.SystemFieldConstants; +import com.hzs.common.core.constant.*; import com.hzs.common.core.domain.R; import com.hzs.common.core.enums.*; import com.hzs.common.core.utils.ComputeUtil; @@ -38,6 +37,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -55,6 +56,9 @@ public class CuMemberBonusServiceImpl extends ServiceImpl cuMemberBonusMap.put(cuMemberBonus.getPkMember(), cuMemberBonus)); return cuMemberBonusMap; } + + @Override + public void recalculateTeamNewBoxNum(List pkIdList) { + String retailsTableName = getDayTableName(); + log.info("recalculateTeamNewBoxNum: pkIdList: {}, tableName: {}", JSONUtil.toJsonStr(pkIdList), retailsTableName); + for (Long pkId : pkIdList) { + baseMapper.recalculateTeamNewBoxNum(pkId, retailsTableName); + } + } + private String getDayTableName() { + String localDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + int period = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(localDate).getPkId(); + return TableNameConstants.CU_MEMBER_RETAIL_S + period; + } } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/listener/SaOrderSecondActivateCompensationListener.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/listener/SaOrderSecondActivateCompensationListener.java new file mode 100644 index 00000000..4b648640 --- /dev/null +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/listener/SaOrderSecondActivateCompensationListener.java @@ -0,0 +1,46 @@ +package com.hzs.bonus.listener; + +import cn.hutool.json.JSONUtil; +import com.hzs.bonus.bonus.service.IBonusSettleService; +import com.hzs.bonus.bonus.service.ICuMemberBonusService; +import com.hzs.bonus.bonus.service.ICuMemberRetailLogService; +import com.hzs.common.core.constant.CountryConstants; +import com.hzs.common.core.constant.MagicNumberConstants; +import com.hzs.common.core.constant.RabbitMqConstants; +import com.hzs.common.core.enums.EYesNo; +import com.hzs.common.domain.member.bonus.CuMemberRetailLog; +import com.hzs.common.domain.sale.ext.SaOrderExt; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.*; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 订单秒接 + */ +@Slf4j +@Component +public class SaOrderSecondActivateCompensationListener { + @Autowired + private ICuMemberBonusService memberBonusService; + + @RabbitListener(bindings = @QueueBinding( + exchange = @Exchange(value = RabbitMqConstants.ORDER_SECOND_ACTIVATE_COMPENSATION_EXCHANGE, type = "topic"), + value = @Queue(value = RabbitMqConstants.ORDER_SECOND_ACTIVATE_COMPENSATION_QUEUE, durable = "true", autoDelete = "false"), + key = RabbitMqConstants.ORDER_SECOND_ACTIVATE_COMPENSATION_KEY)) + @RabbitHandler + public void onMessage(Message> message, Channel channel) throws Exception { + List activateCompensationIdList = message.getPayload(); + log.info("秒结开始消费,接收到的参数:{}", JSONUtil.toJsonStr(activateCompensationIdList)); + + Long deliveryTag = (Long) message.getHeaders().get(AmqpHeaders.DELIVERY_TAG); + channel.basicAck(deliveryTag, false); + + memberBonusService.recalculateTeamNewBoxNum(activateCompensationIdList); + } +} diff --git a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusMapper.xml index e5d49d48..a111573f 100644 --- a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusMapper.xml +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusMapper.xml @@ -574,4 +574,23 @@ group by cb.pk_member + + UPDATE ${retailsTableName} + SET TEAM_NEW_BOX_NUM = ( + SELECT SUM(boxNum) + FROM ( + SELECT b.PK_ID, NVL(s.NEW_BOX_NUM, 0) AS boxNum + FROM ${retailsTableName} s + RIGHT JOIN ( + SELECT cm.PK_ID + FROM cu_member cm + WHERE cm.PK_ID != #{pkId} + START WITH cm.PK_ID = #{pkId} + CONNECT BY PRIOR cm.pk_id = cm.pk_parent + ORDER BY LEVEL + ) b ON s.PK_MEMBER = b.PK_ID + ) c + ) + WHERE PK_MEMBER = #{pkId} + diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/controller/api/RetailMemberController.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/controller/api/RetailMemberController.java index 084a5d29..f6807e14 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/controller/api/RetailMemberController.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/member/controller/api/RetailMemberController.java @@ -7,11 +7,12 @@ import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.hzs.bonus.settle.IMemberSettleBonusApi; import com.hzs.common.core.annotation.RepeatSubmitSimple; -import com.hzs.common.core.config.BdConfig; +import com.hzs.common.core.constant.SysConstants; import com.hzs.common.core.constant.msg.AreaConstants; -import com.hzs.common.core.enums.*; +import com.hzs.common.core.enums.EGrade; +import com.hzs.common.core.enums.ENoticeWebsiteType; +import com.hzs.common.core.enums.EYesNo; import com.hzs.common.core.utils.PageUtils; import com.hzs.common.core.web.controller.BaseController; import com.hzs.common.core.web.domain.AjaxResult; @@ -37,7 +38,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -60,11 +60,6 @@ public class RetailMemberController extends BaseController { @DubboReference IAreaServiceApi iAreaServiceApi; - @DubboReference - IMemberSettleBonusApi iMemberSettleBonusApi; - - // 2025年6月11日 判断可选择收益区域的伞下+自身业绩阈值 (30万) - private static final BigDecimal REGIONAL_PERFORMANCE_THRESHOLD = new BigDecimal("300000"); /** * 获取登录会员信息 * @@ -117,7 +112,7 @@ public class RetailMemberController extends BaseController { if(EYesNo.YES.getIntValue() == cuMemberRetailRegionExt.getIsActivate()){ CuMemberRetailAchieveVO retailAchieve = iCuMemberRetailAchieveService.selectMemberSumAchieve(userId, pkCountry, systemType); log.info("retailAchieve : {}", JSONUtil.toJsonStr(retailAchieve)); - if(retailAchieve.getArealPv().compareTo(REGIONAL_PERFORMANCE_THRESHOLD) >= 0){ + if(retailAchieve.getArealPv().compareTo(SysConstants.TOTAL_AREA_PV) >= 0){ return AjaxResult.success(RetailMemberRegionVO.builder() .regionStatus(EYesNo.YES.getIntValue()) .build()); @@ -175,7 +170,7 @@ public class RetailMemberController extends BaseController { } if(EYesNo.YES.getIntValue() == cuMemberRetailRegionExt.getIsActivate()){ CuMemberRetailAchieveVO retailAchieve = iCuMemberRetailAchieveService.selectMemberSumAchieve(userId, pkCountry, systemType); - if(retailAchieve.getArealPv().compareTo(REGIONAL_PERFORMANCE_THRESHOLD) >= 0){ + if(retailAchieve.getArealPv().compareTo(SysConstants.TOTAL_AREA_PV) >= 0){ canSet = true; } } 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 index 5b27e322..5cac6a0e 100644 --- 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 @@ -5,7 +5,10 @@ import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO; import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsResultVO; import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; /** * 用户统计数据工具 @@ -22,42 +25,65 @@ public class DataStatisticsUtil { private static final String SMALL_RANGE_VIRTUAL_NAME = "注水小区虚拟分支"; public static CuMemberRetailDataStatisticsResultVO getCalcMap(List detailVOList, Long pkId){ - calcDetailVOTotalField(detailVOList); + calcDetailVOTotalField(detailVOList, pkId); addVirtualBranch(detailVOList, pkId); CuMemberRetailDataStatisticsDetailVO total = getDetailVOByPKID(detailVOList, pkId); CuMemberRetailDataStatisticsDetailVO bigRange = getBigRangeDetailVO(detailVOList, pkId); + Integer smallRangeTotalBoxNum = total.getTotalBoxNum() - bigRange.getTotalBoxNum(); + if(smallRangeTotalBoxNum < 0){ + smallRangeTotalBoxNum = 0; + } + BigDecimal smallRangeTotalPv = total.getTotalPv().subtract(bigRange.getTotalPv()); + if(smallRangeTotalPv.compareTo(BigDecimal.ZERO) < 0){ + smallRangeTotalPv = BigDecimal.ZERO; + } 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())) + .smallRangeTotalBoxNum(smallRangeTotalBoxNum) + .smallRangeTotalPv(smallRangeTotalPv) .build(); } /** * 计算集合内数据总数 * @param detailVOList */ - public static void calcDetailVOTotalField(List detailVOList){ + public static void calcDetailVOTotalField(List detailVOList, Long pkId){ detailVOList.parallelStream().forEach(detailVO -> { detailVO.setTotalBoxNum( detailVO.getConsumeBoxNum() // 个人累计消费盒数(日结) - + detailVO.getNewBoxNum() // 个人新增盒数(日结) +// + detailVO.getNewBoxNum() // 个人新增盒数(日结) + detailVO.getTeamBoxNum() // 团队累计消费盒数(日结) - + detailVO.getTeamNewBoxNum() // 团队新增盒数(日结) +// + detailVO.getTeamNewBoxNum() // 团队新增盒数(日结) + detailVO.getSNewBoxNum() // 个人新增消费盒数(秒结) + detailVO.getSTeamNewBoxNum() // 团队新增盒数(秒结) // - detailVO.getBigBoxNum() // 个人注水大区盒数(日结) // - detailVO.getSmallBoxNum() // 个人注水小区盒数(日结) ); detailVO.setTotalPv(detailVO.getConsumePv() - .add(detailVO.getNewConsumePv()) +// .add(detailVO.getNewConsumePv()) .add(detailVO.getTeamConsumePv()) - .add(detailVO.getTeamNewPv()) +// .add(detailVO.getTeamNewPv()) .add(detailVO.getSNewConsumePv()) .add(detailVO.getSTeamNewPv()) ); + // self增加当日伞下 +// if(detailVO.getPkId().equals(pkId)){ +// List subList = detailVOList.parallelStream().filter(o -> !o.getPkId().equals(pkId)).collect(Collectors.toList()); +// int subSTotalNewBoxNum = subList.parallelStream() +// .map(CuMemberRetailDataStatisticsDetailVO::getSNewBoxNum) +// .filter(Objects::nonNull) +// .mapToInt(Integer::intValue) +// .sum(); +// BigDecimal subSTotalNewPv = subList.parallelStream() +// .map(CuMemberRetailDataStatisticsDetailVO::getSNewConsumePv) +// .filter(Objects::nonNull) +// .reduce(BigDecimal.ZERO, BigDecimal::add); +// detailVO.setTotalBoxNum(detailVO.getTotalBoxNum() + subSTotalNewBoxNum); +// detailVO.setTotalPv(detailVO.getTotalPv().add(subSTotalNewPv)); +// } }); } @@ -137,18 +163,18 @@ public class DataStatisticsUtil { * @return */ public static CuMemberRetailDataStatisticsDetailVO getDetailVOByPKID(List detailVOList, Long pkId){ - return detailVOList.stream().filter(o -> o.getPkId().equals(pkId)).findFirst().orElse(null); + return detailVOList.parallelStream().filter(o -> o.getPkId().equals(pkId)).findFirst().orElse(null); } private static Integer getMaxTotalBoxNum(List detailVOList) { - return detailVOList.stream() + return detailVOList.parallelStream() .map(CuMemberRetailDataStatisticsDetailVO::getTotalBoxNum) .filter(Objects::nonNull) .max(Integer::compare) .orElse(null); } private static CuMemberRetailDataStatisticsDetailVO getBigRangeDetailVO(List detailVOList, Long pkId){ - return detailVOList.stream() + return detailVOList.parallelStream() .filter(vo -> vo.getTotalBoxNum() != null && !vo.getPkId().equals(pkId)) .max(Comparator.comparingInt(CuMemberRetailDataStatisticsDetailVO::getTotalBoxNum)) .orElse(null);