yujian
2019-12-10 c8041ec0544bf122e6819e6bf698997ccbf30aaf
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java
@@ -21,11 +21,11 @@
import org.yeshi.utils.entity.DateInfo;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.transaction.LocalTransactionExecuter;
import com.aliyun.openservices.ons.api.transaction.TransactionProducer;
import com.aliyun.openservices.ons.api.transaction.TransactionStatus;
import com.google.gson.Gson;
import com.yeshi.fanli.dao.mybatis.user.UserSystemCouponMapper;
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
import com.yeshi.fanli.dto.mq.user.body.UserSystemCouponUseMQMsg;
@@ -49,7 +49,6 @@
import com.yeshi.fanli.entity.system.SystemCoupon;
import com.yeshi.fanli.entity.system.SystemCoupon.CouponTypeEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.exception.user.UserInfoExtraException;
import com.yeshi.fanli.exception.user.UserSystemCouponException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
@@ -74,6 +73,7 @@
import com.yeshi.fanli.service.inter.user.UserSystemCouponRecordService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisManager;
@@ -83,6 +83,7 @@
import com.yeshi.fanli.util.annotation.RequestSerializableByKeyService;
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
import com.yeshi.fanli.util.factory.msg.MsgOtherSystemGiveDTOFactory;
import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
@@ -153,6 +154,7 @@
   @Resource
   private UserOtherMsgNotificationService userOtherMsgNotificationService;
   @Lazy
   @Resource
   private CommonOrderCountService commonOrderCountService;
