yj
2020-03-06 207dc8655711cddac2653e18b51e58a88dba2084
fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java
@@ -39,6 +39,7 @@
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.money.InviteOrderSubsidyDebtService;
import com.yeshi.fanli.service.inter.money.UserMoneyDebtService;
import com.yeshi.fanli.service.inter.money.UserMoneyDetailService;
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;
@@ -47,7 +48,6 @@
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
import com.yeshi.fanli.vo.order.CommonOrderVO;
@Service
public class TaoBaoWeiQuanDrawBackServiceImpl implements TaoBaoWeiQuanDrawBackService {
@@ -90,13 +90,16 @@
   @Resource
   private InviteOrderSubsidyDebtService inviteOrderSubsidyDebtService;
   @Resource
   private UserMoneyDetailService userMoneyDetailService;
   @Override
   public void addWeiQuanDrawBack(TaoBaoWeiQuanDrawBack taoBaoWeiQuanDrawBack) {
      taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(taoBaoWeiQuanDrawBack.getOrderItemId(),
            taoBaoWeiQuanDrawBack.getUser().getId());
   }
   @Transactional
   @Transactional(rollbackFor = Exception.class)
   private void addDebt(Long uid, Long hbId, BigDecimal money) throws UserMoneyDebtException {
      UserMoneyDebt debt = new UserMoneyDebt();
      debt.setBeiZhu(null);
@@ -124,47 +127,21 @@
      return money;
   }
   @Transactional
   @Transactional(rollbackFor = Exception.class)
   @Override
   public void doWeiQuanFanli(String orderId) throws TaoBaoWeiQuanException {
   public Map<Long, BigDecimal> doWeiQuanFanli(String orderId, boolean subMoneySync) throws TaoBaoWeiQuanException {
      if (StringUtil.isNullOrEmpty(orderId))
         throw new TaoBaoWeiQuanException(1, "订单号为空值");
      // 查询是否为维权订单
      List<TaoBaoWeiQuanOrder> list = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId);
      if (list == null || list.size() == 0)
         return;
      // 查询还未扣款的主红包
      List<HongBaoV2> mainHongBaoList = new ArrayList<>();
      for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
         List<CommonOrder> orderList = commonOrderMapper.listBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
               weiQuanOrder.getOrderItemId());
         if (orderList != null && orderList.size() > 0)
            for (CommonOrder commonOrder : orderList) {
               // 修改订单状态为维权
               CommonOrder co = new CommonOrder(commonOrder.getId());
               co.setState(CommonOrder.STATE_WQ);
               co.setUpdateTime(new Date());
               commonOrderMapper.updateByPrimaryKeySelective(co);
               HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
               if (hongBaoOrder.getCommonOrder() != null
                     && !StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getTradeId()))
               // 查询是否已经维权
               {
                  TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(
                        hongBaoOrder.getCommonOrder().getTradeId(),
                        hongBaoOrder.getHongBaoV2().getUserInfo().getId());
                  if (drawBack == null)// 添加还未扣款的子订单
                     mainHongBaoList.add(hongBaoOrder.getHongBaoV2());
               }
            }
      }
         return null;
      List<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId);
      if (mainHongBaoList == null || mainHongBaoList.size() == 0)
         return;
         return null;
      for (int i = 0; i < mainHongBaoList.size(); i++) {
         //锁行,防止重复 操作
         // 锁行,防止重复 操作
         HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(mainHongBaoList.get(i).getId());
         mainHongBaoList.set(i, hb);
         // 只处理返利订单
@@ -175,7 +152,7 @@
      }
      if (mainHongBaoList == null || mainHongBaoList.size() == 0)
         return;
         return null;
      // 主用户ID
      Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
