3
0
Fork 0

## Feat - 新增秒结补偿MQ逻辑

查当前ID伞下秒结表的sum(NEW_BOX_NUM)更新至当前用户的TEAM_NEW_BOX_NUM
This commit is contained in:
sangelxiu1 2025-06-13 10:39:49 +08:00
parent b32e00d74e
commit 4d5e592019
7 changed files with 143 additions and 29 deletions

View File

@ -137,4 +137,6 @@ public interface CuMemberBonusMapper extends BaseMapper<CuMemberBonus> {
* @param: null null
**/
List<CuMemberBonus> queryWeekMemberBonus(@Param("startPeriod") int startPeriod, @Param("endPeriod") int endPeriod);
void recalculateTeamNewBoxNum(@Param("pkId") Long pkId, @Param("retailsTableName") String retailsTableName);
}

View File

@ -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<CuMemberBonus> {
void calculateBonusTotal(CuMemberBonusExt cuMemberBonusExt, CuMemberBonusExt memberBonusExt);
CuMemberBonusExt initCuMemberBonus();
/**
* 用户激活后会抛出MQ
* 在此需要补偿该用户的当日秒结的团队新增
*
* @param pkIdList
*/
void recalculateTeamNewBoxNum(List<Long> pkIdList);
}

View File

@ -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<CuMemberBonusMapper, C
ICurrencyServiceApi iCurrencyServiceApi;
@DubboReference
IBonusItemsServiceApi iBonusItemsServiceApi;
@Autowired
private ICuMemberSettlePeriodService iCuMemberSettlePeriodService;
private CuMemberBonusDetailMapper cuMemberBonusDetailMapper;
@ -693,4 +697,18 @@ public class CuMemberBonusServiceImpl extends ServiceImpl<CuMemberBonusMapper, C
cuMemberBonusList.forEach(cuMemberBonus -> cuMemberBonusMap.put(cuMemberBonus.getPkMember(), cuMemberBonus));
return cuMemberBonusMap;
}
@Override
public void recalculateTeamNewBoxNum(List<Long> 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;
}
}

View File

@ -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<List<Long>> message, Channel channel) throws Exception {
List<Long> activateCompensationIdList = message.getPayload();
log.info("秒结开始消费,接收到的参数:{}", JSONUtil.toJsonStr(activateCompensationIdList));
Long deliveryTag = (Long) message.getHeaders().get(AmqpHeaders.DELIVERY_TAG);
channel.basicAck(deliveryTag, false);
memberBonusService.recalculateTeamNewBoxNum(activateCompensationIdList);
}
}

View File

@ -574,4 +574,23 @@
group by cb.pk_member
</select>
<update id="recalculateTeamNewBoxNum">
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}
</update>
</mapper>

View File

@ -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;
}
}

View File

@ -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<CuMemberRetailDataStatisticsDetailVO> 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<CuMemberRetailDataStatisticsDetailVO> detailVOList){
public static void calcDetailVOTotalField(List<CuMemberRetailDataStatisticsDetailVO> 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<CuMemberRetailDataStatisticsDetailVO> 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<CuMemberRetailDataStatisticsDetailVO> 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<CuMemberRetailDataStatisticsDetailVO> detailVOList) {
return detailVOList.stream()
return detailVOList.parallelStream()
.map(CuMemberRetailDataStatisticsDetailVO::getTotalBoxNum)
.filter(Objects::nonNull)
.max(Integer::compare)
.orElse(null);
}
private static CuMemberRetailDataStatisticsDetailVO getBigRangeDetailVO(List<CuMemberRetailDataStatisticsDetailVO> 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);