From 03200163091eacc438da86a36eb9b00f816a4b6e Mon Sep 17 00:00:00 2001 From: cabbage <281119120@qq.com> Date: Mon, 1 Sep 2025 17:09:38 +0800 Subject: [PATCH] =?UTF-8?q?##=20=E5=A5=96=E9=87=91=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=A7=92=E7=BB=93=E5=A4=84=E7=90=86=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/CuMemberRetailRangeMapper.java | 25 ++++ .../service/ICuMemberRetailRangeService.java | 11 ++ .../impl/CuMemberRetailRangeServiceImpl.java | 14 +++ .../bonus/mapper/CuMemberBonusMapper.java | 7 ++ .../bonus/mapper/CuMemberRetailLogMapper.java | 19 +++ .../bonus/service/IBonusSettleService.java | 5 + .../bonus/service/ICuMemberBonusService.java | 12 ++ .../service/ICuMemberRetailLogService.java | 23 ++++ .../service/impl/BonusSettleRangeHandle.java | 64 ++++++++++- .../service/impl/BonusSettleServiceImpl.java | 74 ++++++++++++ .../impl/CuMemberBonusServiceImpl.java | 14 +++ .../impl/CuMemberRetailLogServiceImpl.java | 38 ++++++ .../detail/mapper/CuMemberGradeMapper.java | 6 + .../detail/service/ICuMemberGradeService.java | 5 + .../impl/CuMemberGradeServiceImpl.java | 6 + .../bonus/listener/SaOrderSecondListener.java | 62 ++++++++++ .../achieve/CuMemberRetailRangeMapper.xml | 108 +++++++++++++++++- .../bonus/bonus/CuMemberBonusMapper.xml | 89 +++++++++++++++ .../bonus/bonus/CuMemberRetailLogMapper.xml | 15 +++ .../bonus/detail/CuMemberGradeMapper.xml | 27 +++++ .../service/impl/RetailOrderServiceImpl.java | 36 +++++- .../core/constant/RabbitMqConstants.java | 13 +++ 22 files changed, 661 insertions(+), 12 deletions(-) create mode 100644 bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberRetailLogMapper.java create mode 100644 bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberRetailLogService.java create mode 100644 bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberRetailLogServiceImpl.java create mode 100644 bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/listener/SaOrderSecondListener.java create mode 100644 bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberRetailLogMapper.xml diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/mapper/CuMemberRetailRangeMapper.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/mapper/CuMemberRetailRangeMapper.java index 536d9257..ac5086ce 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/mapper/CuMemberRetailRangeMapper.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/mapper/CuMemberRetailRangeMapper.java @@ -3,6 +3,7 @@ package com.hzs.bonus.achieve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hzs.common.domain.member.achieve.CuMemberRetailRange; import com.hzs.common.domain.member.achieve.ext.CuMemberRetailRangeExt; +import com.hzs.common.domain.sale.ext.SaOrderExt; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -29,8 +30,18 @@ public interface CuMemberRetailRangeMapper extends BaseMapper queryCuMemberRetailRangeParent(@Param("tableName") String tableName, @Param("saOrderExtList") List saOrderExtList); + /** + * 根据会员查询会员血缘上网体 -- 秒结使用 + */ + List getCuMemberRetailRangeParent(@Param("saOrderExt") SaOrderExt saOrderExt); + CuMemberRetailRangeExt queryCuMemberRetailRangeByMemberId(@Param("tableName") String tableName, @Param("memberId") Long memberId); + /** + * 查询会员信息 + */ + CuMemberRetailRangeExt getMemberRetailRange(@Param("memberId") Long memberId); + /** * 批量更新网体 */ @@ -45,4 +56,18 @@ public interface CuMemberRetailRangeMapper extends BaseMapper pkMemberList); + /** + * 当前网体更新极差秒结表 + */ + void mergeMemberSecondRetailRangeByRange(@Param("secondRangeTableName") String secondRangeTableName, + @Param("pkMember") Long pkMember); + + /** + * 昨天的结算表更新极差秒结状态 + */ + void mergeMemberSecondRetailRangeByRangeEnable(@Param("rangeTableName") String rangeTableName, + @Param("secondRangeTableName") String secondRangeTableName, + @Param("pkMember") Long pkMember); + + } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/ICuMemberRetailRangeService.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/ICuMemberRetailRangeService.java index e5683e00..f2c9f881 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/ICuMemberRetailRangeService.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/ICuMemberRetailRangeService.java @@ -24,6 +24,11 @@ public interface ICuMemberRetailRangeService extends IService queryCuMemberRetailRangeParent(String tableName, List saOrderExtList); + /** + * 根据会员查询会员血缘上网体 -- 秒结使用 + */ + List getCuMemberRetailRangeParent(SaOrderExt saOrderExt); + /** * 更新会员树的累计业绩 * @@ -41,4 +46,10 @@ public interface ICuMemberRetailRangeService extends IService pkMemberList); + /** + * 更新极差秒接表,用昨天的结算表 + */ + void mergeMemberSecondRetailRangeByRange(String rangeTableName, String secondRangeTableName, Long pkMember); + + } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailRangeServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailRangeServiceImpl.java index b35679ef..b0feab67 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailRangeServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailRangeServiceImpl.java @@ -50,6 +50,11 @@ public class CuMemberRetailRangeServiceImpl extends ServiceImpl getCuMemberRetailRangeParent(SaOrderExt saOrderExt) { + return baseMapper.getCuMemberRetailRangeParent(saOrderExt); + } + @Override public void updateCuMemberRetailRange(String settleTableName, Map cuMemberTreeMap) { List> treeList = setUpdCuMemberTreeLists(cuMemberTreeMap); @@ -67,4 +72,13 @@ public class CuMemberRetailRangeServiceImpl extends ServiceImpl { @Param("oldGrantStatus") Integer oldGrantStatus, @Param("startPeriod") Integer startPeriod, @Param("endPeriod") Integer endPeriod); + /** + * 批量插入会员奖金主表 + * + * @param cuMemberBonusList 会员奖金 + */ + void insertOrUpdateCuMemberBonus(@Param("cuMemberBonusList") List cuMemberBonusList); + } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberRetailLogMapper.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberRetailLogMapper.java new file mode 100644 index 00000000..fed3aac8 --- /dev/null +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberRetailLogMapper.java @@ -0,0 +1,19 @@ +package com.hzs.bonus.bonus.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hzs.common.domain.member.bonus.CuMemberRetailLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 秒接日志记录表 Mapper 接口 + */ +public interface CuMemberRetailLogMapper extends BaseMapper { + + /* + * 更新会员日志 + **/ + void updateCuMemberRetailLogByList(@Param("cuMemberRetailLogs") List cuMemberRetailLogs); + +} diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/IBonusSettleService.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/IBonusSettleService.java index 90d35f1c..b8a02aee 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/IBonusSettleService.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/IBonusSettleService.java @@ -17,4 +17,9 @@ public interface IBonusSettleService { */ void calculateCuMemberBonus(String date, List saOrderExtList); + /** + * 根据订单计算新零售奖金 -- 秒结 + */ + void calculateCuMemberRetailRangeBonusBySaOrder(String orderCode); + } 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 bfba25ca..56c0cddc 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 @@ -128,4 +128,16 @@ public interface ICuMemberBonusService extends IService { CuMemberBonusExt initCuMemberBonus(); + /** + * 批量插入会员奖金主表 + * + * @param cuMemberBonusList 会员奖金 + */ + void insertOrUpdateCuMemberBonus(List cuMemberBonusList); + + /** + * 查询会员奖金 + */ + List queryCuMemberBonus(int period, List cuMemberBonusList); + } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberRetailLogService.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberRetailLogService.java new file mode 100644 index 00000000..2c7b76f6 --- /dev/null +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberRetailLogService.java @@ -0,0 +1,23 @@ +package com.hzs.bonus.bonus.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.hzs.common.domain.member.bonus.CuMemberRetailLog; + +import java.util.List; + +/** + * 秒接日志记录表 服务类 + */ +public interface ICuMemberRetailLogService extends IService { + + /* + * 查询24小时之内失败的记录,重试 + **/ + List queryCuMemberRetailLog(); + + /* + * 更新会员日志 + **/ + void updateCuMemberRetailLogByList(List cuMemberRetailLogs); + +} diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleRangeHandle.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleRangeHandle.java index fcc6540d..9e4db2d8 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleRangeHandle.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleRangeHandle.java @@ -59,6 +59,54 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { @DubboReference IMemberServiceApi iMemberServiceApi; + /** + * 秒结: + * 首购级差、复购级差、复购配送(业绩、盒数、等级、奖衔、日奖) + */ + List calculateCuMemberRetailRangeBonusBySecond(String settleDate, SaOrderExt saOrderExt, BonusConfigDTO bonusConfigDTO, + int currentPeriod, Map cuMemberBonusMap, + List cuMemberBonusDetailList) { + // 直推、复购级差收益 + List cuMemberBonusRangeList = new ArrayList<>(); + + // 按照血缘,查询该会员所有伞上会员 -- 不处理业绩等,直接查询会员表 cu_member + List memberRetailRangeExtList = iCuMemberRetailRangeService.getCuMemberRetailRangeParent(saOrderExt); + // 会员结算map(key:会员ID,value:结算扩展) + Map memberRangeExtMap = new HashMap<>(); + for (CuMemberRetailRangeExt cuMemberRetailRangeExt : memberRetailRangeExtList) { + if (!memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) { + memberRangeExtMap.put(cuMemberRetailRangeExt.getPkMember(), cuMemberRetailRangeExt); + } + } + + // 配送收益配置 + Map regionMap = iMemberServiceApi.listEffectiveRegion(DateUtils.parseStringToDate(settleDate)).getData(); + // 订单指定产品盒数 + BigDecimal boxNum = saOrderExt.getBoxNum(); + + // 计算奖金 直推级差 + if ((EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType() + || EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType()) + && boxNum.compareTo(BigDecimal.ZERO) > 0 + ) { + // 注册或升级订单并且存在盒数产品,才有 直推级差 + cuMemberBonusRangeList.addAll(calculateRetailRangeBonus(memberRangeExtMap, cuMemberBonusMap, bonusConfigDTO, currentPeriod, saOrderExt)); + } else if (EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()) { + // 复购订单 + if (boxNum.compareTo(BigDecimal.ZERO) > 0) { + // 存在盒数商品,计算复购级差 + cuMemberBonusRangeList.addAll(calculateRetailRepurRangeBonus(memberRangeExtMap, cuMemberBonusMap, + bonusConfigDTO, currentPeriod, saOrderExt)); + } + // 计算配送收益 + if (regionMap.size() != 0) { + cuMemberBonusDetailList.addAll(calculateRetailRepurRegionBonus(memberRangeExtMap, cuMemberBonusMap, + bonusConfigDTO, currentPeriod, saOrderExt, regionMap, null, true)); + } + } + return cuMemberBonusRangeList; + } + /** * 日结: * 计算新零售奖金,首购级差、复购级差 @@ -185,7 +233,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { && boxNum.compareTo(BigDecimal.ZERO) > 0 ) { // 注册或升级订单并且存在盒数产品,才有 直推级差 - cuMemberBonusRangeList.addAll(calculateRetailRangeBonus(memberRangeExtMap, cuMemberBonusMap, bonusConfigDTO, period, saOrderExt, gradeIdMap)); + cuMemberBonusRangeList.addAll(calculateRetailRangeBonus(memberRangeExtMap, cuMemberBonusMap, bonusConfigDTO, period, saOrderExt)); // 订单存在升级记录 if (memberLevelMap.containsKey(saOrderExt.getPkId())) { @@ -222,7 +270,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 计算配送收益 if (regionMap.size() != 0) { cuMemberBonusDetailList.addAll(calculateRetailRepurRegionBonus(memberRangeExtMap, cuMemberBonusMap, - bonusConfigDTO, period, saOrderExt, regionMap, rangeTableName)); + bonusConfigDTO, period, saOrderExt, regionMap, rangeTableName, false)); } } } @@ -295,7 +343,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { * 计算直推级差收益 */ List calculateRetailRangeBonus(Map memberRangeExtMap, Map cuMemberBonusMap, - BonusConfigDTO bonusConfigDTO, Integer period, SaOrderExt saOrderExt, Map gradeIdMap) { + BonusConfigDTO bonusConfigDTO, Integer period, SaOrderExt saOrderExt) { // 直推级差返回数据 List memberBonusRangeList = new ArrayList<>(); @@ -654,7 +702,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { */ List calculateRetailRepurRegionBonus(Map memberRangeExtMap, Map cuMemberBonusMap, BonusConfigDTO bonusConfigDTO, Integer period, SaOrderExt saOrderExt, Map regionMap, - String rangeTableName) { + String rangeTableName, boolean secondFlag) { // 复购配送区域返回数据 List memberBonusDetailList = new ArrayList<>(); @@ -665,7 +713,13 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { if (null != retailRegion) { CuMemberRetailRangeExt targetMemberRangeExt = memberRangeExtMap.get(retailRegion.getPkMember()); if (ObjectUtil.isEmpty(targetMemberRangeExt)) { - targetMemberRangeExt = cuMemberRetailRangeMapper.queryCuMemberRetailRangeByMemberId(rangeTableName, retailRegion.getPkMember()); + if (secondFlag) { + // 秒结处理 + targetMemberRangeExt = cuMemberRetailRangeMapper.getMemberRetailRange(retailRegion.getPkMember()); + } else { + // 非秒结处理 + targetMemberRangeExt = cuMemberRetailRangeMapper.queryCuMemberRetailRangeByMemberId(rangeTableName, retailRegion.getPkMember()); + } if (null == targetMemberRangeExt) { // 配送区域对应的会员不存在了,直接跳过 return memberBonusDetailList; diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java index 5639af2f..371acc23 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java @@ -1,8 +1,11 @@ package com.hzs.bonus.bonus.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.hzs.bonus.achieve.service.ICuMemberSettlePeriodService; import com.hzs.bonus.bonus.service.*; import com.hzs.bonus.bonus.vo.BonusRecordDetailVO; +import com.hzs.bonus.order.service.IBonusOrderService; +import com.hzs.common.core.constant.MagicNumberConstants; import com.hzs.common.core.enums.*; import com.hzs.common.core.utils.DateUtils; import com.hzs.common.domain.member.bonus.*; @@ -40,6 +43,24 @@ public class BonusSettleServiceImpl implements IBonusSettleService { private ICuMemberBonusRangeService iCuMemberBonusRangeService; @Autowired private BonusSettleRangeHandle bonusSettleRangeHandle; + @Autowired + private IBonusOrderService iBonusOrderService; + + /** + * 保存会员奖金 + * + * @param cuMemberBonusMap 奖金map + */ + protected void saveCuMemberBonus(int period, String settleDate, Map cuMemberBonusMap) { + // 保存奖金 + List cuMemberBonusList = setCuMemberBonusSeq(settleDate, cuMemberBonusMap); + if (cuMemberBonusList.size() > 0) { + // 插入奖金主表 + iCuMemberBonusService.insertOrUpdateCuMemberBonus(cuMemberBonusList); + List cuMemberBonuses = iCuMemberBonusService.queryCuMemberBonus(period, cuMemberBonusList); + cuMemberBonuses.forEach(cuMemberBonus -> cuMemberBonusMap.put(cuMemberBonus.getPkMember(), cuMemberBonus)); + } + } @Override @Transactional(rollbackFor = Exception.class) @@ -74,6 +95,59 @@ public class BonusSettleServiceImpl implements IBonusSettleService { } } + @Override + public void calculateCuMemberRetailRangeBonusBySaOrder(String orderCode) { + // 需要处理的订单 + List retailOrderList = iBonusOrderService.queryRetailSaOrderByDay(DateUtils.beforeDate(6, ChronoUnit.DAYS), DateUtils.afterDate(1, ChronoUnit.DAYS), orderCode); + + if (CollectionUtil.isNotEmpty(retailOrderList)) { + // 查询奖金参数 + BonusConfigDTO bonusConfigDTO = iBonusItemsServiceApi.queryBonusConfigDTO().getData(); + // 会员奖金map + Map cuMemberBonusMap = new HashMap<>(MagicNumberConstants.BATCH_UPDATE_NUM); + // 订单数据 + SaOrderExt saOrderExt = retailOrderList.get(0); + + // 处理奖金结算秒结表,判断是否存在当天结算的秒接表,从cu_member中获取网体,从昨日结算表中获取累计、结余数据 + // 今天结算期数 + String settleDate = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, saOrderExt.getPayTime()); + int currentPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(settleDate).getPkId(); + + if (saOrderExt.getDelFlag() == EYesNo.YES.getIntValue()) { + // 订单下单处理(正向) + // 会员奖金明细 + List cuMemberBonusDetailList = new ArrayList<>(); + // 实时计算秒结数据(秒奖) + List cuMemberBonusRangeList = bonusSettleRangeHandle.calculateCuMemberRetailRangeBonusBySecond(settleDate, saOrderExt, bonusConfigDTO, + currentPeriod, cuMemberBonusMap, cuMemberBonusDetailList); + saveCuMemberBonus(currentPeriod, settleDate, cuMemberBonusMap); + + Set memberIdSet = iCuMemberBonusService.queryMemberBonusByPeriod(currentPeriod); + if (cuMemberBonusRangeList.size() > 0) { + cuMemberBonusRangeList.forEach(cuMemberBonusRange -> + cuMemberBonusRange.setPkBonus(cuMemberBonusMap.get(cuMemberBonusRange.getPkBonus()).getPkId())); + iCuMemberBonusRangeService.batchInsertCuMemberBonusRange(cuMemberBonusRangeList, memberIdSet); + } + if (cuMemberBonusDetailList.size() > 0) { + cuMemberBonusDetailList.forEach(cuMemberBonusDetail -> + cuMemberBonusDetail.setPkBonus(cuMemberBonusMap.get(cuMemberBonusDetail.getPkBonus()).getPkId())); + iCuMemberBonusDetailService.batchInsertCuMemberBonusDetail(cuMemberBonusDetailList, memberIdSet); + } + } else { + // 订单撤单处理(逆向) +// if (!DateUtils.isSameDay(saOrderExt.getPayTime(), DateUtils.currentDate())) { +// settleDate = DateUtils.parseDateToFormat(DateUtils.YYYY_MM_DD, DateUtils.beforeDate(1, ChronoUnit.DAYS)); +// currentPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(settleDate).getPkId(); +// } +// // 实时计算撤单数据(业绩、盒数、等级、奖衔、日奖) +// bonusSettleRangeHandle.calculateCuMemberBackRetailIncome(saOrderExt, bonusConfigDTO, +// secondRangeTableName, beforePeriod, currentPeriod); +// // 处理收益 +// iCuMemberBonusService.mergeBackMemberBonusIncome(saOrderExt.getPkId()); + } + } + } + /** * 计算每天的奖金入库 * 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 c452f08b..1d5fefbf 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 @@ -404,4 +404,18 @@ public class CuMemberBonusServiceImpl extends ServiceImpl cuMemberBonusList) { + baseMapper.insertOrUpdateCuMemberBonus(cuMemberBonusList); + } + + @Override + public List queryCuMemberBonus(int period, List cuMemberBonusList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + List memberList = cuMemberBonusList.stream().map(CuMemberBonus::getPkMember).collect(Collectors.toList()); + queryWrapper.eq(MemberFieldConstants.PERIOD, period); + queryWrapper.in(MemberFieldConstants.PK_MEMBER, memberList); + return baseMapper.selectList(queryWrapper); + } + } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberRetailLogServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberRetailLogServiceImpl.java new file mode 100644 index 00000000..461632b1 --- /dev/null +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberRetailLogServiceImpl.java @@ -0,0 +1,38 @@ +package com.hzs.bonus.bonus.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hzs.bonus.bonus.mapper.CuMemberRetailLogMapper; +import com.hzs.bonus.bonus.service.ICuMemberRetailLogService; +import com.hzs.common.core.enums.EYesNo; +import com.hzs.common.core.utils.DateUtils; +import com.hzs.common.domain.member.bonus.CuMemberRetailLog; +import org.springframework.stereotype.Service; + +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.List; + +/** + * 秒接日志记录表 服务实现类 + */ +@Service +public class CuMemberRetailLogServiceImpl extends ServiceImpl implements ICuMemberRetailLogService { + + @Override + public List queryCuMemberRetailLog() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(CuMemberRetailLog::getEnableStatus, EYesNo.NO.getIntValue()); + Date endTime = DateUtils.currentDateTime(); + Date startTime = DateUtils.beforeDate(1, ChronoUnit.DAYS, endTime); + queryWrapper.gt(CuMemberRetailLog::getCreationTime, startTime); + queryWrapper.le(CuMemberRetailLog::getCreationTime, endTime); + queryWrapper.orderByAsc(CuMemberRetailLog::getCreationTime); + return baseMapper.selectList(queryWrapper); + } + + @Override + public void updateCuMemberRetailLogByList(List cuMemberRetailLogs) { + baseMapper.updateCuMemberRetailLogByList(cuMemberRetailLogs); + } +} diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/mapper/CuMemberGradeMapper.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/mapper/CuMemberGradeMapper.java index e411356a..20263fef 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/mapper/CuMemberGradeMapper.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/mapper/CuMemberGradeMapper.java @@ -25,4 +25,10 @@ public interface CuMemberGradeMapper extends BaseMapper { @Param("endDate") Date endDate, @Param("upType") Integer upType); + + /** + * 查询会员最新手动升级记录,更新秒结表会员等级小于手动升级的会员等级 + */ + void updateCuMemberGradeSecond(@Param("secondRangeTableName") String secondRangeTableName, @Param("period") Integer period); + } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/service/ICuMemberGradeService.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/service/ICuMemberGradeService.java index 97256db2..f6cbef13 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/service/ICuMemberGradeService.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/service/ICuMemberGradeService.java @@ -31,4 +31,9 @@ public interface ICuMemberGradeService extends IService { */ List listAutoLevel(Date startDate, Date endDate); + /** + * 查询会员最新手动升级记录,更新秒结表会员等级小于手动升级的会员等级 + */ + void updateCuMemberGradeSecond(String secondRangeTableName, Integer period); + } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/service/impl/CuMemberGradeServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/service/impl/CuMemberGradeServiceImpl.java index 63d6a40c..b84e10a5 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/service/impl/CuMemberGradeServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/detail/service/impl/CuMemberGradeServiceImpl.java @@ -34,4 +34,10 @@ public class CuMemberGradeServiceImpl extends ServiceImpl message, Channel channel) throws Exception { + SaOrderExt saOrderExt = message.getPayload(); + log.info("秒结开始消费,接收到的参数:{}", saOrderExt.getOrderCode()); + + Long deliveryTag = (Long) message.getHeaders().get(AmqpHeaders.DELIVERY_TAG); + channel.basicAck(deliveryTag, false); + + CuMemberRetailLog cuMemberRetailLog = new CuMemberRetailLog(); + cuMemberRetailLog.setPkCountry(CountryConstants.CHINA_COUNTRY); + cuMemberRetailLog.setPkCreator(MagicNumberConstants.PK_ADMIN); + cuMemberRetailLog.setOrderCode(saOrderExt.getOrderCode()); + if (saOrderExt.getCancelBool() != null && saOrderExt.getCancelBool()) { + cuMemberRetailLog.setCancelStatus(EYesNo.YES.getIntValue()); + } + + try { + Thread.sleep(1000); + iBonusSettleService.calculateCuMemberRetailRangeBonusBySaOrder(saOrderExt.getOrderCode()); + } catch (Exception e) { + cuMemberRetailLog.setEnableStatus(EYesNo.NO.getIntValue()); + cuMemberRetailLog.setMsg(e.getMessage()); + e.printStackTrace(); + } finally { + iCuMemberRetailLogService.save(cuMemberRetailLog); + } + } +} diff --git a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberRetailRangeMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberRetailRangeMapper.xml index 49a15c7d..ae872f5a 100644 --- a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberRetailRangeMapper.xml +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberRetailRangeMapper.xml @@ -163,7 +163,6 @@ a.pay_time, a.pk_rate, a.system_type, - a.income_status, a.pk_country, a.pk_settle_country, a.enable_status, @@ -204,6 +203,34 @@ + + + + + + update ${rangeTableName} cmr @@ -264,4 +318,56 @@ + + + merge into ${secondRangeTableName} a + using ( + select a.pk_id pk_member, + a.pk_parent, + a.pk_settle_grade pk_grade, + a.pk_awards, + a.pk_range_awards, + a.is_activate enable_status, + a.system_type + from (select * + from cu_member + where del_flag = 0 + start + with pk_id = #{pkMember} + connect by pk_id = prior pk_parent + ) a + ) b + on (a.pk_member = b.pk_member) + when not matched then + insert (pk_member, pk_parent, pk_grade, pk_awards, pk_share_awards, enable_status, system_type) + values (b.pk_member, b.pk_parent, b.pk_grade, b.pk_awards, b.pk_range_awards, b.enable_status, b.system_type) + + + + + merge into ${secondRangeTableName} a + using ( + select a.pk_id pk_member, + a.pk_parent, + a.pk_settle_grade pk_grade, + a.pk_awards, + a.pk_range_awards, + nvl(b.enable_status, 1) enable_status + from (select * + from cu_member + where del_flag = 0 + start + with pk_id = #{pkMember} + connect by pk_id = prior pk_parent + ) a + left join ${rangeTableName} b + on a.pk_id = b.pk_member + where b.enable_status = 0 + ) b + on (a.pk_member = b.pk_member) + when matched then + update set a.enable_status = b.enable_status, a.pk_grade = b.pk_grade + + + 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 ba3ea360..107b33df 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 @@ -507,4 +507,93 @@ from dual connect by rownum <= #{rowNum} + + merge into cu_member_bonus a + using( + select pk_id,pk_member,period,pk_rate,direct_income,expand_income,expand_no_capping, + expand_capping,coach_income,share_income,service_income,back_points,service_spend, + pur_real_subtotal,repur_push_income, + repur_range_income, + repur_expand_income,repur_real_subtotal, + cloud_direct_income,cloud_pur_income,cloud_repur_income,cloud_real_subtotal, + repur_coupon,repur_coupon_subtotal,global_points, + car_award_points,hi_fun_income,hai_fun_income, + retail_range_income, retail_same_level_income, retail_area_income, + retail_benefit_range_income, retail_benefit_avg_income, retail_benefit_income, + retail_real_subtotal, maker_direct_income,maker_share_income, maker_real_subtotal, real_income_total, + pk_country, pk_creator, grant_status, income_status + from ( + + select #{item.pkId} pk_id,#{item.pkMember} pk_member,#{item.period} period,#{item.pkRate} pk_rate, + #{item.directIncome} direct_income,#{item.expandIncome} expand_income,#{item.expandNoCapping} expand_no_capping, + #{item.expandCapping} expand_capping,#{item.coachIncome} coach_income,#{item.shareIncome} share_income, + #{item.serviceIncome} service_income,#{item.backPoints} back_points,#{item.serviceSpend} service_spend, + #{item.purRealSubtotal} pur_real_subtotal,#{item.repurPushIncome} repur_push_income, + #{item.repurRangeIncome} repur_range_income, + #{item.repurExpandIncome} repur_expand_income, + #{item.repurRealSubtotal} repur_real_subtotal,#{item.cloudDirectIncome} cloud_direct_income, + #{item.cloudPurIncome} cloud_pur_income,#{item.cloudRepurIncome} cloud_repur_income, + #{item.cloudRealSubtotal} cloud_real_subtotal,#{item.repurCoupon} repur_coupon, + #{item.repurCouponSubtotal} repur_coupon_subtotal,#{item.globalPoints} global_points, + #{item.carAwardPoints} car_award_points,#{item.hiFunIncome} hi_fun_income, + #{item.haiFunIncome} hai_fun_income,#{item.makerDirectIncome} maker_direct_income, + #{item.makerShareIncome} maker_share_income,#{item.makerRealSubtotal} maker_real_subtotal, + #{item.realIncomeTotal} real_income_total,#{item.pkCountry} pk_country,#{item.pkCreator} pk_creator, + #{item.grantStatus} grant_status, #{item.incomeStatus} income_status, + #{item.retailRangeIncome} retail_range_income, #{item.retailSameLevelIncome} retail_same_level_income, + #{item.retailAreaIncome} retail_area_income, #{item.retailBenefitRangeIncome} retail_benefit_range_income, + #{item.retailBenefitAvgIncome} retail_benefit_avg_income, #{item.retailBenefitIncome} retail_benefit_income, + #{item.retailRealSubtotal} retail_real_subtotal + from dual + ) + ) b + on (a.pk_member = b.pk_member and a.period = b.period) + when matched then + update set + a.direct_income = a.direct_income + b.direct_income,a.expand_income=a.expand_income+b.expand_income, + a.expand_no_capping=a.expand_no_capping+b.expand_no_capping,a.expand_capping=a.expand_capping+b.expand_capping, + a.coach_income=a.coach_income+b.coach_income,a.share_income=a.share_income+b.share_income, + a.service_income=a.service_income+b.service_income,a.back_points=a.back_points+b.back_points,a.service_spend=a.service_spend+b.service_spend, + a.pur_real_subtotal=a.pur_real_subtotal+b.pur_real_subtotal,a.repur_push_income=a.repur_push_income+b.repur_push_income, + a.repur_range_income = a.repur_range_income + b.repur_range_income, + a.repur_expand_income=a.repur_expand_income+b.repur_expand_income, + a.repur_real_subtotal=a.repur_real_subtotal+b.repur_real_subtotal,a.cloud_direct_income=a.cloud_direct_income+b.cloud_direct_income, + a.cloud_pur_income=a.cloud_pur_income+b.cloud_pur_income,a.cloud_repur_income=a.cloud_repur_income+b.cloud_repur_income, + a.cloud_real_subtotal=a.cloud_real_subtotal+b.cloud_real_subtotal,a.repur_coupon=a.repur_coupon+b.repur_coupon, + a.global_points=a.global_points+b.global_points,a.car_award_points=a.car_award_points+b.car_award_points, + a.hi_fun_income=a.hi_fun_income+b.hi_fun_income,a.real_income_total=a.real_income_total+b.real_income_total, + a.retail_range_income = a.retail_range_income + b.retail_range_income, + a.retail_same_level_income = a.retail_same_level_income + b.retail_same_level_income, + a.retail_area_income = a.retail_area_income + b.retail_area_income, + a.retail_benefit_range_income = a.retail_benefit_range_income + b.retail_benefit_range_income, + a.retail_benefit_avg_income = a.retail_benefit_avg_income + b.retail_benefit_avg_income, + a.retail_benefit_income = a.retail_benefit_income + b.retail_benefit_income, + a.retail_real_subtotal = a.retail_real_subtotal + b.retail_real_subtotal + when not matched then + insert ( + pk_id,pk_member,period,pk_rate,direct_income,expand_income,expand_no_capping, + expand_capping,coach_income,share_income,service_income,back_points,service_spend, + pur_real_subtotal,repur_push_income, + repur_range_income, + repur_expand_income,repur_real_subtotal, + cloud_direct_income,cloud_pur_income,cloud_repur_income,cloud_real_subtotal, + repur_coupon,global_points,car_award_points,hi_fun_income,real_income_total, + pk_country,pk_creator,grant_status,income_status, + retail_range_income, retail_same_level_income, retail_area_income, + retail_benefit_range_income, retail_benefit_avg_income, retail_benefit_income, + retail_real_subtotal) + values ( + b.pk_id,b.pk_member,b.period,b.pk_rate,b.direct_income,b.expand_income,b.expand_no_capping, + b.expand_capping,b.coach_income,b.share_income,b.service_income,b.back_points,b.service_spend, + b.pur_real_subtotal,b.repur_push_income, + b.repur_range_income, + b.repur_expand_income,b.repur_real_subtotal, + b.cloud_direct_income,b.cloud_pur_income,b.cloud_repur_income,b.cloud_real_subtotal, + b.repur_coupon,b.global_points,b.car_award_points,b.hi_fun_income,b.real_income_total, + b.pk_country,b.pk_creator,b.grant_status,b.income_status, + b.retail_range_income, b.retail_same_level_income, b.retail_area_income, + b.retail_benefit_range_income, b.retail_benefit_avg_income, b.retail_benefit_income, + b.retail_real_subtotal) + + diff --git a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberRetailLogMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberRetailLogMapper.xml new file mode 100644 index 00000000..c77e7b95 --- /dev/null +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberRetailLogMapper.xml @@ -0,0 +1,15 @@ + + + + + + update cu_member_retail_log + set enable_status = 0 + where del_flag = 0 + and pk_id in + + #{item.pkId} + + + + diff --git a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/detail/CuMemberGradeMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/detail/CuMemberGradeMapper.xml index ec277521..3774af84 100644 --- a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/detail/CuMemberGradeMapper.xml +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/detail/CuMemberGradeMapper.xml @@ -35,4 +35,31 @@ order by upgrade_time + + + merge into ${secondRangeTableName} a + using ( + select cs.pk_member, b.pk_grade + from ${secondRangeTableName} cs + inner join ( + select a.pk_member, max(a.new_level) pk_grade + from cu_member_grade a + inner join ( + select pk_member, max(nvl(modified_time, creation_time)) creation_time + from cu_member_grade + where period <= #{period} + and del_flag = 0 + and up_type = 2 + group by pk_member + ) b on a.pk_member = b.pk_member and nvl(a.modified_time, a.creation_time) = b.creation_time + group by a.pk_member + ) b on cs.pk_member = b.pk_member + where cs.pk_grade < b.pk_grade + ) b + on (a.pk_member = b.pk_member) + when matched then + update set + a.pk_grade = b.pk_grade + + diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/controller/service/impl/RetailOrderServiceImpl.java b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/controller/service/impl/RetailOrderServiceImpl.java index 0d0fd79e..e887b448 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/controller/service/impl/RetailOrderServiceImpl.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/controller/service/impl/RetailOrderServiceImpl.java @@ -52,6 +52,7 @@ import com.hzs.system.base.dto.CurrencyDTO; import com.hzs.system.config.IGradeServiceApi; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -100,6 +101,8 @@ public class RetailOrderServiceImpl implements IRetailOrderService { @Autowired private RedisService redisService; + @Autowired + private RabbitTemplate rabbitTemplate; @DubboReference IGradeServiceApi iGradeServiceApi; @@ -537,9 +540,8 @@ public class RetailOrderServiceImpl implements IRetailOrderService { log.error("新零售 payRegSaOrder 会员注册失败,{}", saveResult.getMsg()); throw new RuntimeException("会员注册失败"); } - // 同步全网产品库存 - this.allProductSync(saOrderExt); + this.pushOrderMq(saOrderExt); return null; } @@ -561,9 +563,8 @@ public class RetailOrderServiceImpl implements IRetailOrderService { log.error("新零售 payUpgOrder 会员升级失败,{}", saveResult.getMsg()); throw new RuntimeException("会员升级失败"); } - // 同步全网产品库存 - this.allProductSync(saOrderExt); + this.pushOrderMq(saOrderExt); return null; } @@ -582,12 +583,35 @@ public class RetailOrderServiceImpl implements IRetailOrderService { log.error("新零售 payOtherOrder 会员其它订单失败,{}", saveResult.getMsg()); throw new RuntimeException("下单支付失败"); } - // 同步全网产品库存 - this.allProductSync(saOrderExt); + this.pushOrderMq(saOrderExt); return null; } + /** + * 订单推送MQ处理 + * + * @param saOrderExt 会员订单 + */ + private void pushOrderMq(SaOrderExt saOrderExt) { + try { + // 同步全网产品库存 + this.allProductSync(saOrderExt); + + if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType() + || EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType() + || EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType() + ) { + // 计算奖金,通过mq分发消息,异步处理 + saOrderExt.setCancelBool(Boolean.FALSE); + log.info("新零售秒结消息,order.second.exchange:{}", saOrderExt.getOrderCode()); + rabbitTemplate.convertAndSend(RabbitMqConstants.ORDER_SECOND_EXCHANGE, RabbitMqConstants.ORDER_SECOND_KEY, saOrderExt); + } + } catch (Exception e) { + log.error("新零售 pushOrderMq 推送MQ失败. order: {}", saOrderExt, e); + } + } + @Transactional(rollbackFor = Exception.class) @Override public String onlinePaymentCallBack(Long pkMember, String orderCode) { diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/RabbitMqConstants.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/RabbitMqConstants.java index db3edec8..47ba8d34 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/RabbitMqConstants.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/RabbitMqConstants.java @@ -10,6 +10,19 @@ public class RabbitMqConstants { */ public final static String PREFIX = "global."; + /** + * 奖金秒接 exchange + */ + public static final String ORDER_SECOND_EXCHANGE = PREFIX + "order.second.exchange"; + /** + * 奖金秒接 queue + */ + public static final String ORDER_SECOND_QUEUE = PREFIX + "order.second.queue"; + /** + * 奖金秒接 key + */ + public static final String ORDER_SECOND_KEY = PREFIX + "order.second.key"; + /** * 活动 exchange */