@@ -194,6 +171,7 @@
      // 计算每个用户的返利比例
      Iterator<Long> its = fanMoneyMap.keySet().iterator();
      Map<Long, BigDecimal> userSubMoneyMap = new HashMap<>();
      while (its.hasNext()) {
         Long uid = its.next();
         BigDecimal userGetMoney = fanMoneyMap.get(uid);
@@ -248,93 +226,126 @@
         // 退款金额
         BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney);
         // 计算资金是否充足
         UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
         if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 资金不足
         {
            // 添加债务
            for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) {
               TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(drawBack.getOrderItemId());
               if (taoBaoOrder != null) {
                  TaoBaoWeiQuanOrder weiQuanOrder = taoBaoWeiQuanOrderService
                        .selectByTradeId(drawBack.getOrderItemId());
                  CommonOrder co = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                        drawBack.getOrderItemId());
                  if (co != null) {
                     HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId());
                     if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null) {
                        BigDecimal drawback = computeDrawBackMoney(taoBaoOrder.getSettlement(),
                              weiQuanOrder.getMoney(), hongBaoOrder.getHongBaoV2().getMoney());
                        try {
                           addDebt(uid, hongBaoOrder.getHongBaoV2().getId(), drawback);
                        } catch (UserMoneyDebtException e) {
                           throw new TaoBaoWeiQuanException(101, "资金借贷异常");
         userSubMoneyMap.put(uid, drawBackMoney);
         if (subMoneySync) {
            // 计算资金是否充足
            UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
            if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 资金不足
            {
               // 添加债务
               for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) {
                  TaoBaoOrder taoBaoOrder = taoBaoOrderMapper
                        .selectTaoBaoOrderByTradeId(drawBack.getOrderItemId());
                  if (taoBaoOrder != null) {
                     TaoBaoWeiQuanOrder weiQuanOrder = taoBaoWeiQuanOrderService
                           .selectByTradeId(drawBack.getOrderItemId());
                     CommonOrder co = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                           drawBack.getOrderItemId());
                     if (co != null) {
                        HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId());
                        if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null) {
                           BigDecimal drawback = computeDrawBackMoney(taoBaoOrder.getSettlement(),
                                 weiQuanOrder.getMoney(), hongBaoOrder.getHongBaoV2().getMoney());
                           try {
                              addDebt(uid, hongBaoOrder.getHongBaoV2().getId(), drawback);
                           } catch (UserMoneyDebtException e) {
                              throw new TaoBaoWeiQuanException(101, "资金借贷异常");
                           }
                        }
                     }
                  }
               }
               continue;
            }
            continue;
         }
         UserMoneyDetail userMoneyDetail = null;
         // 新版资金记录
         try {
            userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
         } catch (UserMoneyDetailException e) {
            UserMoneyDetail userMoneyDetail = null;
            // 新版资金记录
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
               userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
            } catch (UserMoneyDetailException e) {
               try {
                  LogHelper.errorDetailInfo(e);
               } catch (Exception e1) {
                  e1.printStackTrace();
               }
            }
            if (userMoneyDetail == null)
               throw new TaoBaoWeiQuanException(110, "资金记录生成失败");
            userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
            // 新版通知
            userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO,
                  drawBackMoney, userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
         } else {// 记录资金记录,但是不显示给用户
            UserMoneyDetail userMoneyDetail = null;
            // 新版资金记录
            try {
               userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
            } catch (UserMoneyDetailException e) {
               try {
                  LogHelper.errorDetailInfo(e);
               } catch (Exception e1) {
                  e1.printStackTrace();
               }
            }
            if (userMoneyDetail == null)
               throw new TaoBaoWeiQuanException(110, "资金记录生成失败");
            userMoneyDetail.setShow(false);
            try {
               userMoneyDetailService.addUserMoneyDetail(userMoneyDetail);
            } catch (UserMoneyDetailException e) {
               throw new TaoBaoWeiQuanException(111, "插入记录生成失败");
            }
         }
         userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
         // 新版通知
         userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
               userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
      }
      return userSubMoneyMap;
   }
   @Transactional
   private List<HongBaoV2> getWeiQuanMainHongBao(List<TaoBaoWeiQuanOrder> list, String orderId) {
      // 查询是否为维权订单
      if (list == null || list.size() == 0)
         return null;
      // 获取和该订单号有关联的用户
      // 查询还未扣款的主红包
      List<HongBaoV2> mainHongBaoList = new ArrayList<>();
      for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
         List<CommonOrder> orderList = commonOrderMapper.listBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
               weiQuanOrder.getOrderItemId());
         if (orderList != null && orderList.size() > 0)
            for (CommonOrder commonOrder : orderList) {
               // 修改订单状态为维权
               CommonOrder co = new CommonOrder(commonOrder.getId());
               co.setState(CommonOrder.STATE_WQ);
               co.setUpdateTime(new Date());
               commonOrderMapper.updateByPrimaryKeySelective(co);
               HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
               if (hongBaoOrder.getCommonOrder() != null
                     && !StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getTradeId()))
               // 查询是否已经维权
               {
                  TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(
                        hongBaoOrder.getCommonOrder().getTradeId(),
                        hongBaoOrder.getHongBaoV2().getUserInfo().getId());
                  if (drawBack == null)// 添加还未扣款的子订单
                     mainHongBaoList.add(hongBaoOrder.getHongBaoV2());
               }
            }
      }
      return mainHongBaoList;
   }
   @Transactional(rollbackFor = Exception.class)
   @Override
   public void doWeiQuanShare(String orderId) throws TaoBaoWeiQuanException {
      if (StringUtil.isNullOrEmpty(orderId))
         throw new TaoBaoWeiQuanException(1, "订单号为空值");
      // 查询是否为维权订单
      List<TaoBaoWeiQuanOrder> list = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId);
      if (list == null || list.size() == 0)
         return;
      // 获取和该订单号有关联的用户
      // 获取主红包(同一个订单号的单只会对应同一个用户)
      List<CommonOrderVO> typeList = new ArrayList<>();
      CommonOrderVO cv = new CommonOrderVO();
      cv.setSourceType(Constant.SOURCE_TYPE_TAOBAO);
      cv.setOrderNo(orderId);
      typeList.add(cv);
      List<CommonOrderVO> commonOrderList = commonOrderMapper.listOrderGoodsInfo(typeList);
      List<HongBaoV2> mainHongBaoList = new ArrayList<>();
      if (commonOrderList != null)
         for (CommonOrderVO vo : commonOrderList) {
            // 更改订单状态
            CommonOrder co = new CommonOrder(vo.getId());
            co.setState(CommonOrder.STATE_WQ);
            co.setUpdateTime(new Date());
            commonOrderMapper.updateByPrimaryKeySelective(co);
            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(vo.getId());
            if (hongBaoOrder.getCommonOrder() != null
                  && !StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getTradeId()))
            // 查询是否已经维权
            {
               TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(
                     hongBaoOrder.getCommonOrder().getTradeId(),
                     hongBaoOrder.getHongBaoV2().getUserInfo().getId());
               if (drawBack == null)// 添加还未扣款的子订单
                  mainHongBaoList.add(hongBaoOrder.getHongBaoV2());
            }
         }
      List<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId);
      if (mainHongBaoList == null || mainHongBaoList.size() == 0)
         return;
