yujian
2020-01-18 f4a0f2acc63d7785eab108419a4e16f5f688cb95
fanli/src/main/java/com/yeshi/fanli/service/impl/tlj/UserTaoLiJinRecordServiceImpl.java
@@ -27,15 +27,18 @@
import com.yeshi.fanli.entity.bus.user.TokenRecord.TokenTypeEnum;
import com.yeshi.fanli.entity.bus.user.UserMoneyExtra;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
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.TaoLiJinCreateException;
import com.yeshi.fanli.exception.tlj.UserTaoLiJinRecordException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.goods.CommonGoodsService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService;
import com.yeshi.fanli.service.inter.money.UserMoneyExtraService;
import com.yeshi.fanli.service.inter.msg.UserOtherMsgNotificationService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.taobao.ShareHotGoodsService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoBuyRelationMapService;
import com.yeshi.fanli.service.inter.tlj.ConfigTaoLiJinService;
@@ -45,16 +48,16 @@
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinRecordService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinReportService;
import com.yeshi.fanli.service.inter.user.TokenRecordService;
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.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.util.Constant;
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.account.UserUtil;
import com.yeshi.fanli.util.TokenUtil;
import com.yeshi.fanli.util.factory.CommonGoodsFactory;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import com.yeshi.fanli.util.taobao.TaoLiJinUtil;
import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
@@ -68,7 +71,7 @@
   @Resource
   private RedisManager redisManager;
   @Resource
   private ConfigService configService;
