|  | @@ -18,7 +18,6 @@ import cn.newfeifan.mall.module.distri.dal.mysql.integral.IntegralMapper;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.dal.mysql.orderpercentage.OrderPercentageMapper;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 | 
	
		
			
				|  |  | -import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.member.api.address.MemberAddressApi;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.member.api.address.dto.MemberAddressRespDTO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.pay.api.order.PayOrderApi;
 | 
	
	
		
			
				|  | @@ -391,14 +390,19 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          return tradePriceService.calculatePrice(calculateReqBO);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    //把数据库的钱转换为数据库的积分
 | 
	
		
			
				|  |  | +    public static BigDecimal money2Integral(BigDecimal money){
 | 
	
		
			
				|  |  | +        return money.multiply(DistriConstants.MONEY2INTEGRAL_BIG_DECIMAL);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      //把数据库的钱转换为数据库的积分
 | 
	
		
			
				|  |  |      public static Integer money2Integral(Integer money){
 | 
	
		
			
				|  |  | -        return money*DistriConstants.INTEGRAL2MONEY;
 | 
	
		
			
				|  |  | +        return money*DistriConstants.MONEY2INTEGRAL;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      //把数据库的积分转换为数据库的钱
 | 
	
		
			
				|  |  |      public static Integer integral2Money(Integer integral){
 | 
	
		
			
				|  |  | -        return integral/DistriConstants.INTEGRAL2MONEY;
 | 
	
		
			
				|  |  | +        return integral/DistriConstants.MONEY2INTEGRAL;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
	
		
			
				|  | @@ -590,14 +594,23 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |              tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //如果订单有使用积分,则抵扣用户的积分 add by Ben
 | 
	
		
			
				|  |  | +        //如果订单有使用积分,则抵扣用户的积分。add by Ben
 | 
	
		
			
				|  |  |          if(payPoints>0){
 | 
	
		
			
				|  |  | +            for(Map<String,Object> m:orderMapList) {
 | 
	
		
			
				|  |  | +                TradeOrderDO order = (TradeOrderDO) (m.get("order"));
 | 
	
		
			
				|  |  | +                Long tradeOrderId = order.getId();
 | 
	
		
			
				|  |  | +                String OrderNum =order.getNo();
 | 
	
		
			
				|  |  | +                Integer payIntegral = order.getPayIntegral();//每个订单使用的积分
 | 
	
		
			
				|  |  | +                integralService.updateUserIntegral(userId, CaclEnum.ORDER_PAY_INTEGRAL, payIntegral * (-1), 0, tradeOrderId, OrderNum);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            //下面这部分,应该是写到订单支付成功的地方的,写在下面这里,只是为了方便测试
 | 
	
		
			
				|  |  | +        boolean caculateFreezeAmount = false;//增加冻结积分
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //增加冻结积分这分部分,是订单微信支付成功后,才执行的,下面的代码只是为了测试方便写在这,实际永远不会执行。add by Ben
 | 
	
		
			
				|  |  | +        if(caculateFreezeAmount){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            //查询订单提成比例
 | 
	
		
			
				|  |  | -            QueryWrapper<OrderPercentageDO> queryWrapper = new QueryWrapper<>();
 | 
	
		
			
				|  |  | -            OrderPercentageDO orderPercentageDO = orderPercentageMapper.selectOne(queryWrapper);//表中只有一条记录
 | 
	
		
			
				|  |  | +            //下面这部分,应该是写到订单支付成功的地方的,写在下面这里,只是为了方便测试
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              for(Map<String,Object> m:orderMapList){
 | 
	
		
			
				|  |  |                  TradeOrderDO order = (TradeOrderDO)(m.get("order"));
 | 
	
	
		
			
				|  | @@ -624,18 +637,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |                              *tradeOrderItemDO.getCount();
 | 
	
		
			
				|  |  |                      totalPromotionExpenses+=promotionExpenses;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                //转为BigDecimal
 | 
	
		
			
				|  |  | -                BigDecimal profit = new BigDecimal(String.valueOf(totalPromotionExpenses));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                // 计算毛利: 利润 * 0.38
 | 
	
		
			
				|  |  | -                BigDecimal grossProfit = profit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitPerc())).setScale(4, RoundingMode.DOWN);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                // 计算直推人额度: 毛利 * 0.35
 | 
	
		
			
				|  |  | -                BigDecimal descendantQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitAncestorQuotaPerc())).setScale(4, RoundingMode.DOWN);
 | 
	
		
			
				|  |  | -                Integer descendantQuotaInt = descendantQuota.intValue();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                //把钱转为:增加的冻结积分
 | 
	
		
			
				|  |  | -                Integer freezeAmount = money2Integral(descendantQuotaInt);
 | 
	
		
			
				|  |  | +                //把商品的推广费总额,转换为直推人获得的冻结积分
 | 
	
		
			
				|  |  | +                Integer freezeAmount = promotionExpenses2GrossProfitAncestorQuota(orderPercentageMapper,totalPromotionExpenses);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  Long tradeOrderId = order.getId();
 | 
	
		
			
				|  |  |                  String OrderNum =order.getNo();
 | 
	
	
		
			
				|  | @@ -647,6 +651,37 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          return virtualOrder;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 把商品的推广费总额,转换为直推人获得的冻结积分
 | 
	
		
			
				|  |  | +     * @param totalPromotionExpenses 商品的推广费总额
 | 
	
		
			
				|  |  | +     * @return 输入推广费,对应的直推人获得的冻结积分
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public static Integer promotionExpenses2GrossProfitAncestorQuota(
 | 
	
		
			
				|  |  | +            OrderPercentageMapper orderPercentageMapper,
 | 
	
		
			
				|  |  | +            Integer totalPromotionExpenses){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //查询订单提成比例
 | 
	
		
			
				|  |  | +        QueryWrapper<OrderPercentageDO> queryWrapper = new QueryWrapper<>();
 | 
	
		
			
				|  |  | +        OrderPercentageDO orderPercentageDO = orderPercentageMapper.selectOne(queryWrapper);//表中只有一条记录
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //转为BigDecimal
 | 
	
		
			
				|  |  | +        BigDecimal profit = new BigDecimal(String.valueOf(totalPromotionExpenses));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 计算毛利: 利润 * 0.38
 | 
	
		
			
				|  |  | +        BigDecimal grossProfit = profit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitPerc())).setScale(4, RoundingMode.DOWN);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 计算直推人额度: 毛利 * 0.35
 | 
	
		
			
				|  |  | +        BigDecimal descendantQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitAncestorQuotaPerc())).setScale(4, RoundingMode.DOWN);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //把钱转为:增加的冻结积分
 | 
	
		
			
				|  |  | +        BigDecimal freezeAmount_bigDecimal = money2Integral(descendantQuota);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Integer freezeAmount = freezeAmount_bigDecimal.intValue();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return freezeAmount;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private TradeOrderDO buildTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO,
 | 
	
		
			
				|  |  |                                           TradePriceCalculateRespBO calculateRespBO) {
 | 
	
		
			
				|  |  |          TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, createReqVO, calculateRespBO);
 | 
	
	
		
			
				|  | @@ -804,7 +839,41 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |              TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus());
 | 
	
		
			
				|  |  |              TradeOrderLogUtils.setUserInfo(order.getUserId(), UserTypeEnum.MEMBER.getValue());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 5. 增加用户冻结积分 20240420
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            List<Long> skuList = new ArrayList<>();
 | 
	
		
			
				|  |  | +            //汇总各订单项利润
 | 
	
		
			
				|  |  | +            List<TradeOrderItemDO> TradeOrderItemList = tradeOrderItemMapper.selectList("order_id", order.getId());
 | 
	
		
			
				|  |  | +            for (TradeOrderItemDO tradeOrderItemDO : TradeOrderItemList) {
 | 
	
		
			
				|  |  | +                Long skuId = tradeOrderItemDO.getSkuId();
 | 
	
		
			
				|  |  | +                skuList.add(skuId);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            List<ProductSkuDO> productSkuDOS = productSkuMapper.selectBatchIds(skuList);
 | 
	
		
			
				|  |  | +            Map<Long,ProductSkuDO> skuDOMap = new HashMap<Long,ProductSkuDO>();
 | 
	
		
			
				|  |  | +            for (ProductSkuDO productSkuDO : productSkuDOS) {
 | 
	
		
			
				|  |  | +                skuDOMap.put(productSkuDO.getId(),productSkuDO);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Integer totalPromotionExpenses = 0;//总推广费,单位为分
 | 
	
		
			
				|  |  | +            for (TradeOrderItemDO tradeOrderItemDO : TradeOrderItemList) {
 | 
	
		
			
				|  |  | +                ProductSkuDO productSkuDO = skuDOMap.get(tradeOrderItemDO.getSkuId());
 | 
	
		
			
				|  |  | +                //这类商品的总推广费
 | 
	
		
			
				|  |  | +                Integer promotionExpenses = (productSkuDO.getPrice()-productSkuDO.getCostPrice())
 | 
	
		
			
				|  |  | +                        *tradeOrderItemDO.getCount();
 | 
	
		
			
				|  |  | +                totalPromotionExpenses+=promotionExpenses;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //把商品的推广费总额,转换为直推人获得的冻结积分
 | 
	
		
			
				|  |  | +            Integer freezeAmount = promotionExpenses2GrossProfitAncestorQuota(orderPercentageMapper,totalPromotionExpenses);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            String OrderNum =order.getNo();
 | 
	
		
			
				|  |  | +            integralService.updateUserIntegral(tradeOrderDO.getUserId(), CaclEnum.ORDER_GET_FREEZE_INTEGRAL, 0,freezeAmount,tradeOrderId,OrderNum);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 |