admin
2018-12-25 4cb15e222cd7d099d533ccbeb7f9a8cd99bf180c
fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoWeiQuanDrawBackServiceImpl.java
@@ -15,21 +15,26 @@
import com.yeshi.fanli.dao.mybatis.AccountDetailsMapper;
import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
import com.yeshi.fanli.dao.mybatis.hongbao.HongBaoMapper;
import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanDrawBackMapper;
import com.yeshi.fanli.entity.bus.user.AccountDetails;
import com.yeshi.fanli.entity.bus.user.HongBao;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
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.TaoBaoWeiQuanException;
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.taobao.TaoBaoWeiQuanDrawBackService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoWeiQuanOrderService;
import com.yeshi.fanli.service.inter.user.UserNotificationService;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.factory.AccountDetailsFactory;
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
@Service
public class TaoBaoWeiQuanDrawBackServiceImpl implements TaoBaoWeiQuanDrawBackService {
@@ -47,6 +52,9 @@
   @Resource
   private UserInfoMapper userInfoMapper;
   @Resource
   private UserMoneyDetailMapper userMoneyDetailMapper;
   @Resource
   private AccountDetailsMapper accountDetailsMapper;
@@ -114,9 +122,10 @@
         BigDecimal userGetMoney = fanMoneyMap.get(uid);
         BigDecimal fanMoney = new BigDecimal("0");
         // 统计用户在这个单中需要扣除的资金
         TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
         for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
            TaoBaoWeiQuanDrawBack weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper
                  .selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(), uid);
            weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
                  uid);
            if (weiQuanDrawBack != null)
               continue;
            // 退款的资金
@@ -142,10 +151,25 @@
         AccountDetails accountDetails = AccountDetailsFactory.create("-" + drawBackMoney,
               AccountDetailsFactory.SHARE_GOODS_DRAWBACK, null, null, new UserInfo(uid));
         accountDetailsMapper.insertSelective(accountDetails);
         // 新版资金记录
         try {
            UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack,
                  drawBackMoney);
            userMoneyDetail.setId(accountDetails.getId());
            userMoneyDetailMapper.insert(userMoneyDetail);
         } catch (UserMoneyDetailException e) {
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
            }
         }
         userNotificationService.weiQuanFanli(uid, orderId, drawBackMoney);
      }
   }
   @Transactional
   @Override
   public void doWeiQuanShare(String orderId) throws TaoBaoWeiQuanException {
      if (StringUtil.isNullOrEmpty(orderId))
@@ -204,9 +228,10 @@
         BigDecimal userGetMoney = fanMoneyMap.get(uid);
         BigDecimal fanMoney = new BigDecimal("0");
         // 统计用户在这个单中需要扣除的资金
         TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
         for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
            TaoBaoWeiQuanDrawBack weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper
                  .selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(), uid);
            weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
                  uid);
            if (weiQuanDrawBack != null)
               continue;
            // 退款的资金
@@ -232,6 +257,129 @@
         AccountDetails accountDetails = AccountDetailsFactory.create("-" + drawBackMoney,
               AccountDetailsFactory.SHARE_GOODS_DRAWBACK, null, null, new UserInfo(uid));
         accountDetailsMapper.insertSelective(accountDetails);
         // 新版资金记录
         try {
            UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createShareWeiQuan(uid, weiQuanDrawBack,
                  drawBackMoney);
            userMoneyDetail.setId(accountDetails.getId());
            userMoneyDetailMapper.insert(userMoneyDetail);
         } catch (UserMoneyDetailException e) {
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
            }
         }
         userNotificationService.weiQuanTiCheng(uid, orderId, drawBackMoney);
      }
   }
   @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;
      // 查询订单库
      List<TaoBaoOrder> orderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
      // 计算淘宝联盟返给平台的资金
      BigDecimal sumFee = new BigDecimal("0");
      for (TaoBaoOrder order : orderList)
         if (order.getOrderState().equalsIgnoreCase("订单结算"))
            sumFee = sumFee.add(order.geteIncome());
      // 获取和该订单号有关联的用户
      // 获取主红包(同一个订单号的单只会对应同一个用户)
      List<HongBao> mainHongBaoList = hongBaoMapper.selectByOrderIdWithoutChild(orderId);
      if (mainHongBaoList == null || mainHongBaoList.size() == 0)
         return;
      // 主用户ID
      Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
      if (mainHongBaoList != null)
         for (HongBao hongBao : mainHongBaoList) {
            if (hongBao.getState() == HongBao.STATE_SHIXIAO)
               continue;
            // 返利红包不计入
            if (hongBao.getType() != HongBao.TYPE_TAOBAO) {
               // 累计主红包的金额
               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()));
            }
            // 累计子红包的金额
            List<HongBao> childHongBaoList = hongBaoMapper.selectChildHongBaoByPid(hongBao.getId());
            if (childHongBaoList != null)
               for (HongBao child : childHongBaoList) {
                  if (child.getState() == HongBao.STATE_SHIXIAO)
                     continue;
                  if (fanMoneyMap.get(child.getUserInfo().getId()) == null) {
                     fanMoneyMap.put(child.getUserInfo().getId(), child.getMoney());
                  } else
                     fanMoneyMap.put(child.getUserInfo().getId(),
                           fanMoneyMap.get(child.getUserInfo().getId()).add(child.getMoney()));
               }
         }
      // 计算每个用户的返利比例
      Iterator<Long> its = fanMoneyMap.keySet().iterator();
      while (its.hasNext()) {
         Long uid = its.next();
         BigDecimal userGetMoney = fanMoneyMap.get(uid);
         BigDecimal fanMoney = new BigDecimal("0");
         // 统计用户在这个单中需要扣除的资金
         TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
         for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
            weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
                  uid);
            if (weiQuanDrawBack != null)
               continue;
            // 退款的资金
            fanMoney = fanMoney.add(weiQuanOrder.getFanMoney());
            // 插入记录
            weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
            weiQuanDrawBack.setCreateTime(new Date());
            // TODO 暂时设为0
            weiQuanDrawBack.setDrawBackMoney(new BigDecimal(0));
            weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
            weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
            weiQuanDrawBack.setUser(new UserInfo(uid));
            taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);
         }
         if (fanMoney.compareTo(new BigDecimal("0")) <= 0)
            continue;
         // 退款金额
         BigDecimal drawBackMoney = MoneyBigDecimalUtil.div(userGetMoney.multiply(fanMoney), sumFee);
         userInfoMapper.subHongBaoByUid(uid, drawBackMoney);
         // 添加资金记录
         AccountDetails accountDetails = AccountDetailsFactory.create("-" + drawBackMoney,
               AccountDetailsFactory.SHARE_GOODS_DRAWBACK, null, null, new UserInfo(uid));
         accountDetailsMapper.insertSelective(accountDetails);
         // 新版资金记录
         try {
            UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createInviteWeiQuan(uid, weiQuanDrawBack,
                  drawBackMoney);
            userMoneyDetail.setId(accountDetails.getId());
            userMoneyDetailMapper.insert(userMoneyDetail);
         } catch (UserMoneyDetailException e) {
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
            }
         }
         //
         userNotificationService.weiQuanTiCheng(uid, orderId, drawBackMoney);
      }