forked from angelo/java-retail-app
				
			Compare commits
	
		
			2 Commits
		
	
	
		
			ddec95414b
			...
			671d8f112a
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
								 | 
						671d8f112a | |
| 
							
							
								
								 | 
						b1e16744e2 | 
| 
						 | 
				
			
			@ -126,7 +126,6 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
 | 
			
		|||
            // 配送收益配置
 | 
			
		||||
            Map<Integer, CuMemberRetailRegion> regionMap = iMemberServiceApi.listEffectiveRegion(settleStartDate).getData();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            // 直推、复购级差收益
 | 
			
		||||
            List<CuMemberBonusRange> cuMemberBonusRangeList = new ArrayList<>();
 | 
			
		||||
            // 复购配送收益
 | 
			
		||||
| 
						 | 
				
			
			@ -147,14 +146,14 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
 | 
			
		|||
                CuMemberRetailRangeExt sourceMemberRangeExt = memberRangeExtMap.get(saOrderExt.getPkMember());
 | 
			
		||||
 | 
			
		||||
                // 订单指定产品盒数(计算等级使用)
 | 
			
		||||
                int boxNum = saOrderExt.getBoxNum();
 | 
			
		||||
                BigDecimal boxNum = saOrderExt.getBoxNum();
 | 
			
		||||
 | 
			
		||||
                // 个人累计消费pv
 | 
			
		||||
                BigDecimal orderAchieve = saOrderExt.getOrderAchieve();
 | 
			
		||||
                // 复购、重消,盒数、业绩算个人累计数据(盒数、业绩)
 | 
			
		||||
                sourceMemberRangeExt.setNewBoxNum(sourceMemberRangeExt.getNewBoxNum() + boxNum);
 | 
			
		||||
                sourceMemberRangeExt.setConsumeBoxNum(sourceMemberRangeExt.getConsumeBoxNum() + boxNum);
 | 
			
		||||
                sourceMemberRangeExt.setMonthBoxNum(sourceMemberRangeExt.getMonthBoxNum() + boxNum);
 | 
			
		||||
                sourceMemberRangeExt.setNewBoxNum(sourceMemberRangeExt.getNewBoxNum().add(boxNum));
 | 
			
		||||
                sourceMemberRangeExt.setConsumeBoxNum(sourceMemberRangeExt.getConsumeBoxNum().add(boxNum));
 | 
			
		||||
                sourceMemberRangeExt.setMonthBoxNum(sourceMemberRangeExt.getMonthBoxNum().add(boxNum));
 | 
			
		||||
                sourceMemberRangeExt.setNewConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getNewConsumePv(), orderAchieve));
 | 
			
		||||
                sourceMemberRangeExt.setConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getConsumePv(), orderAchieve));
 | 
			
		||||
                sourceMemberRangeExt.setMonthConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getMonthConsumePv(), orderAchieve));
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +168,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
 | 
			
		|||
                // 计算奖金 直推级差
 | 
			
		||||
                if ((EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType()
 | 
			
		||||
                        || EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType())
 | 
			
		||||
                        && boxNum > 0
 | 
			
		||||
                        && boxNum.compareTo(BigDecimal.ZERO) > 0
 | 
			
		||||
                ) {
 | 
			
		||||
                    // 注册或升级订单并且存在盒数产品,才有 直推级差
 | 
			
		||||
                    cuMemberBonusRangeList.addAll(calculateRetailRangeBonus(memberRangeExtMap, cuMemberBonusMap, bonusConfigDTO, period, saOrderExt, gradeIdMap));
 | 
			
		||||
| 
						 | 
				
			
			@ -186,20 +185,22 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
 | 
			
		|||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    // 订单存在自动升级记录(高级店主处理)
 | 
			
		||||
                    // 订单存在自动升级记录(高级店主、区域董事处理)
 | 
			
		||||
                    if (autoLevelMap.containsKey(saOrderExt.getPkId())) {
 | 
			
		||||
                        CuMemberLevel cuMemberLevel = autoLevelMap.get(saOrderExt.getPkId());
 | 
			
		||||
                        if (gradeIdMap.containsKey(cuMemberLevel.getNewLevel())) {
 | 
			
		||||
                            BdGrade bdGrade = gradeIdMap.get(cuMemberLevel.getNewLevel());
 | 
			
		||||
                            CuMemberRetailRangeExt tmpMemberRetailRange = memberRangeExtMap.get(cuMemberLevel.getPkMember());
 | 
			
		||||
                            tmpMemberRetailRange.setPkGrade(bdGrade.getPkId());
 | 
			
		||||
                            tmpMemberRetailRange.setGradeValue(bdGrade.getGradeValue());
 | 
			
		||||
                            tmpMemberRetailRange.setGradeName(bdGrade.getGradeName());
 | 
			
		||||
                            if (bdGrade.getGradeValue() > tmpMemberRetailRange.getGradeValue()) {
 | 
			
		||||
                                tmpMemberRetailRange.setPkGrade(bdGrade.getPkId());
 | 
			
		||||
                                tmpMemberRetailRange.setGradeValue(bdGrade.getGradeValue());
 | 
			
		||||
                                tmpMemberRetailRange.setGradeName(bdGrade.getGradeName());
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else if (EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()) {
 | 
			
		||||
                    // 复购订单
 | 
			
		||||
                    if (boxNum > 0) {
 | 
			
		||||
                    if (boxNum.compareTo(BigDecimal.ZERO) > 0) {
 | 
			
		||||
                        // 存在盒数商品,计算复购级差
 | 
			
		||||
                        cuMemberBonusRangeList.addAll(calculateRetailRepurRangeBonus(memberRangeExtMap, cuMemberBonusMap,
 | 
			
		||||
                                bonusConfigDTO, period, saOrderExt));
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +235,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
 | 
			
		|||
     * 累计团队盒数、业绩等
 | 
			
		||||
     */
 | 
			
		||||
    public void calculateRetailRangeGradeAwards(Map<Long, CuMemberRetailRangeExt> memberRangeExtMap, SaOrderExt saOrderExt,
 | 
			
		||||
                                                Integer boxNum, Map<Long, Date> activateMap) {
 | 
			
		||||
                                                BigDecimal boxNum, Map<Long, Date> activateMap) {
 | 
			
		||||
        // 订单会员
 | 
			
		||||
        CuMemberRetailRangeExt sourceMemberRangeExt = memberRangeExtMap.get(saOrderExt.getPkMember());
 | 
			
		||||
        // 订单会员的推荐人
 | 
			
		||||
| 
						 | 
				
			
			@ -261,9 +262,9 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
 | 
			
		|||
                targetMemberRangeExt.setTeamConsumePv(ComputeUtil.computeAdd(targetMemberRangeExt.getTeamConsumePv(), orderAchieve));
 | 
			
		||||
                targetMemberRangeExt.setTeamMonthPv(ComputeUtil.computeAdd(targetMemberRangeExt.getTeamMonthPv(), orderAchieve));
 | 
			
		||||
                // 累计盒数
 | 
			
		||||
                targetMemberRangeExt.setTeamNewBoxNum(targetMemberRangeExt.getTeamNewBoxNum() + boxNum);
 | 
			
		||||
                targetMemberRangeExt.setTeamBoxNum(targetMemberRangeExt.getTeamBoxNum() + boxNum);
 | 
			
		||||
                targetMemberRangeExt.setTeamMonthBoxNum(targetMemberRangeExt.getTeamMonthBoxNum() + boxNum);
 | 
			
		||||
                targetMemberRangeExt.setTeamNewBoxNum(targetMemberRangeExt.getTeamNewBoxNum().add(boxNum));
 | 
			
		||||
                targetMemberRangeExt.setTeamBoxNum(targetMemberRangeExt.getTeamBoxNum().add(boxNum));
 | 
			
		||||
                targetMemberRangeExt.setTeamMonthBoxNum(targetMemberRangeExt.getTeamMonthBoxNum().add(boxNum));
 | 
			
		||||
            }
 | 
			
		||||
            targetMemberRangeExt = memberRangeExtMap.get(targetMemberRangeExt.getPkParent());
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -281,9 +282,23 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
 | 
			
		|||
        CuMemberRetailRangeExt sourceMemberRangeExt = memberRangeExtMap.get(saOrderExt.getPkMember());
 | 
			
		||||
        // 推荐人
 | 
			
		||||
        long pkParent = sourceMemberRangeExt.getPkParent();
 | 
			
		||||
        // 订单等级值
 | 
			
		||||
        // 订单金额
 | 
			
		||||
        BigDecimal orderAmount = saOrderExt.getOrderAmount();
 | 
			
		||||
//        // TODO 累计升级,此处订单可能没有等级值
 | 
			
		||||
//        if (null != saOrderExt.getPkGrade()) {
 | 
			
		||||
//            // 订单存在升级记录信息
 | 
			
		||||
//            // 订单等级值
 | 
			
		||||
//            Integer orderGradeValue = gradeIdMap.get(saOrderExt.getPkGrade()).getGradeValue();
 | 
			
		||||
//        } else {
 | 
			
		||||
//
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        Integer orderGradeValue = gradeIdMap.get(saOrderExt.getPkGrade()).getGradeValue();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // 前一个会员等级
 | 
			
		||||
        int beforeGradeValue = 0;
 | 
			
		||||
        // 前面累计奖金
 | 
			
		||||
| 
						 | 
				
			
			@ -598,7 +613,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
 | 
			
		|||
        // 推荐人
 | 
			
		||||
        long pkParent = sourceMemberRangeExt.getPkParent();
 | 
			
		||||
        // 商品盒数
 | 
			
		||||
        BigDecimal boxNum = new BigDecimal(saOrderExt.getBoxNum());
 | 
			
		||||
        BigDecimal boxNum = saOrderExt.getBoxNum();
 | 
			
		||||
 | 
			
		||||
        // 2025.08.13 添加分公司级差收益,每1盒(4个产品)第一分公司4元,第二分公司4元,公司6元,总拨出14元
 | 
			
		||||
        int branch = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -434,15 +434,15 @@
 | 
			
		|||
            pk_country          number(4) default 1 not null,
 | 
			
		||||
            system_type         NUMBER(2) default 2 not null,
 | 
			
		||||
            pk_rate             NUMBER(6),
 | 
			
		||||
            new_box_num         number(8) default 0 not null,
 | 
			
		||||
            consume_box_num     number(8) default 0 not null,
 | 
			
		||||
            month_box_num       number(8) default 0 not null,
 | 
			
		||||
            new_box_num         number(10,2) default 0 not null,
 | 
			
		||||
            consume_box_num     number(10,2) default 0 not null,
 | 
			
		||||
            month_box_num       number(10,2) default 0 not null,
 | 
			
		||||
            new_consume_pv      number(17,6) default 0 not null,
 | 
			
		||||
            consume_pv          number(17,6) default 0 not null,
 | 
			
		||||
            month_consume_pv    number(17,6) default 0 not null,
 | 
			
		||||
            team_new_box_num    number(8) default 0 not null,
 | 
			
		||||
            team_box_num        number(8) default 0 not null,
 | 
			
		||||
            team_month_box_num  number(8) default 0 not null,
 | 
			
		||||
            team_new_box_num    number(10,2) default 0 not null,
 | 
			
		||||
            team_box_num        number(10,2) default 0 not null,
 | 
			
		||||
            team_month_box_num  number(10,2) default 0 not null,
 | 
			
		||||
            team_new_pv         number(17,6) default 0 not null,
 | 
			
		||||
            team_consume_pv     number(17,6) default 0 not null,
 | 
			
		||||
            team_month_pv       number(17,6) default 0 not null,
 | 
			
		||||
| 
						 | 
				
			
			@ -452,8 +452,8 @@
 | 
			
		|||
            recommend_num       number(8) default 0 not null,
 | 
			
		||||
            team_num            number(8) default 0 not null,
 | 
			
		||||
            region_address      number(8) default 0 not null,
 | 
			
		||||
            big_box_num         number(8) default 0 not null,
 | 
			
		||||
            small_box_num       number(8) default 0 not null,
 | 
			
		||||
            big_box_num         number(10,2) default 0 not null,
 | 
			
		||||
            small_box_num       number(10,2) default 0 not null,
 | 
			
		||||
            big_team_pv         number(17,6) default 0 not null,
 | 
			
		||||
            small_team_pv       number(17,6) default 0 not null
 | 
			
		||||
        )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -604,7 +604,7 @@ public interface CuMemberMapper extends BaseMapper<CuMember> {
 | 
			
		|||
     *
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    CuMember getShopkeeperMember(@Param("pkMember") Long pkMember);
 | 
			
		||||
    CuMember getShopkeeperMember(@Param("pkMember") Long pkMember, @Param("gradeValue") Integer gradeValue);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询高级店主
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -873,7 +873,7 @@ public interface ICuMemberService extends IService<CuMember> {
 | 
			
		|||
     *
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    CuMember getShopkeeperMember(Long pkMember);
 | 
			
		||||
    CuMember getShopkeeperMember(Long pkMember, Integer gradeValue);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询高级店主
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -918,7 +918,6 @@ public class CuMemberBusinessServiceImpl implements ICuMemberBusinessService {
 | 
			
		|||
        // 处理推荐人等级
 | 
			
		||||
        this.handleParentLevel(saOrder, currentDateTime);
 | 
			
		||||
 | 
			
		||||
        // 部分撤单 todo  发货后邮费不退,未发货退邮费
 | 
			
		||||
        if (saOrder.getPayType().equals(EOrderPayType.WALLET.getValue())) {
 | 
			
		||||
            // 钱包支付,则需要回退金额
 | 
			
		||||
            // 部分撤单
 | 
			
		||||
| 
						 | 
				
			
			@ -1606,9 +1605,9 @@ public class CuMemberBusinessServiceImpl implements ICuMemberBusinessService {
 | 
			
		|||
        if (null == gradeDTO) {
 | 
			
		||||
            gradeDTO = iGradeServiceApi.getGrade(cuMember.getPkSettleGrade()).getData();
 | 
			
		||||
        }
 | 
			
		||||
        if (EGrade.VIP.getValue() == gradeDTO.getGradeValue()) {
 | 
			
		||||
            // 会员等级为 博羚店主,推荐人如果也是博羚店主,需要升级为高级店主
 | 
			
		||||
            CuMember parentMember = iCuMemberService.getShopkeeperMember(cuMember.getPkParent());
 | 
			
		||||
        if (gradeDTO.getGradeValue() >= EGrade.VIP.getValue()) {
 | 
			
		||||
            // 会员等级大于等于 博羚店主,推荐人如果也是博羚店主,需要升级为高级店主
 | 
			
		||||
            CuMember parentMember = iCuMemberService.getShopkeeperMember(cuMember.getPkParent(), EGrade.VIP.getValue());
 | 
			
		||||
            if (null != parentMember) {
 | 
			
		||||
                // 记录升级历史
 | 
			
		||||
                GradeDTO upgradeDTO = iGradeServiceApi.getGradeByGradeValue(EGrade.S_VIP.getValue(), cuMember.getPkSettleCountry()).getData();
 | 
			
		||||
| 
						 | 
				
			
			@ -1624,6 +1623,31 @@ public class CuMemberBusinessServiceImpl implements ICuMemberBusinessService {
 | 
			
		|||
                cuMemberLevel.setPkCreator(cuMember.getPkId());
 | 
			
		||||
                iCuMemberLevelService.save(cuMemberLevel);
 | 
			
		||||
 | 
			
		||||
                LambdaUpdateWrapper<CuMember> updateWrapper = new LambdaUpdateWrapper<>();
 | 
			
		||||
                updateWrapper.set(CuMember::getPkSettleGrade, upgradeDTO.getPkId());
 | 
			
		||||
                updateWrapper.eq(CuMember::getPkId, parentMember.getPkId());
 | 
			
		||||
                updateWrapper.set(CuMember::getPkModified, cuMember.getPkId());
 | 
			
		||||
                updateWrapper.set(CuMember::getModifiedTime, new Date());
 | 
			
		||||
                iCuMemberService.update(updateWrapper);
 | 
			
		||||
            }
 | 
			
		||||
        } else if (gradeDTO.getGradeValue() >= EGrade.REGION.getValue())  {
 | 
			
		||||
            // 会员等级大于等于 区域代理,推荐人如果也是区域代理,需要升级为董事代理
 | 
			
		||||
            CuMember parentMember = iCuMemberService.getShopkeeperMember(cuMember.getPkParent(), EGrade.REGION.getValue());
 | 
			
		||||
            if (null != parentMember) {
 | 
			
		||||
                // 记录升级历史
 | 
			
		||||
                GradeDTO upgradeDTO = iGradeServiceApi.getGradeByGradeValue(EGrade.DIRECTOR.getValue(), cuMember.getPkSettleCountry()).getData();
 | 
			
		||||
                CuMemberLevel cuMemberLevel = CuMemberLevel.builder()
 | 
			
		||||
                        .pkMember(parentMember.getPkId())
 | 
			
		||||
                        .upType(EUpgradeType.AUTO_UPGRADE.getValue())
 | 
			
		||||
                        .oldLevel(parentMember.getPkSettleGrade())
 | 
			
		||||
                        .newLevel(upgradeDTO.getPkId())
 | 
			
		||||
                        .upgradeTime(saOrder.getPayTime())
 | 
			
		||||
                        .pkOrder(saOrder.getPkId())
 | 
			
		||||
                        .build();
 | 
			
		||||
                cuMemberLevel.setPkCountry(cuMember.getPkSettleCountry());
 | 
			
		||||
                cuMemberLevel.setPkCreator(cuMember.getPkId());
 | 
			
		||||
                iCuMemberLevelService.save(cuMemberLevel);
 | 
			
		||||
 | 
			
		||||
                LambdaUpdateWrapper<CuMember> updateWrapper = new LambdaUpdateWrapper<>();
 | 
			
		||||
                updateWrapper.set(CuMember::getPkSettleGrade, upgradeDTO.getPkId());
 | 
			
		||||
                updateWrapper.eq(CuMember::getPkId, parentMember.getPkId());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -116,7 +116,7 @@ public class CuMemberServiceImpl extends ServiceImpl<CuMemberMapper, CuMember> i
 | 
			
		|||
    @Autowired
 | 
			
		||||
    private ICuSettleCountryDetailedService iCuSettleCountryDetailedService;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private ICuMemberBusinessService cuMemberBusinessService;
 | 
			
		||||
    private ICuMemberBusinessService iCuMemberBusinessService;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RabbitTemplate rabbitTemplate;
 | 
			
		||||
| 
						 | 
				
			
			@ -2292,7 +2292,7 @@ public class CuMemberServiceImpl extends ServiceImpl<CuMemberMapper, CuMember> i
 | 
			
		|||
        cuMember.setPkRegisterGrade(gradeDTO.getPkId());
 | 
			
		||||
        cuMember.setPkSettleGrade(gradeDTO.getPkId());
 | 
			
		||||
        cuMember.setPkAwards(gradeDTO.getPkAwards());
 | 
			
		||||
        cuMemberBusinessService.saveShareMember(cuMember);
 | 
			
		||||
        iCuMemberBusinessService.saveShareMember(cuMember);
 | 
			
		||||
        return cuMember;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3139,8 +3139,8 @@ public class CuMemberServiceImpl extends ServiceImpl<CuMemberMapper, CuMember> i
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public CuMember getShopkeeperMember(Long pkMember) {
 | 
			
		||||
        return baseMapper.getShopkeeperMember(pkMember);
 | 
			
		||||
    public CuMember getShopkeeperMember(Long pkMember, Integer gradeValue) {
 | 
			
		||||
        return baseMapper.getShopkeeperMember(pkMember, gradeValue);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ public class CuMemberRetailAchieveVO implements Serializable {
 | 
			
		|||
    /**
 | 
			
		||||
     * 盒数
 | 
			
		||||
     */
 | 
			
		||||
    private Integer boxs;
 | 
			
		||||
    private BigDecimal boxs;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2379,7 +2379,7 @@
 | 
			
		|||
                 left join bd_grade bg
 | 
			
		||||
                           on bg.pk_id = cm.pk_settle_grade
 | 
			
		||||
        where cm.pk_id = #{pkMember}
 | 
			
		||||
          and bg.grade_value = 60
 | 
			
		||||
          and bg.grade_value = #{gradeValue}
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <!-- 查询高级店主 -->
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,11 +9,7 @@ import lombok.NoArgsConstructor;
 | 
			
		|||
import java.math.BigDecimal;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: 伞下直推查询会员大小区金额业绩盒数
 | 
			
		||||
 * @author: zhang jing
 | 
			
		||||
 * @date: 2025/2/10 18:00
 | 
			
		||||
 * @param:
 | 
			
		||||
 * @return:
 | 
			
		||||
 * 伞下直推查询会员大小区金额业绩盒数
 | 
			
		||||
 **/
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
| 
						 | 
				
			
			@ -36,71 +32,65 @@ public class DirectPushAmountPvBoxVo {
 | 
			
		|||
    /**
 | 
			
		||||
     * 盒数
 | 
			
		||||
     */
 | 
			
		||||
    private Integer boxNum;
 | 
			
		||||
    private BigDecimal boxNum;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 金额
 | 
			
		||||
     */
 | 
			
		||||
    @BigDecimalFormat()
 | 
			
		||||
    private BigDecimal orderAmountReg=BigDecimal.ZERO;
 | 
			
		||||
    private BigDecimal orderAmountReg = BigDecimal.ZERO;
 | 
			
		||||
    /**
 | 
			
		||||
     * 金额
 | 
			
		||||
     */
 | 
			
		||||
    @BigDecimalFormat()
 | 
			
		||||
    private BigDecimal orderAmountUpg=BigDecimal.ZERO;
 | 
			
		||||
    private BigDecimal orderAmountUpg = BigDecimal.ZERO;
 | 
			
		||||
    /**
 | 
			
		||||
     * 金额
 | 
			
		||||
     */
 | 
			
		||||
    @BigDecimalFormat()
 | 
			
		||||
    private BigDecimal orderAmountRep=BigDecimal.ZERO;
 | 
			
		||||
    private BigDecimal orderAmountRep = BigDecimal.ZERO;
 | 
			
		||||
    /**
 | 
			
		||||
     * 金额
 | 
			
		||||
     */
 | 
			
		||||
    @BigDecimalFormat()
 | 
			
		||||
    private BigDecimal orderAmountCon=BigDecimal.ZERO;
 | 
			
		||||
    private BigDecimal orderAmountCon = BigDecimal.ZERO;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 业绩
 | 
			
		||||
     */
 | 
			
		||||
    @BigDecimalFormat()
 | 
			
		||||
    private BigDecimal orderAchieveReg=BigDecimal.ZERO;
 | 
			
		||||
    private BigDecimal orderAchieveReg = BigDecimal.ZERO;
 | 
			
		||||
    /**
 | 
			
		||||
     * 业绩
 | 
			
		||||
     */
 | 
			
		||||
    @BigDecimalFormat()
 | 
			
		||||
    private BigDecimal orderAchieveUpg=BigDecimal.ZERO;
 | 
			
		||||
    private BigDecimal orderAchieveUpg = BigDecimal.ZERO;
 | 
			
		||||
    /**
 | 
			
		||||
     * 业绩
 | 
			
		||||
     */
 | 
			
		||||
    @BigDecimalFormat()
 | 
			
		||||
    private BigDecimal orderAchieveRep=BigDecimal.ZERO;
 | 
			
		||||
    private BigDecimal orderAchieveRep = BigDecimal.ZERO;
 | 
			
		||||
    /**
 | 
			
		||||
     * 业绩
 | 
			
		||||
     */
 | 
			
		||||
    @BigDecimalFormat()
 | 
			
		||||
    private BigDecimal orderAchieveCon=BigDecimal.ZERO;
 | 
			
		||||
    private BigDecimal orderAchieveCon = BigDecimal.ZERO;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 盒数
 | 
			
		||||
     */
 | 
			
		||||
    private int boxNumReg;
 | 
			
		||||
    private BigDecimal boxNumReg;
 | 
			
		||||
    /**
 | 
			
		||||
     * 盒数
 | 
			
		||||
     */
 | 
			
		||||
    private int boxNumUpg;
 | 
			
		||||
    private BigDecimal boxNumUpg;
 | 
			
		||||
    /**
 | 
			
		||||
     * 盒数
 | 
			
		||||
     */
 | 
			
		||||
    private int boxNumRep;
 | 
			
		||||
    private BigDecimal boxNumRep;
 | 
			
		||||
    /**
 | 
			
		||||
     * 盒数
 | 
			
		||||
     */
 | 
			
		||||
    private int boxNumCon;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private BigDecimal boxNumCon;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,23 +38,23 @@
 | 
			
		|||
		  TEAM_REP_AMOUNT NUMBER(17,6) default 0 not null,
 | 
			
		||||
		  TEAM_CON_AMOUNT NUMBER(17,6) default 0 not null,
 | 
			
		||||
 | 
			
		||||
          SUM_BOX        NUMBER(8) default 0,
 | 
			
		||||
          BIG_BOX        NUMBER(8) default 0,
 | 
			
		||||
          SMALL_BOX      NUMBER(8) default 0,
 | 
			
		||||
          REG_BOX        NUMBER(8) default 0,
 | 
			
		||||
		  UPG_BOX        NUMBER(8) default 0,
 | 
			
		||||
		  REP_BOX        NUMBER(8) default 0,
 | 
			
		||||
		  CON_BOX        NUMBER(8) default 0,
 | 
			
		||||
		  INFLATE_BIG_BOX NUMBER(8) default 0,
 | 
			
		||||
		  INFLATE_SMALL_BOX NUMBER(8) default 0,
 | 
			
		||||
          SUM_BOX        NUMBER(10, 2) default 0,
 | 
			
		||||
          BIG_BOX        NUMBER(10, 2) default 0,
 | 
			
		||||
          SMALL_BOX      NUMBER(10, 2) default 0,
 | 
			
		||||
          REG_BOX        NUMBER(10, 2) default 0,
 | 
			
		||||
		  UPG_BOX        NUMBER(10, 2) default 0,
 | 
			
		||||
		  REP_BOX        NUMBER(10, 2) default 0,
 | 
			
		||||
		  CON_BOX        NUMBER(10, 2) default 0,
 | 
			
		||||
		  INFLATE_BIG_BOX NUMBER(10, 2) default 0,
 | 
			
		||||
		  INFLATE_SMALL_BOX NUMBER(10, 2) default 0,
 | 
			
		||||
 | 
			
		||||
          TEAM_SUM_BOX   NUMBER(18) default 0,
 | 
			
		||||
          TEAM_BIG_BOX   NUMBER(18) default 0,
 | 
			
		||||
          TEAM_SMALL_BOX NUMBER(8) default 0,
 | 
			
		||||
          TEAM_REG_BOX   NUMBER(18) default 0,
 | 
			
		||||
		  TEAM_UPG_BOX   NUMBER(18) default 0,
 | 
			
		||||
		  TEAM_REP_BOX   NUMBER(18) default 0,
 | 
			
		||||
		  TEAM_CON_BOX   NUMBER(18) default 0,
 | 
			
		||||
          TEAM_SUM_BOX   NUMBER(18, 2) default 0,
 | 
			
		||||
          TEAM_BIG_BOX   NUMBER(18, 2) default 0,
 | 
			
		||||
          TEAM_SMALL_BOX NUMBER(8, 2) default 0,
 | 
			
		||||
          TEAM_REG_BOX   NUMBER(18, 2) default 0,
 | 
			
		||||
		  TEAM_UPG_BOX   NUMBER(18, 2) default 0,
 | 
			
		||||
		  TEAM_REP_BOX   NUMBER(18, 2) default 0,
 | 
			
		||||
		  TEAM_CON_BOX   NUMBER(18, 2) default 0,
 | 
			
		||||
 | 
			
		||||
          SUM_PV         NUMBER(17,6) default 0 not null,
 | 
			
		||||
          BIG_PV         NUMBER(17,6) default 0 not null,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -236,7 +236,7 @@ public class RetailOrderServiceImpl implements IRetailOrderService {
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // TODO 2025.08.04 注册、升级专区,下单支付会员如果是分公司,订单不需要发货,直接放入提货中心
 | 
			
		||||
            // 2025.08.04 注册、升级专区,下单支付会员如果是分公司,订单不需要发货,直接放入提货中心
 | 
			
		||||
            CuMember createMember = orderParam.getCreatorMember();
 | 
			
		||||
            if (null == createMember) {
 | 
			
		||||
                createMember = iMemberServiceApi.getMember(orderParam.getPkCreator()).getData();
 | 
			
		||||
| 
						 | 
				
			
			@ -273,7 +273,7 @@ public class RetailOrderServiceImpl implements IRetailOrderService {
 | 
			
		|||
        Map<Integer, List<SaOrderItems>> postageMap = new HashMap<>(ComputeUtil.mapInitCapacity(waresDetailExtList.size()));
 | 
			
		||||
 | 
			
		||||
        // 当前盒数
 | 
			
		||||
        int boxNum = 0;
 | 
			
		||||
        BigDecimal boxNum = BigDecimal.ZERO;
 | 
			
		||||
 | 
			
		||||
        // 设置已经累计盒数的商品列表
 | 
			
		||||
        List<String> tmpBoxWares = new ArrayList<>();
 | 
			
		||||
| 
						 | 
				
			
			@ -298,7 +298,7 @@ public class RetailOrderServiceImpl implements IRetailOrderService {
 | 
			
		|||
                if (boxWaresList.contains(waresDetailExt.getWaresCode())) {
 | 
			
		||||
                    // 商品是盒数商品,需要累计数量
 | 
			
		||||
                    if (!tmpBoxWares.contains(waresDetailExt.getWaresCode())) {
 | 
			
		||||
                        boxNum += waresDetailExt.getBoxNum() * orderItems.getWaresQuantity();
 | 
			
		||||
                        boxNum = boxNum.add(waresDetailExt.getBoxNum().multiply(new BigDecimal(orderItems.getWaresQuantity())));
 | 
			
		||||
                        tmpBoxWares.add(waresDetailExt.getWaresCode());
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -387,26 +387,6 @@ public class RetailOrderServiceImpl implements IRetailOrderService {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据购买盒数,返回商品价格
 | 
			
		||||
     *
 | 
			
		||||
     * @param boxNum    盒数
 | 
			
		||||
     * @param gradeList 等级列表(倒序排序)
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal getWaresPrice(int boxNum, List<BdGrade> gradeList) {
 | 
			
		||||
        // 去掉升级条件带有累计盒数的(V4,V5)并且升级购买合数小于等于订单商品盒数的,再进行等级值倒序排序
 | 
			
		||||
        gradeList = gradeList.stream().filter(tmpGrade -> tmpGrade.getBoxTotal() == 0 && tmpGrade.getBoxNumber() <= boxNum).sorted(Comparator.comparingInt(BdGrade::getGradeValue).reversed()).collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        for (BdGrade bdGrade : gradeList) {
 | 
			
		||||
            if (boxNum > bdGrade.getBoxNumber()) {
 | 
			
		||||
                // 盒数大于等于购买盒数
 | 
			
		||||
                return ERetailWaresPrice.getEnumByValue(bdGrade.getGradeValue()).getPrice();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return ERetailWaresPrice.V0.getPrice();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 封装订单信息
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			@ -871,7 +851,7 @@ public class RetailOrderServiceImpl implements IRetailOrderService {
 | 
			
		|||
                || EOrderType.RETAIL_UPGRADE.getValue() == saOrder.getOrderType())
 | 
			
		||||
        ) {
 | 
			
		||||
            // 会员激活状态为空 或 未激活,并且是 注册、升级 订单,判断会员是否激活
 | 
			
		||||
            if (saOrder.getBoxNum() > 0) {
 | 
			
		||||
            if (saOrder.getBoxNum().compareTo(BigDecimal.ZERO) > 0) {
 | 
			
		||||
                // 存在指定盒数商品
 | 
			
		||||
                cuMember.setIsActivate(EYesNo.YES.getIntValue());
 | 
			
		||||
                if (EPayStatus.UNPAID.getValue() == cuMember.getPayStatus()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -961,49 +941,53 @@ public class RetailOrderServiceImpl implements IRetailOrderService {
 | 
			
		|||
        if (EYesNo.NO.getIntValue() == BdConfig.getProductSync()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        Map<Integer, BdProduct> productMap = iBdProductService.queryProductMap(saOrderExt.getOrderItemsList().stream().map(SaOrderItems::getPkProduct).collect(Collectors.toSet()), null);
 | 
			
		||||
        // 开启线程调用全网产品库存
 | 
			
		||||
        // 请求参数
 | 
			
		||||
        Map<String, Object> bodyMap = new HashMap<>();
 | 
			
		||||
        bodyMap.put("source", BdConfig.getSysName());
 | 
			
		||||
        bodyMap.put("orderCode", saOrderExt.getOrderCode());
 | 
			
		||||
        List<Map<String, Object>> bodyDetailList = new ArrayList<>();
 | 
			
		||||
        for (SaOrderItems saOrderItems : saOrderExt.getOrderItemsList()) {
 | 
			
		||||
            Map<String, Object> detailMap = new HashMap<>();
 | 
			
		||||
            detailMap.put("wmsCode", productMap.get(saOrderItems.getPkProduct()).getWmsCode());
 | 
			
		||||
            detailMap.put("changeNum", saOrderItems.getQuantity());
 | 
			
		||||
            bodyDetailList.add(detailMap);
 | 
			
		||||
        }
 | 
			
		||||
        bodyMap.put("detailList", bodyDetailList);
 | 
			
		||||
        // 请求头
 | 
			
		||||
        String header = Base64Encoder.encode(BdConfig.getSysName() + "!" + saOrderExt.getOrderCode());
 | 
			
		||||
        ThreadUtils.threadPoolExecutor.submit(() -> {
 | 
			
		||||
            log.info("同步产品,header: {}", header);
 | 
			
		||||
            log.info("同步产品,bodyMap: {}", bodyMap);
 | 
			
		||||
            HttpRequest httpRequest = HttpUtil.createPost(BdConfig.getProductSyncUrl());
 | 
			
		||||
            httpRequest.header("authorization", header);
 | 
			
		||||
            httpRequest.body(JSONUtil.toJsonStr(bodyMap));
 | 
			
		||||
            httpRequest.setReadTimeout(5000);
 | 
			
		||||
            try {
 | 
			
		||||
                // 同步产品接口返回
 | 
			
		||||
                String resultStr = httpRequest.execute().body();
 | 
			
		||||
                AjaxResult ajaxResult = JSONUtil.toBean(resultStr, AjaxResult.class);
 | 
			
		||||
                log.info("同步产品,resultStr: {}", resultStr);
 | 
			
		||||
                if (!ajaxResult.isSuccess()) {
 | 
			
		||||
                    // 同步产品失败,250毫秒后重试
 | 
			
		||||
                    Thread.sleep(250);
 | 
			
		||||
                    resultStr = httpRequest.execute().body();
 | 
			
		||||
                    log.info("同步产品失败重试,resultStr: {}", resultStr);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                log.error("同步产品库存异常", e);
 | 
			
		||||
                // 保存订单产品同步记录
 | 
			
		||||
                iSaOrderSyncService.save(SaOrderSync.builder()
 | 
			
		||||
                        .orderCode(saOrderExt.getOrderCode())
 | 
			
		||||
                        .bodyDetail(JSONUtil.toJsonStr(bodyDetailList))
 | 
			
		||||
                        .build());
 | 
			
		||||
        try {
 | 
			
		||||
            Map<Integer, BdProduct> productMap = iBdProductService.queryProductMap(saOrderExt.getOrderItemsList().stream().map(SaOrderItems::getPkProduct).collect(Collectors.toSet()), null);
 | 
			
		||||
            // 开启线程调用全网产品库存
 | 
			
		||||
            // 请求参数
 | 
			
		||||
            Map<String, Object> bodyMap = new HashMap<>();
 | 
			
		||||
            bodyMap.put("source", BdConfig.getSysName());
 | 
			
		||||
            bodyMap.put("orderCode", saOrderExt.getOrderCode());
 | 
			
		||||
            List<Map<String, Object>> bodyDetailList = new ArrayList<>();
 | 
			
		||||
            for (SaOrderItems saOrderItems : saOrderExt.getOrderItemsList()) {
 | 
			
		||||
                Map<String, Object> detailMap = new HashMap<>();
 | 
			
		||||
                detailMap.put("wmsCode", productMap.get(saOrderItems.getPkProduct()).getWmsCode());
 | 
			
		||||
                detailMap.put("changeNum", saOrderItems.getQuantity());
 | 
			
		||||
                bodyDetailList.add(detailMap);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
            bodyMap.put("detailList", bodyDetailList);
 | 
			
		||||
            // 请求头
 | 
			
		||||
            String header = Base64Encoder.encode(BdConfig.getSysName() + "!" + saOrderExt.getOrderCode());
 | 
			
		||||
            ThreadUtils.threadPoolExecutor.submit(() -> {
 | 
			
		||||
                log.info("同步产品,header: {}", header);
 | 
			
		||||
                log.info("同步产品,bodyMap: {}", bodyMap);
 | 
			
		||||
                HttpRequest httpRequest = HttpUtil.createPost(BdConfig.getProductSyncUrl());
 | 
			
		||||
                httpRequest.header("authorization", header);
 | 
			
		||||
                httpRequest.body(JSONUtil.toJsonStr(bodyMap));
 | 
			
		||||
                httpRequest.setReadTimeout(5000);
 | 
			
		||||
                try {
 | 
			
		||||
                    // 同步产品接口返回
 | 
			
		||||
                    String resultStr = httpRequest.execute().body();
 | 
			
		||||
                    AjaxResult ajaxResult = JSONUtil.toBean(resultStr, AjaxResult.class);
 | 
			
		||||
                    log.info("同步产品,resultStr: {}", resultStr);
 | 
			
		||||
                    if (!ajaxResult.isSuccess()) {
 | 
			
		||||
                        // 同步产品失败,250毫秒后重试
 | 
			
		||||
                        Thread.sleep(250);
 | 
			
		||||
                        resultStr = httpRequest.execute().body();
 | 
			
		||||
                        log.info("同步产品失败重试,resultStr: {}", resultStr);
 | 
			
		||||
                    }
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                    log.error("同步产品库存异常", e);
 | 
			
		||||
                    // 保存订单产品同步记录
 | 
			
		||||
                    iSaOrderSyncService.save(SaOrderSync.builder()
 | 
			
		||||
                            .orderCode(saOrderExt.getOrderCode())
 | 
			
		||||
                            .bodyDetail(JSONUtil.toJsonStr(bodyDetailList))
 | 
			
		||||
                            .build());
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            log.error("同步产品异常: ", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,7 @@ import com.hzs.sale.order.param.WaresOrderParam;
 | 
			
		|||
import com.hzs.sale.order.vo.WaresOrderVo;
 | 
			
		||||
import org.apache.ibatis.annotations.Param;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -285,11 +286,11 @@ public interface SaOrderItemsMapper extends BaseMapper<SaOrderItems> {
 | 
			
		|||
     * @param systemType    系统类型(可为null)
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    int getRetailWaresQuantityNew(@Param("pkMember") Long pkMember,
 | 
			
		||||
                                  @Param("waresCodeList") List<String> waresCodeList,
 | 
			
		||||
                                  @Param("payTime") Date payTime,
 | 
			
		||||
                                  @Param("orderTypeList") List<Integer> orderTypeList,
 | 
			
		||||
                                  @Param("systemType") Integer systemType);
 | 
			
		||||
    BigDecimal getRetailWaresQuantityNew(@Param("pkMember") Long pkMember,
 | 
			
		||||
                                         @Param("waresCodeList") List<String> waresCodeList,
 | 
			
		||||
                                         @Param("payTime") Date payTime,
 | 
			
		||||
                                         @Param("orderTypeList") List<Integer> orderTypeList,
 | 
			
		||||
                                         @Param("systemType") Integer systemType);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 订单发货数量
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ import lombok.Data;
 | 
			
		|||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +43,7 @@ public class OrderItemsParam implements Serializable {
 | 
			
		|||
    /**
 | 
			
		||||
     * 商品盒数
 | 
			
		||||
     */
 | 
			
		||||
    private Integer boxNum;
 | 
			
		||||
    private BigDecimal boxNum;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 商品明细
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,7 @@ import com.hzs.sale.order.param.WaresOrderParam;
 | 
			
		|||
import com.hzs.sale.order.vo.WaresOrderVo;
 | 
			
		||||
import org.apache.ibatis.annotations.Param;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -249,7 +250,7 @@ public interface ISaOrderItemsService extends IService<SaOrderItems> {
 | 
			
		|||
     * @param systemType    系统类型(可为null)
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    int getRetailWaresQuantityNew(Long pkMember, List<String> waresCodeList, Date payTime, List<Integer> orderTypeList, Integer systemType);
 | 
			
		||||
    BigDecimal getRetailWaresQuantityNew(Long pkMember, List<String> waresCodeList, Date payTime, List<Integer> orderTypeList, Integer systemType);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 订单发货数量
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -603,7 +603,7 @@ public interface ISaOrderService extends IService<SaOrder> {
 | 
			
		|||
     * @param checkUpgrade 校验升级
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    BdGrade getGradeByBox(final Integer boxTotal, List<BdGrade> gradeList, BdGrade memberGrade, boolean checkUpgrade);
 | 
			
		||||
    BdGrade getGradeByBox(final BigDecimal boxTotal, List<BdGrade> gradeList, BdGrade memberGrade, boolean checkUpgrade);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 处理升级盒数基数
 | 
			
		||||
| 
						 | 
				
			
			@ -615,7 +615,7 @@ public interface ISaOrderService extends IService<SaOrder> {
 | 
			
		|||
     * @param systemType     所属系统
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    int handleBaseBoxNum(CuMember cuMember, BdGrade memberGrade, List<BdGrade> gradeList, List<String> boxProductList, Integer systemType);
 | 
			
		||||
    BigDecimal handleBaseBoxNum(CuMember cuMember, BdGrade memberGrade, List<BdGrade> gradeList, List<String> boxProductList, Integer systemType);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询省、市、区绑定次数
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2286,7 +2286,7 @@ public class OrderBusinessServiceImpl implements IOrderBusinessService {
 | 
			
		|||
                    // 调换货物选择不同产品,没有商品信息,此处先全部按默认值来处理
 | 
			
		||||
 | 
			
		||||
                    // 2025.02.11 如果盒数商品,历史商品ID不变,非盒数商品进行处理
 | 
			
		||||
                    if (saOrder.getBoxNum() == 0) {
 | 
			
		||||
                    if (saOrder.getBoxNum().compareTo(BigDecimal.ZERO) == 0) {
 | 
			
		||||
                        saOrderItems.setPkWares(0);
 | 
			
		||||
                    }
 | 
			
		||||
                    saOrderItems.setPkWaresDetail(0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ import com.hzs.sale.order.vo.WaresOrderVo;
 | 
			
		|||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -191,7 +192,7 @@ public class SaOrderItemsServiceImpl extends ServiceImpl<SaOrderItemsMapper, SaO
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getRetailWaresQuantityNew(Long pkMember, List<String> waresCodeList, Date payTime, List<Integer> orderTypeList, Integer systemType) {
 | 
			
		||||
    public BigDecimal getRetailWaresQuantityNew(Long pkMember, List<String> waresCodeList, Date payTime, List<Integer> orderTypeList, Integer systemType) {
 | 
			
		||||
        return baseMapper.getRetailWaresQuantityNew(pkMember, waresCodeList, payTime, orderTypeList, systemType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2132,18 +2132,18 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
 | 
			
		|||
            gradeList = iGradeServiceApi.getRetailGradeList().getData();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 盒数产品
 | 
			
		||||
        // 盒数商品
 | 
			
		||||
        List<String> boxWaresList = BoxProductUtil.getBoxProductListBySystemType(systemType);
 | 
			
		||||
 | 
			
		||||
        // 当前产品盒数
 | 
			
		||||
        int boxNum = 0;
 | 
			
		||||
        BigDecimal boxNum = BigDecimal.ZERO;
 | 
			
		||||
        // 处理商品盒数
 | 
			
		||||
        this.handleWaresBoxNum(specialArea, orderItemsParams);
 | 
			
		||||
        // 判断订单明细中指定产品数量,校验等级
 | 
			
		||||
        for (OrderItemsParam orderItemsParam : orderItemsParams) {
 | 
			
		||||
            if (boxWaresList.contains(orderItemsParam.getWaresCode())) {
 | 
			
		||||
                // 存在指定商品,需要累计盒数
 | 
			
		||||
                boxNum += orderItemsParam.getBoxNum() * orderItemsParam.getQuantity();
 | 
			
		||||
                boxNum = boxNum.add(orderItemsParam.getBoxNum().multiply(new BigDecimal(orderItemsParam.getQuantity())));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2154,7 +2154,8 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
 | 
			
		|||
            bdGrade = this.getGradeByBox(boxNum, gradeList, null, true);
 | 
			
		||||
        } else if (ESpecialArea.RETAIL_UPGRADE.getValue() == specialArea) {
 | 
			
		||||
            // 升级专区,一次性补差升级
 | 
			
		||||
            if (boxNum == 0) {
 | 
			
		||||
            // 2025.08.20 升级方式改为累计升级制
 | 
			
		||||
            if (boxNum.compareTo(BigDecimal.ZERO) == 0) {
 | 
			
		||||
                // 不满足升级条件
 | 
			
		||||
                throw new ServiceException("不满足升级条件");
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -2167,9 +2168,14 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
 | 
			
		|||
            }
 | 
			
		||||
 | 
			
		||||
            // 获取升级盒数基数
 | 
			
		||||
            int baseBoxNum = this.handleBaseBoxNum(updateGradeMember, memberGrade, gradeList, boxWaresList, systemType);
 | 
			
		||||
            BigDecimal baseBoxNum = this.handleBaseBoxNum(updateGradeMember, memberGrade, gradeList, boxWaresList, systemType);
 | 
			
		||||
            // 计算等级
 | 
			
		||||
            bdGrade = this.getGradeByBox(boxNum + baseBoxNum, gradeList, memberGrade, true);
 | 
			
		||||
            bdGrade = this.getGradeByBox(boxNum.add(baseBoxNum), gradeList, memberGrade, true);
 | 
			
		||||
 | 
			
		||||
            // 2025.08.20 升级方式改为累计升级制
 | 
			
		||||
            if (memberGrade.getGradeValue().equals(bdGrade.getGradeValue())) {
 | 
			
		||||
                return bdGrade;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 会员等级 大于等于 购买盒数等级,则不充足升级条件
 | 
			
		||||
            if (memberGrade.getGradeValue().compareTo(bdGrade.getGradeValue()) >= 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2180,18 +2186,18 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public BdGrade getGradeByBox(final Integer boxTotal, List<BdGrade> gradeList, BdGrade memberGrade, boolean checkUpgrade) {
 | 
			
		||||
    public BdGrade getGradeByBox(final BigDecimal boxTotal, List<BdGrade> gradeList, BdGrade memberGrade, boolean checkUpgrade) {
 | 
			
		||||
        if (CollectionUtil.isEmpty(gradeList)) {
 | 
			
		||||
            gradeList = iGradeServiceApi.getRetailGradeList().getData();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (null == memberGrade) {
 | 
			
		||||
            // 注册处理
 | 
			
		||||
            // 小于总公司等级 并且 排除高级店主 并且 升级盒数小于购买盒数的最大一个等级为注册等级
 | 
			
		||||
            // 小于总公司等级 并且 排除高级店主、董事代理 并且 升级盒数小于购买盒数的最大一个等级为注册等级
 | 
			
		||||
            return gradeList.stream()
 | 
			
		||||
                    .filter(tmpGrade -> tmpGrade.getGradeValue() != EGrade.S_VIP.getValue()
 | 
			
		||||
                    .filter(tmpGrade -> tmpGrade.getGradeValue() != EGrade.S_VIP.getValue() && tmpGrade.getGradeValue() != EGrade.DIRECTOR.getValue()
 | 
			
		||||
                            && tmpGrade.getGradeValue() < EGrade.COMPANY.getValue()
 | 
			
		||||
                            && tmpGrade.getBoxNumber() <= boxTotal)
 | 
			
		||||
                            && tmpGrade.getBoxNumber().compareTo(boxTotal) <= 0)
 | 
			
		||||
                    .max(Comparator.comparingInt(BdGrade::getGradeValue)).get();
 | 
			
		||||
        } else {
 | 
			
		||||
            // 非注册处理
 | 
			
		||||
| 
						 | 
				
			
			@ -2213,8 +2219,8 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
 | 
			
		|||
            Optional<BdGrade> gradeOptional = gradeList.stream()
 | 
			
		||||
                    .filter(tmpGrade -> tmpGrade.getGradeValue() != EGrade.S_VIP.getValue() && tmpGrade.getGradeValue() > memberGrade.getGradeValue())
 | 
			
		||||
                    .sorted(Comparator.comparingInt(BdGrade::getGradeValue).reversed())
 | 
			
		||||
                    .filter(tmpGrade -> tmpGrade.getBoxNumber() != 0)
 | 
			
		||||
                    .filter(tmpGrade -> tmpGrade.getBoxNumber() <= boxTotal).findFirst();
 | 
			
		||||
                    .filter(tmpGrade -> tmpGrade.getBoxNumber().compareTo(BigDecimal.ZERO) > 0)
 | 
			
		||||
                    .filter(tmpGrade -> tmpGrade.getBoxNumber().compareTo(boxTotal) <= 0).findFirst();
 | 
			
		||||
            return gradeOptional.orElse(memberGrade);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -2231,11 +2237,10 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
 | 
			
		|||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public int handleBaseBoxNum(CuMember cuMember, BdGrade memberGrade,
 | 
			
		||||
                                List<BdGrade> gradeList, List<String> boxWaresList,
 | 
			
		||||
    public BigDecimal handleBaseBoxNum(CuMember cuMember, BdGrade memberGrade, List<BdGrade> gradeList, List<String> boxWaresList,
 | 
			
		||||
                                Integer systemType) {
 | 
			
		||||
        // 升级盒数基数
 | 
			
		||||
        int baseBoxNum = 0;
 | 
			
		||||
        BigDecimal baseBoxNum = BigDecimal.ZERO;
 | 
			
		||||
        // 会员所有升级记录
 | 
			
		||||
        List<CuMemberLevel> memberLevelList = iCuMemberDetailServiceApi.getUpgradeList(cuMember.getPkId()).getData();
 | 
			
		||||
        if (CollectionUtil.isNotEmpty(memberLevelList)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2245,11 +2250,18 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
 | 
			
		|||
                CuMemberLevel lastMemberLevel = lastManualOptional.get();
 | 
			
		||||
                BdGrade lastUpdateGrade = gradeList.stream().filter(tmpGrade -> tmpGrade.getPkId().equals(lastMemberLevel.getNewLevel())).findFirst().get();
 | 
			
		||||
                // 盒数基数 = 手动升级盒数 + 手动升级之后的升级订单盒数
 | 
			
		||||
                baseBoxNum = lastUpdateGrade.getBoxNumber()
 | 
			
		||||
                        + iSaOrderItemsService.getRetailWaresQuantityNew(cuMember.getPkId(), boxWaresList, lastMemberLevel.getUpgradeTime(), Collections.singletonList(EOrderType.RETAIL_UPGRADE.getValue()), systemType);
 | 
			
		||||
                BigDecimal oldBoxNum = iSaOrderItemsService.getRetailWaresQuantityNew(cuMember.getPkId(), boxWaresList, lastMemberLevel.getUpgradeTime(), Collections.singletonList(EOrderType.RETAIL_UPGRADE.getValue()), systemType);
 | 
			
		||||
                if (null != oldBoxNum) {
 | 
			
		||||
                    baseBoxNum = lastUpdateGrade.getBoxNumber().add(oldBoxNum);
 | 
			
		||||
                } else {
 | 
			
		||||
                    baseBoxNum = lastUpdateGrade.getBoxNumber();
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                // 没有手动升级记录
 | 
			
		||||
                baseBoxNum = iSaOrderItemsService.getRetailWaresQuantityNew(cuMember.getPkId(), boxWaresList, null, Arrays.asList(EOrderType.RETAIL_REGISTER.getValue(), EOrderType.RETAIL_UPGRADE.getValue()), systemType);
 | 
			
		||||
                BigDecimal oldBoxNum = iSaOrderItemsService.getRetailWaresQuantityNew(cuMember.getPkId(), boxWaresList, null, Arrays.asList(EOrderType.RETAIL_REGISTER.getValue(), EOrderType.RETAIL_UPGRADE.getValue()), systemType);
 | 
			
		||||
                if (null != oldBoxNum) {
 | 
			
		||||
                    baseBoxNum = oldBoxNum;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return baseBoxNum;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -517,8 +517,7 @@ public class BdWaresController extends BaseController {
 | 
			
		|||
        waresParams.setPkSpecialCurrency(waresExtend.getPkSpecialCurrency());
 | 
			
		||||
        waresParams.setSortStatus(wares.getSortStatus());
 | 
			
		||||
        waresParams.setSystemType(waresExtend.getSystemType());
 | 
			
		||||
        waresParams.
 | 
			
		||||
                setAreaIncome(wares.getAreaIncome());
 | 
			
		||||
        waresParams.setAreaIncome(wares.getAreaIncome());
 | 
			
		||||
        waresParams.setBoxNum(wares.getBoxNum());
 | 
			
		||||
 | 
			
		||||
        BdAreaClassify parentAreaClassify = areaClassifyService.getAreaClassify(wares.getPkAreaClassify());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -412,6 +412,6 @@ public class WaresParams implements Serializable {
 | 
			
		|||
    /**
 | 
			
		||||
     * 商品上传盒数
 | 
			
		||||
     */
 | 
			
		||||
    private Integer boxNum;
 | 
			
		||||
    private BigDecimal boxNum;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1160,15 +1160,9 @@
 | 
			
		|||
    </select>
 | 
			
		||||
 | 
			
		||||
    <!-- 查询新零售购买指定商品数量(新) -->
 | 
			
		||||
    <select id="getRetailWaresQuantityNew" resultType="int">
 | 
			
		||||
        select nvl(sum(soi.wares_quantity * bw.box_num), 0) wares_quantity
 | 
			
		||||
    <select id="getRetailWaresQuantityNew" resultType="decimal">
 | 
			
		||||
        select sum(so.box_num) wares_quantity
 | 
			
		||||
        from sa_order so
 | 
			
		||||
        left join sa_order_items soi
 | 
			
		||||
        on soi.pk_order = so.pk_id
 | 
			
		||||
        and soi.del_flag = 0
 | 
			
		||||
        and soi.is_gift = 1
 | 
			
		||||
        left join bd_wares bw
 | 
			
		||||
        on bw.pk_id = soi.pk_wares
 | 
			
		||||
        where so.del_flag = 0
 | 
			
		||||
        and so.order_status = 1
 | 
			
		||||
        and so.pk_member = #{pkMember}
 | 
			
		||||
| 
						 | 
				
			
			@ -1179,10 +1173,6 @@
 | 
			
		|||
        <foreach collection="orderTypeList" item="item" open="(" close=")" separator=",">
 | 
			
		||||
            #{item}
 | 
			
		||||
        </foreach>
 | 
			
		||||
        and bw.wares_code in
 | 
			
		||||
        <foreach collection="waresCodeList" item="items" open="(" close=")" separator=",">
 | 
			
		||||
            #{items}
 | 
			
		||||
        </foreach>
 | 
			
		||||
        <if test="payTime != null">
 | 
			
		||||
            and so.pay_time > #{payTime}
 | 
			
		||||
        </if>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ import lombok.Getter;
 | 
			
		|||
public enum EUpgradeType {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 1=自动升级 -- 目前只高级店主升级为自动升级
 | 
			
		||||
     * 1=自动升级 -- 高级店主升级为自动升级、董事代理为自动升级
 | 
			
		||||
     */
 | 
			
		||||
    AUTO_UPGRADE(1, "自动升级", 0, EnumsPrefixConstants.UPGRADE_TYPE + 1),
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,17 +117,17 @@ public class CuMemberRetailRange extends BaseEntity {
 | 
			
		|||
     * 本人当天新消费盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("NEW_BOX_NUM")
 | 
			
		||||
    private Integer newBoxNum;
 | 
			
		||||
    private BigDecimal newBoxNum;
 | 
			
		||||
    /**
 | 
			
		||||
     * 本人累计消费盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("CONSUME_BOX_NUM")
 | 
			
		||||
    private Integer consumeBoxNum;
 | 
			
		||||
    private BigDecimal consumeBoxNum;
 | 
			
		||||
    /**
 | 
			
		||||
     * 本人月累计盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("MONTH_BOX_NUM")
 | 
			
		||||
    private Integer monthBoxNum;
 | 
			
		||||
    private BigDecimal monthBoxNum;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 本人当天新消费pv
 | 
			
		||||
| 
						 | 
				
			
			@ -159,17 +159,17 @@ public class CuMemberRetailRange extends BaseEntity {
 | 
			
		|||
     * 团队当天新增盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("TEAM_NEW_BOX_NUM")
 | 
			
		||||
    private Integer teamNewBoxNum;
 | 
			
		||||
    private BigDecimal teamNewBoxNum;
 | 
			
		||||
    /**
 | 
			
		||||
     * 团队累计盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("TEAM_BOX_NUM")
 | 
			
		||||
    private Integer teamBoxNum;
 | 
			
		||||
    private BigDecimal teamBoxNum;
 | 
			
		||||
    /**
 | 
			
		||||
     * 团队月累计盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("TEAM_MONTH_BOX_NUM")
 | 
			
		||||
    private Integer teamMonthBoxNum;
 | 
			
		||||
    private BigDecimal teamMonthBoxNum;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 团队当天新增消费pv
 | 
			
		||||
| 
						 | 
				
			
			@ -238,13 +238,13 @@ public class CuMemberRetailRange extends BaseEntity {
 | 
			
		|||
     * 大区注水盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("big_box_num")
 | 
			
		||||
    private Integer bigBoxNum;
 | 
			
		||||
    private BigDecimal bigBoxNum;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 小区注水盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("small_box_num")
 | 
			
		||||
    private Integer smallBoxNum;
 | 
			
		||||
    private BigDecimal smallBoxNum;
 | 
			
		||||
 | 
			
		||||
    @TableField("big_team_pv")
 | 
			
		||||
    private BigDecimal bigTeamPv;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,6 +141,6 @@ public class BdWaresDetailExt extends BdWaresDetail {
 | 
			
		|||
    /**
 | 
			
		||||
     * 商品上传盒数
 | 
			
		||||
     */
 | 
			
		||||
    private Integer boxNum;
 | 
			
		||||
    private BigDecimal boxNum;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -224,6 +224,6 @@ public class SaOrder extends BaseEntity {
 | 
			
		|||
     * 指定商品盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("BOX_NUM")
 | 
			
		||||
    private Integer boxNum;
 | 
			
		||||
    private BigDecimal boxNum;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -226,6 +226,6 @@ public class BdWares extends BaseEntity {
 | 
			
		|||
     * 商品上传盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("BOX_NUM")
 | 
			
		||||
    private Integer boxNum;
 | 
			
		||||
    private BigDecimal boxNum;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -161,19 +161,19 @@ public class BdGrade extends BaseEntity {
 | 
			
		|||
     * 购买盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("BOX_NUMBER")
 | 
			
		||||
    private Integer boxNumber;
 | 
			
		||||
    private BigDecimal boxNumber;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 累计盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("BOX_TOTAL")
 | 
			
		||||
    private Integer boxTotal;
 | 
			
		||||
    private BigDecimal boxTotal;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 小市场盒数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField("BOX_SMALL_TOTAL")
 | 
			
		||||
    private Integer boxSmallTotal;
 | 
			
		||||
    private BigDecimal boxSmallTotal;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 购买价格
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue