|  | @@ -13,10 +13,11 @@ import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.framework.common.util.number.MoneyUtils;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.constant.DistriConstants;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
 | 
	
		
			
				|  |  |  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;
 | 
	
	
		
			
				|  | @@ -62,6 +63,7 @@ import cn.newfeifan.mall.module.trade.service.price.TradePriceService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateReqBO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
	
		
			
				|  |  |  import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  |  import org.jetbrains.annotations.NotNull;
 | 
	
		
			
				|  |  |  import org.springframework.beans.BeanUtils;
 | 
	
	
		
			
				|  | @@ -69,6 +71,8 @@ import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import javax.annotation.Resource;
 | 
	
		
			
				|  |  | +import java.math.BigDecimal;
 | 
	
		
			
				|  |  | +import java.math.RoundingMode;
 | 
	
		
			
				|  |  |  import java.time.LocalDateTime;
 | 
	
		
			
				|  |  |  import java.util.*;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -138,6 +142,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private IntegralService integralService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Resource
 | 
	
		
			
				|  |  | +    private OrderPercentageMapper orderPercentageMapper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // =================== Order ===================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -383,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
 | 
	
	
		
			
				|  | @@ -582,15 +594,53 @@ 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){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              //下面这部分,应该是写到订单支付成功的地方的,写在下面这里,只是为了方便测试
 | 
	
		
			
				|  |  | -            Integer freezeAmount =2;//测试方便,临时写死,等汉鹏的方法
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              for(Map<String,Object> m:orderMapList){
 | 
	
		
			
				|  |  |                  TradeOrderDO order = (TradeOrderDO)(m.get("order"));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +                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);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  Long tradeOrderId = order.getId();
 | 
	
		
			
				|  |  |                  String OrderNum =order.getNo();
 | 
	
		
			
				|  |  |                  integralService.updateUserIntegral(userId, CaclEnum.ORDER_PAY_INTEGRAL, payPoints*(-1),freezeAmount,tradeOrderId,OrderNum);
 | 
	
	
		
			
				|  | @@ -601,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);
 | 
	
	
		
			
				|  | @@ -758,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);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 |