admin
2019-12-06 cd637932a970e7935b17d41568fe89c92775bccc
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;
@@ -74,6 +74,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 +84,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;
@@ -174,6 +176,14 @@
   @Resource
   private UserSystemCouponActivateService userSystemCouponActivateService;
   @Resource(name = "producer")
   private Producer producer;
   @Resource
   private UserVIPInfoService userVIPInfoService;
   @Override
   public int insertSelective(UserSystemCoupon record) {
@@ -834,7 +844,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 +900,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
@@ -1870,18 +1880,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 +2083,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,
@@ -2256,9 +2281,100 @@
      sendBackGiveCoupon(list);
   }
   @Override
   @RequestSerializableByKeyService(key = "#id")
   @Transactional(rollbackFor = Exception.class)
   public void sendBackByGiveId(Long couponId) {
      if (couponId == null)
         return;
      UserSystemCoupon userCoupon = userSystemCouponMapper.selectByPrimaryKey(couponId);
      if (userCoupon == null)
         return;
      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();
      if (endTime != null && endTime.getTime() < now.getTime()) {
         List<UserSystemCoupon> list = new ArrayList<UserSystemCoupon>();
         list.add(userCoupon);
         updateCounponInvalid(list);
         return;
      }
      // 退回券
      UserSystemCoupon userSystemCoupon = new UserSystemCoupon();
      userSystemCoupon.setId(userCoupon.getId());
      userSystemCoupon.setGive(false);
      userSystemCoupon.setUseTime(null);
      userSystemCoupon.setState(UserSystemCoupon.STATE_CAN_USE);
      userSystemCoupon.setUpdateTime(new Date());
      userSystemCouponMapper.updateByPrimaryKeySelective(userSystemCoupon);
      // 使用记录
      UserSystemCouponRecord useRecord = userSystemCouponRecordService.getNearByUserCouponId(couponId);
      if (useRecord != null) {
         UserSystemCouponRecord useRecordUpdate = new UserSystemCouponRecord();
         useRecordUpdate.setId(useRecord.getId());
         useRecordUpdate.setState(UserSystemCouponRecord.STATE_WAIT_TIME_OUT);
         useRecordUpdate.setUpdateTime(new Date());
         userSystemCouponRecordService.updateByPrimaryKeySelective(useRecordUpdate);
      }
      SystemCoupon systemCoupon = userCoupon.getSystemCoupon();
      if (systemCoupon != null)
         systemCoupon = systemCouponService.selectByPrimaryKey(systemCoupon.getId());
      if (systemCoupon == null)
         return;
      // 退回消息
      String couponName = systemCoupon.getName();
      if (CouponTypeEnum.freeCouponGive == systemCoupon.getType()) {
         couponName = "免单券";
      } else if (CouponTypeEnum.rebatePercentCoupon == systemCoupon.getType()) {
         couponName = "奖励券";
      }
      String beiZhu = "请到我的-福利中心查看";
      SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm");
      MsgOtherGiveContentDTO msgOther = new MsgOtherGiveContentDTO();
      msgOther.setType(MsgOtherGiveContentDTO.TYEP_COUPON);
      msgOther.setTitle(couponName + "退回");
      msgOther.setGiveType("你赠送的" + couponName + "未被成功领取");
      msgOther.setGiveTime(sd.format(giveRecord.getGiveTime()));
      msgOther.setReturnTime(sd.format(new Date()));
      userOtherMsgNotificationService.tokenGiveMsg(giveRecord.getGiveUid(), beiZhu, msgOther);
   }
   @Override
   public void sendBackGiveCoupon(List<UserSystemCouponGiveRecord> overdueList) {
      for (UserSystemCouponGiveRecord record : overdueList) {
         if (record.getState() != null && record.getState() != UserSystemCouponGiveRecord.STATE_INIT)
            continue;
         // 更新赠送记录
         UserSystemCouponGiveRecord updateRecord = new UserSystemCouponGiveRecord();
         updateRecord.setId(record.getId());
@@ -2450,7 +2566,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)
@@ -2458,6 +2577,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;
@@ -2471,10 +2604,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);