yujian
2020-03-24 88c7df1d5089d8e39f356a68eaccc18f308e190c
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderMoneySettleServiceImpl.java
@@ -37,22 +37,25 @@
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.order.HongBaoV2SettleTemp;
import com.yeshi.fanli.entity.order.InviteOrderSubsidy;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.order.OrderTeamReward;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.money.InviteOrderSubsidyDebtException;
import com.yeshi.fanli.exception.money.OrderMoneySettleException;
import com.yeshi.fanli.exception.money.OrderTeamRewardDebtException;
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
import com.yeshi.fanli.exception.order.TaoBaoWeiQuanException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.hongbao.AccountDetailsHongBaoMapService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoV2SettleTempService;
import com.yeshi.fanli.service.inter.money.InviteOrderSubsidyDebtService;
import com.yeshi.fanli.service.inter.money.OrderTeamRewardDebtService;
import com.yeshi.fanli.service.inter.money.UserMoneyService;
import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
import com.yeshi.fanli.service.inter.money.tb.TaoBaoWeiQuanDrawBackService;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.InviteOrderSubsidyService;
import com.yeshi.fanli.service.inter.order.OrderMoneySettleService;
import com.yeshi.fanli.service.inter.order.OrderTeamRewardService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.util.Constant;
@@ -62,7 +65,6 @@
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
import com.yeshi.fanli.util.taobao.TaoKeOrderApiUtil;
@Service
public class OrderMoneySettleServiceImpl implements OrderMoneySettleService {
@@ -114,7 +116,13 @@
   @Resource
   private HongBaoV2SettleTempService hongBaoV2SettleTempService;
   //下级被封禁,红包失效
   @Resource
   private OrderTeamRewardService orderTeamRewardService;
   @Resource
   private OrderTeamRewardDebtService orderTeamRewardDebtService;
   // 下级被封禁,红包失效
   private void invalidHongBaoForbidden(Long id) {
      HongBaoV2 updateHongBaoV2 = new HongBaoV2(id);
      updateHongBaoV2.setState(HongBaoV2.STATE_SHIXIAO);
@@ -1064,4 +1072,90 @@
      }
      return debtMoney;
   }
   private BigDecimal kouKuanReward(List<OrderTeamReward> rewardList, BigDecimal debtMoney) {
      BigDecimal average = debtMoney.divide(new BigDecimal(rewardList.size()), 2, RoundingMode.UP);
      for (int i = 0; i < rewardList.size(); i++) {
         OrderTeamReward sidy = rewardList.get(i);
         BigDecimal subMoney = null;
         if (average.compareTo(sidy.getMoney()) >= 0) {
            subMoney = sidy.getMoney();
         } else {
            subMoney = average;
         }
         if (subMoney.compareTo(debtMoney) > 0)
            subMoney = debtMoney;
         debtMoney = debtMoney.subtract(subMoney);
         sidy.setMoney(sidy.getMoney().subtract(subMoney));
         if (sidy.getMoney().compareTo(new BigDecimal(0)) == 0) {
            rewardList.remove(i);
            i--;
         }
      }
      return debtMoney;
   }
   @Transactional(rollbackFor = Exception.class)
   @Override
   public void orderTeamRewardSettle(Long uid) throws OrderMoneySettleException {
      long count = orderTeamRewardService.countCanSettle(uid);
      if (count <= 0) {
         return;
      }
      int pageSize = 2000;
      int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      // 查询出需要到账的奖励
      List<OrderTeamReward> totalList = new ArrayList<>();
      for (int i = 0; i < page; i++) {
         List<OrderTeamReward> list = orderTeamRewardService.listCanSettle(uid, i + 1, pageSize);
         if (list != null && list.size() > 0)
            totalList.addAll(list);
      }
      if (totalList.size() > 0) {
         BigDecimal debtMoney = orderTeamRewardDebtService.getTotalDebtMoney(uid);
         BigDecimal originalDebtMoney = new BigDecimal(debtMoney.toString());// 总的欠款
         List<OrderTeamReward> copyRewardList = new ArrayList<>();
         copyRewardList.addAll(totalList);
         while (debtMoney.compareTo(new BigDecimal(0)) > 0 && copyRewardList.size() > 0) {// 有欠款,还有还的
            debtMoney = kouKuanReward(copyRewardList, debtMoney);
         }
         // 偿还欠款金额
         BigDecimal repayMoney = originalDebtMoney.subtract(debtMoney);
         BigDecimal bannce = null;
         if (repayMoney.compareTo(new BigDecimal(0)) > 0) {
            try {
               bannce = orderTeamRewardDebtService.repayDebtByUid(uid, repayMoney);
               // 剩余的补贴金额
            } catch (OrderTeamRewardDebtException e) {
               throw new OrderMoneySettleException(2, "还款异常");
            }
         }
         if (bannce != null && bannce.compareTo(new BigDecimal(0)) > 0) {
            // 如果有还剩下的钱就加到第一个上面
            totalList.get(0).setMoney(totalList.get(0).getMoney().add(bannce));
         }
         BigDecimal totalMoney = new BigDecimal(0);
         for (OrderTeamReward reward : totalList) {
            orderTeamRewardService.settleById(reward.getId(), reward.getMoney());
            totalMoney = totalMoney.add(reward.getMoney());
         }
         // 实际到账奖励
         UserMoneyDetail userMoneyDetail = null;
         try {
            userMoneyDetail = UserMoneyDetailFactory.createOrderTeamReward(uid, totalMoney, new Date());
         } catch (UserMoneyDetailException e) {
            throw new OrderMoneySettleException(1, "账户明细构建出错");
         }
         // 添加资金
         userMoneyService.addUserMoney(uid, totalMoney, userMoneyDetail);
         // 添加消息
         userMoneyMsgNotificationService.orderTeamReward(uid, new Date(), "系统自动下发", totalMoney,
               userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao());
      }
   }
}