|  | @@ -11,6 +11,7 @@ import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPerce
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.enums.SocialStatusEnum;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.mq.message.order.DistriOrderMessage;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.mq.message.order.OrderCalcMessage;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.mq.message.order.OrderItemMessage;
 | 
	
	
		
			
				|  | @@ -19,7 +20,6 @@ import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.service.partitioncrash.PartitionCrashService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
 | 
	
		
			
				|  |  | -import cn.newfeifan.mall.module.distri.service.ptprofitdailystatisticslog.PtProfitDailyStatisticsLogService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.distri.service.sharepath.SharePathService;
 | 
	
		
			
				|  |  |  import org.springframework.context.annotation.Lazy;
 | 
	
	
		
			
				|  | @@ -83,9 +83,6 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private PartitionCrashService partitionCrashService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Resource
 | 
	
		
			
				|  |  | -    private PtProfitDailyStatisticsLogService ptProfitDailyStatisticsLogService;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public Long createOrderCalc(OrderCalcSaveReqVO createReqVO) {
 | 
	
		
			
				|  |  |          // 插入
 | 
	
	
		
			
				|  | @@ -146,7 +143,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |              String percentTemplate = JsonUtils.toJsonString(orderPercentageDO);
 | 
	
		
			
				|  |  |              calc(tradeOrderDO, orderPercentageDO, percentTemplate);
 | 
	
		
			
				|  |  |          } catch (Exception e) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +            System.out.println(e.getMessage());
 | 
	
		
			
				|  |  |          } finally {
 | 
	
		
			
				|  |  |              // todo 计算当天用户的碰撞
 | 
	
		
			
				|  |  |              // 计算兄弟分区, 以及后代分区
 | 
	
	
		
			
				|  | @@ -161,6 +158,11 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |                  .in(OrderCalcDO::getUserId, userList));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void updateOrderItem(Long orderItemId) {
 | 
	
		
			
				|  |  | +        orderCalcMapper.updateOrderItemById(orderItemId);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private void calc(List<OrderCalcMessage> tradeOrderDO, OrderPercentageDO orderPercentageDO, String percentTemplate) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          List<PtProfitSaveReqVO> savePFitMap = new ArrayList<>();
 | 
	
	
		
			
				|  | @@ -198,13 +200,16 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // 计算
 | 
	
		
			
				|  |  |              // 计算利润: (价格 - 成本价格) * 产品数量
 | 
	
		
			
				|  |  | -            final BigDecimal[] profit = {new BigDecimal("0")};
 | 
	
		
			
				|  |  | +            final BigDecimal[] profit = {new BigDecimal("0"), new BigDecimal("0")};      //用户自得不用要计算,从orderItem里面获取
 | 
	
		
			
				|  |  |              k.getOrderItemMessages().forEach(j -> {
 | 
	
		
			
				|  |  |                  BigDecimal onePrice = new BigDecimal(j.getPrice());
 | 
	
		
			
				|  |  |                  BigDecimal oneCostPrice = new BigDecimal(j.getCostPrice());
 | 
	
		
			
				|  |  |                  BigDecimal productCount = new BigDecimal(j.getCount());
 | 
	
		
			
				|  |  |                  BigDecimal oneGrossProfit = onePrice.subtract(oneCostPrice).multiply(productCount);
 | 
	
		
			
				|  |  |                  profit[0] = profit[0].add(oneGrossProfit);  // 注意这里的改动
 | 
	
		
			
				|  |  | +                profit[1] = profit[1].add(new BigDecimal(j.getIncreaseIntegral()));     //自得积分
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                updateOrderItem(j.getOrderItemId());
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -219,7 +224,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // 用户所得: 毛利 * 0.35
 | 
	
		
			
				|  |  | -            BigDecimal descendantQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitUserQuotaPerc())).setScale(4, RoundingMode.DOWN);
 | 
	
		
			
				|  |  | +            BigDecimal descendantQuota = profit[1];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // 直推奖: 毛利 * 0.35 (上一级)
 | 
	
		
			
				|  |  |              BigDecimal ancestorQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitAncestorQuotaPerc())).setScale(4, RoundingMode.DOWN);
 | 
	
	
		
			
				|  | @@ -237,7 +242,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |              // 乘以 10000 并转换为整数
 | 
	
		
			
				|  |  |              Long grossProfitInt = grossProfit.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
 | 
	
		
			
				|  |  |              Long ancestorQuotaInt = ancestorQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
 | 
	
		
			
				|  |  | -            Long descendantQuotaInt = descendantQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
 | 
	
		
			
				|  |  | +            Long descendantQuotaInt = descendantQuota.longValue();
 | 
	
		
			
				|  |  |              Long bonusQuotaInt = bonusQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
 | 
	
		
			
				|  |  |              Long highQuotaInt = highQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
 | 
	
		
			
				|  |  |              Long grossProfitAfterBonusInt = grossProfitAfterBonus.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
 | 
	
	
		
			
				|  | @@ -250,6 +255,20 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |              IntegralDO integralDOAncestor = integralService.selectByUser(sharePath.getAncestor());
 | 
	
		
			
				|  |  |              IntegralDO integralDO = integralService.selectByUser(sharePath.getDescendant());
 | 
	
		
			
				|  |  |              IntegralDO ptIntegral = integralService.selectByUser(1L);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // ========== 身价计算 ==============
 | 
	
		
			
				|  |  | +            //推荐人身价计算
 | 
	
		
			
				|  |  | +            double orderAncestorSocialStatus = Double.parseDouble(orderPercentageDO.getOrderAncestorSocialStatus());
 | 
	
		
			
				|  |  | +            double ancestorSocial = k.getOrderItemMessages().get(0).getTotalPrice() * orderAncestorSocialStatus;
 | 
	
		
			
				|  |  | +            duserService.updateDuserSocial(integralDOAncestor.getUserId(), (long) ancestorSocial, SocialStatusEnum.SHOPPING_ANCESTOR_SOCIAL.getStatus());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //自得身价计算
 | 
	
		
			
				|  |  | +            double orderUserSocialStatus = Double.parseDouble(orderPercentageDO.getOrderUserSocialStatus());
 | 
	
		
			
				|  |  | +            double descendantSocial = k.getOrderItemMessages().get(0).getTotalPrice() * orderUserSocialStatus;
 | 
	
		
			
				|  |  | +            duserService.updateDuserSocial(integralDO.getUserId(), (long) descendantSocial, SocialStatusEnum.SHOPPING_SOCIAL.getStatus());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              // ========== 汇总计算 =================
 | 
	
		
			
				|  |  |              OrderCalcSaveReqVO orderCalcSaveReqVO = OrderCalcSaveReqVO.builder()
 | 
	
		
			
				|  |  |                      .userId(k.getUserId())
 | 
	
	
		
			
				|  | @@ -267,7 +286,15 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |                      .percentTemplate(percentTemplate).build();
 | 
	
		
			
				|  |  |              saveList.add(orderCalcSaveReqVO);
 | 
	
		
			
				|  |  |              // ========== 修改用户钱包 =================
 | 
	
		
			
				|  |  | -            changeUserWallet(integralSaveReqVOS, integralDO, integralDOAncestor, ptIntegral, ancestorQuotaInt, descendantQuotaInt, highQuotaInt, grossProfitAfterBonusInt, platformQuotaInt);
 | 
	
		
			
				|  |  | +            //直推奖也要限制额度
 | 
	
		
			
				|  |  | +            Long ancestorHighQuota = integralDOAncestor.getHighQuota() + new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue();//加上基础的最大额度值
 | 
	
		
			
				|  |  | +            if (ancestorHighQuota < ancestorQuotaInt) {
 | 
	
		
			
				|  |  | +                changeUserWallet(integralSaveReqVOS, integralDO, integralDOAncestor, ptIntegral, 0L,
 | 
	
		
			
				|  |  | +                        descendantQuotaInt, highQuotaInt, grossProfitAfterBonusInt, platformQuotaInt);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                changeUserWallet(integralSaveReqVOS, integralDO, integralDOAncestor, ptIntegral, ancestorQuotaInt,
 | 
	
		
			
				|  |  | +                        descendantQuotaInt, highQuotaInt, grossProfitAfterBonusInt, platformQuotaInt);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              // ========== 修改平台信息 =================
 | 
	
		
			
				|  |  |              // 每个订单计算的过程
 | 
	
		
			
				|  |  |              // 增加平台收益
 | 
	
	
		
			
				|  | @@ -277,6 +304,11 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |                              .ptAdd(platformQuotaInt)
 | 
	
		
			
				|  |  |                              .ptGrossAdd(grossProfitAfterBonusInt)
 | 
	
		
			
				|  |  |                              .ptTotalAdd(platformQuotaInt + grossProfitAfterBonusInt).build();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 当直推人获取的积分额度不足时,平台收益要加回来,并生成log
 | 
	
		
			
				|  |  | +            calcIntegral(ptProfitSaveReqVOS, ptProfitSaveReqVO, ancestorHighQuota, ancestorQuotaInt,
 | 
	
		
			
				|  |  | +                    k.getOrderId(), k.getNo(), integralDOAncestor.getUserId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              ptProfitSaveReqVOS.add(ptProfitSaveReqVO);
 | 
	
		
			
				|  |  |              // ========== 增加日志记录 =================
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -303,6 +335,9 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // 直推人记录
 | 
	
		
			
				|  |  |              PtProfitLogSaveReqVO ztrLog = PtProfitLogSaveReqVO.builder().orderId(k.getOrderId()).profitStatus(CaclEnum.DIRECT_REFERRAL_QUOTA.getType()).orderNo(k.getNo()).userId(sharePath.getDescendant()).amount(descendantQuotaInt).afterAmount(integralDO.getCurrentQuota() + descendantQuotaInt).percentTemplate(percentTemplate).build();
 | 
	
		
			
				|  |  | +            // 直推人冻结积分转化成可用记录
 | 
	
		
			
				|  |  | +            PtProfitLogSaveReqVO freezeLog = PtProfitLogSaveReqVO.builder().orderId(k.getOrderId()).profitStatus(CaclEnum.FREEZE_CHANGE_INTEGRAL.getType()).orderNo(k.getNo()).userId(sharePath.getDescendant()).freezeAmount(descendantQuotaInt).afterFreezeAmount(integralDO.getCurrentQuota() - descendantQuotaInt).percentTemplate(percentTemplate).build();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              PtProfitLogSaveReqVO highQuotaLog = PtProfitLogSaveReqVO.builder().orderId(k.getOrderId()).profitStatus(CaclEnum.HIGH_QUOTA.getType()).orderNo(k.getNo()).userId(sharePath.getDescendant()).amount(highQuotaInt).afterAmount(integralDO.getHighQuota() + highQuotaInt).percentTemplate(percentTemplate).build();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // 合赢奖记录
 | 
	
	
		
			
				|  | @@ -314,6 +349,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |              ptProfitLogSaveReqVOS.add(ptAddLog);
 | 
	
		
			
				|  |  |              ptProfitLogSaveReqVOS.add(tjrLog);
 | 
	
		
			
				|  |  |              ptProfitLogSaveReqVOS.add(ztrLog);
 | 
	
		
			
				|  |  | +            ptProfitLogSaveReqVOS.add(freezeLog);
 | 
	
		
			
				|  |  |              ptProfitLogSaveReqVOS.add(hyjLog);
 | 
	
		
			
				|  |  |              ptProfitLogSaveReqVOS.add(highQuotaLog);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -346,6 +382,24 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private void calcIntegral(List<PtProfitSaveReqVO> ptProfitSaveReqVOS, PtProfitSaveReqVO ptProfitSaveReqVO,
 | 
	
		
			
				|  |  | +                              Long highQuotaInt, Long ancestorQuotaInt, Long orderId, String orderNo, Long userId) {
 | 
	
		
			
				|  |  | +        if (highQuotaInt < ancestorQuotaInt) {
 | 
	
		
			
				|  |  | +            ptProfitSaveReqVO.setPtGrossAdd(ptProfitSaveReqVO.getPtGrossAdd() + ancestorQuotaInt);
 | 
	
		
			
				|  |  | +            ptProfitSaveReqVO.setPtTotalAdd(ptProfitSaveReqVO.getPtGrossAdd() + ptProfitSaveReqVO.getPtAdd());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            PtProfitLogSaveReqVO ptProfitLog = PtProfitLogSaveReqVO.builder()
 | 
	
		
			
				|  |  | +                    .orderId(orderId)
 | 
	
		
			
				|  |  | +                    .profitStatus(CaclEnum.GROSS_PROFIT_ANCESTOR_QUOTA_PERC_EXCEED_MAXIMUM_LIMIT.getType())
 | 
	
		
			
				|  |  | +                    .orderNo(orderNo)
 | 
	
		
			
				|  |  | +                    .userId(userId)
 | 
	
		
			
				|  |  | +                    .amount(ancestorQuotaInt)
 | 
	
		
			
				|  |  | +                    .afterAmount(ptProfitSaveReqVOS.stream().mapToLong(PtProfitSaveReqVO::getPtGrossAdd).sum() + ancestorQuotaInt)
 | 
	
		
			
				|  |  | +                    .build();
 | 
	
		
			
				|  |  | +            ptProfitLogService.createPtProfitLog(ptProfitLog);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private PtProfitDO calcPtProfit(PtProfitDO ptProfitDO, List<PtProfitSaveReqVO> ptProfitSaveReqVOS) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          Long currentPtAdd = 0L;
 | 
	
	
		
			
				|  | @@ -386,10 +440,14 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |          // todo 增加累计额度
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          integralDO.setCurrentQuota(integralDO.getCurrentQuota() + descendantQuota);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        integralDO.setFreezeQuota(integralDO.getFreezeQuota() - descendantQuota);
 | 
	
		
			
				|  |  |          // 增加推荐人额度
 | 
	
		
			
				|  |  |          integralDOAncestor.setCurrentQuota(integralDOAncestor.getCurrentQuota() + ancestorQuota);
 | 
	
		
			
				|  |  | +        // 减少推荐人的可获取额度
 | 
	
		
			
				|  |  | +        integralDOAncestor.setHighQuota(integralDOAncestor.getHighQuota() - ancestorQuota);
 | 
	
		
			
				|  |  | +        integralDOAncestor.setAncestorQuota(integralDOAncestor.getAncestorQuota() + ancestorQuota);
 | 
	
		
			
				|  |  | +        integralService.updateIntegral(BeanUtils.toBean(integralDOAncestor, IntegralSaveReqVO.class));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // 增加平台额度
 | 
	
		
			
				|  |  |          pt.setCurrentQuota(pt.getCurrentQuota() + ptA + ptB);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -397,7 +455,6 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |  //        integralSaveReqVOS.add(BeanUtils.toBean(integralDOAncestor, IntegralSaveReqVO.class));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
 | 
	
		
			
				|  |  | -        integralService.updateIntegral(BeanUtils.toBean(integralDOAncestor, IntegralSaveReqVO.class));
 | 
	
		
			
				|  |  |          integralService.updateIntegral(BeanUtils.toBean(pt, IntegralSaveReqVO.class));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -409,4 +466,4 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +}
 |