|
@@ -1031,256 +1031,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
|
tradeOrderMapper.updateById(updateOrderObj);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 计算订单支付成功后,订单项的冻结积分转换
|
|
|
- *
|
|
|
- * @param tradeOrderDOList 订单列表
|
|
|
- * @param orderPercentageDO 参数百分比
|
|
|
- * @param percentTemplate 计算百分比模板
|
|
|
- */
|
|
|
- private void calc(List<TradeOrderDO> tradeOrderDOList, OrderPercentageDO orderPercentageDO, String percentTemplate) {
|
|
|
- // 平台收益日志
|
|
|
- List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS = new ArrayList<>();
|
|
|
-
|
|
|
- // todo 修改用户身价 如何从订单中获取身价?
|
|
|
- BigDecimal oneHundred = new BigDecimal(BigInteger.ONE);
|
|
|
-
|
|
|
-
|
|
|
- // 计算,毛利中100 之外的百分比
|
|
|
- BigDecimal otherOneHundred = oneHundred.subtract(new BigDecimal(orderPercentageDO.getGrossProfitUserQuotaPerc()))
|
|
|
- .subtract(new BigDecimal(orderPercentageDO.getGrossProfitAncestorQuotaPerc()))
|
|
|
- .subtract(new BigDecimal(orderPercentageDO.getGrossProfitPlatformQuotaPerc()));
|
|
|
-
|
|
|
-
|
|
|
- tradeOrderDOList.forEach(k -> {
|
|
|
- PtProfitDO ptProfitDO = ptProfitService.getPtProfit();
|
|
|
- // 平台收益
|
|
|
- List<PtProfitSaveReqVO> ptProfitSaveReqVOS = new ArrayList<>();
|
|
|
-
|
|
|
- List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectListByOrderId(k.getId());
|
|
|
-
|
|
|
- // 计算
|
|
|
- // 计算利润: (价格 - 成本价格) * 产品数量
|
|
|
- //用户自得和直推奖不用计算,从orderItem里面获取
|
|
|
- final BigDecimal[] profit = {new BigDecimal("0"), new BigDecimal("0"), new BigDecimal("0"), new BigDecimal("0")};
|
|
|
- tradeOrderItemDOS.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[2] = profit[2].add(new BigDecimal(j.getAncestorIncreaseIntegral())); //直推奖
|
|
|
- profit[3] = profit[3].add(new BigDecimal(j.getFreezeHighQuota())); //用户获得冻结最大可用额度
|
|
|
-
|
|
|
- // 遍历订单项拿到订单项编号
|
|
|
- //将当前订单项设置为已分配权益
|
|
|
- TradeOrderItemDO item = new TradeOrderItemDO();
|
|
|
- item.setId(j.getId());
|
|
|
- item.setDistributeBenefit(true);
|
|
|
- tradeOrderItemMapper.updateById(item);
|
|
|
- });
|
|
|
-
|
|
|
-
|
|
|
- // 计算毛利: 利润 * 1
|
|
|
- BigDecimal grossProfit = profit[0].multiply(new BigDecimal(orderPercentageDO.getGrossProfitPerc())).setScale(4, RoundingMode.DOWN);
|
|
|
-
|
|
|
- // 计算平台收益
|
|
|
- BigDecimal grossProfitAfterBonus = profit[0].multiply(oneHundred.subtract(new BigDecimal(orderPercentageDO.getGrossProfitPerc()))).setScale(4, RoundingMode.DOWN);
|
|
|
-
|
|
|
- if (otherOneHundred.compareTo(new BigDecimal(BigInteger.ZERO)) > 0) {
|
|
|
- grossProfitAfterBonus = grossProfitAfterBonus.add(grossProfit.multiply(otherOneHundred).setScale(4, RoundingMode.DOWN));
|
|
|
- }
|
|
|
-
|
|
|
- // 用户所得: 毛利 * 0.35
|
|
|
- BigDecimal descendantQuota = BigDecimal.valueOf(0L);
|
|
|
-
|
|
|
- // 直推奖: 毛利 * 0.3 (上一级)
|
|
|
- BigDecimal ancestorQuota = profit[2];
|
|
|
-
|
|
|
- // 平台服务费: 毛利 * 0.05
|
|
|
- BigDecimal platformQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitPlatformQuotaPerc())).setScale(4, RoundingMode.DOWN);
|
|
|
-
|
|
|
-
|
|
|
- // 计算当前下单人的毛利的十倍
|
|
|
-// BigDecimal highQuota = grossProfit.multiply(new BigDecimal("10")).setScale(4, RoundingMode.DOWN);
|
|
|
- BigDecimal highQuota = profit[3];
|
|
|
-
|
|
|
- // 乘以 10000 并转换为整数
|
|
|
- Long ancestorQuotaInt = ancestorQuota.longValue();
|
|
|
- Long descendantQuotaInt = descendantQuota.longValue();
|
|
|
- Long highQuotaInt = highQuota.longValue();
|
|
|
- Long grossProfitAfterBonusInt = grossProfitAfterBonus.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
|
|
|
- Long platformQuotaInt = platformQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
|
|
|
-
|
|
|
-
|
|
|
- // 获取当前下单人关系
|
|
|
- SharePathDO sharePath = sharePathService.getSharePathByDescendant(k.getUserId());
|
|
|
- // 如果sharePath为空, 则说明没有直推人关系
|
|
|
- IntegralDO integralDOAncestor = integralService.selectByUser(sharePath.getAncestor()); //父级
|
|
|
- IntegralDO integralDO = integralService.selectByUser(sharePath.getDescendant()); //自己
|
|
|
- IntegralDO ptIntegral = integralService.selectByUser(1L); //pt
|
|
|
-
|
|
|
-
|
|
|
- // ========== 身价计算 ==============
|
|
|
- //推荐人身价计算
|
|
|
- double orderAncestorSocialStatus = Double.parseDouble(orderPercentageDO.getOrderAncestorSocialStatus());
|
|
|
- double ancestorSocial = k.getTotalPrice() * orderAncestorSocialStatus / 100;
|
|
|
- duserService.updateDuserSocial(integralDOAncestor.getUserId(), (long) ancestorSocial, SocialStatusEnum.SHOPPING_ANCESTOR_SOCIAL.getStatus());
|
|
|
-
|
|
|
- //自得身价计算
|
|
|
- double orderUserSocialStatus = Double.parseDouble(orderPercentageDO.getOrderUserSocialStatus());
|
|
|
- double descendantSocial = k.getTotalPrice() * orderUserSocialStatus / 100;
|
|
|
- duserService.updateDuserSocial(integralDO.getUserId(), (long) descendantSocial, SocialStatusEnum.SHOPPING_SOCIAL.getStatus());
|
|
|
-
|
|
|
- /*
|
|
|
- 原本这里有添加到distri_order_calc表的记录,但是现在要合赢奖和(直推奖、自得奖)分开,所以现在搬走了
|
|
|
- */
|
|
|
-
|
|
|
- // ========== 修改用户钱包 =================
|
|
|
-
|
|
|
- //直推奖也要限制额度
|
|
|
- Long ancestorHighQuota = integralDOAncestor.getHighQuota() + new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue();//加上基础的最大额度值
|
|
|
-
|
|
|
- //amount用于记录本次添加的值
|
|
|
- Long amount = 0L;
|
|
|
- //平台需要补回的收益
|
|
|
- Long ptReplenish = ancestorQuotaInt;
|
|
|
-
|
|
|
- //如果直推人的可获取额度大于0,则能够获取
|
|
|
- if (ancestorHighQuota.compareTo(0L) > 0) {
|
|
|
- if (ancestorHighQuota.compareTo(ancestorQuotaInt) > 0) {
|
|
|
- //如果最大额度 > 直推人可获取额度,则直接获取
|
|
|
- amount = ancestorQuotaInt;
|
|
|
- //平台没有需要补回的收益
|
|
|
- ptReplenish = 0L;
|
|
|
- } else {
|
|
|
- //如果最大额度 < 直推人可获取额度,则获取自己的最大额度
|
|
|
- amount = ancestorHighQuota;
|
|
|
- //用户本次没有拿到的直推奖
|
|
|
- ptReplenish = ancestorQuotaInt - ancestorHighQuota;
|
|
|
- }
|
|
|
- }
|
|
|
- changeUserWallet(integralDO, integralDOAncestor, ptIntegral, amount,
|
|
|
- descendantQuotaInt, highQuotaInt, grossProfitAfterBonusInt, platformQuotaInt, ptReplenish);
|
|
|
-
|
|
|
- // ========== 修改平台信息 =================
|
|
|
- // 每个订单计算的过程
|
|
|
- // 增加平台收益
|
|
|
- // 平台服务费
|
|
|
- PtProfitSaveReqVO ptProfitSaveReqVO =
|
|
|
- PtProfitSaveReqVO.builder()
|
|
|
- .ptAdd(platformQuotaInt)
|
|
|
- .ptGrossAdd(grossProfitAfterBonusInt)
|
|
|
- .ptTotalAdd(platformQuotaInt + grossProfitAfterBonusInt).build();
|
|
|
-
|
|
|
-
|
|
|
- // 当直推人获取的积分额度不足时,平台收益要加回来,并生成log
|
|
|
- if (ptReplenish.compareTo(0L) > 0) {
|
|
|
- calcIntegral(ptProfitSaveReqVOS, ptProfitSaveReqVO, ptReplenish,
|
|
|
- k.getId(), k.getNo());
|
|
|
- }
|
|
|
-
|
|
|
- ptProfitSaveReqVOS.add(ptProfitSaveReqVO);
|
|
|
- // ========== 增加日志记录 =================
|
|
|
-
|
|
|
- // 平台记录
|
|
|
- // 平台总收益
|
|
|
- // 平台总收益
|
|
|
- PtProfitLogSaveReqVO ptTotal = PtProfitLogSaveReqVO.builder()
|
|
|
- .orderId(k.getId())
|
|
|
- .profitStatus(CaclEnum.PLATFORM_TOTAL_ADD.getType())
|
|
|
- .orderNo(k.getNo())
|
|
|
- .amount(platformQuotaInt + grossProfitAfterBonusInt)
|
|
|
- .afterAmount(ptProfitDO.getPtTotalAdd() + platformQuotaInt + grossProfitAfterBonusInt)
|
|
|
- .percentTemplate(percentTemplate)
|
|
|
- .generateUserId(integralDO.getUserId())
|
|
|
- .build();
|
|
|
- // 平台收益
|
|
|
- PtProfitLogSaveReqVO ptGrossAddLog = PtProfitLogSaveReqVO.builder()
|
|
|
- .orderId(k.getId())
|
|
|
- .profitStatus(CaclEnum.PLATFORM_REVENUE.getType())
|
|
|
- .orderNo(k.getNo())
|
|
|
- .amount(grossProfitAfterBonusInt)
|
|
|
- .afterAmount(ptProfitDO.getPtGrossAdd() + ptProfitSaveReqVO.getPtGrossAdd())
|
|
|
- .percentTemplate(percentTemplate)
|
|
|
- .generateUserId(integralDO.getUserId())
|
|
|
- .build();
|
|
|
-
|
|
|
- // 平台服务费
|
|
|
- PtProfitLogSaveReqVO ptAddLog = PtProfitLogSaveReqVO.builder()
|
|
|
- .orderId(k.getId())
|
|
|
- .profitStatus(CaclEnum.PLATFORM_SERVICE_FEE.getType())
|
|
|
- .orderNo(k.getNo())
|
|
|
- .amount(platformQuotaInt)
|
|
|
- .afterAmount(ptProfitDO.getPtAdd() + ptProfitSaveReqVO.getPtAdd())
|
|
|
- .percentTemplate(percentTemplate)
|
|
|
- .generateUserId(integralDO.getUserId())
|
|
|
- .build();
|
|
|
-
|
|
|
-
|
|
|
- // 直推奖记录
|
|
|
- PtProfitLogSaveReqVO tjrLog = PtProfitLogSaveReqVO.builder()
|
|
|
- .orderId(k.getId())
|
|
|
- .profitStatus(CaclEnum.RECOMMENDED_PERSON_QUOTA.getType())
|
|
|
- .orderNo(k.getNo())
|
|
|
- .userId(sharePath.getAncestor())
|
|
|
- .amount(amount)
|
|
|
- .afterAmount(integralDOAncestor.getRedCurrentQuota())
|
|
|
- .freezeAmount(-amount)
|
|
|
- .afterFreezeAmount(integralDOAncestor.getFreezeQuota())
|
|
|
- .ancestorQuotaAmount(ptReplenish)
|
|
|
- .maxAvailablePointsAmount(-amount)
|
|
|
- .afterMaxAvailablePointsAmount(ancestorHighQuota - amount)
|
|
|
- .percentTemplate(percentTemplate)
|
|
|
- .generateUserId(integralDO.getUserId())
|
|
|
- .build();
|
|
|
-
|
|
|
-
|
|
|
- // 用户自得记录 + 户冻结积分转化成可用 + 扣减最高可用额度记录
|
|
|
- PtProfitLogSaveReqVO ztrLog = PtProfitLogSaveReqVO.builder()
|
|
|
- .orderId(k.getId())
|
|
|
- .profitStatus(CaclEnum.DIRECT_REFERRAL_QUOTA.getType())
|
|
|
- .orderNo(k.getNo())
|
|
|
- .userId(sharePath.getDescendant())
|
|
|
- .amount(descendantQuotaInt)
|
|
|
- .afterAmount(integralDO.getRedCurrentQuota())
|
|
|
- .freezeAmount(-descendantQuotaInt)
|
|
|
- .afterFreezeAmount(integralDO.getFreezeQuota())
|
|
|
- .maxAvailablePointsAmount(highQuotaInt)
|
|
|
- .afterMaxAvailablePointsAmount(integralDO.getHighQuota() + new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue())
|
|
|
- .freezeHighQuota(-highQuotaInt)
|
|
|
- .afterFreezeHighQuota(integralDO.getFreezeHighQuota())
|
|
|
- .percentTemplate(percentTemplate)
|
|
|
- .generateUserId(integralDO.getUserId())
|
|
|
- .build();
|
|
|
-
|
|
|
- ptProfitLogSaveReqVOS.add(ptTotal);
|
|
|
- ptProfitLogSaveReqVOS.add(ptGrossAddLog);
|
|
|
- ptProfitLogSaveReqVOS.add(ptAddLog);
|
|
|
- ptProfitLogSaveReqVOS.add(tjrLog);
|
|
|
- ptProfitLogSaveReqVOS.add(ztrLog);
|
|
|
-
|
|
|
-
|
|
|
- PtProfitDO ptProfit = ptProfitService.getPtProfit();
|
|
|
- // 计算总积分
|
|
|
- Long total = ptProfitSaveReqVOS.stream().mapToLong(PtProfitSaveReqVO::getPtTotalAdd).sum();
|
|
|
- Long add = ptProfitSaveReqVOS.stream().mapToLong(PtProfitSaveReqVO::getPtAdd).sum();
|
|
|
- Long grossAdd = ptProfitSaveReqVOS.stream().mapToLong(PtProfitSaveReqVO::getPtGrossAdd).sum();
|
|
|
- ptProfit.setPtAdd(ptProfit.getPtAdd() + add);
|
|
|
- ptProfit.setPtTotalAdd(ptProfit.getPtTotalAdd() + total);
|
|
|
- ptProfit.setPtGrossAdd(ptProfit.getPtGrossAdd() + grossAdd);
|
|
|
- PtProfitSaveReqVO ptProfitSaveReqVO2 = PtProfitSaveReqVO.builder()
|
|
|
- .id(ptProfitDO.getId())
|
|
|
- .ptTotalAdd(ptProfit.getPtTotalAdd())
|
|
|
- .ptAdd(ptProfit.getPtAdd())
|
|
|
- .ptGrossAdd(ptProfit.getPtGrossAdd()).build();
|
|
|
- ptProfitService.updatePtProfit(ptProfitSaveReqVO2);
|
|
|
- });
|
|
|
-
|
|
|
- // 信息整合
|
|
|
- ptProfitLogService.saveBatch(ptProfitLogSaveReqVOS);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 在用户获取直推奖的时候溢出的需要加入到平台,并记录log
|
|
|
*/
|