admin
2019-07-11 3824cbcaec6e6c67418d5280a53e9c2fedeef6f9
fanli/src/main/java/com/yeshi/fanli/service/impl/tlj/UserTaoLiJinRecordServiceImpl.java
@@ -24,20 +24,26 @@
import com.yeshi.fanli.entity.bus.user.UserMoneyExtra;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.taobao.TaoKeAppInfo;
import com.yeshi.fanli.exception.taobao.TaoKeApiException;
import com.yeshi.fanli.exception.tlj.UserTaoLiJinRecordException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.goods.CommonGoodsService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService;
import com.yeshi.fanli.service.inter.msg.UserOtherMsgNotificationService;
import com.yeshi.fanli.service.inter.taobao.ShareHotGoodsService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoBuyRelationMapService;
import com.yeshi.fanli.service.inter.tlj.ConfigTaoLiJinService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinDetailService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinOriginService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinRecordService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinReportService;
import com.yeshi.fanli.service.inter.user.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserMoneyExtraService;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TaoBaoConstant;
import com.yeshi.fanli.util.factory.CommonGoodsFactory;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
@@ -84,11 +90,22 @@
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
   @Resource
   private TaoBaoBuyRelationMapService taoBaoBuyRelationMapService;
   @Resource
   private ShareHotGoodsService shareHotGoodsService;
   @Override
   public UserTaoLiJinRecord selectByPrimaryKey(Long id) {
      return userTaoLiJinRecordMapper.selectByPrimaryKey(id);
   }
   @Transactional
   @Override
   public UserTaoLiJinRecord createSelfBuyTaoLiJin(Long uid, int totalNum, TaoBaoGoodsBrief goods)
         throws UserTaoLiJinRecordException {
@@ -115,16 +132,40 @@
      // 新人红包 自购一元
      BigDecimal perface = new BigDecimal(1);
      String pid = TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT;
      if (goods.getMaterialLibType() == null || goods.getMaterialLibType() == 0)
         pid = TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID;
      return createUserTaoLiJin(1, uid, goods.getAuctionId(), perface, 1, name, sendStartTime, sendEndTime, null,
            useEndTime, pid);
      if (goods.getMaterialLibType() == null || goods.getMaterialLibType() == 0) {// 非返利库商品
         String relationId = null;
         try {
            relationId = taoBaoBuyRelationMapService.getRelationId(uid);
         } catch (Exception e) {
            LogHelper.errorDetailInfo(e, "uid:" + uid, null);
         }
         if (StringUtil.isNullOrEmpty(relationId)) {
            throw new UserTaoLiJinRecordException(101, "渠道未备案");
         }
         UserTaoLiJinRecord record = createUserTaoLiJin(1, uid, goods.getAuctionId(), perface, 1, name,
               sendStartTime, sendEndTime, null, useEndTime, TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID);
         record.setSendUrl(record.getSendUrl() + "&relationId=" + relationId);
         UserTaoLiJinRecord updateRecoed=new UserTaoLiJinRecord();
         updateRecoed.setId(record.getId());
         updateRecoed.setSendUrl(record.getSendUrl());
         userTaoLiJinRecordMapper.updateByPrimaryKeySelective(record);
         return record;
      } else {// 返利库商品
         return createUserTaoLiJin(1, uid, goods.getAuctionId(), perface, 1, name, sendStartTime, sendEndTime, null,
               useEndTime, TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT);
      }
   }
   @Transactional
   @Override
   public UserTaoLiJinRecord createShareTaoLiJin(Long uid, int totalNum, TaoBaoGoodsBrief goods)
         throws UserTaoLiJinRecordException {
      String relationId = userExtraTaoBaoInfoService.getRelationIdByUid(uid);
      if (StringUtil.isNullOrEmpty(relationId))
         throw new UserTaoLiJinRecordException(101, "渠道未授权");
      Date date = new Date();
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      SimpleDateFormat formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -164,37 +205,75 @@
         perface = TaoLiJinUtil.getSpreadMoney(warningRate, goods);
      }
      return createUserTaoLiJin(2, uid, goods.getAuctionId(), perface, totalNum, name, sendStartTime, sendEndTime,
            null, useEndTime, TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT);
      UserTaoLiJinRecord record = createUserTaoLiJin(2, uid, goods.getAuctionId(), perface, totalNum, name,
            sendStartTime, sendEndTime, null, useEndTime, TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT);
      String sendUrl = record.getSendUrl() + "&relationId=" + relationId;
      record.setSendUrl(sendUrl);
      UserTaoLiJinRecord updateRecoed=new UserTaoLiJinRecord();
      updateRecoed.setId(record.getId());
      updateRecoed.setSendUrl(sendUrl);
      userTaoLiJinRecordMapper.updateByPrimaryKeySelective(record);
      return record;
   }
   @Override
   @Transactional
   public UserTaoLiJinRecord createUserTaoLiJin(int origin, Long uid, Long auctionId, BigDecimal perface, int totalNum, String name,
         Date sendStartTime, Date sendEndTime, Date useStartTime, Date useEndTime,String pid) throws UserTaoLiJinRecordException{
   public UserTaoLiJinRecord createUserTaoLiJin(int origin, Long uid, Long auctionId, BigDecimal perface, int totalNum,
         String name, Date sendStartTime, Date sendEndTime, Date useStartTime, Date useEndTime, String pid)
         throws UserTaoLiJinRecordException {
      // 用户剩余可以淘礼金验证
      UserMoneyExtra userMoneyExtra = userMoneyExtraService.selectByPrimaryKey(uid);
      if (userMoneyExtra == null || userMoneyExtra.getTlj() == null) {
         throw new UserTaoLiJinRecordException(101, "红包余额不足");
      }
      // 过期
      userTaoLiJinOriginService.overdueHongBao(uid);
      BigDecimal tlj = userMoneyExtra.getTlj();
      // 总推广红包
      BigDecimal totalMoney = MoneyBigDecimalUtil.mul(perface, new BigDecimal(totalNum));
      if (totalMoney.compareTo(tlj) > 0) {
         throw new UserTaoLiJinRecordException(101, "红包余额不足");
      // 自购时的红包余额
      if (origin == 1) {
         BigDecimal tljSelf = userMoneyExtra.getTljSelf();
         if (tljSelf == null || tljSelf.compareTo(totalMoney) < 0) {
            throw new UserTaoLiJinRecordException(101, "自购红包余额不足");
         }
      }
      // 分享时的红包余额
      BigDecimal tlj = userMoneyExtra.getTlj();
      if (tlj == null || tlj.compareTo(totalMoney) < 0) {
         throw new UserTaoLiJinRecordException(101, "分享红包余额不足");
      }
      
      // 创建淘礼金红包
      TaoLiJinDTO taoLiJinDTO = TaoKeApiUtil.createTaoLiJin(auctionId, name, perface, totalNum, sendStartTime, sendEndTime, useStartTime, useEndTime, pid);
      if (taoLiJinDTO == null) {
         throw new UserTaoLiJinRecordException(101, "红包创建失败");
      TaoLiJinDTO taoLiJinDTO = null;
      try {
         taoLiJinDTO = TaoKeApiUtil.createTaoLiJin(auctionId, name, perface, totalNum, sendStartTime,
               sendEndTime, useStartTime, useEndTime,   new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET, pid));
      } catch (TaoKeApiException e) {
         LogHelper.errorDetailInfo(e);
         executor.execute(new Runnable() {
            @Override
            public void run() {
               if (e.getCode() == TaoKeApiException.CODE_TLJ_FORBIDDEN) {
                  // 该商品不支持创建淘礼金红包
                  shareHotGoodsService.deleteByGoodsId(auctionId);
               } else if (e.getCode() == TaoKeApiException.CODE_TLJ_NO_MONEY) {
                  // 官方玩法钱包余额不足  TODO
               }
            }
         });
      }
      
      //  保存记录
      if (taoLiJinDTO == null) {
         throw new UserTaoLiJinRecordException(101, "淘宝API推广红包创建失败");
      }
      // 保存记录
      UserTaoLiJinRecord record = new UserTaoLiJinRecord();
      record.setUid(uid);
      record.setGoodsId(auctionId);
@@ -208,18 +287,27 @@
      record.setRightsId(taoLiJinDTO.getRightsId());
      record.setSendUrl(taoLiJinDTO.getSendUrl());
      record.setCreateTime(new Date());
      userTaoLiJinRecordMapper.insertSelective(record);
      if (origin == 1) { //  自购
         record.setUseType(1);
      } else { //  分享
         record.setUseType(2);
      }
      
      // 剩余淘礼金
      BigDecimal surplusTlj = MoneyBigDecimalUtil.sub(tlj, totalMoney);
      userTaoLiJinRecordMapper.insertSelective(record);
      BigDecimal surplusTlj = MoneyBigDecimalUtil.sub(tlj, totalMoney);
      UserMoneyExtra updateExtra = new UserMoneyExtra();
      updateExtra.setUid(uid);
      if (origin == 1) { // 剩余淘礼金-- 自购
         updateExtra.setTljSelf(MoneyBigDecimalUtil.sub(userMoneyExtra.getTljSelf(), totalMoney));
      }
      updateExtra.setTlj(surplusTlj);
      updateExtra.setUpdateTime(new Date());
      userMoneyExtraService.updateByPrimaryKeySelective(updateExtra);
      record.setSurplusMoney(surplusTlj);
      // 异步
      String rightsId = taoLiJinDTO.getRightsId();
      executor.execute(new Runnable() {
@@ -237,30 +325,29 @@
            } catch (Exception e) {
               LogHelper.errorDetailInfo(e);
            }
            // 成功使用红包
            try {
               BigDecimal total = totalMoney;
               BigDecimal lastMoney = null;
               BigDecimal zero = new BigDecimal(0);
               // 修改余额
               List<UserTaoLiJinOrigin> list = userTaoLiJinOriginService.getSurplusLiJin(uid);
               if (list != null && list.size() > 0) {
                  for (UserTaoLiJinOrigin taoLiJinOrigin: list) {
                     if (total.compareTo(zero) < 1 ) {
                  for (UserTaoLiJinOrigin taoLiJinOrigin : list) {
                     if (total.compareTo(zero) < 1) {
                        break;
                     }
                     BigDecimal moneySurplus = taoLiJinOrigin.getMoneySurplus();
                     lastMoney = total;
                     total = MoneyBigDecimalUtil.sub(total, moneySurplus);
                     if (total.compareTo(zero) >= 0 ) {
                     if (total.compareTo(zero) >= 0) {
                        moneySurplus = zero;
                     } else {
                        moneySurplus = MoneyBigDecimalUtil.sub(moneySurplus, lastMoney);
                     }
                     UserTaoLiJinOrigin usertlj = new UserTaoLiJinOrigin();
                     usertlj.setId(taoLiJinOrigin.getId());
                     usertlj.setMoneySurplus(moneySurplus);
@@ -271,25 +358,7 @@
            } catch (Exception e) {
               LogHelper.errorDetailInfo(e);
            }
            // 使用成功消息
            try {
               String beizhu = "未被领取/使用的部分将会退回";
               SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd hh.mm");
               String time = sd.format(new Date());
               MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
               content.setState("红包扣除");
               content.setSource(time + " 创建的分享记录");
               content.setMoney(totalMoney);
               userOtherMsgNotificationService.taoLiJinMsg(uid, beizhu, content);
            } catch (Exception e) {
               LogHelper.errorDetailInfo(e);
            }
            // 创建报告
            try {
               userTaoLiJinReportService.insertDefault(rightsId);
@@ -297,9 +366,32 @@
               LogHelper.errorDetailInfo(e);
            }
            
            if (origin == 1) {
               return; //  自购不推送消息
            }
            // 使用成功消息
            try {
               String beizhu = "未被领取/使用的部分将会退回";
               SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd hh.mm");
               String time = sd.format(new Date());
               MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
               content.setState("红包扣除");
               content.setSource(time + " 创建的分享记录");
               content.setMoney(totalMoney);
               userOtherMsgNotificationService.taoLiJinMsg(uid, beizhu, content);
            } catch (Exception e) {
               LogHelper.errorDetailInfo(e);
            }
            // 检测商品是否存在
            try {
               CommonGoods commonGoods = commonGoodsService.getCommonGoodsByGoodsIdAndGoodsType(auctionId, CommonGoods.GOODS_TYPE_TB);
               CommonGoods commonGoods = commonGoodsService.getCommonGoodsByGoodsIdAndGoodsType(auctionId,
                     CommonGoods.GOODS_TYPE_TB);
               if (commonGoods == null) {
                  TaoBaoGoodsBrief taoBaoGoodsBrief = redisManager.getTaoBaoGoodsBrief(auctionId);
                  if (taoBaoGoodsBrief != null) {
@@ -311,7 +403,7 @@
            }
         }
      });
      return record;
   }
@@ -364,10 +456,9 @@
         // 计算分享奖金
         BigDecimal shareMoney = new BigDecimal(0);
         BigDecimal commission = userTaoLiJinRecordVO.getCommission();
         if (commission != null && commission.compareTo(shareMoney) > 1) {
         if (commission != null && commission.compareTo(shareMoney) > 0) {
            BigDecimal shareRate = hongBaoManageService.getShareRate();
            shareMoney = MoneyBigDecimalUtil.mul(MoneyBigDecimalUtil.mul(commission, new BigDecimal("0.01")),
                  MoneyBigDecimalUtil.div(shareRate, new BigDecimal(100)));
            shareMoney = MoneyBigDecimalUtil.mul(commission, MoneyBigDecimalUtil.div(shareRate, new BigDecimal(100)));
            shareMoney = BigDecimalUtil.getWithNoZera(shareMoney);
         }
@@ -386,6 +477,12 @@
   }
   @Override
   public long countShareRecordByUid(Long uid) {
      return userTaoLiJinRecordMapper.countShareRecordByUid(uid);
   }
   @Override
   public long countTodayNum(Long uid) {
      return userTaoLiJinRecordMapper.countTodayNum(uid);
   }