admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java
@@ -1,611 +1,622 @@
package com.yeshi.fanli.service.impl.money.tb;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.HongBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanDrawBackMapper;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.money.InviteOrderSubsidyDebt;
import com.yeshi.fanli.entity.money.UserMoneyDebt;
import com.yeshi.fanli.entity.money.UserMoneyDebt.UserMoneyDebtTypeEnum;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.order.InviteOrderSubsidy;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.money.InviteOrderSubsidyDebtException;
import com.yeshi.fanli.exception.money.UserMoneyDebtException;
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.money.InviteOrderSubsidyDebtService;
import com.yeshi.fanli.service.inter.money.UserMoneyDebtService;
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.InviteOrderSubsidyService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
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 {
   @Resource
   private TaoBaoWeiQuanDrawBackMapper taoBaoWeiQuanDrawBackMapper;
   @Resource
   private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
   @Resource
   private TaoBaoOrderMapper taoBaoOrderMapper;
   @Resource
   private UserInfoMapper userInfoMapper;
   @Resource
   private UserMoneyDetailMapper userMoneyDetailMapper;
   @Resource
   private CommonOrderMapper commonOrderMapper;
   @Resource
   private HongBaoV2Mapper hongBaoV2Mapper;
   @Resource
   private HongBaoOrderMapper hongBaoOrderMapper;
   @Resource
   private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
   @Resource
   private UserMoneyDebtService userMoneyDebtService;
   @Resource
   private UserMoneyService userMoneyService;
   @Resource
   private InviteOrderSubsidyService inviteOrderSubsidyService;
   @Resource
   private InviteOrderSubsidyDebtService inviteOrderSubsidyDebtService;
   @Override
   public void addWeiQuanDrawBack(TaoBaoWeiQuanDrawBack taoBaoWeiQuanDrawBack) {
      taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(taoBaoWeiQuanDrawBack.getOrderItemId(),
            taoBaoWeiQuanDrawBack.getUser().getId());
   }
   @Transactional
   private void addDebt(Long uid, Long hbId, BigDecimal money) throws UserMoneyDebtException {
      UserMoneyDebt debt = new UserMoneyDebt();
      debt.setBeiZhu(null);
      debt.setCreateTime(new Date());
      debt.setLeftMoney(money);
      debt.setOriginMoney(money);
      debt.setSourceId(hbId);
      debt.setType(UserMoneyDebtTypeEnum.order);
      debt.setUid(uid);
      userMoneyDebtService.addUserMoneyDebt(debt);
   }
   /**
    * 计算退款金额
    *
    * @param settlement
    * @param wqMoney
    * @param hongBaoMoney
    * @return
    */
   private BigDecimal computeDrawBackMoney(BigDecimal settlement, BigDecimal wqMoney, BigDecimal hongBaoMoney) {
      BigDecimal money = (hongBaoMoney.multiply(wqMoney)).divide(settlement, 2, BigDecimal.ROUND_UP);
      if (money.compareTo(hongBaoMoney) > 0)
         money = hongBaoMoney;
      return money;
   }
   @Transactional
   @Override
   public void doWeiQuanFanli(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());
            }
         }
      if (mainHongBaoList == null || mainHongBaoList.size() == 0)
         return;
      for (int i = 0; i < mainHongBaoList.size(); i++) {
         HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKey(mainHongBaoList.get(i).getId());
         mainHongBaoList.set(i, hb);
         // 只处理返利订单
         if (hb.getType() != HongBaoV2.TYPE_ZIGOU) {
            mainHongBaoList.remove(i);
            i--;
         }
      }
      if (mainHongBaoList == null || mainHongBaoList.size() == 0)
         return;
      // 主用户ID
      Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
      if (mainHongBaoList != null)
         for (HongBaoV2 hongBao : mainHongBaoList) {
            if (hongBao.getState() != HongBaoV2.STATE_YILINGQU)
               continue;
            // 累计主红包的金额
            if (fanMoneyMap.get(hongBao.getUserInfo().getId()) == null) {
               fanMoneyMap.put(hongBao.getUserInfo().getId(), hongBao.getMoney());
            } else
               fanMoneyMap.put(hongBao.getUserInfo().getId(),
                     fanMoneyMap.get(hongBao.getUserInfo().getId()).add(hongBao.getMoney()));
         }
      // 计算每个用户的返利比例
      Iterator<Long> its = fanMoneyMap.keySet().iterator();
      while (its.hasNext()) {
         Long uid = its.next();
         BigDecimal userGetMoney = fanMoneyMap.get(uid);
         BigDecimal wqMoney = new BigDecimal("0");
         // 统计用户在这个单中需要扣除的资金
         TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
         List<TaoBaoWeiQuanDrawBack> newWeiQuanDrawBackList = new ArrayList<>();
         BigDecimal settleMent = new BigDecimal(0);
         for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
            weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
                  uid);
            if (weiQuanDrawBack != null)
               continue;
            // 计算结算金额
            TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
            if (taoBaoOrder == null)
               throw new TaoBaoWeiQuanException(101, "未找到子订单相关数据");
            if (taoBaoOrder.getSettlement() == null)
               throw new TaoBaoWeiQuanException(102, "淘宝结算金额为空");
            settleMent = settleMent.add(taoBaoOrder.getSettlement());
            // 退款的资金
            wqMoney = wqMoney.add(weiQuanOrder.getMoney());
            weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
            weiQuanDrawBack.setCreateTime(new Date());
            CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                  weiQuanOrder.getOrderItemId());
            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
            // 计算退款的资金
            BigDecimal drawBack = null;
            if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null)
               drawBack = computeDrawBackMoney(commonOrder.getSettlement(), weiQuanOrder.getMoney(),
                     hongBaoOrder.getHongBaoV2().getMoney());
            weiQuanDrawBack.setDrawBackMoney(drawBack);
            weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
            weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
            weiQuanDrawBack.setUser(new UserInfo(uid));
            newWeiQuanDrawBackList.add(weiQuanDrawBack);
         }
         if (wqMoney.compareTo(new BigDecimal("0")) <= 0)
            continue;
         // 插入记录
         for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) {
            taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack);
         }
         // 退款金额
         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, "资金借贷异常");
                        }
                     }
                  }
               }
            }
            continue;
         }
         UserMoneyDetail userMoneyDetail = null;
         // 新版资金记录
         try {
            userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
         } catch (UserMoneyDetailException e) {
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
            }
         }
         userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
         // 新版通知
         userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
               userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
      }
   }
   @Transactional
   @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());
            }
         }
      if (mainHongBaoList == null || mainHongBaoList.size() == 0)
         return;
      // 主用户ID
      Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
      if (mainHongBaoList != null)
         for (HongBaoV2 hongBao : mainHongBaoList) {// 统计订单下的所有主红包
            hongBao = hongBaoV2Mapper.selectByPrimaryKey(hongBao.getId());
            if (hongBao.getState() != HongBaoV2.STATE_YILINGQU)
               continue;
            // 只计入分享赚的红包
            if (hongBao.getType() == HongBaoV2.TYPE_SHARE_GOODS) {
               // 累计主红包的金额
               if (fanMoneyMap.get(hongBao.getUserInfo().getId()) == null) {
                  fanMoneyMap.put(hongBao.getUserInfo().getId(), hongBao.getMoney());
               } else
                  fanMoneyMap.put(hongBao.getUserInfo().getId(),
                        fanMoneyMap.get(hongBao.getUserInfo().getId()).add(hongBao.getMoney()));
            }
         }
      Iterator<Long> its = fanMoneyMap.keySet().iterator();
      // 查询和这个订单有关的用户(主订单)
      while (its.hasNext()) {
         Long uid = its.next();
         BigDecimal userGetMoney = fanMoneyMap.get(uid);
         BigDecimal wqMoney = new BigDecimal("0");
         BigDecimal settleMent = new BigDecimal("0");
         // 统计用户在这个单中需要扣除的资金
         TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
         List<TaoBaoWeiQuanDrawBack> newWeiQuanDrawBackList = new ArrayList<>();
         for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
            weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
                  uid);
            if (weiQuanDrawBack != null)
               continue;
            // 计算结算金额
            TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
            if (taoBaoOrder == null)
               throw new TaoBaoWeiQuanException(101, "未找到子订单相关数据");
            if (taoBaoOrder.getSettlement() == null)
               throw new TaoBaoWeiQuanException(102, "淘宝结算金额为空");
            settleMent = settleMent.add(taoBaoOrder.getSettlement());
            // 退款的资金
            wqMoney = wqMoney.add(weiQuanOrder.getMoney());
            // 插入记录
            weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
            weiQuanDrawBack.setCreateTime(new Date());
            // 计算退款资金
            CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                  weiQuanOrder.getOrderItemId());
            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
            // 计算退款的资金
            BigDecimal drawBack = null;
            if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null)
               drawBack = computeDrawBackMoney(commonOrder.getSettlement(), weiQuanOrder.getMoney(),
                     hongBaoOrder.getHongBaoV2().getMoney());
            weiQuanDrawBack.setDrawBackMoney(drawBack);
            weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
            weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
            weiQuanDrawBack.setUser(new UserInfo(uid));
            newWeiQuanDrawBackList.add(weiQuanDrawBack);
         }
         if (wqMoney.compareTo(new BigDecimal("0")) <= 0)
            continue;
         // 退款金额
         BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney);
         if (drawBackMoney.compareTo(userGetMoney) > 0)
            drawBackMoney = userGetMoney;
         for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList)
            taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack);
         // 计算资金是否充足
         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());
                  BigDecimal settleMentMoney = taoBaoOrder.getSettlement();
                  CommonOrder co = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                        weiQuanOrder.getOrderItemId());
                  if (co != null) {
                     HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId());
                     BigDecimal drawback = computeDrawBackMoney(settleMentMoney, weiQuanOrder.getMoney(),
                           hongBaoOrder.getHongBaoV2().getMoney());
                     try {
                        addDebt(uid, hongBaoOrder.getHongBaoV2().getId(), drawback);
                     } catch (UserMoneyDebtException e) {
                        throw new TaoBaoWeiQuanException(101, "资金借贷异常");
                     }
                  }
               }
            }
            continue;
         }
         UserMoneyDetail userMoneyDetail = null;
         // 新版资金记录
         try {
            userMoneyDetail = UserMoneyDetailFactory.createShareWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
         } catch (UserMoneyDetailException e) {
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
            }
         }
         userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
         userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
               userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao());
      }
   }
   @Transactional
   @Override
   public void doWeiQuanInvite(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;
      // 查询订单库
      for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
         TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
         BigDecimal wqMoney = weiQuanOrder.getMoney();
         if (taoBaoOrder == null)
            throw new TaoBaoWeiQuanException(1, "来源交易ID有误");
         BigDecimal settleMent = new BigDecimal("0");
         if (taoBaoOrder.getOrderState().equalsIgnoreCase("订单结算")) {
            settleMent = settleMent.add(taoBaoOrder.getSettlement());
         }
         // 查询下级子用户
         CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
               weiQuanOrder.getOrderItemId());
         if (commonOrder == null)
            throw new TaoBaoWeiQuanException(2, "订单有误");
         HongBaoOrder hongbaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
         if (hongbaoOrder == null || hongbaoOrder.getHongBaoV2() == null)
            throw new TaoBaoWeiQuanException(3, "红包有误");
         List<HongBaoV2> childList = hongBaoV2Mapper.listChildrenById(hongbaoOrder.getHongBaoV2().getId());
         if (childList != null)
            for (HongBaoV2 child : childList) {
               Long uid = child.getUserInfo().getId();
               if (child.getState() != HongBaoV2.STATE_YILINGQU)
                  continue;
               TaoBaoWeiQuanDrawBack weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper
                     .selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(), child.getUserInfo().getId());
               if (weiQuanDrawBack != null)
                  continue;
               BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, child.getMoney());
               weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
               weiQuanDrawBack.setCreateTime(new Date());
               weiQuanDrawBack.setDrawBackMoney(drawBackMoney);
               weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
               weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
               weiQuanDrawBack.setUser(child.getUserInfo());
               taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);// 加入返还记录
               // 加入邀请补贴返还记录
               doInviteOrderSubsidy(orderId, Constant.SOURCE_TYPE_TAOBAO, uid, settleMent, wqMoney);
               // 如果资金大于0才扣除
               if (drawBackMoney != null && drawBackMoney.compareTo(new BigDecimal(0)) > 0) {
                  // 判断资金是否足够扣款
                  UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
                  if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 资金不足
                  {
                     try {
                        addDebt(uid, child.getId(), drawBackMoney);
                     } catch (UserMoneyDebtException e) {
                        throw new TaoBaoWeiQuanException(101, "资金借贷异常");
                     }
                     continue;
                  }
                  UserMoneyDetail userMoneyDetail = null;
                  // 新版资金记录
                  try {
                     userMoneyDetail = UserMoneyDetailFactory.createInviteWeiQuan(uid, weiQuanDrawBack,
                           drawBackMoney);
                  } catch (UserMoneyDetailException e) {
                     try {
                        LogHelper.errorDetailInfo(e);
                     } catch (Exception e1) {
                        e1.printStackTrace();
                     }
                  }
                  userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
                  // 新版通知
                  userMoneyMsgNotificationService.inviteOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO,
                        drawBackMoney, userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao());
               }
            }
      }
   }
   /**
    * 邀请订单补贴维权处理
    *
    * @param orderId
    * @param sourceType
    */
   private void doInviteOrderSubsidy(String orderId, int sourceType, Long uid, BigDecimal settleMent,
         BigDecimal weiQuanMoney) throws TaoBaoWeiQuanException {
      InviteOrderSubsidy subSidy = inviteOrderSubsidyService.getByOrderNoAndType(uid, orderId, sourceType);
      if (subSidy != null)// 添加借贷关系
      {
         BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, weiQuanMoney, subSidy.getOriginalMoney());
         if (drawBackMoney.compareTo(new BigDecimal(0)) <= 0)
            return;
         InviteOrderSubsidyDebt debt = new InviteOrderSubsidyDebt();
         debt.setBeiZhu("订单维权:" + orderId + "-" + sourceType);
         debt.setOriginMoney(drawBackMoney);
         debt.setUid(uid);
         debt.setCreateTime(new Date());
         try {
            inviteOrderSubsidyDebtService.addDebt(debt);
         } catch (InviteOrderSubsidyDebtException e) {
            throw new TaoBaoWeiQuanException(101, "邀请订单补贴异常");
         }
      }
   }
   @Override
   public TaoBaoWeiQuanDrawBack selectByOrderItemId(String orderItemId) {
      List<TaoBaoWeiQuanDrawBack> list = taoBaoWeiQuanDrawBackMapper.selectByOrderItemId(orderItemId);
      if (list != null && list.size() > 0)
         return list.get(0);
      else
         return null;
   }
   @Override
   public TaoBaoWeiQuanDrawBack selectByHongBaoId(Long hbId) {
      Long uid = null;
      HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKey(hbId);
      uid = hb.getUserInfo().getId();
      if (hb.getParent() != null)
         hb = hb.getParent();
      HongBaoOrder hbo = hongBaoOrderMapper.selectByHongBaoId(hb.getId());
      if (hbo != null && hbo.getCommonOrder() != null) {
         return taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(hbo.getCommonOrder().getTradeId(), uid);
      }
      return null;
   }
}
package com.yeshi.fanli.service.impl.money.tb;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.HongBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanDrawBackMapper;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.money.UserMoneyDebt;
import com.yeshi.fanli.entity.money.UserMoneyDebt.UserMoneyDebtTypeEnum;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.money.UserMoneyDebtException;
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.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;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
@Service
public class TaoBaoWeiQuanDrawBackServiceImpl implements TaoBaoWeiQuanDrawBackService {
    @Resource
    private TaoBaoWeiQuanDrawBackMapper taoBaoWeiQuanDrawBackMapper;
    @Resource
    private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
    @Resource
    private TaoBaoOrderMapper taoBaoOrderMapper;
    @Resource
    private UserInfoMapper userInfoMapper;
    @Resource
    private UserMoneyDetailMapper userMoneyDetailMapper;
    @Resource
    private CommonOrderMapper commonOrderMapper;
    @Resource
    private HongBaoV2Mapper hongBaoV2Mapper;
    @Resource
    private HongBaoOrderMapper hongBaoOrderMapper;
    @Resource
    private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
    @Resource
    private UserMoneyDebtService userMoneyDebtService;
    @Resource
    private UserMoneyService userMoneyService;
    @Resource
    private UserMoneyDetailService userMoneyDetailService;
    @Override
    public void addWeiQuanDrawBack(TaoBaoWeiQuanDrawBack taoBaoWeiQuanDrawBack) {
        taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(taoBaoWeiQuanDrawBack.getOrderItemId(),
                taoBaoWeiQuanDrawBack.getUser().getId());
    }
    @Transactional(rollbackFor = Exception.class)
    private void addDebt(Long uid, Long hbId, BigDecimal money) throws UserMoneyDebtException {
        UserMoneyDebt debt = new UserMoneyDebt();
        debt.setBeiZhu(null);
        debt.setCreateTime(new Date());
        debt.setLeftMoney(money);
        debt.setOriginMoney(money);
        debt.setSourceId(hbId);
        debt.setType(UserMoneyDebtTypeEnum.order);
        debt.setUid(uid);
        userMoneyDebtService.addUserMoneyDebt(debt);
    }
    /**
     * 计算退款金额
     *
     * @param settlement
     * @param wqMoney
     * @param hongBaoMoney
     * @return
     */
    private BigDecimal computeDrawBackMoney(BigDecimal settlement, BigDecimal wqMoney, BigDecimal hongBaoMoney) {
        BigDecimal money = (hongBaoMoney.multiply(wqMoney)).divide(settlement, 2, BigDecimal.ROUND_UP);
        if (money.compareTo(hongBaoMoney) > 0)
            money = hongBaoMoney;
        return money;
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    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 null;
        List<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId);
        if (mainHongBaoList == null || mainHongBaoList.size() == 0)
            return null;
        for (int i = 0; i < mainHongBaoList.size(); i++) {
            // 锁行,防止重复 操作
            HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(mainHongBaoList.get(i).getId());
            mainHongBaoList.set(i, hb);
            // 只处理返利订单
            if (hb.getType() != HongBaoV2.TYPE_ZIGOU) {
                mainHongBaoList.remove(i);
                i--;
            }
        }
        if (mainHongBaoList == null || mainHongBaoList.size() == 0)
            return null;
        // 主用户ID
        Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
        if (mainHongBaoList != null)
            for (HongBaoV2 hongBao : mainHongBaoList) {
                if (hongBao.getState() != HongBaoV2.STATE_YILINGQU)
                    continue;
                // 累计主红包的金额
                if (fanMoneyMap.get(hongBao.getUserInfo().getId()) == null) {
                    fanMoneyMap.put(hongBao.getUserInfo().getId(), hongBao.getMoney());
                } else
                    fanMoneyMap.put(hongBao.getUserInfo().getId(),
                            fanMoneyMap.get(hongBao.getUserInfo().getId()).add(hongBao.getMoney()));
            }
        // 计算每个用户的返利比例
        Iterator<Long> its = fanMoneyMap.keySet().iterator();
        Map<Long, BigDecimal> userSubMoneyMap = new HashMap<>();
        while (its.hasNext()) {
            Long uid = its.next();
            BigDecimal userGetMoney = fanMoneyMap.get(uid);
            BigDecimal wqMoney = new BigDecimal("0");
            // 统计用户在这个单中需要扣除的资金
            TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
            List<TaoBaoWeiQuanDrawBack> newWeiQuanDrawBackList = new ArrayList<>();
            BigDecimal settleMent = new BigDecimal(0);
            for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
                weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
                        uid);
                if (weiQuanDrawBack != null) {
                    weiQuanDrawBack = null;
                    continue;
                }
                // 计算结算金额
                TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
                if (taoBaoOrder == null)
                    throw new TaoBaoWeiQuanException(101, "未找到子订单相关数据");
                if (taoBaoOrder.getSettlement() == null)
                    throw new TaoBaoWeiQuanException(102, "淘宝结算金额为空");
                settleMent = settleMent.add(taoBaoOrder.getSettlement());
                // 退款的资金
                wqMoney = wqMoney.add(weiQuanOrder.getMoney());
                weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
                weiQuanDrawBack.setCreateTime(new Date());
                CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                        weiQuanOrder.getOrderItemId());
                HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
                // 计算退款的资金
                BigDecimal drawBack = null;
                if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null)
                    drawBack = computeDrawBackMoney(commonOrder.getSettlement(), weiQuanOrder.getMoney(),
                            hongBaoOrder.getHongBaoV2().getMoney());
                weiQuanDrawBack.setDrawBackMoney(drawBack);
                weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
                weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
                weiQuanDrawBack.setUser(new UserInfo(uid));
                newWeiQuanDrawBackList.add(weiQuanDrawBack);
            }
            if (wqMoney.compareTo(new BigDecimal("0")) <= 0)
                continue;
            // 插入记录
            for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) {
                taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack);
            }
            // 退款金额
            BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney);
            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;
                }
                UserMoneyDetail userMoneyDetail = null;
                // 新版资金记录
                try {
                    userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, orderId, newWeiQuanDrawBackList, 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);
                // 新版通知
                List<CommonOrder> orderList = commonOrderMapper.listBySourceTypeAndOrderNo(Constant.SOURCE_TYPE_TAOBAO,
                        orderId);
                int goodsCount = 0;
                for (CommonOrder co : orderList) {
                    if (co.getState() != CommonOrder.STATE_SX)
                        goodsCount += co.getCount();
                }
                BigDecimal fanliMoney = new BigDecimal(0);
                List<HongBaoOrder> hongBaoOrderList = hongBaoOrderMapper.listDetailByOrderIdAndSourceType(orderId,
                        Constant.SOURCE_TYPE_TAOBAO);
                for (HongBaoOrder hb : hongBaoOrderList) {
                    fanliMoney = fanliMoney.add(hb.getHongBaoV2().getMoney());
                }
                userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO,
                        drawBackMoney, fanliMoney, goodsCount, orderList.get(0).getThirdCreateTime());
            } else {// 记录资金记录,但是不显示给用户
                UserMoneyDetail userMoneyDetail = null;
                // 新版资金记录
                try {
                    userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, orderId, newWeiQuanDrawBackList, 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, "插入记录生成失败");
                }
            }
        }
        return userSubMoneyMap;
    }
    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<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId);
        if (mainHongBaoList == null || mainHongBaoList.size() == 0)
            return;
        // 主用户ID
        Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
        if (mainHongBaoList != null)
            for (HongBaoV2 hongBao : mainHongBaoList) {// 统计订单下的所有主红包
                hongBao = hongBaoV2Mapper.selectByPrimaryKey(hongBao.getId());
                if (hongBao.getState() != HongBaoV2.STATE_YILINGQU)
                    continue;
                // 只计入分享赚的红包
                if (hongBao.getType() == HongBaoV2.TYPE_SHARE_GOODS) {
                    // 累计主红包的金额
                    if (fanMoneyMap.get(hongBao.getUserInfo().getId()) == null) {
                        fanMoneyMap.put(hongBao.getUserInfo().getId(), hongBao.getMoney());
                    } else
                        fanMoneyMap.put(hongBao.getUserInfo().getId(),
                                fanMoneyMap.get(hongBao.getUserInfo().getId()).add(hongBao.getMoney()));
                }
            }
        Iterator<Long> its = fanMoneyMap.keySet().iterator();
        // 查询和这个订单有关的用户(主订单)
        while (its.hasNext()) {
            Long uid = its.next();
            BigDecimal userGetMoney = fanMoneyMap.get(uid);
            BigDecimal wqMoney = new BigDecimal("0");
            BigDecimal settleMent = new BigDecimal("0");
            // 统计用户在这个单中需要扣除的资金
            TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
            List<TaoBaoWeiQuanDrawBack> newWeiQuanDrawBackList = new ArrayList<>();
            for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
                weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
                        uid);
                if (weiQuanDrawBack != null)
                    continue;
                // 计算结算金额
                TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
                if (taoBaoOrder == null)
                    throw new TaoBaoWeiQuanException(101, "未找到子订单相关数据");
                if (taoBaoOrder.getSettlement() == null)
                    throw new TaoBaoWeiQuanException(102, "淘宝结算金额为空");
                settleMent = settleMent.add(taoBaoOrder.getSettlement());
                // 退款的资金
                wqMoney = wqMoney.add(weiQuanOrder.getMoney());
                // 插入记录
                weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
                weiQuanDrawBack.setCreateTime(new Date());
                // 计算退款资金
                CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                        weiQuanOrder.getOrderItemId());
                HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
                // 计算退款的资金
                BigDecimal drawBack = null;
                if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null)
                    drawBack = computeDrawBackMoney(commonOrder.getSettlement(), weiQuanOrder.getMoney(),
                            hongBaoOrder.getHongBaoV2().getMoney());
                weiQuanDrawBack.setDrawBackMoney(drawBack);
                weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
                weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
                weiQuanDrawBack.setUser(new UserInfo(uid));
                newWeiQuanDrawBackList.add(weiQuanDrawBack);
            }
            if (wqMoney.compareTo(new BigDecimal("0")) <= 0)
                continue;
            // 退款金额
            BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney);
            if (drawBackMoney.compareTo(userGetMoney) > 0)
                drawBackMoney = userGetMoney;
            for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList)
                taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack);
            // 计算资金是否充足
            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());
                        BigDecimal settleMentMoney = taoBaoOrder.getSettlement();
                        CommonOrder co = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                                weiQuanOrder.getOrderItemId());
                        if (co != null) {
                            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId());
                            BigDecimal drawback = computeDrawBackMoney(settleMentMoney, weiQuanOrder.getMoney(),
                                    hongBaoOrder.getHongBaoV2().getMoney());
                            try {
                                addDebt(uid, hongBaoOrder.getHongBaoV2().getId(), drawback);
                            } catch (UserMoneyDebtException e) {
                                throw new TaoBaoWeiQuanException(101, "资金借贷异常");
                            }
                        }
                    }
                }
                continue;
            }
            UserMoneyDetail userMoneyDetail = null;
            // 新版资金记录
            try {
                userMoneyDetail = UserMoneyDetailFactory.createShareWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
            } catch (UserMoneyDetailException e) {
                try {
                    LogHelper.errorDetailInfo(e);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
            userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
            // 新版通知
            List<CommonOrder> orderList = commonOrderMapper.listBySourceTypeAndOrderNo(Constant.SOURCE_TYPE_TAOBAO,
                    orderId);
            int goodsCount = 0;
            for (CommonOrder co : orderList) {
                if (co.getState() != CommonOrder.STATE_SX)
                    goodsCount += co.getCount();
            }
            BigDecimal fanliMoney = new BigDecimal(0);
            List<HongBaoOrder> hongBaoOrderList = hongBaoOrderMapper.listDetailByOrderIdAndSourceType(orderId,
                    Constant.SOURCE_TYPE_TAOBAO);
            for (HongBaoOrder hb : hongBaoOrderList) {
                fanliMoney = fanliMoney.add(hb.getHongBaoV2().getMoney());
            }
            userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
                    fanliMoney, goodsCount, orderList.get(0).getThirdCreateTime());
        }
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void doWeiQuanInvite(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;
        // 查询订单库
        for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
            TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
            BigDecimal wqMoney = weiQuanOrder.getMoney();
            if (taoBaoOrder == null)
                throw new TaoBaoWeiQuanException(1, "来源交易ID有误");
            BigDecimal settleMent = new BigDecimal("0");
            if (taoBaoOrder.getOrderState().equalsIgnoreCase("订单结算")) {
                settleMent = settleMent.add(taoBaoOrder.getSettlement());
            }
            CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
                    weiQuanOrder.getOrderItemId());
            if (commonOrder == null)
                throw new TaoBaoWeiQuanException(2, "订单有误");
            HongBaoOrder hongbaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
            if (hongbaoOrder == null || hongbaoOrder.getHongBaoV2() == null)
                throw new TaoBaoWeiQuanException(3, "红包有误");
            // 查询下级子用户
            List<HongBaoV2> childList = hongBaoV2Mapper.listChildrenById(hongbaoOrder.getHongBaoV2().getId());
            if (childList != null)
                for (HongBaoV2 child : childList) {
                    Long uid = child.getUserInfo().getId();
                    if (child.getState() != HongBaoV2.STATE_YILINGQU)
                        continue;
                    TaoBaoWeiQuanDrawBack weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper
                            .selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(), child.getUserInfo().getId());
                    if (weiQuanDrawBack != null)
                        continue;
                    BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, child.getMoney());
                    weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
                    weiQuanDrawBack.setCreateTime(new Date());
                    weiQuanDrawBack.setDrawBackMoney(drawBackMoney);
                    weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
                    weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
                    weiQuanDrawBack.setUser(child.getUserInfo());
                    taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);// 加入返还记录
                    // 如果资金大于0才扣除
                    if (drawBackMoney != null && drawBackMoney.compareTo(new BigDecimal(0)) > 0) {
                        // 判断资金是否足够扣款
                        UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
                        if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 资金不足
                        {
                            try {
                                addDebt(uid, child.getId(), drawBackMoney);
                            } catch (UserMoneyDebtException e) {
                                throw new TaoBaoWeiQuanException(101, "资金借贷异常");
                            }
                            continue;
                        }
                        UserMoneyDetail userMoneyDetail = null;
                        // 新版资金记录
                        try {
                            userMoneyDetail = UserMoneyDetailFactory.createInviteWeiQuan(uid, weiQuanDrawBack,
                                    drawBackMoney);
                        } catch (UserMoneyDetailException e) {
                            try {
                                LogHelper.errorDetailInfo(e);
                            } catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        }
                        userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
                    }
                }
        }
    }
    @Override
    public TaoBaoWeiQuanDrawBack selectByOrderItemId(String orderItemId) {
        List<TaoBaoWeiQuanDrawBack> list = taoBaoWeiQuanDrawBackMapper.selectByOrderItemId(orderItemId);
        if (list != null && list.size() > 0)
            return list.get(0);
        else
            return null;
    }
    @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);
        uid = hb.getUserInfo().getId();
        if (hb.getParent() != null)
            hb = hb.getParent();
        HongBaoOrder hbo = hongBaoOrderMapper.selectByHongBaoId(hb.getId());
        if (hbo != null && hbo.getCommonOrder() != null) {
            return taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(hbo.getCommonOrder().getTradeId(), uid);
        }
        return null;
    }
}