diff --git a/bd-api/bd-api-member/src/main/java/com/hzs/member/base/IMemberServiceApi.java b/bd-api/bd-api-member/src/main/java/com/hzs/member/base/IMemberServiceApi.java index c35a1d13..d4472cc1 100644 --- a/bd-api/bd-api-member/src/main/java/com/hzs/member/base/IMemberServiceApi.java +++ b/bd-api/bd-api-member/src/main/java/com/hzs/member/base/IMemberServiceApi.java @@ -3,6 +3,7 @@ package com.hzs.member.base; import com.hzs.common.core.domain.R; import com.hzs.common.domain.member.base.CuMember; import com.hzs.common.domain.member.base.CuMemberRegister; +import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.common.domain.member.ext.CuMemberAccountExt; import com.hzs.common.domain.member.ext.CuMemberExt; import com.hzs.common.domain.retail.member.CuMemberRetailRegion; @@ -32,6 +33,20 @@ public interface IMemberServiceApi { */ R getMemberInfo(String memberCode); + /** + * 通过会员编码查询分享会员信息 + * + * @param memberCode 会员编号 + * @return + */ + R getShareMemberInfo(String memberCode); + + /** + * 查询分享会员 + * + * @param pkMember 主键 + */ + R queryCuMemberShare(Long pkMember); /** * 根据会员ID获取会员信息(查库) * diff --git a/bd-api/bd-api-member/src/main/java/com/hzs/member/base/dto/LoginMember.java b/bd-api/bd-api-member/src/main/java/com/hzs/member/base/dto/LoginMember.java index f1704da2..af3cb740 100644 --- a/bd-api/bd-api-member/src/main/java/com/hzs/member/base/dto/LoginMember.java +++ b/bd-api/bd-api-member/src/main/java/com/hzs/member/base/dto/LoginMember.java @@ -1,6 +1,7 @@ package com.hzs.member.base.dto; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.common.domain.member.ext.CuMemberExt; import lombok.AllArgsConstructor; import lombok.Builder; @@ -63,6 +64,11 @@ public class LoginMember implements Serializable { */ private CuMemberExt cuMember; + /** + * 分享会员信息(分享注册会员使用) + */ + private CuMemberShare cuMemberShare; + /** * 结算国家(此字段实体不存值,只做部分业务传递参数使用) */ 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 cuMemberBonusList = iCuMemberBonusService.queryMemberSecondBonusVoByCondition(bonusParam); + List memberBonusVOList = new ArrayList<>(); + cuMemberBonusList.forEach(cuMemberBonus -> { + if (ComputeUtil.compareValue(cuMemberBonus.getRealIncomeTotal())) { + MemberBonusVO memberBonusVO = BeanUtil.copyProperties(cuMemberBonus, MemberBonusVO.class, "settleDate"); + memberBonusVO.setSettleDate(DateUtils.currentDate()); + memberBonusVOList.add(memberBonusVO); + } + }); + return getDataTable(memberBonusVOList); + } + /** * 新零售实时奖金:查询会员奖金列表 */ @@ -56,6 +81,7 @@ public class ApiCuMemberBonusController extends BaseController { @PostMapping("/query-bonus-total") public TableDataInfo lisBonusTotal(@RequestBody BonusParam bonusParam) { setBonusParam(bonusParam); + bonusParam.setStartDate(DateUtils.beforeDate(1, ChronoUnit.DAYS, bonusParam.getEndDate())); List cuMemberBonusList = iCuMemberBonusService.queryMemberBonusTotalByCondition(bonusParam); 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 e0dd7f21..290535e7 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 @@ -78,4 +78,16 @@ public interface CuMemberBonusMapper extends BaseMapper { @Param("oldGrantStatus") Integer oldGrantStatus, @Param("startPeriod") Integer startPeriod, @Param("endPeriod") Integer endPeriod); + /** + * 批量插入会员奖金主表 + * + * @param cuMemberBonusList 会员奖金 + */ + void insertOrUpdateCuMemberBonus(@Param("cuMemberBonusList") List cuMemberBonusList); + + /** + * 回退奖金 + */ + void mergeBackRangeBonusIncome(@Param("pkOrder") Long pkOrder, @Param("bonusValue") Integer bonusValue); + } 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..1ef6dfd5 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,28 @@ public interface ICuMemberBonusService extends IService { CuMemberBonusExt initCuMemberBonus(); + /** + * 批量插入会员奖金主表 + * + * @param cuMemberBonusList 会员奖金 + */ + void insertOrUpdateCuMemberBonus(List cuMemberBonusList); + + /** + * 查询会员奖金 + */ + List queryCuMemberBonus(int period, List cuMemberBonusList); + + /** + * 根据查询条件查询会员秒接奖金 + * + * @param bonusParam 查询条件 + */ + List queryMemberSecondBonusVoByCondition(BonusParam bonusParam); + + /** + * 新零售撤单,回退奖金 + */ + void mergeBackMemberBonusIncome(Long pkOrder); + } 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..d88b9447 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,52 @@ 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 { + // 订单撤单处理(逆向) + // 处理收益 + 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..e450f3a3 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,30 @@ 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); + } + + @Override + public List queryMemberSecondBonusVoByCondition(BonusParam bonusParam) { + return getCuMemberBonusExtList(bonusParam); + } + + @Override + public void mergeBackMemberBonusIncome(Long pkOrder) { + baseMapper.mergeBackRangeBonusIncome(pkOrder, EBonusItems.RETAIL_RANGE_INCOME.getValue()); + baseMapper.mergeBackRangeBonusIncome(pkOrder, EBonusItems.RETAIL_REPURCHASE_INCOME.getValue()); + baseMapper.mergeBackRangeBonusIncome(pkOrder, EBonusItems.RETAIL_REPURCHASE_DELIVERY_INCOME.getValue()); + } + } 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/bonus/vo/MemberBonusVO.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/vo/MemberBonusVO.java index a58a007e..44b4509d 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/vo/MemberBonusVO.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/vo/MemberBonusVO.java @@ -20,152 +20,34 @@ import java.util.Date; @NoArgsConstructor public class MemberBonusVO implements Serializable { - /** - * 会员主键 - */ - private Long pkMember; - - /** - * 会员编号 - */ - private String memberCode; - - /** - * 会员名称 - */ - private String memberName; - - /** - * 结算等级 - */ - private Integer pkSettleGrade; - - /** - * 真实奖衔 - */ - private Integer pkAwards; - - /** - * 体系名称 - */ - private String vertexName; - - /** - * 团队名称 - */ - private String teamName; - - /** - * 期间 - */ - private Integer period; - - /** - * 汇率 - */ - private Integer pkRate; - - /** - * 直推收益 - */ - private BigDecimal directIncome; - - /** - * 拓展收益 - */ - private BigDecimal expandIncome; - - /** - * 辅导收益 - */ - private BigDecimal coachIncome; - - /** - * 分红收益 - */ - private BigDecimal shareIncome; - - /** - * 报单收益 - */ - private BigDecimal serviceIncome; - - /** - * 商城重消 - */ - @BigDecimalFormat - private BigDecimal backPoints; - - /** - * 平台服务费 - */ - private BigDecimal serviceSpend; - - /** - * 商城重消 - */ - private BigDecimal repBackPoints; - - /** - * 平台服务费 - */ - private BigDecimal repServiceSpend; - - /** - * 实发收益总计 - */ - @BigDecimalFormat - private BigDecimal realIncomeTotal; - - /** - * 收益状态 (0=正常,1=停止收益) - */ - private Integer incomeStatus; - - /** - * 国家 - */ - private Integer pkCountry; - /** * 新零售直推级差收益 */ @BigDecimalFormat private BigDecimal retailRangeIncome; - /** - * 新零售平级收益 + * 新零售复购级差收益 */ @BigDecimalFormat - private BigDecimal retailSameLevelIncome; - + private BigDecimal repurRangeIncome; /** - * 新零售区域收益 + * 新零售复购配送收益 */ @BigDecimalFormat private BigDecimal retailAreaIncome; - /** - * 新零售福利极差收益 - */ - private BigDecimal retailBenefitRangeIncome; - - /** - * 新零售福利平均收益 - */ - private BigDecimal retailBenefitAvgIncome; - - /** - * 新零售福利加权收益 - */ - private BigDecimal retailBenefitIncome; - /** * 新零售收益小计 */ @BigDecimalFormat private BigDecimal retailRealSubtotal; + /** + * 实发收益总计 + */ + @BigDecimalFormat + private BigDecimal realIncomeTotal; + /** * 结算日期 */ 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..7a85481b 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..8361a7a1 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,131 @@ 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) + + + + + merge into cu_member_bonus a + using ( + select b.* from bd_bonus_items bt + inner join ( + select pk_bonus, pk_bonus_items, + sum(pretax_income) pretax_income, + sum(income_tax) income_tax, + sum(real_income) real_income + from + + cu_member_bonus_detail + cu_member_bonus_range + + where del_flag = 0 + and pk_order= #{pkOrder} + group by pk_bonus, pk_bonus_items + ) b + on bt.pk_id = b.pk_bonus_items + where bt.bonus_value = #{bonusValue} + ) b + on (a.pk_id = b.pk_bonus) + when matched then + update set a.retail_real_subtotal = a.retail_real_subtotal - b.real_income, + a.back_points = a.back_points - b.income_tax, + a.real_income_total = a.real_income_total - b.real_income + + ,a.retail_range_income = a.retail_range_income - b.pretax_income + + + ,a.repur_range_income = a.repur_range_income - b.pretax_income + + + ,a.retail_area_income = a.retail_area_income - b.pretax_income + + + 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-member/src/main/java/com/hzs/member/base/controller/api/ApiMemberController.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/controller/api/ApiMemberController.java index 1e0a80bc..9bf9cf14 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/controller/api/ApiMemberController.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/controller/api/ApiMemberController.java @@ -1,7 +1,9 @@ package com.hzs.member.base.controller.api; +import cn.hutool.core.codec.Base64Decoder; import cn.hutool.core.collection.CollectionUtil; import com.hzs.common.core.annotation.RepeatSubmitSimple; +import com.hzs.common.core.config.BdConfig; import com.hzs.common.core.constant.msg.CommonMsgConstants; import com.hzs.common.core.constant.msg.ConfigMsgConstants; import com.hzs.common.core.constant.msg.MemberMsgConstants; @@ -369,4 +371,50 @@ public class ApiMemberController extends BaseController { return getDataTable(list); } + + /** + * 查询推荐人编号 -- 188分享注册 + * + * @param pkParent 推荐人(加密) + * @return + */ + @GetMapping("/fans-convert-code/{pkParent}") + public AjaxResult fansConvertCode(@PathVariable("pkParent") String pkParent) { + // 验证必输项 + if (pkParent == null) { + return AjaxResult.error(MemberMsgConstants.REQUIRED_NOT_EMPTY); + } + CuMember cuMember = iCuMemberService.getMemberById(Long.parseLong(new String(Base64Decoder.decode(pkParent)))); + if (null != cuMember) { + return AjaxResult.success("", cuMember.getMemberCode()); + } + return AjaxResult.error(); + } + + /** + * 根据订单查询会员信息 -- 188分享注册 + * + * @param orderCode 订单编号 + * @return + */ + @RepeatSubmitSimple(intervalTime = 2L) + @GetMapping("/fans-order/{orderCode}") + public AjaxResult fansOrder(@PathVariable("orderCode") String orderCode) { + CuMemberExt cuMemberExt = iCuMemberService.queryFansOrder(orderCode); + if (null == cuMemberExt) { + return AjaxResult.error("注册会员失败,请联系客服处理"); + } + + return AjaxResult.success(MemberShare.builder() + .memberName(cuMemberExt.getMemberName()) + .memberCode(cuMemberExt.getMemberCode()) + .phone(cuMemberExt.getPhone()) + .loginPassword(cuMemberExt.getLoginPassword()) + .payPassword(cuMemberExt.getPayPassword()) + .urlAddress(BdConfig.getPc()) + .gzh(BdConfig.getGzh()) + .ios(BdConfig.getIos()) + .android(BdConfig.getAndroid()) + .build()); + } } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/mapper/CuMemberMapper.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/mapper/CuMemberMapper.java index 9068ad14..4b62bfc8 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/mapper/CuMemberMapper.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/mapper/CuMemberMapper.java @@ -651,4 +651,12 @@ public interface CuMemberMapper extends BaseMapper { */ List queryDateBySummary(CensusSummaryParam censusSummaryParam); + + /** + * 查询海粉订单 + * + * @param orderCode 订单编号 + * @return + */ + CuMemberExt queryFansOrder(@Param("orderCode") String orderCode); } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/provider/MemberServiceProvider.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/provider/MemberServiceProvider.java index f0008276..57aadfd7 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/provider/MemberServiceProvider.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/provider/MemberServiceProvider.java @@ -1,11 +1,13 @@ package com.hzs.member.base.provider; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.hzs.common.core.domain.R; import com.hzs.common.core.enums.ELoginType; import com.hzs.common.core.utils.StringUtils; import com.hzs.common.domain.member.base.CuMember; import com.hzs.common.domain.member.base.CuMemberRegister; +import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.common.domain.member.ext.CuMemberAccountExt; import com.hzs.common.domain.member.ext.CuMemberExt; import com.hzs.common.domain.retail.member.CuMemberRetailRegion; @@ -40,6 +42,8 @@ public class MemberServiceProvider implements IMemberServiceApi { @Autowired private ICuMemberService iCuMemberService; @Autowired + private ICuMemberShareService iCuMemberShareService; + @Autowired private ICuMemberBusinessService iCuMemberBusinessService; @Autowired private ICuMemberRegisterService iCuMemberRegisterService; @@ -62,6 +66,20 @@ public class MemberServiceProvider implements IMemberServiceApi { return R.ok(loginMember); } + + @Override + public R getShareMemberInfo(String memberCode) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(CuMemberShare::getMemberCode, memberCode); + CuMemberShare cuMemberShare = iCuMemberShareService.getOne(queryWrapper); + if (null == cuMemberShare) { + return R.fail("用户名或密码错误"); + } + LoginMember loginMember = new LoginMember(); + loginMember.setLoginType(ELoginType.SHARE_MEMBER.getValue()); + loginMember.setCuMemberShare(cuMemberShare); + return R.ok(loginMember); + } @Override public R getMemberById(Long memberId) { return R.ok(iCuMemberService.getMemberById(memberId)); @@ -381,4 +399,9 @@ public class MemberServiceProvider implements IMemberServiceApi { return R.ok(iCuMemberService.checkRegisterRelation(phone, parentCode)); } + + @Override + public R queryCuMemberShare(Long pkMember) { + return R.ok(iCuMemberShareService.queryCuMemberShare(pkMember)); + } } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberService.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberService.java index f2ff3ffd..eec604f7 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberService.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberService.java @@ -179,7 +179,15 @@ public interface ICuMemberService extends IService { * @param digit 编号数字位数 * @return */ - String createUserNameByPremix(Integer pkCountry, Integer digit); + String createUserNameByPremix(Integer pkCountry, Integer digit); /** + * 生成会员编号 + * + * @param pkCountry 所属国家 + * @param isHaiFun + * @param digit 编号数字位数 + * @return + */ + String createUserNameByPremix(Integer pkCountry, Boolean isHaiFun, Integer digit); /** * 批量生成会员编号 @@ -797,7 +805,7 @@ public interface ICuMemberService extends IService { * @return */ CuMember getRetailTopMember(Long pkMember, String memberCode, Long topPkMember, String topMemberCode); - + String createRetailMemberCode(String prefix); /** * 根据推荐人编号,校验手机号必须唯一 * @@ -911,4 +919,12 @@ public interface ICuMemberService extends IService { */ List selectCensusSummary(CensusSummaryParam censusSummaryParam, List days); + + /** + * 查询海粉订单 + * + * @param orderCode 订单编号 + * @return + */ + CuMemberExt queryFansOrder(String orderCode); } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberShareService.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberShareService.java index 686beef1..9bac0405 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberShareService.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberShareService.java @@ -22,5 +22,10 @@ public interface ICuMemberShareService extends IService { * @return */ List seaFlourList(SeaFlourParam seaFlourParam); - + /** + * 查询会员分享 + * + * @param pkMember 会员主键 + */ + CuMemberShare queryCuMemberShare(Long pkMember); } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberServiceImpl.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberServiceImpl.java index afc4cf79..01868298 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberServiceImpl.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberServiceImpl.java @@ -1614,6 +1614,34 @@ public class CuMemberServiceImpl extends ServiceImpl i return memberCode; } + @Override + public String createUserNameByPremix(Integer pkCountry, Boolean isHaiFun, Integer digit) { + String prefix; + if (isHaiFun) { + prefix = SysConstants.HAI_FUN_PREFIX; + } else { + CountryDTO country = iCountryServiceApi.getCountry(pkCountry).getData(); + prefix = country.getCode(); + } + if (StringUtils.isEmpty(prefix)) { + return null; + } + // 生成loginName + String memberCode = this.createMemberCode(prefix, digit); + + CuMember cuMemberByKey = getMember(memberCode); + if (cuMemberByKey != null && cuMemberByKey.getPkId() > 0) { + // 用户名已经存在,则继续尝试 + return this.createUserNameByPremix(pkCountry, isHaiFun, digit); + } else { + // 验证空单注册里面是否存在编号 + List cuMemberEmptyDetails = iCuMemberEmptyCodeService.queryCuMemberEmptyCode(memberCode); + if (CollectionUtil.isNotEmpty(cuMemberEmptyDetails)) { + return this.createUserNameByPremix(pkCountry, isHaiFun, digit); + } + } + return memberCode; + } /** * 创建会员编号 * @@ -3080,6 +3108,7 @@ public class CuMemberServiceImpl extends ServiceImpl i * @param prefix 会员编号前缀 * @return */ + @Override public String createRetailMemberCode(String prefix) { if (StringUtils.isEmpty(prefix)) { prefix = SysConstants.RETAIL_PREFIX; @@ -3329,4 +3358,9 @@ public class CuMemberServiceImpl extends ServiceImpl i return censusSummaryList; } + + @Override + public CuMemberExt queryFansOrder(String orderCode) { + return baseMapper.queryFansOrder(orderCode); + } } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberShareServiceImpl.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberShareServiceImpl.java index 484846da..33371947 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberShareServiceImpl.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberShareServiceImpl.java @@ -1,5 +1,6 @@ package com.hzs.member.base.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.member.base.mapper.CuMemberShareMapper; @@ -30,4 +31,10 @@ public class CuMemberShareServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.select("PK_ID,MEMBER_CODE,MEMBER_NAME,PHONE,PK_PARENT"); + return baseMapper.selectById(pkMember); + } } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/login/service/IMemberLoginService.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/login/service/IMemberLoginService.java index 157c9f1f..b6f74543 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/login/service/IMemberLoginService.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/login/service/IMemberLoginService.java @@ -21,4 +21,13 @@ public interface IMemberLoginService { **/ LoginMember passwordFreelogin(String username); + + /** + * 分享登录 + * + * @param username 用户名 + * @param password 密码 + * @return + */ + LoginMember shareLogin(String username, String password); } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/login/service/impl/MemberLoginServiceImpl.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/login/service/impl/MemberLoginServiceImpl.java index c2a8572d..948f122f 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/login/service/impl/MemberLoginServiceImpl.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/login/service/impl/MemberLoginServiceImpl.java @@ -11,6 +11,7 @@ import com.hzs.common.core.utils.ServletUtils; import com.hzs.common.core.utils.StringUtils; import com.hzs.common.core.utils.ip.IpUtils; import com.hzs.common.domain.member.base.CuMember; +import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.common.domain.member.detail.CuMemberLogin; import com.hzs.common.domain.member.ext.CuMemberExt; import com.hzs.common.security.utils.SecurityUtils; @@ -157,6 +158,35 @@ public class MemberLoginServiceImpl implements IMemberLoginService { return loginMember; } + @Override + public LoginMember shareLogin(String username, String password) { + // 用户名或密码为空 错误 + if (StringUtils.isAnyBlank(username, password)) { + // 用户/密码必须填写 + throw new ServiceException(TransactionUtils.getContent(SystemMsgConstants.USER_REQUIRED)); + } + // 查询用户信息 + R memberResult = iMemberServiceApi.getShareMemberInfo(username); + + if (R.FAIL == memberResult.getCode()) { + throw new ServiceException(memberResult.getMsg()); + } + + if (StringUtils.isNull(memberResult.getData())) { + // 登录用户: %s 不存在 + throw new ServiceException(TransactionUtils.getContent(SystemMsgConstants.USER_NOT_EXIST, username)); + } + + LoginMember loginMember = memberResult.getData(); + CuMemberShare cuMemberShare = loginMember.getCuMemberShare(); + // 密码校验 + if (!SecurityUtils.matchesPassword(password, cuMemberShare.getLoginPwd())) { + // 用户不存在/密码错误 + throw new ServiceException(TransactionUtils.getContent(SystemMsgConstants.USER_ERROR, username)); + } + + return loginMember; + } /** * 记录登录信息 * diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/share/controller/api/ApiShareController.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/share/controller/api/ApiShareController.java index 127e9800..8a168e65 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/share/controller/api/ApiShareController.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/share/controller/api/ApiShareController.java @@ -172,4 +172,30 @@ public class ApiShareController extends BaseController { } + + + /** + * 获取188分享码(H5) + * + * @return + */ + @GetMapping("/fans-code-h5") + public AjaxResult fansCodeH5() { + Long userId = SecurityUtils.getUserId(); + // 188注册分享人就是自己 + R resultR = iShareServiceApi.queryShareCode(ShareServiceDTO.builder() + .eShareType(EShareType.FANS) + .pkBusiness(userId) + .pkCountry(SecurityUtils.getPkCountry()) + .userId(userId) + .build()); + if (resultR.isSuccess()) { + Map resultMap = new HashMap<>(); + resultMap.put("dataUrl", resultR.getData()); + // 前端无法根据URL生成海报,此处需要转一下base64 + resultMap.put("dataStr", Base64Util.toUrlBase64(resultR.getData())); + return AjaxResult.success(resultMap); + } + return AjaxResult.error(); + } } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/retail/login/controller/RetailMemberTokenController.java b/bd-business/bd-business-member/src/main/java/com/hzs/retail/login/controller/RetailMemberTokenController.java index 055fbc25..b74f3aca 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/retail/login/controller/RetailMemberTokenController.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/retail/login/controller/RetailMemberTokenController.java @@ -1,13 +1,22 @@ package com.hzs.retail.login.controller; +import cn.hutool.core.codec.Base64Decoder; import com.hzs.common.core.constant.CacheConstants; +import com.hzs.common.core.constant.MagicNumberConstants; +import com.hzs.common.core.constant.SysConstants; import com.hzs.common.core.service.RedisService; import com.hzs.common.core.utils.StringUtils; import com.hzs.common.core.web.domain.AjaxResult; +import com.hzs.common.domain.member.base.CuMemberShare; +import com.hzs.common.domain.member.ext.CuMemberExt; import com.hzs.common.security.auth.AuthMemberUtil; import com.hzs.common.security.service.MemberTokenService; import com.hzs.common.security.utils.SecurityUtils; import com.hzs.member.base.dto.LoginMember; +import com.hzs.member.base.service.ICuMemberService; +import com.hzs.member.base.service.ICuMemberShareService; +import com.hzs.member.login.param.AutoLoginParam; +import com.hzs.member.login.service.IMemberLoginService; import com.hzs.retail.login.param.RetailAutoLoginParam; import com.hzs.retail.login.param.RetailLoginParam; import com.hzs.retail.login.service.IRetailMemberLoginService; @@ -28,6 +37,13 @@ import javax.validation.Valid; @RestController public class RetailMemberTokenController { + @Autowired + private ICuMemberService iCuMemberService; + @Autowired + private ICuMemberShareService iCuMemberShareService; + @Autowired + private IMemberLoginService iMemberLoginService; + @Autowired private MemberTokenService memberTokenService; @Autowired @@ -57,19 +73,53 @@ public class RetailMemberTokenController { * @return */ @PostMapping("/auto-login") - public AjaxResult autoLogin(@Valid @RequestBody RetailAutoLoginParam param) { - String tmpUuid = redisService.getCacheObject(CacheConstants.AUTO_LOGIN + param.getUsername()); - if (!param.getUuid().equals(tmpUuid)) { - // 没有自动登录标记 或者 标记不对,则不能自动登录 - return AjaxResult.error("当前会员已不能快递登录"); +// public AjaxResult autoLogin(@Valid @RequestBody RetailAutoLoginParam param) { +// String tmpUuid = redisService.getCacheObject(CacheConstants.AUTO_LOGIN + param.getUsername()); +// if (!param.getUuid().equals(tmpUuid)) { +// // 没有自动登录标记 或者 标记不对,则不能自动登录 +// return AjaxResult.error("当前会员已不能快递登录"); +// } +// +// // 用户登录 +// LoginMember loginMember = iRetailMemberLoginService.login(param.getUsername(), param.getPassword()); +// // 获取登录token +// return AjaxResult.success(memberTokenService.createToken(loginMember)); +// } + public AjaxResult autoLogin(@RequestBody AutoLoginParam param) { + if (StringUtils.isEmpty(param.getPkParent())) { + return AjaxResult.error("缺少注册信息!"); } - // 用户登录 - LoginMember loginMember = iRetailMemberLoginService.login(param.getUsername(), param.getPassword()); - // 获取登录token - return AjaxResult.success(memberTokenService.createToken(loginMember)); - } + // 上级编码(推荐人) + Long pkParent = Long.parseLong(new String(Base64Decoder.decode(param.getPkParent()))); + // 查询上级信息 + CuMemberExt parentCuMember = iCuMemberService.getMemberById(pkParent); + if (null == parentCuMember) { + return AjaxResult.error("二维码已经失效!"); + } + // 生成的会员编号 + String memberCode = iCuMemberService.createRetailMemberCode(SysConstants.RETAIL_PREFIX); +// iCuMemberService.createUserNameByPremix(parentCuMember.getPkSettleCountry(), MagicNumberConstants.DIGIT); + + CuMemberShare cuMemberShare = new CuMemberShare(); + cuMemberShare.setMemberCode(memberCode); + cuMemberShare.setPkParent(pkParent); + cuMemberShare.setLoginPassword(SysConstants.LOGIN_PASSWORD); + cuMemberShare.setLoginPwd(SecurityUtils.encryptPassword(SysConstants.LOGIN_PASSWORD)); + cuMemberShare.setPayPassword(SysConstants.PAY_PASSWORD); + cuMemberShare.setPayPwd(SecurityUtils.encryptPassword(SysConstants.PAY_PASSWORD)); + cuMemberShare.setPkCreator(pkParent); + cuMemberShare.setPkCountry(parentCuMember.getPkSettleCountry()); + if (iCuMemberShareService.save(cuMemberShare)) { + // 会员登录 + LoginMember loginMember = iMemberLoginService.shareLogin(memberCode, SysConstants.LOGIN_PASSWORD); + + // 获取登录token + return AjaxResult.success(memberTokenService.createToken(loginMember)); + } + return AjaxResult.error(); + } /** * 会员登出 * diff --git a/bd-business/bd-business-member/src/main/resources/mapper/member/base/CuMemberMapper.xml b/bd-business/bd-business-member/src/main/resources/mapper/member/base/CuMemberMapper.xml index fabe754d..448535fb 100644 --- a/bd-business/bd-business-member/src/main/resources/mapper/member/base/CuMemberMapper.xml +++ b/bd-business/bd-business-member/src/main/resources/mapper/member/base/CuMemberMapper.xml @@ -2519,4 +2519,19 @@ + + + diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/controller/api/ApiRetailOrderController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/controller/api/ApiRetailOrderController.java index 5e142f6f..001f3362 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/controller/api/ApiRetailOrderController.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/controller/api/ApiRetailOrderController.java @@ -7,17 +7,22 @@ import com.hzs.common.core.config.BdConfig; import com.hzs.common.core.constant.CacheConstants; import com.hzs.common.core.domain.R; import com.hzs.common.core.enums.EGrade; +import com.hzs.common.core.enums.EOrderPrefix; import com.hzs.common.core.enums.ESpecialArea; import com.hzs.common.core.enums.EYesNo; import com.hzs.common.core.exception.ServiceException; import com.hzs.common.core.service.RedisService; +import com.hzs.common.core.utils.CommonUtil; import com.hzs.common.core.utils.StringUtils; import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.domain.member.base.CuMember; +import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.common.domain.member.ext.CuMemberAccountExt; import com.hzs.common.domain.retail.member.ext.CuMemberRetailRegionExt; import com.hzs.common.domain.sale.ext.SaOrderExt; +import com.hzs.common.domain.sale.wares.BdWares; import com.hzs.common.domain.system.config.BdGrade; +import com.hzs.common.security.service.MemberTokenService; import com.hzs.common.security.utils.SecurityUtils; import com.hzs.member.base.IMemberServiceApi; import com.hzs.retail.sale.controller.service.IRetailOrderService; @@ -25,10 +30,13 @@ import com.hzs.retail.sale.param.*; import com.hzs.retail.sale.vo.*; import com.hzs.sale.order.param.*; import com.hzs.sale.order.service.ISaOrderService; +import com.hzs.sale.order.service.ISaOrderShareTmpService; import com.hzs.sale.shopping.service.IShoppingCartService; import com.hzs.sale.shopping.vo.ProductGroup; import com.hzs.sale.shopping.vo.ShoppingCartRedis; import com.hzs.sale.shopping.vo.ShoppingCartVO; +import com.hzs.sale.wares.service.IBdWaresService; +import com.hzs.sale.wares.service.IBdWaresSpecsSkuService; import com.hzs.system.base.IAreaServiceApi; import com.hzs.system.config.IGradeServiceApi; import com.hzs.system.config.dto.GradeDTO; @@ -36,12 +44,14 @@ import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import com.hzs.common.domain.sale.ext.BdWaresSpecsSkuExt; import javax.validation.Valid; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 新零售订单控制器 @@ -60,12 +70,21 @@ public class ApiRetailOrderController { @Autowired private RedisService redisService; + @Autowired + private IBdWaresService iBdWaresService; + @Autowired + private IBdWaresSpecsSkuService iBdWaresSpecsSkuService; + @Autowired + private ISaOrderShareTmpService iSaOrderShareTmpService; + @DubboReference IMemberServiceApi iMemberServiceApi; @DubboReference IGradeServiceApi iGradeServiceApi; @DubboReference IAreaServiceApi iAreaServiceApi; + @Autowired + private MemberTokenService memberTokenService; /** * 校验会员等级 @@ -791,4 +810,111 @@ public class ApiRetailOrderController { return null; } + + /** + * 确认注册订单 + * + * @param registerParam 订单入参 + * @param source 数据来源 + * @return + */ + @RepeatSubmit + @PostMapping("/fans-confirm-order") + public AjaxResult fansConfirmOrder(@RequestBody RetailOrderRegisterParam registerParam, + @RequestHeader("Source") Integer source) { + // 设置数据来源 + registerParam.setSource(source); + // 会员ID + registerParam.setPkCreator(SecurityUtils.getUserId()); + // 新零售注册专区 + registerParam.setSpecialArea(ESpecialArea.RETAIL_REGISTER.getValue()); + // 系统类型 + registerParam.setSystemType(SecurityUtils.getSystemType()); + + // 获取等级列表 + List gradeList = iGradeServiceApi.getRetailGradeList().getData(); + // 校验注册权限等 +// String checkStr = this.checkRegistrationPermission(registerParam, gradeList); +// if (null != checkStr) { +// return AjaxResult.error(checkStr); +// } + + // 手机号可以重复,不需要进行是否重复校验 -- 已经跳过,此处可以不需要当前判断 +// // 校验注册关系(是否跨团队) -- 2024.12.24 修改为校验手机号必须唯一 +// String relationStr = iMemberServiceApi.checkRegisterRelation(registerParam.getPhone(), registerParam.getParentCode()).getData(); +// if (relationStr != null) { +// return AjaxResult.error(relationStr); +// } + + // 购物车中获取商品信息 +// registerParam.setOrderItemsParams(convertShoppingCarToSku(registerParam.getPkCreator(), registerParam.getShopList())); + + // 遍历商品,封装订单明细 + // 订单金额 + BigDecimal orderAmount = BigDecimal.ZERO; + + // 生成订单编号 + String orderCode = CommonUtil.createSerialNumber(EOrderPrefix.ORDER_CODE); + List orderItemsParams = new ArrayList<>(); + for (FansConfirmOrderWaresParam waresParam : registerParam.getWaresList()) { + // 遍历sku + // 产品价格等map + Map skuMap = iBdWaresSpecsSkuService.queryWaresSpecsSkuList(waresParam.getSkuList().stream().map(FansConfirmOrderSkuParam::getPkWaresSku).collect(Collectors.toList())); + + // 查询商品 + BdWares bdWares = iBdWaresService.getWares(waresParam.getPkWares()); + + // 缓存数据 + List itemsParamList = new ArrayList<>(waresParam.getSkuList().size()); + // 遍历产品信息 + for (FansConfirmOrderSkuParam skuParam : waresParam.getSkuList()) { + BdWaresSpecsSkuExt specsSku = skuMap.get(skuParam.getPkWaresSku()); + orderAmount = orderAmount.add(specsSku.getPrice().multiply(new BigDecimal(skuParam.getQuantity() * waresParam.getQuantity()))); + + itemsParamList.add(WaresItemsParam.builder() + .pkWaresSpecsSku(skuParam.getPkWaresSku().intValue()) + .quantity(skuParam.getQuantity()) + .build()); + } + orderItemsParams.add(OrderItemsParam.builder() + .waresCode(bdWares.getWaresCode()) + .quantity(waresParam.getQuantity()) + .waresItemsParamList(itemsParamList) + .build()); + } + registerParam.setOrderItemsParams(orderItemsParams); + CuMemberShare memberShare = memberTokenService.getLoginMember().getCuMemberShare(); + registerParam.setCuMemberShare(memberShare); +// registerParam.setPkCreator(memberShare.getPkParent()); + // 确认订单 + String str = iRetailOrderService.confirmRegOrder(registerParam, gradeList); + // redis 拿金额 + SaOrderExt saOrder = redisService.getCacheObject(CacheConstants.RETAIL_TEMP_ORDER + registerParam.getPkCreator() + registerParam.getOrderCode()); + return confirmSharedOrderReturn(str, registerParam.getPkCreator(), registerParam.getShopList(), registerParam.getOrderCode(), saOrder.getOrderAmount()); + } + + /** + * 确认订单返回 + * + * @param str 提示信息(null 为成功) + * @param pkCreator 订单创建人 + * @param shopList 购物车ID + * @param orderCode 订单编号 + * @return + */ + private AjaxResult confirmSharedOrderReturn(String str, Long pkCreator, List shopList, String orderCode, BigDecimal orderAmount) { + if (null == str) { + // 删除购物车商品数据 + if (CollectionUtil.isNotEmpty(shopList)) { + shoppingCartService.batchDelShopping(pkCreator, ShoppingCartVO.builder() + .deleteList(shopList) + .build()); + } + return AjaxResult.success(RetailOrderVO.builder() + .orderCode(orderCode) + .orderAmount(orderAmount) + .build()); + } + return AjaxResult.error(str); + } } 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..cc89a1b0 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 @@ -3,6 +3,7 @@ package com.hzs.retail.sale.controller.service.impl; import cn.hutool.core.codec.Base64Encoder; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; @@ -21,6 +22,7 @@ import com.hzs.common.domain.activity.pick.AcPick; import com.hzs.common.domain.activity.pick.AcPickMemberLog; import com.hzs.common.domain.member.account.CuMemberAccount; import com.hzs.common.domain.member.base.CuMember; +import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.common.domain.member.ext.CuMemberAccountExt; import com.hzs.common.domain.sale.ext.BdWaresDetailExt; import com.hzs.common.domain.sale.ext.SaOrderExt; @@ -52,6 +54,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 +103,8 @@ public class RetailOrderServiceImpl implements IRetailOrderService { @Autowired private RedisService redisService; + @Autowired + private RabbitTemplate rabbitTemplate; @DubboReference IGradeServiceApi iGradeServiceApi; @@ -239,17 +244,25 @@ public class RetailOrderServiceImpl implements IRetailOrderService { } } - // 2025.08.04 注册、升级专区,下单支付会员如果是分公司,订单不需要发货,直接放入提货中心 - CuMember createMember = orderParam.getCreatorMember(); - if (null == createMember) { - createMember = iMemberServiceApi.getMember(orderParam.getPkCreator()).getData(); - } - Integer createPkGrade = createMember.getPkSettleGrade(); - BdGrade createGrade = gradeList.stream().filter(tmpData -> tmpData.getPkId().equals(createPkGrade)).findFirst().get(); - if (EGrade.REGION.getValue() == createGrade.getGradeValue() - || EGrade.DIRECTOR.getValue() == createGrade.getGradeValue()) { - // 发货方式:提货中心 - saOrderExt.setDeliveryWay(EDelivery.PICK.getValue()); + if(ObjectUtil.isNotEmpty(orderParam.getCuMemberShare())){ + CuMember createMember = orderParam.getCreatorMember(); + if (null == createMember) { + createMember = iMemberServiceApi.getMember(orderParam.getCuMemberShare().getPkParent()).getData(); + orderParam.setCreatorMember(createMember); + } + }else{ + // 2025.08.04 注册、升级专区,下单支付会员如果是分公司,订单不需要发货,直接放入提货中心 + CuMember createMember = orderParam.getCreatorMember(); + if (null == createMember) { + createMember = iMemberServiceApi.getMember(orderParam.getPkCreator()).getData(); + } + Integer createPkGrade = createMember.getPkSettleGrade(); + BdGrade createGrade = gradeList.stream().filter(tmpData -> tmpData.getPkId().equals(createPkGrade)).findFirst().get(); + if (EGrade.REGION.getValue() == createGrade.getGradeValue() + || EGrade.DIRECTOR.getValue() == createGrade.getGradeValue()) { + // 发货方式:提货中心 + saOrderExt.setDeliveryWay(EDelivery.PICK.getValue()); + } } } @@ -499,8 +512,15 @@ public class RetailOrderServiceImpl implements IRetailOrderService { cuMember.setCreationTime(new Date()); cuMember.setPkCreator(orderParam.getPkCreator()); + boolean isShared = false; if (null == orderParam.getCreatorMember()) { - orderParam.setCreatorMember(iMemberServiceApi.getRetailMember(orderParam.getPkCreator(), null).getData()); + if(ObjectUtil.isNotEmpty(orderParam.getCuMemberShare())){ + orderParam.setCreatorMember(iMemberServiceApi.getRetailMember(orderParam.getCuMemberShare().getPkParent(), null).getData()); + cuMember.setPkParent(orderParam.getCuMemberShare().getPkParent()); + isShared = true; + }else{ + orderParam.setCreatorMember(iMemberServiceApi.getRetailMember(orderParam.getPkCreator(), null).getData()); + } } cuMember.setPkVertex(orderParam.getCreatorMember().getPkVertex()); cuMember.setPkTeamCode(orderParam.getCreatorMember().getPkTeamCode()); @@ -508,7 +528,12 @@ public class RetailOrderServiceImpl implements IRetailOrderService { cuMember.setSystemType(orderParam.getCreatorMember().getSystemType()); // 获取会员编号、会员主键 - cuMember = iMemberServiceApi.createRetailMemberIdAndCode(cuMember).getData(); + if(isShared){ + cuMember.setPkId(orderParam.getCuMemberShare().getPkId()); + cuMember.setMemberCode(orderParam.getCuMemberShare().getMemberCode()); + }else{ + cuMember = iMemberServiceApi.createRetailMemberIdAndCode(cuMember).getData(); + } return cuMember; } @@ -537,9 +562,8 @@ public class RetailOrderServiceImpl implements IRetailOrderService { log.error("新零售 payRegSaOrder 会员注册失败,{}", saveResult.getMsg()); throw new RuntimeException("会员注册失败"); } - // 同步全网产品库存 - this.allProductSync(saOrderExt); + this.pushOrderMq(saOrderExt); return null; } @@ -561,9 +585,8 @@ public class RetailOrderServiceImpl implements IRetailOrderService { log.error("新零售 payUpgOrder 会员升级失败,{}", saveResult.getMsg()); throw new RuntimeException("会员升级失败"); } - // 同步全网产品库存 - this.allProductSync(saOrderExt); + this.pushOrderMq(saOrderExt); return null; } @@ -582,12 +605,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) { @@ -613,6 +659,10 @@ public class RetailOrderServiceImpl implements IRetailOrderService { CuMember newMember = this.packageCuMember(registerParam); newMember.setPkSettleGrade(registerParam.getPkGrade()); newMember.setPkAwards(registerParam.getPkAwards()); + if(ObjectUtil.isNotEmpty(registerParam.getCuMemberShare())){ + saOrderExt.setPkReference(registerParam.getCuMemberShare().getPkParent()); + saOrderExt.setOrderType(EOrderType.RETAIL_REGISTER.getValue()); + } saOrderExt.setPkMember(newMember.getPkId()); saOrderExt.setRegionProvince(registerParam.getRegionProvince()); diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/param/RetailOrderParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/param/RetailOrderParam.java index c6d21f80..85747aab 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/param/RetailOrderParam.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/param/RetailOrderParam.java @@ -6,6 +6,7 @@ import com.hzs.common.core.constant.CountryConstants; import com.hzs.common.core.enums.EDelivery; import com.hzs.common.core.enums.ETransportType; import com.hzs.common.domain.member.base.CuMember; +import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.sale.order.param.OrderItemsParam; import com.hzs.sale.shopping.vo.ShoppingCartRedis; import lombok.AllArgsConstructor; @@ -113,6 +114,9 @@ public class RetailOrderParam implements Serializable { @JsonIgnore private CuMember creatorMember; +// @JsonIgnore + private CuMemberShare cuMemberShare; + /** * 订单编号 */ diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/param/RetailOrderRegisterParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/param/RetailOrderRegisterParam.java index 4982edcb..577d6a6b 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/param/RetailOrderRegisterParam.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/param/RetailOrderRegisterParam.java @@ -1,11 +1,12 @@ package com.hzs.retail.sale.param; -import lombok.Data; -import lombok.EqualsAndHashCode; +import com.hzs.sale.order.param.FansConfirmOrderWaresParam; +import lombok.*; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; import java.io.Serializable; +import java.util.List; /** * 新零售注册订单入参 @@ -33,4 +34,9 @@ public class RetailOrderRegisterParam extends RetailOrderParam implements Serial @Size(max = 20, message = "推荐编号不能超过20位") private String parentCode; + + /** + * 商品列表 + */ + private List waresList; } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/vo/RetailOrderVO.java b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/vo/RetailOrderVO.java index a6b3e3c8..95e44578 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/vo/RetailOrderVO.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/sale/vo/RetailOrderVO.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; +import java.math.BigDecimal; /** * 新零售订单返回VO @@ -48,4 +49,9 @@ public class RetailOrderVO implements Serializable { */ private String urlAddress; + /** + * 待支付金额 + */ + private BigDecimal orderAmount; + } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/wares/controller/api/ApiRetailWaresController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/wares/controller/api/ApiRetailWaresController.java index fd09e7f5..22604b81 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/wares/controller/api/ApiRetailWaresController.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/wares/controller/api/ApiRetailWaresController.java @@ -1,6 +1,7 @@ package com.hzs.retail.wares.controller.api; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64Decoder; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; @@ -10,10 +11,13 @@ import com.hzs.common.core.domain.R; import com.hzs.common.core.enums.EAccount; import com.hzs.common.core.enums.ELabelType; import com.hzs.common.core.enums.ESpecialArea; +import com.hzs.common.core.enums.EWaresType; import com.hzs.common.core.utils.ComputeUtil; import com.hzs.common.core.utils.DistinctByKeyUtil; +import com.hzs.common.core.utils.StringUtils; import com.hzs.common.core.web.controller.BaseController; import com.hzs.common.core.web.domain.AjaxResult; +import com.hzs.common.domain.member.base.CuMember; import com.hzs.common.domain.member.ext.CuMemberExt; import com.hzs.common.domain.sale.ext.BdWaresExt; import com.hzs.common.domain.sale.ext.BdWaresSpecsSkuExt; @@ -25,8 +29,11 @@ import com.hzs.member.base.IMemberServiceApi; import com.hzs.member.base.dto.ShowWaresDTO; import com.hzs.retail.wares.param.RetailWaresDetailParam; import com.hzs.retail.wares.param.RetailWaresParam; +import com.hzs.retail.wares.param.WaresShareParam; import com.hzs.retail.wares.vo.RetailWaresDetailVO; import com.hzs.retail.wares.vo.RetailWaresVO; +import com.hzs.sale.order.service.ISaOrderService; +import com.hzs.sale.wares.param.CuWaresParams; import com.hzs.sale.wares.service.IBdWaresLabelService; import com.hzs.sale.wares.service.IBdWaresRangeService; import com.hzs.sale.wares.service.IBdWaresService; @@ -38,10 +45,7 @@ import com.hzs.system.config.dto.AreaCurrencyDTO; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.math.BigDecimal; @@ -64,6 +68,8 @@ public class ApiRetailWaresController extends BaseController { private IBdWaresSpecsSkuService iBdWaresSpecsSkuService; @Autowired private IBdWaresRangeService iBdWaresRangeService; + @Autowired + private ISaOrderService iSaOrderService; @DubboReference ICurrencyServiceApi currencyServiceApi; @@ -377,4 +383,147 @@ public class ApiRetailWaresController extends BaseController { } + + /** + * 188分享专区商品列表 + */ + @GetMapping("/list-wares-share") + public AjaxResult listWaresShare(WaresShareParam param) { + param.setSpecialArea(ESpecialArea.REGISTER_AREA.getValue()); + param.setIsMakerGift(EWaresType.ORDINARY.getValue()); + param.setPkCountry(CountryConstants.CHINA_COUNTRY); + + // 返回数据 + List waresParamsList = new ArrayList<>(); + + // 查询商品列表 + List bdWaresExtList = iBdWaresService.listWaresShare(param.getSpecialArea(), param.getIsMakerGift(), param.getPkCountry()); + + if (CollectionUtil.isNotEmpty(bdWaresExtList)) { + // 商品主键列表 + List waresIdList = bdWaresExtList.stream().map(BdWares::getPkId).collect(Collectors.toList()); + + if (StringUtils.isNotEmpty(param.getShareMemberCode())) { + // 分享人ID + Long pkMember = Long.parseLong(new String(Base64Decoder.decode(param.getShareMemberCode()))); + CuMember cuMember = iSaOrderService.getCuMemberByKey(pkMember); + // 当前会员编号 + String memberCode = cuMember.getMemberCode(); + + // 检验商品团队信息 + Map> waresAuthorityMap = iBdWaresService.getWaresAuthority(waresIdList); + List showWaresList = bdWaresExtList.stream().map(we -> getShowWares(we.getPkId(), pkMember, memberCode, waresAuthorityMap)).collect(Collectors.toList()); + R> waresShowMapDto = iMemberServiceApi.checkIsShowWares(showWaresList); + Map waresShowMap = waresShowMapDto.getData(); + + // 商品标签列表 + BdWaresLabel waresLabel = new BdWaresLabel(); + waresLabel.setPkIdList(waresIdList); + List list = iBdWaresLabelService.selectByList(waresLabel); + // 标签 + for (BdWaresExt bdWaresExt : bdWaresExtList) { + // 保证标签 + List ensureLabelList = new ArrayList<>(); + // 卖点标签 + List sellingLabelList = new ArrayList<>(); + + for (BdLabelExt bdLabel : list) { + if (ELabelType.PREFIX.getValue() == bdLabel.getLabelType() && bdLabel.getPkWares().equals(bdWaresExt.getPkId())) { + // 前缀标签 + bdWaresExt.setPrefixLabelTarget(bdLabel); + } + if (ELabelType.COOL.getValue() == bdLabel.getLabelType() && bdLabel.getPkWares().equals(bdWaresExt.getPkId())) { + // 酷炫标签 + bdWaresExt.setCoolLabelTarget(bdLabel); + } + if (ELabelType.ENSURE.getValue() == bdLabel.getLabelType() && bdLabel.getPkWares().equals(bdWaresExt.getPkId())) { + // 保证标签 + ensureLabelList.add(bdLabel); + } + if (ELabelType.SELLING.getValue() == bdLabel.getLabelType() && bdLabel.getPkWares().equals(bdWaresExt.getPkId())) { + // 卖点标签 + sellingLabelList.add(bdLabel); + } + } + bdWaresExt.setEnsureLabelList(ensureLabelList.stream().filter(DistinctByKeyUtil.distinctByKey(BdLabel::getPkId)).collect(Collectors.toList())); + bdWaresExt.setSellingLabelList(sellingLabelList.stream().filter(DistinctByKeyUtil.distinctByKey(BdLabel::getPkId)).collect(Collectors.toList())); + } + + // 查询商品sku 最小值 和数量 + List waresSpecsSkuArray = iBdWaresSpecsSkuService.selectByMinWaresSpecsSkuByPkWaresList(waresIdList); + Map> waresSpecsSkuMap = waresSpecsSkuArray.stream().collect(Collectors.groupingBy(BdWaresSpecsSkuExt::getPkWares)); + + // 查询默认规格 + List waresSpecsSkuList = iBdWaresSpecsSkuService.selectByWaresSpecsSku(waresIdList); + + for (BdWaresExt waresExt : bdWaresExtList) { + // 校验团队信息 + Boolean isShowWares = waresShowMap.get(waresExt.getPkId()); + if (null == isShowWares || !isShowWares) { + continue; + } + + CuWaresParams waresParams = BeanUtil.copyProperties(waresExt, CuWaresParams.class); + // 价格 + BigDecimal waresPrice = BigDecimal.ZERO; + // 业绩 + BigDecimal waresAchieve = BigDecimal.ZERO; + + List waresSpecsSku = waresSpecsSkuMap.get(waresExt.getPkId()); + waresSpecsSku = waresSpecsSku.stream().peek(a -> a.setProductGift(a.getPkProduct() + "" + a.getIsGift())).collect(Collectors.toList()); + Map> col = waresSpecsSku.stream().collect(Collectors.groupingBy(BdWaresSpecsSkuExt::getProductGift)); + for (Map.Entry> integerListEntry : col.entrySet()) { + // 取得每一个商品价格最小值 + Optional minBdWaresSpecsSkuExt = integerListEntry.getValue().stream().filter(Objects::nonNull).min(Comparator.comparing(BdWaresSpecsSkuExt::getPrice)); + BdWaresSpecsSkuExt bdWaresSpecsSkuExt = minBdWaresSpecsSkuExt.get(); + waresPrice = waresPrice.add(bdWaresSpecsSkuExt.getPrice().multiply(new BigDecimal(bdWaresSpecsSkuExt.getQuantity()))); + waresAchieve = waresAchieve.add(bdWaresSpecsSkuExt.getAchieve().multiply(new BigDecimal(bdWaresSpecsSkuExt.getQuantity()))); + } + + // 计算商品列表价格和业绩最小值 + waresParams.setWaresPrice(waresPrice); + waresParams.setWaresAchieve(waresAchieve); + // 商品业绩计算汇率 + if (waresParams.getWaresAchieve() != null) { + waresParams.setWaresAchieve(waresParams.getWaresAchieve()); + waresParams.setWaresPrice(waresParams.getWaresPrice()); + } else { + waresParams.setWaresAchieve(BigDecimal.ZERO); + waresParams.setWaresPrice(BigDecimal.ZERO); + } + + // 查询默认规格 + JSONArray jsonArray = new JSONArray(); + List collect = waresSpecsSkuList.stream().filter(DistinctByKeyUtil.distinctByKey(BdWaresSpecsSku::getPkWaresDetail)).collect(Collectors.toList()); + for (BdWaresSpecsSkuExt bdWaresSpecsSku : collect) { + if (bdWaresSpecsSku.getPkWares().equals(waresExt.getPkId())) { + JSONObject js = new JSONObject(); + js.put("pkProduct", bdWaresSpecsSku.getPkProduct()); + js.put("pkSkuId", bdWaresSpecsSku.getPkId()); + js.put("quantity", bdWaresSpecsSku.getQuantity()); + jsonArray.add(js); + } + } + waresParams.setProductGroup(jsonArray); + waresParamsList.add(waresParams); + } + } + } + return AjaxResult.success(waresParamsList); + } + + /** + * 查询团队配置是否展示该商品 + * + * @param pkWares + * @return + */ + public ShowWaresDTO getShowWares(Integer pkWares, Long loginMember, String loginMemberCode, Map> waresAuthorityMap) { + ShowWaresDTO showWaresDTO = new ShowWaresDTO(); + showWaresDTO.setPkWares(pkWares); + showWaresDTO.setLoginMember(loginMember); + showWaresDTO.setLoginMemberCode(loginMemberCode); + showWaresDTO.setWaresAuthorityList(waresAuthorityMap.get(pkWares)); + return showWaresDTO; + } } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/retail/wares/param/WaresShareParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/wares/param/WaresShareParam.java new file mode 100644 index 00000000..1e5e125b --- /dev/null +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/retail/wares/param/WaresShareParam.java @@ -0,0 +1,31 @@ +package com.hzs.retail.wares.param; + +import lombok.Data; + +/** + * 分享商品查询条件 + */ +@Data +public class WaresShareParam { + + /** + * 分享会员编号 + */ + private String shareMemberCode; + + /** + * 所属专区 + */ + private Integer specialArea; + + /** + * 商品类型 + */ + private Integer isMakerGift; + + /** + * 国家 + */ + private Integer pkCountry; + +} diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/deliver/controller/manage/SaDeliverUnhandledController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/deliver/controller/manage/SaDeliverUnhandledController.java index a736f3d8..f6e3acd2 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/deliver/controller/manage/SaDeliverUnhandledController.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/deliver/controller/manage/SaDeliverUnhandledController.java @@ -108,6 +108,10 @@ public class SaDeliverUnhandledController extends BaseController { param.setAreaScopeList(userAuthorityDTO.getRoleAreaScopeList()); param.setVertexIdList(userAuthorityDTO.getVertexIdList()); param.setTeamList(userAuthorityDTO.getUserTeamList()); + // 兼容调换货产品 + if (CollectionUtil.isEmpty(param.getPkWaresList())) { + param.setPkWaresList(Collections.singletonList(0)); + } startPage(); List resultList = iSaOrderItemsService.queryDeliverUnhandledList(param, pkCountry); @@ -151,6 +155,10 @@ public class SaDeliverUnhandledController extends BaseController { param.setAreaScopeList(userAuthorityDTO.getRoleAreaScopeList()); param.setVertexIdList(userAuthorityDTO.getVertexIdList()); param.setTeamList(userAuthorityDTO.getUserTeamList()); + // 兼容调换货产品 + if (CollectionUtil.isEmpty(param.getPkWaresList())) { + param.setPkWaresList(Collections.singletonList(0)); + } List resultList = iSaOrderItemsService.queryDeliverUnhandledList(param, pkCountry); diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/controller/api/ApiFanSaOrderController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/controller/api/ApiFanSaOrderController.java index f9c935b2..0bbed525 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/controller/api/ApiFanSaOrderController.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/controller/api/ApiFanSaOrderController.java @@ -2,25 +2,50 @@ package com.hzs.sale.order.controller.api; import cn.hutool.core.collection.CollectionUtil; import com.hzs.common.core.annotation.RepeatSubmit; +import com.hzs.common.core.constant.CacheConstants; import com.hzs.common.core.constant.HttpStatus; import com.hzs.common.core.constant.msg.MemberMsgConstants; import com.hzs.common.core.constant.msg.SaOrderMsgConstants; +import com.hzs.common.core.enums.*; +import com.hzs.common.core.utils.CommonUtil; +import com.hzs.common.core.utils.StringUtils; import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.domain.member.base.CuMember; +import com.hzs.common.domain.member.base.CuMemberShare; +import com.hzs.common.domain.sale.ext.BdWaresSpecsSkuExt; +import com.hzs.common.domain.sale.ext.SaOrderExt; +import com.hzs.common.domain.sale.order.SaOrderShareTmp; +import com.hzs.common.domain.sale.wares.BdWares; import com.hzs.common.security.utils.SecurityUtils; import com.hzs.common.util.TransactionUtils; import com.hzs.member.base.IMemberServiceApi; +import com.hzs.retail.sale.param.RetailOrderParam; +import com.hzs.retail.sale.param.RetailOrderRegisterParam; import com.hzs.sale.order.controller.ParentOrderController; import com.hzs.sale.order.param.*; +import com.hzs.sale.order.service.ISaOrderService; +import com.hzs.sale.order.service.ISaOrderShareTmpService; +import com.hzs.sale.order.vo.FansConfirmOrderVO; import com.hzs.sale.shopping.vo.ShoppingCartVO; +import com.hzs.sale.wares.service.IBdWaresService; +import com.hzs.sale.wares.service.IBdWaresSpecsSkuService; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + /** * 嗨粉订单 */ @@ -29,6 +54,15 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j public class ApiFanSaOrderController extends ParentOrderController { + @Autowired + private IBdWaresService iBdWaresService; + @Autowired + private IBdWaresSpecsSkuService iBdWaresSpecsSkuService; + @Autowired + private ISaOrderShareTmpService iSaOrderShareTmpService; + @Autowired + private ISaOrderService iSaOrderService; + @DubboReference IMemberServiceApi iMemberServiceApi; @@ -95,4 +129,154 @@ public class ApiFanSaOrderController extends ParentOrderController { } } + +// /** +// * 海粉确认订单 +// * +// * @param param 确认订单入参 +// * @return +// */ +// @PostMapping("/fans-confirm-order") +// public AjaxResult fansConfirmOrder(@RequestBody FansConfirmOrderParam param) { +// // 校验参数 +// if (StringUtils.isAnyEmpty(param.getMemberName(), param.getPhone(), param.getRecName(), param.getRecPhone(), param.getRecAddress()) +// || null == param.getPkCountry() || null == param.getRecProvince() || null == param.getRecCity() +// || CollectionUtil.isEmpty(param.getWaresList()) +// ) { +// // 缺少参数 +// return AjaxResult.error("缺少参数"); +// } +// // 校验商品数据 +// for (FansConfirmOrderWaresParam waresParam : param.getWaresList()) { +// if (null == waresParam.getPkWares() || null == waresParam.getQuantity() +// || CollectionUtil.isEmpty(waresParam.getSkuList())) { +// // 缺少参数 +// return AjaxResult.error("缺少参数"); +// } +// // 校验产品数据 +// for (FansConfirmOrderSkuParam skuParam : waresParam.getSkuList()) { +// if (null == skuParam.getPkWaresSku() || null == skuParam.getQuantity()) { +// // 缺少参数 +// return AjaxResult.error("缺少参数"); +// } +// } +// } +// +// // 会员ID +// Long userId = SecurityUtils.getUserId(); +// // 所属国家 +// Integer pkCountry = SecurityUtils.getPkCountry(); +// +// // 查询临时会员 +// CuMemberShare cuMemberShare = iMemberServiceApi.queryCuMemberShare(userId).getData(); +// if (null == cuMemberShare) { +// // 会员不存在 +// return AjaxResult.error("推荐人不存在"); +// } +// +// // 封装缓存数据 +// RetailOrderRegisterParam orderParam = RetailOrderRegisterParam.builder() +// .memberName(param.getMemberName()) +// .phone(param.getPhone()) +// .build(); +// +// // 手机号注册次数校验 +// AjaxResult ajaxResult = super.validatePhone(orderParam); +// if (!ajaxResult.isSuccess()) { +// return ajaxResult; +// } +// +// // 订单金额 +// BigDecimal orderAmount = BigDecimal.ZERO; +// +// // 生成订单编号 +// String orderCode = CommonUtil.createSerialNumber(EOrderPrefix.ORDER_CODE); +// +// // 缓存数据 +// List orderItemsParams = new ArrayList<>(); +// // 遍历商品,封装订单明细 +// for (FansConfirmOrderWaresParam waresParam : param.getWaresList()) { +// // 遍历sku +// // 产品价格等map +// Map skuMap = iBdWaresSpecsSkuService.queryWaresSpecsSkuList(waresParam.getSkuList().stream().map(FansConfirmOrderSkuParam::getPkWaresSku).collect(Collectors.toList())); +// +// // 查询商品 +// BdWares bdWares = iBdWaresService.getWares(waresParam.getPkWares()); +// +// // 缓存数据 +// List itemsParamList = new ArrayList<>(waresParam.getSkuList().size()); +// // 遍历产品信息 +// for (FansConfirmOrderSkuParam skuParam : waresParam.getSkuList()) { +// BdWaresSpecsSkuExt specsSku = skuMap.get(skuParam.getPkWaresSku()); +// orderAmount = orderAmount.add(specsSku.getPrice().multiply(new BigDecimal(skuParam.getQuantity() * waresParam.getQuantity()))); +// +// itemsParamList.add(WaresItemsParam.builder() +// .pkWaresSpecsSku(skuParam.getPkWaresSku().intValue()) +// .quantity(skuParam.getQuantity()) +// .build()); +// } +// orderItemsParams.add(OrderItemsParam.builder() +// .waresCode(bdWares.getWaresCode()) +// .quantity(waresParam.getQuantity()) +// .waresItemsParamList(itemsParamList) +// .build()); +// } +// // 封装订单数据 +// SaOrderExt saOrder = new SaOrderExt(); +// saOrder.setOrderCode(orderCode); +// // 188注册订单实际按复购订单来算 +// saOrder.setOrderType(EOrderType.REPURCHASE_ORDER.getValue()); +// saOrder.setOrderTypeExtend(EOrderTypeExtend.REG_REP.getValue()); +// saOrder.setOrderAmount(orderAmount); +// saOrder.setPostage(BigDecimal.ZERO); +// saOrder.setRecName(param.getRecName()); +// saOrder.setRecPhone(param.getRecPhone()); +// saOrder.setRecProvince(param.getRecProvince()); +// saOrder.setRecCity(param.getRecCity()); +// saOrder.setRecCounty(param.getRecCounty()); +// saOrder.setRecAddress(param.getRecAddress()); +// saOrder.setRemark(param.getRemark()); +// saOrder.setPkMember(cuMemberShare.getPkId()); +// saOrder.setPkReference(cuMemberShare.getPkParent()); +// saOrder.setDeliveryWay(EDelivery.FAST_MAIL.getValue()); +// saOrder.setTranType(ETransportType.LAND.getValue()); +// saOrder.setPkCreator(cuMemberShare.getPkId()); +// saOrder.setPkCountry(pkCountry); +// +// orderParam.setOrderCode(orderCode); +// orderParam.setSpecialArea(saOrder.getOrderType()); +// orderParam.setPostage(saOrder.getPostage()); +// orderParam.setDeliveryWay(saOrder.getDeliveryWay()); +// orderParam.setTransType(saOrder.getTranType()); +// orderParam.setRecName(saOrder.getRecName()); +// orderParam.setRecPhone(saOrder.getRecPhone()); +// orderParam.setRecProvince(saOrder.getRecProvince()); +// orderParam.setRecCity(saOrder.getRecCity()); +// orderParam.setRecCounty(saOrder.getRecCounty()); +// orderParam.setRecAddress(saOrder.getRecAddress()); +// orderParam.setOrderItemsParams(orderItemsParams); +// +// HashMap orderInfo = new HashMap<>(); +// orderInfo.put("param", param); +// orderInfo.put("saOrder", saOrder); +// orderInfo.put("orderParam", orderParam); +// // 分享会员订单数据 +// if (iSaOrderShareTmpService.save(SaOrderShareTmp.builder() +// .pkId(cuMemberShare.getPkId()) +// .orderInfo(JSONUtil.toJsonStr(orderInfo)) +// .build())) { +// +// // 临时订单直接放入缓存(24小时有效) +// redisService.setCacheObject(CacheConstants.RETAIL_TEMP_ORDER + userId + orderCode, saOrder, 24L, TimeUnit.HOURS); +// // 临时会员直接放入缓存(24小时有效) +// redisService.setCacheObject(CacheConstants.RETAIL_TEMP_REG_PARAM + userId + orderCode, orderParam, 24L, TimeUnit.HOURS); +// +// return AjaxResult.success(FansConfirmOrderVO.builder() +// .orderCode(orderCode) +// .orderAmount(saOrder.getOrderAmount().add(saOrder.getPostage())) +// .payTime(iSaOrderService.getIsToBePayTime(pkCountry, saOrder.getOrderType())) +// .build()); +// } +// return AjaxResult.error(); +// } } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderParam.java index 82b6cf25..28aea898 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderParam.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderParam.java @@ -5,11 +5,7 @@ import lombok.Data; import java.util.List; /** - * @Description: 海粉确认订单入参 - * @Author: jiang chao - * @Time: 2023/9/7 16:56 - * @Classname: FansConfirmOrder - * @PackageName: com.hzs.sale.order.param + * 海粉确认订单入参 */ @Data public class FansConfirmOrderParam { diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderSkuParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderSkuParam.java index 934dae4c..b533710b 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderSkuParam.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderSkuParam.java @@ -3,11 +3,7 @@ package com.hzs.sale.order.param; import lombok.Data; /** - * @Description: 海粉确认订单产品入参 - * @Author: jiang chao - * @Time: 2023/9/7 19:37 - * @Classname: FansConfirmOrderSkuParam - * @PackageName: com.hzs.sale.order.param + * 海粉确认订单产品入参 */ @Data public class FansConfirmOrderSkuParam { diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderWaresParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderWaresParam.java index bcfaf348..e5cb4067 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderWaresParam.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/param/FansConfirmOrderWaresParam.java @@ -5,11 +5,7 @@ import lombok.Data; import java.util.List; /** - * @Description: 海粉确认订单商品入参 - * @Author: jiang chao - * @Time: 2023/9/7 17:32 - * @Classname: FansConfirmOrderProductParam - * @PackageName: com.hzs.sale.order.param + * 海粉确认订单商品入参 */ @Data public class FansConfirmOrderWaresParam { diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java index d50611bb..23b6dd18 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java @@ -1335,6 +1335,8 @@ public class SaOrderServiceImpl extends ServiceImpl impl } try { + // 撤单秒结处理 + this.pushCancelOrderMq(saOrderExt); // 推送MQ的列表 List mqList = new ArrayList<>(); mqList.add(saOrderExt); @@ -1766,6 +1768,8 @@ public class SaOrderServiceImpl extends ServiceImpl impl } try { + // 撤单秒结处理 + this.pushCancelOrderMq(saOrderExt); // 推送MQ,处理活动回退 rabbitTemplate.convertAndSend(RabbitMqConstants.ORDER_CANCEL_EXCHANGE, RabbitMqConstants.ORDER_CANCEL_KEY, Collections.singletonList(saOrderExt)); } catch (Exception e) { @@ -2224,4 +2228,25 @@ public class SaOrderServiceImpl extends ServiceImpl impl } } + /** + * 订单推送MQ处理 + * + * @param saOrderExt 会员订单 + */ + private void pushCancelOrderMq(SaOrderExt saOrderExt) { + try { + if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType() + || EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType() + || EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()) { + // 撤单标记为 true + saOrderExt.setCancelBool(Boolean.TRUE); + // 计算奖金,通过mq分发消息,异步处理 + 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); + } + } + } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/shopping/controller/api/ApiShoppingCartController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/shopping/controller/api/ApiShoppingCartController.java index 4fb54840..5eaeb713 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/shopping/controller/api/ApiShoppingCartController.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/shopping/controller/api/ApiShoppingCartController.java @@ -162,11 +162,7 @@ public class ApiShoppingCartController extends BaseController { } /** - * @description: 专区购物车数量 getAreaShoppingCount - * @author: zhang jing - * @date: 2024/3/28 10:27 - * @param: [shoppingCartVO] - * @return: com.hzs.common.core.web.domain.AjaxResult + * 专区购物车数量 getAreaShoppingCount **/ @GetMapping("/getAreaShoppingCount") public AjaxResult getAreaShoppingCount(ShoppingCartVO shoppingCartVO) { diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/controller/api/ApiBdWaresController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/controller/api/ApiBdWaresController.java index cec73a41..fc05c8a7 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/controller/api/ApiBdWaresController.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/controller/api/ApiBdWaresController.java @@ -1,6 +1,7 @@ package com.hzs.sale.wares.controller.api; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64Decoder; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; @@ -27,6 +28,7 @@ import com.hzs.common.security.utils.SecurityUtils; import com.hzs.common.util.TransactionUtils; import com.hzs.member.base.IMemberServiceApi; import com.hzs.member.base.dto.ShowWaresDTO; +import com.hzs.retail.wares.param.WaresShareParam; import com.hzs.sale.order.service.ISaOrderService; import com.hzs.sale.shopping.service.IShoppingCartService; import com.hzs.sale.shopping.vo.WaresItemWaresInfo; @@ -717,4 +719,132 @@ public class ApiBdWaresController extends BaseController { return AjaxResult.success(waresInfoVo); } + + /** + * 188分享专区商品列表 + */ + @GetMapping("/list-wares-share") + public AjaxResult listWaresShare(WaresShareParam param) { + param.setSpecialArea(ESpecialArea.RETAIL_REGISTER.getValue()); + param.setIsMakerGift(EWaresType.ORDINARY.getValue()); + param.setPkCountry(CountryConstants.CHINA_COUNTRY); + + // 返回数据 + List waresParamsList = new ArrayList<>(); + + // 查询商品列表 + List bdWaresExtList = bdWaresService.listWaresShare(param.getSpecialArea(), param.getIsMakerGift(), param.getPkCountry()); + + if (CollectionUtil.isNotEmpty(bdWaresExtList)) { + // 商品主键列表 + List waresIdList = bdWaresExtList.stream().map(BdWares::getPkId).collect(Collectors.toList()); + + if (StringUtils.isNotEmpty(param.getShareMemberCode())) { + // 分享人ID + Long pkMember = Long.parseLong(new String(Base64Decoder.decode(param.getShareMemberCode()))); + CuMember cuMember = saOrderService.getCuMemberByKey(pkMember); + // 当前会员编号 + String memberCode = cuMember.getMemberCode(); + + // 检验商品团队信息 + Map> waresAuthorityMap = bdWaresService.getWaresAuthority(waresIdList); + List showWaresList = bdWaresExtList.stream().map(we -> getShowWares(we.getPkId(), pkMember, memberCode, waresAuthorityMap)).collect(Collectors.toList()); + R> waresShowMapDto = memberServiceApi.checkIsShowWares(showWaresList); + Map waresShowMap = waresShowMapDto.getData(); + + // 商品标签列表 + BdWaresLabel waresLabel = new BdWaresLabel(); + waresLabel.setPkIdList(waresIdList); + List list = waresLabelService.selectByList(waresLabel); + // 标签 + for (BdWaresExt bdWaresExt : bdWaresExtList) { + // 保证标签 + List ensureLabelList = new ArrayList<>(); + // 卖点标签 + List sellingLabelList = new ArrayList<>(); + + for (BdLabelExt bdLabel : list) { + if (ELabelType.PREFIX.getValue() == bdLabel.getLabelType() && bdLabel.getPkWares().equals(bdWaresExt.getPkId())) { + // 前缀标签 + bdWaresExt.setPrefixLabelTarget(bdLabel); + } + if (ELabelType.COOL.getValue() == bdLabel.getLabelType() && bdLabel.getPkWares().equals(bdWaresExt.getPkId())) { + // 酷炫标签 + bdWaresExt.setCoolLabelTarget(bdLabel); + } + if (ELabelType.ENSURE.getValue() == bdLabel.getLabelType() && bdLabel.getPkWares().equals(bdWaresExt.getPkId())) { + // 保证标签 + ensureLabelList.add(bdLabel); + } + if (ELabelType.SELLING.getValue() == bdLabel.getLabelType() && bdLabel.getPkWares().equals(bdWaresExt.getPkId())) { + // 卖点标签 + sellingLabelList.add(bdLabel); + } + } + bdWaresExt.setEnsureLabelList(ensureLabelList.stream().filter(DistinctByKeyUtil.distinctByKey(BdLabel::getPkId)).collect(Collectors.toList())); + bdWaresExt.setSellingLabelList(sellingLabelList.stream().filter(DistinctByKeyUtil.distinctByKey(BdLabel::getPkId)).collect(Collectors.toList())); + } + + // 查询商品sku 最小值 和数量 + List waresSpecsSkuArray = bdWaresSpecsSkuService.selectByMinWaresSpecsSkuByPkWaresList(waresIdList); + Map> waresSpecsSkuMap = waresSpecsSkuArray.stream().collect(Collectors.groupingBy(BdWaresSpecsSkuExt::getPkWares)); + + // 查询默认规格 + List waresSpecsSkuList = bdWaresSpecsSkuService.selectByWaresSpecsSku(waresIdList); + + for (BdWaresExt waresExt : bdWaresExtList) { + // 校验团队信息 + Boolean isShowWares = waresShowMap.get(waresExt.getPkId()); + if (null == isShowWares || !isShowWares) { + continue; + } + + CuWaresParams waresParams = BeanUtil.copyProperties(waresExt, CuWaresParams.class); + // 价格 + BigDecimal waresPrice = BigDecimal.ZERO; + // 业绩 + BigDecimal waresAchieve = BigDecimal.ZERO; + + List waresSpecsSku = waresSpecsSkuMap.get(waresExt.getPkId()); + waresSpecsSku = waresSpecsSku.stream().peek(a -> a.setProductGift(a.getPkProduct() + "" + a.getIsGift())).collect(Collectors.toList()); + Map> col = waresSpecsSku.stream().collect(Collectors.groupingBy(BdWaresSpecsSkuExt::getProductGift)); + for (Map.Entry> integerListEntry : col.entrySet()) { + // 取得每一个商品价格最小值 + Optional minBdWaresSpecsSkuExt = integerListEntry.getValue().stream().filter(Objects::nonNull).min(Comparator.comparing(BdWaresSpecsSkuExt::getPrice)); + BdWaresSpecsSkuExt bdWaresSpecsSkuExt = minBdWaresSpecsSkuExt.get(); + waresPrice = waresPrice.add(bdWaresSpecsSkuExt.getPrice().multiply(new BigDecimal(bdWaresSpecsSkuExt.getQuantity()))); + waresAchieve = waresAchieve.add(bdWaresSpecsSkuExt.getAchieve().multiply(new BigDecimal(bdWaresSpecsSkuExt.getQuantity()))); + } + + // 计算商品列表价格和业绩最小值 + waresParams.setWaresPrice(waresPrice); + waresParams.setWaresAchieve(waresAchieve); + // 商品业绩计算汇率 + if (waresParams.getWaresAchieve() != null) { + waresParams.setWaresAchieve(waresParams.getWaresAchieve()); + waresParams.setWaresPrice(waresParams.getWaresPrice()); + } else { + waresParams.setWaresAchieve(BigDecimal.ZERO); + waresParams.setWaresPrice(BigDecimal.ZERO); + } + + // 查询默认规格 + JSONArray jsonArray = new JSONArray(); + List collect = waresSpecsSkuList.stream().filter(DistinctByKeyUtil.distinctByKey(BdWaresSpecsSku::getPkWaresDetail)).collect(Collectors.toList()); + for (BdWaresSpecsSkuExt bdWaresSpecsSku : collect) { + if (bdWaresSpecsSku.getPkWares().equals(waresExt.getPkId())) { + JSONObject js = new JSONObject(); + js.put("pkProduct", bdWaresSpecsSku.getPkProduct()); + js.put("pkSkuId", bdWaresSpecsSku.getPkId()); + js.put("quantity", bdWaresSpecsSku.getQuantity()); + jsonArray.add(js); + } + } + waresParams.setProductGroup(jsonArray); + waresParamsList.add(waresParams); + } + } + } + return AjaxResult.success(waresParamsList); + } } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/mapper/BdWaresMapper.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/mapper/BdWaresMapper.java index 0e257309..689bb4cd 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/mapper/BdWaresMapper.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/mapper/BdWaresMapper.java @@ -20,6 +20,17 @@ import java.util.List; */ public interface BdWaresMapper extends BaseMapper { + /** + * 根据条件查询商品信息 + * + * @param specialArea 专区 + * @param specialArea 专区 + * @param pkCountry 所属国家 + * @return: List + */ + List listWaresShare(@Param("specialArea") Integer specialArea, + @Param("isMakerGift") Integer isMakerGift, + @Param("pkCountry") Integer pkCountry); /** * 根据条件查询商品信息 * diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/mapper/BdWaresSpecsSkuMapper.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/mapper/BdWaresSpecsSkuMapper.java index beaf1ad5..325c97ec 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/mapper/BdWaresSpecsSkuMapper.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/mapper/BdWaresSpecsSkuMapper.java @@ -109,4 +109,12 @@ public interface BdWaresSpecsSkuMapper extends BaseMapper { */ List selectByMinWaresSpecsSkuByPkWaresList(@Param("pkWaresIds") List pkWaresIds); + + /** + * 查询SKU价格等信息 + * + * @param skuIdList skuID列表 + * @return + */ + List queryWaresSpecsSkuList(@Param("skuIdList") List skuIdList); } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/IBdWaresService.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/IBdWaresService.java index bf22f3a8..26b0fb65 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/IBdWaresService.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/IBdWaresService.java @@ -24,6 +24,15 @@ import java.util.Map; */ public interface IBdWaresService extends IService { + /** + * 根据条件查询商品信息 + * + * @param specialArea 专区 + * @param specialArea 专区 + * @param pkCountry 所属国家 + * @return: List + */ + List listWaresShare(Integer specialArea, Integer isMakerGift, Integer pkCountry); /** * 获取最大排序值 * @return diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/IBdWaresSpecsSkuService.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/IBdWaresSpecsSkuService.java index 5a73299d..1f801491 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/IBdWaresSpecsSkuService.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/IBdWaresSpecsSkuService.java @@ -13,6 +13,7 @@ import com.hzs.sale.wares.param.CuWaresParams; import com.hzs.sale.wares.param.SpecsSkuParam; import java.util.List; +import java.util.Map; /** * 规格sku表 服务类 @@ -107,4 +108,12 @@ public interface IBdWaresSpecsSkuService extends IService { */ RetailWaresDetailVO queryWaresDetail(RetailWaresDetailParam param, Integer pkGrade); + + /** + * 查询SKU价格等信息 + * + * @param skuIdList skuID列表 + * @return + */ + Map queryWaresSpecsSkuList(List skuIdList); } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/impl/BdWaresServiceImpl.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/impl/BdWaresServiceImpl.java index d34f3a15..fc794601 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/impl/BdWaresServiceImpl.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/impl/BdWaresServiceImpl.java @@ -1173,4 +1173,9 @@ public class BdWaresServiceImpl extends ServiceImpl impl return baseMapper.listWaresNoSale(param); } + + @Override + public List listWaresShare(Integer specialArea, Integer isMakerGift, Integer pkCountry) { + return baseMapper.listWaresShare(specialArea, isMakerGift, pkCountry); + } } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/impl/BdWaresSpecsSkuServiceImpl.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/impl/BdWaresSpecsSkuServiceImpl.java index 8585d74f..532e9668 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/impl/BdWaresSpecsSkuServiceImpl.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/wares/service/impl/BdWaresSpecsSkuServiceImpl.java @@ -571,10 +571,22 @@ public class BdWaresSpecsSkuServiceImpl extends ServiceImpl queryWaresSpecsSkuList(List skuIdList) { + Map resultMap = new HashMap<>(); + + List list = baseMapper.queryWaresSpecsSkuList(skuIdList); + for (BdWaresSpecsSkuExt waresSpecsSku : list) { + resultMap.put(waresSpecsSku.getPkId().longValue(), waresSpecsSku); + } + return resultMap; + } } diff --git a/bd-business/bd-business-sale/src/main/resources/mapper/sale/wares/BdWaresMapper.xml b/bd-business/bd-business-sale/src/main/resources/mapper/sale/wares/BdWaresMapper.xml index 6b165f48..318c731d 100644 --- a/bd-business/bd-business-sale/src/main/resources/mapper/sale/wares/BdWaresMapper.xml +++ b/bd-business/bd-business-sale/src/main/resources/mapper/sale/wares/BdWaresMapper.xml @@ -489,4 +489,34 @@ order by bw.wares_name + + diff --git a/bd-business/bd-business-sale/src/main/resources/mapper/sale/wares/BdWaresSpecsSkuMapper.xml b/bd-business/bd-business-sale/src/main/resources/mapper/sale/wares/BdWaresSpecsSkuMapper.xml index 06418e05..432196b4 100644 --- a/bd-business/bd-business-sale/src/main/resources/mapper/sale/wares/BdWaresSpecsSkuMapper.xml +++ b/bd-business/bd-business-sale/src/main/resources/mapper/sale/wares/BdWaresSpecsSkuMapper.xml @@ -357,4 +357,23 @@ + + + diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/config/BdConfig.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/config/BdConfig.java index 553d7b8c..f19aea82 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/config/BdConfig.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/config/BdConfig.java @@ -24,18 +24,18 @@ public class BdConfig { * PC地址 */ private static String pc; -// /** -// * 公众号地址 -// */ -// private static String gzh; -// /** -// * IOS地址 -// */ -// private static String ios; -// /** -// * android地址 -// */ -// private static String android; + /** + * 公众号地址 + */ + private static String gzh; + /** + * IOS地址 + */ + private static String ios; + /** + * android地址 + */ + private static String android; /** * 商品同步是否开启(0=开启,1=不开启) @@ -70,29 +70,30 @@ public class BdConfig { BdConfig.pc = pc; } -// public static String getGzh() { -// return gzh; -// } -// -// public void setGzh(String gzh) { -// HzsConfig.gzh = gzh; -// } -// -// public static String getIos() { -// return ios; -// } -// -// public void setIos(String ios) { -// HzsConfig.ios = ios; -// } -// -// public static String getAndroid() { -// return android; -// } -// -// public void setAndroid(String android) { -// HzsConfig.android = android; -// } + + public static String getGzh() { + return gzh; + } + + public void setGzh(String gzh) { + BdConfig.gzh = gzh; + } + + public static String getIos() { + return ios; + } + + public void setIos(String ios) { + BdConfig.ios = ios; + } + + public static String getAndroid() { + return android; + } + + public void setAndroid(String android) { + BdConfig.android = android; + } public static Integer getProductSync() { return productSync; 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 */ diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/SysConstants.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/SysConstants.java index d152a0a6..e61c9220 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/SysConstants.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/SysConstants.java @@ -8,6 +8,11 @@ import java.util.List; */ public class SysConstants { + + /** + * 嗨粉前缀 + */ + public static final String HAI_FUN_PREFIX = "HF"; /** * 新零售前缀 */ diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EBonusItems.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EBonusItems.java index a8d60f24..8c1b8b99 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EBonusItems.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EBonusItems.java @@ -58,15 +58,15 @@ public enum EBonusItems { ////////////////////////////////////////////////// 新奖项 ////////////////////////////////////////////////// /** - * 直推级差收益 -- 日奖 + * 直推级差收益 -- 日奖、秒奖 */ RETAIL_RANGE_INCOME(25, "直推级差收益", 0), /** - * 复购级差收益 -- 日奖 + * 复购级差收益 -- 日奖、秒奖 */ RETAIL_REPURCHASE_INCOME(35, "复购级差收益", 0), /** - * 复购配送收益 -- 日奖 + * 复购配送收益 -- 日奖、秒奖 */ RETAIL_REPURCHASE_DELIVERY_INCOME(36, "复购配送收益", 0), diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EOrderTypeExtend.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EOrderTypeExtend.java new file mode 100644 index 00000000..a1147d03 --- /dev/null +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EOrderTypeExtend.java @@ -0,0 +1,38 @@ +package com.hzs.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 订单扩展类型枚举类 + */ +@AllArgsConstructor +@Getter +public enum EOrderTypeExtend { + + /** + * 正常 + */ + NORMAL(0, "正常", 0), + + /** + * 注册转复购 + */ + REG_REP(1, "注册转复购", 0), + + ; + + /** + * 实际值 + */ + private final int value; + /** + * 显示标签 + */ + private final String label; + /** + * 是否启用(0=是,1=否) -- 来源EYesNo + */ + private final int enable; + +} diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EShareType.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EShareType.java index 7ddb7034..f81e8b1b 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EShareType.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EShareType.java @@ -15,6 +15,11 @@ public enum EShareType { */ SHARE(1, "分享注册"), + /** + * 188注册 + */ + FANS(2, "188注册"), + ; /** diff --git a/bd-common/bd-common-security/src/main/java/com/hzs/common/security/service/MemberTokenService.java b/bd-common/bd-common-security/src/main/java/com/hzs/common/security/service/MemberTokenService.java index 62297b45..f3a45fb4 100644 --- a/bd-common/bd-common-security/src/main/java/com/hzs/common/security/service/MemberTokenService.java +++ b/bd-common/bd-common-security/src/main/java/com/hzs/common/security/service/MemberTokenService.java @@ -8,6 +8,7 @@ import com.hzs.common.core.utils.ServletUtils; import com.hzs.common.core.utils.StringUtils; import com.hzs.common.core.utils.ip.IpUtils; import com.hzs.common.core.utils.uuid.IdUtils; +import com.hzs.common.domain.member.base.CuMemberShare; import com.hzs.common.domain.member.ext.CuMemberExt; import com.hzs.common.security.utils.SecurityUtils; import com.hzs.member.base.dto.LoginMember; @@ -57,16 +58,26 @@ public class MemberTokenService { public Map createToken(LoginMember loginMember) { String token = IdUtils.fastUUID(); - // 注册用户处理 - CuMemberExt cuMember = loginMember.getCuMember(); // 用户ID - Long pkId = cuMember.getPkId(); + Long pkId; // 用户编号 - String memberCode = cuMember.getMemberCode(); + String memberCode; // 结算国 - Integer pkCountry = cuMember.getPkSettleCountry(); - // 系统类型 - Integer systemType = cuMember.getSystemType(); + Integer pkCountry; + + if (null != loginMember.getCuMember()) { + // 注册用户处理 + CuMemberExt cuMember = loginMember.getCuMember(); + pkId = cuMember.getPkId(); + memberCode = cuMember.getMemberCode(); + pkCountry = cuMember.getPkSettleCountry(); + } else { + // 分享用户处理(临时海粉) + CuMemberShare cuMemberShare = loginMember.getCuMemberShare(); + pkId = cuMemberShare.getPkId(); + memberCode = cuMemberShare.getMemberCode(); + pkCountry = cuMemberShare.getPkCountry(); + } loginMember.setToken(token); loginMember.setPkId(pkId); @@ -82,7 +93,6 @@ public class MemberTokenService { claimsMap.put(SecurityConstants.DETAILS_USERNAME, memberCode); claimsMap.put(SecurityConstants.DETAILS_USER_TYPE, loginMember.getLoginType()); claimsMap.put(SecurityConstants.DETAILS_USER_COUNTRY, pkCountry); - claimsMap.put(SecurityConstants.SYSTEM_TYPE, systemType); // 接口返回信息 Map rspMap = new HashMap<>(); diff --git a/bd-gateway/src/main/resources/bootstrap.yml b/bd-gateway/src/main/resources/bootstrap.yml index 48f970fa..95c199fd 100644 --- a/bd-gateway/src/main/resources/bootstrap.yml +++ b/bd-gateway/src/main/resources/bootstrap.yml @@ -172,6 +172,11 @@ security: - /member/api/share/share-register # 新零售白名单 - /retail-member/api/retail-auth/* + # 188分享注册白名单 + - /member/api/member/fans-convert-code/* + - /member/api/member/fans-order/* + - /system/api/idempotent/generate + - /member/api/retail-auth/auto-login # 日志配置 logging: diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentServiceImpl.java b/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentServiceImpl.java index db5c6cbc..911d8a75 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentServiceImpl.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentServiceImpl.java @@ -61,6 +61,9 @@ public class TOnlinePaymentServiceImpl extends ServiceImpl