@@ -460,11 +471,11 @@
         userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
         userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
               userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao());
               userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
      }
   }
   @Transactional
   @Transactional(rollbackFor = Exception.class)
   @Override
   public void doWeiQuanInvite(String orderId) throws TaoBaoWeiQuanException {
      if (StringUtil.isNullOrEmpty(orderId))
@@ -572,7 +583,7 @@
         if (drawBackMoney.compareTo(new BigDecimal(0)) <= 0)
            return;
         InviteOrderSubsidyDebt debt = new InviteOrderSubsidyDebt();
         debt.setBeiZhu("订单维权:" + orderId + "-" + sourceType);
         debt.setBeiZhu("订单售后:" + orderId + "-" + sourceType);
         debt.setOriginMoney(drawBackMoney);
         debt.setUid(uid);
         debt.setCreateTime(new Date());
@@ -594,6 +605,16 @@
   }
   @Override
   public List<TaoBaoWeiQuanDrawBack> getByOrderItemId(String orderItemId) {
      return taoBaoWeiQuanDrawBackMapper.selectByOrderItemId(orderItemId);
   }
   @Override
   public TaoBaoWeiQuanDrawBack selectByOrderItemIdAndUid(String orderItemId, Long uid) {
      return taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(orderItemId, uid);
   }
   @Override
   public TaoBaoWeiQuanDrawBack selectByHongBaoId(Long hbId) {
      Long uid = null;
      HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKey(hbId);