@@ -110,23 +113,21 @@
   @Resource
   private ShareHotGoodsService shareHotGoodsService;
   @Resource
   private TokenRecordService tokenRecordService;
   @Resource
   private UserTaoLiJinGiveRecordService userTaoLiJinGiveRecordService;
   @Override
   public UserTaoLiJinRecord selectByPrimaryKey(Long id) {
      return userTaoLiJinRecordMapper.selectByPrimaryKey(id);
   }
   @Transactional
   @Transactional(rollbackFor=Exception.class)
   @Override
   public UserTaoLiJinRecord createSelfBuyTaoLiJin(Long uid, int totalNum, TaoBaoGoodsBrief goods)
   public UserTaoLiJinRecord createSelfBuyTaoLiJin(Long uid, BigDecimal couplePrice, TaoBaoGoodsBrief goods)
         throws UserTaoLiJinRecordException {
      Date date = new Date();
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@@ -148,10 +149,8 @@
      } catch (ParseException e2) {
         e2.printStackTrace();
      }
      // 新人红包 自购一元
      BigDecimal perface = new BigDecimal(1);
      if (goods.getMaterialLibType() == null || goods.getMaterialLibType() == 0) {// 非返利库商品
      if (!TaoBaoUtil.isSpecialGoods(goods.getMaterialLibType())) {// 非返利库商品
         String relationId = null;
         try {
            relationId = taoBaoBuyRelationMapService.getRelationId(uid);
@@ -162,22 +161,22 @@
         if (StringUtil.isNullOrEmpty(relationId)) {
            throw new UserTaoLiJinRecordException(101, "渠道未备案");
         }
         UserTaoLiJinRecord record = createUserTaoLiJin(1, uid, goods.getAuctionId(), perface, 1, name,
         UserTaoLiJinRecord record = createUserTaoLiJin(1, uid, goods.getAuctionId(), couplePrice, 1, name,
               sendStartTime, sendEndTime, null, useEndTime, TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID);
         record.setSendUrl(record.getSendUrl() + "&relationId=" + relationId);
         UserTaoLiJinRecord updateRecoed=new UserTaoLiJinRecord();
         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,
         return createUserTaoLiJin(1, uid, goods.getAuctionId(), couplePrice, 1, name, sendStartTime, sendEndTime, null,
               useEndTime, TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT);
      }
   }
   @Transactional
   @Transactional(rollbackFor=Exception.class)
   @Override
   public UserTaoLiJinRecord createShareTaoLiJin(Long uid, int totalNum, TaoBaoGoodsBrief goods)
         throws UserTaoLiJinRecordException {
@@ -220,7 +219,7 @@
         perface = new BigDecimal(1);
      } else {
         // 计算推广红包
         String warningRate = configTaoLiJinService.getValueByKey("warning_value",new Date());
         String warningRate = configTaoLiJinService.getValueByKey("warning_value", new Date());
         perface = TaoLiJinUtil.getSpreadMoney(warningRate, goods);
      }
@@ -228,7 +227,7 @@
            sendStartTime, sendEndTime, null, useEndTime, TaoBaoConstant.TAOBAO_TLJ_RELATION_PID_DEFAULT);
      String sendUrl = record.getSendUrl() + "&relationId=" + relationId;
      record.setSendUrl(sendUrl);
      UserTaoLiJinRecord updateRecoed=new UserTaoLiJinRecord();
      UserTaoLiJinRecord updateRecoed = new UserTaoLiJinRecord();
      updateRecoed.setId(record.getId());
      updateRecoed.setSendUrl(sendUrl);
      userTaoLiJinRecordMapper.updateByPrimaryKeySelective(record);
@@ -236,7 +235,7 @@
   }
   @Override
   @Transactional
   @Transactional(rollbackFor=Exception.class)
   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 {
@@ -249,45 +248,46 @@
      // 过期 -取消收回
      // userTaoLiJinOriginService.overdueHongBao(uid);
      // 总推广红包
      BigDecimal totalMoney = MoneyBigDecimalUtil.mul(perface, new BigDecimal(totalNum));
      // 自购时的红包余额
      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 = 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) {
         taoLiJinDTO = TaoKeApiUtil.createTaoLiJin(auctionId, name, perface, totalNum, sendStartTime, sendEndTime,
               useStartTime, useEndTime,
               new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET, pid));
      } catch (TaoLiJinCreateException e) {
         LogHelper.errorDetailInfo(e);
         executor.execute(new Runnable() {
            @Override
            public void run() {
               if (e.getCode() == TaoKeApiException.CODE_TLJ_FORBIDDEN) {
               if (e.getCode() == TaoLiJinCreateException.CODE_TLJ_FORBIDDEN) {
                  // 该商品不支持创建淘礼金红包
                  shareHotGoodsService.deleteByGoodsId(auctionId);
               } else if (e.getCode() == TaoKeApiException.CODE_TLJ_NO_MONEY) {
                  // 官方玩法钱包余额不足  TODO
               } else if (e.getCode() == TaoLiJinCreateException.CODE_TLJ_NO_MONEY) {
                  // 官方玩法钱包余额不足 TODO
               }
            }
         });
      } catch (TaoKeApiException e1) {
      }
      if (taoLiJinDTO == null) {
         throw new UserTaoLiJinRecordException(101, "淘宝API推广红包创建失败");
      }
@@ -306,21 +306,21 @@
      record.setRightsId(taoLiJinDTO.getRightsId());
      record.setSendUrl(taoLiJinDTO.getSendUrl());
      record.setCreateTime(new Date());
      if (origin == 1) { //  自购
      if (origin == 1) { // 自购
         record.setUseType(1);
      } else { //  分享
      } else { // 分享
         record.setUseType(2);
      }
      userTaoLiJinRecordMapper.insertSelective(record);
      BigDecimal surplusTlj = MoneyBigDecimalUtil.sub(tlj, totalMoney);
      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);
@@ -384,17 +384,15 @@
            } catch (Exception e) {
               LogHelper.errorDetailInfo(e);
            }
            if (origin == 1) {
               return; //  自购不推送消息
            if (origin == 1) {
               return; // 自购不推送消息
            }
            // 使用成功消息
            try {
               String beizhu = "未被领取或领取后未使用部分退回";
               SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH.mm");
               SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm");
               String time = sd.format(new Date());
               MsgOtherTaoLiJinContentDTO content = new MsgOtherTaoLiJinContentDTO();
               content.setState("红包扣除");
@@ -476,7 +474,8 @@
         BigDecimal commission = userTaoLiJinRecordVO.getCommission();
         if (commission != null && commission.compareTo(shareMoney) > 0) {
            BigDecimal shareRate = hongBaoManageService.getShareRate();
            shareMoney = MoneyBigDecimalUtil.mul(commission, MoneyBigDecimalUtil.div(shareRate, new BigDecimal(100)));
            shareMoney = MoneyBigDecimalUtil.mul(commission,
                  MoneyBigDecimalUtil.div(shareRate, new BigDecimal(100)));
            shareMoney = BigDecimalUtil.getWithNoZera(shareMoney);
         }
@@ -498,8 +497,7 @@
   public long countShareRecordByUid(Long uid) {
      return userTaoLiJinRecordMapper.countShareRecordByUid(uid);
   }
   @Override
   public long countTodayNum(Long uid) {
      return userTaoLiJinRecordMapper.countTodayNum(uid);
@@ -514,93 +512,65 @@
   public UserTaoLiJinRecord getByRightsId(String rightsId) {
      return userTaoLiJinRecordMapper.getByRightsId(rightsId);
   }
   @Override
   public String giveTaolijin(Long uid, BigDecimal amount) throws UserTaoLiJinRecordException{
      if (uid == null || amount == null)
         throw new UserTaoLiJinRecordException(1,"参数不正确");
   public String giveTaolijin(Long uid, BigDecimal amount) throws UserTaoLiJinRecordException {
      if (uid == null || amount == null)
         throw new UserTaoLiJinRecordException(1, "参数不正确");
      String giveMin = configTaoLiJinService.getValueByKey("give_min_amount");
      if (amount.compareTo(new BigDecimal(giveMin)) < 0)
         throw new UserTaoLiJinRecordException(1,"赠送推广红包金额至少" + giveMin + "元");
         throw new UserTaoLiJinRecordException(1, "赠送推广红包金额至少" + giveMin + "元");
      // 用户剩余可以淘礼金验证
      UserMoneyExtra userMoneyExtra = userMoneyExtraService.selectByPrimaryKey(uid);
      if (userMoneyExtra == null || userMoneyExtra.getTlj() == null)
         throw new UserTaoLiJinRecordException(1, "红包余额不足");
      BigDecimal tlj = userMoneyExtra.getTlj();
      if (amount.compareTo(tlj) > 0)
         throw new UserTaoLiJinRecordException(1, "红包余额不足");
      Long giveId = null;
      Date nowDate = new Date();
      try {
         String endDay = DateUtil.plusDay(Constant.GIVE_DAYS - 1, nowDate);
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         Date endTime = format.parse(endDay);
         // 赠送记录
         UserTaoLiJinGiveRecord giveRecord = new UserTaoLiJinGiveRecord();
         giveRecord.setAmount(amount);
         giveRecord.setGiveUid(uid);
         giveRecord.setState(UserTaoLiJinGiveRecord.STATE_INIT);
         giveRecord.setGiveTime(nowDate);
         giveRecord.setEndTime(endTime);
         userTaoLiJinGiveRecordService.insertSelective(giveRecord);
         giveId = giveRecord.getId();
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
         throw new UserTaoLiJinRecordException(1, "赠送记录创建失败");
      }
      String token = null;
      for (int i = 0; i < 5; i++) {
         try {
            // TODO 口令生成规则待定
            long num = 10000 + (long) (Math.random() * 10000);
            token = UserUtil.getInviteCode(num);
            String endDay = DateUtil.plusDay(Constant.TOKEN_DAYS - 1,nowDate);
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date endTime = format.parse(endDay);
            TokenRecord tokenRecord = new TokenRecord();
            tokenRecord.setUid(uid);
            tokenRecord.setIdentify(giveId + ""); // 记录id
            tokenRecord.setType(TokenTypeEnum.taoLiJin);
            tokenRecord.setStartTime(nowDate);
            tokenRecord.setEndTime(endTime);
            tokenRecord.setToken(token);
            tokenRecord.setState(0);
            tokenRecordService.insertSelective(tokenRecord);
         } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
            token = null;
         }
         if(!StringUtil.isNullOrEmpty(token)) {
            break;
         }
      }
      if(StringUtil.isNullOrEmpty(token))
         throw new UserTaoLiJinRecordException(1, "口令生成失败");
      // 赠送记录
      UserTaoLiJinGiveRecord giveRecord = new UserTaoLiJinGiveRecord();
      giveRecord.setAmount(amount);
      giveRecord.setGiveUid(uid);
      giveRecord.setState(UserTaoLiJinGiveRecord.STATE_INIT);
      giveRecord.setGiveTime(nowDate);
      giveRecord.setEndTime(DateUtil.plusDayDate(Constant.GIVE_DAYS, new Date()));
      userTaoLiJinGiveRecordService.insertSelective(giveRecord);
      // 口令记录
      TokenRecord tokenRecord = new TokenRecord();
      tokenRecord.setUid(uid);
      tokenRecord.setIdentify(giveRecord.getId() + "");
      tokenRecord.setType(TokenTypeEnum.taoLiJin);
      tokenRecord.setStartTime(nowDate);
      tokenRecord.setEndTime(DateUtil.plusDayDate(Constant.TOKEN_DAYS, new Date()));
      tokenRecord.setState(0);
      tokenRecordService.insertSelective(tokenRecord);
      // 创建口令
      String token = TokenUtil.createToken(tokenRecord.getId());
      tokenRecord.setToken(token);
      tokenRecordService.updateByPrimaryKeySelective(tokenRecord);
      // 更新余额
      UserMoneyExtra updateExtra = new UserMoneyExtra();
      updateExtra.setUid(uid);
      updateExtra.setTlj(MoneyBigDecimalUtil.sub(tlj, amount));
      updateExtra.setUpdateTime(new Date());
      userMoneyExtraService.updateByPrimaryKeySelective(updateExtra);
      String tips = "送给你[%s]元推广红包快去领取吧,复制本条消息[&%s&],打开[返利券]App领取,用推广分享爆款商品,成单率更高哦。\r\n"
             + "----------------------------\r\n"
             + "下载[返利券]App链接:%s\r\n"
             + "PS:口令将会24小时内失效,请及时领取。";
      tips = String.format(tips, amount, token, configService.get("app_down_link"));
      String tips = configTaoLiJinService.getValueByKey("give_taolijin_tips");
      String projectChineseName = Constant.systemCommonConfig.getProjectChineseName();
      while (tips.contains("{APP名称}")) {
         tips = tips.replace("{APP名称}", projectChineseName);
      }
      tips = tips.replace("{口令}", token).replace("{下载链接}", configService.get(ConfigKeyEnum.appDownLink.getKey())).replace("{面额}",
            amount.setScale(0).toString());
      executor.execute(new Runnable() {
         @Override
         public void run() {
@@ -650,9 +620,8 @@
            }
         }
      });
      return tips;
   }
}