@@ -174,6 +176,15 @@
   @Resource
   private UserSystemCouponActivateService userSystemCouponActivateService;
   @Resource(name = "producer")
   private Producer producer;
   @Lazy
   @Resource
   private UserVIPInfoService userVIPInfoService;
   @Override
   public int insertSelective(UserSystemCoupon record) {
@@ -243,6 +254,8 @@
         } else {
            coupon = systemCouponService.getCouponByTypeAndPercent(couponType, percent);
         }
      } else if (couponType.equals(CouponTypeEnum.freeCouponGive.name())) {
         coupon = systemCouponService.getCouponByType(couponType);
      }
      if (coupon == null) {
@@ -295,23 +308,18 @@
      executor.execute(new Runnable() {
         @Override
         public void run() {
            UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
            // 添加一条消息
            if (userInfoExtra != null) {
               if (userInfoExtra.getCouponNews() == null) {
                  userInfoExtra.setCouponNews(1);
         public void run() {  // 福利中心红点
            UserInfoExtra extra = userInfoExtraService.getUserInfoExtra(uid);
            if (extra != null) {
               UserInfoExtra updateExtra =   new UserInfoExtra();
               updateExtra.setId(extra.getId());
               if (extra.getCouponNews() == null) {
                  updateExtra.setCouponNews(1);
               } else {
                  userInfoExtra.setCouponNews(userInfoExtra.getCouponNews() + 1);
                  updateExtra.setCouponNews(extra.getCouponNews() + 1);
               }
               try {
                  userInfoExtraService.saveUserInfoExtra(userInfoExtra);
               } catch (UserInfoExtraException e) {
                  e.printStackTrace();
               }
               userInfoExtraService.updateByPrimaryKeySelective(updateExtra);
            }
         }
      });
@@ -695,6 +703,26 @@
      return userSystemCouponMapper.countUsableByUid(uid, listCouponId);
   }
   @Override
   public long countGiveFreeCoupon(Long uid) {
      if (uid == null)
         return 0;
      List<SystemCoupon> couponList = systemCouponService.getGiveFreeCouponList();
      if (couponList == null || couponList.size() == 0)
         return 0;
      List<Long> listCouponId = new ArrayList<Long>();
      for (SystemCoupon systemCoupon : couponList) {
         listCouponId.add(systemCoupon.getId());
      }
      return userSystemCouponMapper.countUsableByUid(uid, listCouponId);
   }
   @Override
   public long countUsableRewardCoupon(Long uid) {
@@ -834,7 +862,7 @@
         throw new UserSystemCouponException(1, "订单信息获取失败");
      // 版本区分:2.0.2
      if (VersionUtil.greaterThan_2_0_2(acceptData.getPlatform(), acceptData.getVersion())) {
      if (VersionUtil.greaterThan_2_1(acceptData.getPlatform(), acceptData.getVersion())) {
         Date thirdCreateTime = orderVO.getThirdCreateTime();
         if (thirdCreateTime != null) {
            long downOrderTime = thirdCreateTime.getTime();
@@ -890,8 +918,8 @@
         UserSystemCouponUseMQMsg mqMsg = new UserSystemCouponUseMQMsg(userSystemCoupon.getId(), order.getOrderId(),
               sourceType, systemCoupon.getType().name());
         // 事务消息
         Message msg = new Message(MQTopicName.TOPIC_USER.name(), UserTopicTagEnum.useSystemCoupon.name(),
               new Gson().toJson(mqMsg).getBytes());
         Message msg =MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.useSystemCoupon,
               mqMsg);
         try {
            SendResult result = orderTransactionProducer.send(msg, new LocalTransactionExecuter() {
               @Override
@@ -1589,13 +1617,16 @@
      if (userInfoExtra == null) {
         return;
      }
      UserInfoExtra extra = new UserInfoExtra();
      extra.setId(userInfoExtra.getId());
      Integer couponNews = userInfoExtra.getCouponNews();
      if (couponNews == null) {
         userInfoExtra.setCouponNews(num);
         extra.setCouponNews(num);
      } else {
         userInfoExtra.setCouponNews(couponNews + num);
         extra.setCouponNews(couponNews + num);
      }
      userInfoExtraService.saveUserInfoExtra(userInfoExtra);
      userInfoExtraService.saveUserInfoExtra(extra);
   }
   @Override
@@ -1870,18 +1901,20 @@
               jumpBtn.put("params", jumpLink);
               jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("web"));
            } else if (CouponTypeEnum.rebatePercentCoupon == type) {
               // 可使用、 可赠送
               userCouponVO.setState(UserSystemCoupon.STATE_USE_GIVE);
               // 订单列表
               jumpLink.put("state", "2"); // 已收货
               jumpLink.put("showNav", false); // 不显示上方统计信息
               jumpLink.put("type", "1"); // 返利订单
               jumpLink.put("title", "返利订单"); // 标题名
               jumpLink.put("goodsType", "0"); // 订单来源
               jumpBtn = new HashMap<String, Object>();
               jumpBtn.put("params", jumpLink);
               jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("order_screen_list"));
               if (userVIPInfoService.isVIP(uid)) { // 会员只可赠送
                  userCouponVO.setState(UserSystemCoupon.STATE_GIVE_ONLY);
               } else {// 可使用 可赠送
                  userCouponVO.setState(UserSystemCoupon.STATE_USE_GIVE);
                  jumpLink.put("state", "2"); // 已收货
                  jumpLink.put("showNav", false); // 不显示上方统计信息
                  jumpLink.put("type", "1"); // 返利订单
                  jumpLink.put("title", "返利订单"); // 标题名
                  jumpLink.put("goodsType", "0"); // 订单来源
                  jumpBtn = new HashMap<String, Object>();
                  jumpBtn.put("params", jumpLink);
                  jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("order_screen_list"));
               }
            }
         } else if (UserSystemCoupon.STATE_IN_USE == state && give) {
            userCouponVO.setCouponEffect("赠送中");
@@ -2071,7 +2104,20 @@
      }
      tips = tips.replace("{口令}", token).replace("{下载链接}", configService.get("app_down_link"));
      return createUserCouponVOo(userSystemCoupon, systemCoupon, giveRecord, tips);
      UserSystemCouponVO couponVO = createUserCouponVOo(userSystemCoupon, systemCoupon, giveRecord, tips);
      UserSystemCouponUseMQMsg msg = new UserSystemCouponUseMQMsg();
      msg.setUserSystemCouponId(id);
      msg.setCouponType(type.name());
      Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.systemCouponDrawback,
            msg);
      try {
         producer.send(message);
      } catch (Exception e) {
         throw new UserSystemCouponException(1, "创建赠送信息失败");
      }
      return couponVO;
   }
   private UserSystemCouponVO createUserCouponVOo(UserSystemCoupon userSystemCoupon, SystemCoupon systemCoupon,
@@ -2258,30 +2304,10 @@
   
   @Override
   @RequestSerializableByKeyService(key = "#giveid")
   @RequestSerializableByKeyService(key = "#id")
   @Transactional(rollbackFor = Exception.class)
   public void sendBackByGiveId(Long giveid) {
      if (giveid == null)
         return;
      UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService.selectByPrimaryKey(giveid);
      if (giveRecord == null)
         return;
      if (giveRecord.getState() != null && giveRecord.getState() != UserSystemCouponGiveRecord.STATE_INIT)
         return;
      // 更新赠送记录
      UserSystemCouponGiveRecord updateRecord = new UserSystemCouponGiveRecord();
      updateRecord.setId(giveid);
      updateRecord.setState(UserSystemCouponGiveRecord.STATE_OVERDUE);
      userSystemCouponGiveRecordService.updateByPrimaryKeySelective(updateRecord);
      // 口令失效
      tokenRecordService.invalidByCoupon(giveid);
      Long couponId = giveRecord.getCouponId();
      if (couponId == null)
   public void sendBackByGiveId(Long couponId) {
      if (couponId == null)
         return;
      
      UserSystemCoupon userCoupon = userSystemCouponMapper.selectByPrimaryKey(couponId);
@@ -2291,6 +2317,23 @@
      Integer state = userCoupon.getState();
      if (state != UserSystemCoupon.STATE_IN_USE)
         return;
      UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService.getByCouponId(couponId);
      if (giveRecord == null)
         return;
      if (giveRecord.getState() != null && giveRecord.getState() != UserSystemCouponGiveRecord.STATE_INIT)
         return;
      // 更新赠送记录
      UserSystemCouponGiveRecord updateRecord = new UserSystemCouponGiveRecord();
      updateRecord.setId(giveRecord.getId());
      updateRecord.setState(UserSystemCouponGiveRecord.STATE_OVERDUE);
      userSystemCouponGiveRecordService.updateByPrimaryKeySelective(updateRecord);
      // 口令失效
      tokenRecordService.invalidByCoupon(giveRecord.getId());
      Date now = new Date();
      Date endTime = userCoupon.getEndTime();
@@ -2430,34 +2473,16 @@
   }
   @Override
   public boolean getIncludeExchange(Long uid) {
   public boolean getValidRebateCoupon(Long uid) {
      // 过期券
      updateInvalidSate(uid);
      String percent = configService.get("exchange_rebate_percent");
      if (StringUtil.isNullOrEmpty(percent))
         percent = "35";
      List<UserSystemCoupon> listCoupon = userSystemCouponMapper.getIncludeExchange(uid, Integer.parseInt(percent),
            CouponTypeEnum.rebatePercentCoupon.name());
      List<UserSystemCouponVO> listCoupon = userSystemCouponMapper.getValidByUidAndType(uid, CouponTypeEnum.rebatePercentCoupon.name());
      if (listCoupon == null || listCoupon.size() == 0)
         return false;
      return true;
   }
   @Override
   public boolean getIncludeNotExchange(Long uid) {
      // 过期券
      updateInvalidSate(uid);
      String percent = configService.get("exchange_rebate_percent");
      if (StringUtil.isNullOrEmpty(percent))
         percent = "35";
      List<UserSystemCouponVO> listCoupon = userSystemCouponMapper.getIncludeNotExchange(uid,
            Integer.parseInt(percent), CouponTypeEnum.rebatePercentCoupon.name());
      if (listCoupon == null || listCoupon.size() == 0)
         return false;
      return true;
   }
   @Override
   public List<UserSystemCouponVO> listIncludeNotExchange(Long uid) throws Exception {
@@ -2467,12 +2492,8 @@
      // 退回券
      sendBackTimeOutCoupon(uid);
      String percent = configService.get("exchange_rebate_percent");
      if (StringUtil.isNullOrEmpty(percent))
         percent = "35";
      List<UserSystemCouponVO> listCoupon = userSystemCouponMapper.getIncludeNotExchange(uid,
            Integer.parseInt(percent), CouponTypeEnum.rebatePercentCoupon.name());
      List<UserSystemCouponVO> listCoupon = userSystemCouponMapper.getValidByUidAndType(uid, CouponTypeEnum.rebatePercentCoupon.name());
      if (listCoupon == null || listCoupon.size() == 0)
         return null;
@@ -2544,7 +2565,10 @@
   @RequestSerializableByKeyService(key = "#uid")
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void triggerFreeCouponActivate(Long uid) {
   public void triggerFreeCouponActivate(Long uid, String orderNo, Integer source) {
      if (uid == null || source == null || StringUtil.isNullOrEmpty(orderNo))
         return;
      UserSystemCoupon coupon = userSystemCouponMapper.getNeedActivateCouponByType(uid,
            CouponTypeEnum.freeCoupon.name());
      if (coupon == null)
@@ -2552,6 +2576,20 @@
      Long id = coupon.getId();
      UserSystemCouponActivate couponActivate = userSystemCouponActivateService.selectForUpdate(id);
      if (couponActivate == null)
         return;
      // 验证同订单是否存在
      String key = orderNo + "_" + source;
      String ordernos = couponActivate.getOrdernos();
      if (!StringUtil.isNullOrEmpty(ordernos)) {
         String[] array = ordernos.split(",");
         if (array != null)
            for (int i= 0; i < array.length; i ++) {
               if (array[i].equals(key))
                  return;
            }
      }
      // 激活数量
      boolean result = false;
@@ -2565,10 +2603,17 @@
         state = UserSystemCouponActivate.STATE_END;
      }
      if (StringUtil.isNullOrEmpty(ordernos)) {
         ordernos = key;
      } else {
         ordernos = ordernos + "," + key;
      }
      UserSystemCouponActivate updateActivate = new UserSystemCouponActivate();
      updateActivate.setId(id);
      updateActivate.setState(state);
      updateActivate.setCount(count);
      updateActivate.setOrdernos(ordernos);
      updateActivate.setUpdateTime(new Date());
      userSystemCouponActivateService.updateByPrimaryKeySelective(updateActivate);