yujian
2019-11-04 01407e36f8a1d46e065cdcfe14629540dbd6b921
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java
@@ -39,6 +39,7 @@
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.bus.user.UserSystemCoupon;
import com.yeshi.fanli.entity.bus.user.UserSystemCouponActivate;
import com.yeshi.fanli.entity.bus.user.UserSystemCouponGiveRecord;
import com.yeshi.fanli.entity.bus.user.UserSystemCouponRecord;
import com.yeshi.fanli.entity.common.JumpDetailV2;
@@ -47,7 +48,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.money.UserMoneyDetailException;
import com.yeshi.fanli.exception.user.UserInfoExtraException;
import com.yeshi.fanli.exception.user.UserSystemCouponException;
import com.yeshi.fanli.log.LogHelper;
@@ -79,6 +79,7 @@
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TokenUtil;
import com.yeshi.fanli.util.VersionUtil;
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.MQTopicName;
@@ -286,8 +287,11 @@
      userCoupon.setEndTime(endTime);
      userCoupon.setCreateTime(new Date());
      userCoupon.setUpdateTime(new Date());
      // 插入数据库
      insertSelective(userCoupon);
      userSystemCouponMapper.insertSelective(userCoupon);
      if(coupon.getType() == CouponTypeEnum.freeCoupon) {
         userSystemCouponActivateService.addActivateRecord(userCoupon.getId());
      }
      executor.execute(new Runnable() {
         @Override
@@ -874,7 +878,7 @@
         Order order = orderService.findOrderByOrderIdAndType(orderNo, sourceType);
         if (order == null)
            return;
            throw new UserSystemCouponException(1, "该订单不存在");
         /* 奖金计算 以及相关红包信息处理 */
@@ -2443,77 +2447,97 @@
   }
   
   @RequestSerializableByKeyService(key = "#uid")
   @Override
   @Transactional
   public void activateFreeCoupon(Long uid) {
      List<UserSystemCoupon> list = userSystemCouponMapper.getNeedActivateFreeCouponByType(uid, CouponTypeEnum.freeCoupon.name());
      if (list == null || list.size() == 0)
   @Transactional(rollbackFor = Exception.class)
   public void triggerFreeCouponActivate(Long uid) {
      UserSystemCoupon coupon = userSystemCouponMapper.getNeedActivateCouponByType(uid, CouponTypeEnum.freeCoupon.name());
      if (coupon == null)
         return;
      UserSystemCoupon coupon = list.get(0);
      Date nowDate = new Date();
      Date endTime2 = coupon.getEndTime();
      if (endTime2 != null && endTime2.getTime() <= nowDate.getTime())
         return; // 已失效
      SystemCoupon systemCoupon = coupon.getSystemCoupon();
      if (systemCoupon == null)
         return; // 券已不存在
      systemCoupon = systemCouponService.selectByPrimaryKey(systemCoupon.getId());
      if (systemCoupon == null || systemCoupon.getType() != CouponTypeEnum.freeCoupon)
         return; // 券类型不匹配
      Long id = coupon.getId();
      UserSystemCouponActivate couponActivate = userSystemCouponActivateService.selectForUpdate(id);
      
      // 添加激活数量
      String activateNum = configService.get("free_coupon_activate_num");
      boolean activate = userSystemCouponActivateService.addActivateCount(coupon.getId(), Integer.parseInt(activateNum));
      // 激活数量
      boolean result = false;
      int limitNum = Integer.parseInt(configService.get("free_coupon_activate_num"));
      
      // 激活券
      if (activate) {
      Integer state = couponActivate.getState();
      int count = couponActivate.getCount();
      count++;
      if(count >= limitNum) {
         result = true;
         state = UserSystemCouponActivate.STATE_END;
      }
         
         try {
            Integer expiryDay = systemCoupon.getExpiryDay();
            String endDay = DateUtil.plusDay(expiryDay - 1, nowDate);
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            if (endDay != null && endDay.trim().length() > 0) {
               endDay += " 23:59:59";
            }
            Date endTime = format.parse(endDay);
            UserSystemCoupon userCoupon = new UserSystemCoupon();
            userCoupon.setId(coupon.getId());
            userCoupon.setStateActivated(1);
            userCoupon.setEndTime(endTime);
            userCoupon.setStartTime(nowDate);
            userCoupon.setUpdateTime(new Date());
            userSystemCouponMapper.updateByPrimaryKeySelective(userCoupon);
            // 赠送记录
            UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService.getByReceiveId(coupon.getId());
            if (giveRecord == null)
               return;
            Long giveUid = giveRecord.getGiveUid();
            UserInfo userInfo = userInfoService.selectByPKey(giveUid);
            if (userInfo == null)
               return;
            String beiZhu = "请到我的-福利中心中查看";
            SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm");
            MsgOtherCouponActivateDTO msgOther = new MsgOtherCouponActivateDTO();
            msgOther.setTitle("免单券激活");
            msgOther.setType("免单券系统已自动激活");
            msgOther.setExplain("满足" + systemCoupon.getActivateDay() + "天内产生" + activateNum + "笔已到账返利订单");
            msgOther.setGiveUser("昵称:" + userInfo.getNickName() + " ID:" + giveUid);
            msgOther.setReceiveTime(sd.format(giveRecord.getReceiveTime()));
            msgOther.setValidityTime(expiryDay + "天");
            userOtherMsgNotificationService.giveCouponActivateMsg(uid, beiZhu, msgOther);
         } catch (Exception e) {
            e.printStackTrace();
            LogHelper.errorDetailInfo(e);
      UserSystemCouponActivate updateActivate = new UserSystemCouponActivate();
      updateActivate.setId(id);
      updateActivate.setState(state);
      updateActivate.setCount(count);
      updateActivate.setUpdateTime(new Date());
      userSystemCouponActivateService.updateByPrimaryKeySelective(updateActivate);
      // 激活奖励券
      if (result) {
         activateFreeCoupon(coupon, limitNum);
      }
   }
   /**
    * 激活券
    * @param coupon
    * @param activateNum
    */
   @Transactional
   private void activateFreeCoupon(UserSystemCoupon coupon, int limitNum) {
      try {
         Date nowDate = new Date();
         SystemCoupon systemCoupon = coupon.getSystemCoupon();
         Integer expiryDay = systemCoupon.getExpiryDay();
         String endDay = DateUtil.plusDay(expiryDay - 1, nowDate);
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         if (endDay != null && endDay.trim().length() > 0) {
            endDay += " 23:59:59";
         }
         Date endTime = format.parse(endDay);
         UserSystemCoupon userCoupon = new UserSystemCoupon();
         userCoupon.setId(coupon.getId());
         userCoupon.setStateActivated(1);
         userCoupon.setEndTime(endTime);
         userCoupon.setStartTime(nowDate);
         userCoupon.setUpdateTime(new Date());
         userSystemCouponMapper.updateByPrimaryKeySelective(userCoupon);
         // 消息
         executor.execute(new Runnable() {
            @Override
            public void run() {
               UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService.getByReceiveId(coupon.getId());
               if (giveRecord == null)
                  return;
               Long giveUid = giveRecord.getGiveUid();
               UserInfo userInfo = userInfoService.selectByPKey(giveUid);
               if (userInfo == null)
                  return;
               String beiZhu = "请到我的-福利中心中查看";
               SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm");
               MsgOtherCouponActivateDTO msgOther = new MsgOtherCouponActivateDTO();
               msgOther.setTitle("免单券激活");
               msgOther.setType("免单券系统已自动激活");
               msgOther.setExplain("满足" + systemCoupon.getActivateDay() + "天内产生" + limitNum + "笔已到账返利订单");
               msgOther.setGiveUser("昵称:" + userInfo.getNickName() + " ID:" + giveUid);
               msgOther.setReceiveTime(sd.format(giveRecord.getReceiveTime()));
               msgOther.setValidityTime(expiryDay + "天");
               userOtherMsgNotificationService.giveCouponActivateMsg(coupon.getUid(), beiZhu, msgOther);
            }
         });
      } catch (Exception e) {
         e.printStackTrace();
         LogHelper.errorDetailInfo(e);
      }
   }
}