yujian
2019-03-27 cdcbed9af813b2a02cdc01eefa24db8bec6b51a9
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java
@@ -26,7 +26,9 @@
import com.yeshi.fanli.entity.bus.user.UserSystemCouponRecord;
import com.yeshi.fanli.entity.common.JumpDetailV2;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.push.PushCoupon;
import com.yeshi.fanli.entity.push.PushCouponRecord;
import com.yeshi.fanli.entity.system.SystemCoupon;
import com.yeshi.fanli.entity.system.SystemCoupon.CouponTypeEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
@@ -179,7 +181,15 @@
         throw new UserSystemCouponException(1, "参数不正确");
      }
      SystemCoupon coupon = systemCouponService.getCouponByType(couponType);
      SystemCoupon coupon = null;
      if (couponType.equals(CouponTypeEnum.welfareFreeCoupon.name())) {
         // 福利免单券
         coupon = systemCouponService.getCouponByType(couponType);
      } else if (couponType.equals(CouponTypeEnum.rebatePercentCoupon.name())) {
         // 奖励券10%
         coupon = systemCouponService.getCouponByTypeAndPercent(couponType,new BigDecimal(10));
      }
      if (coupon == null) {
         throw new UserSystemCouponException(1, "券类型不正确");
      }
@@ -519,6 +529,7 @@
   @Transactional
   @Override
   public List<UserSystemCouponVO> getOrderCouponList(Long uid) throws UserSystemCouponException, Exception {
      if (uid == null) {
         throw new UserSystemCouponException(1, "用户未登录");
      }
@@ -527,6 +538,8 @@
      updateCounponInvalid(uid);
      // 退回券
      sendBackTimeOutCoupon(uid);
      // 活动领取券
//      receivedCoupon(uid);
      // 订单相关的券
      List<SystemCoupon> couponList = systemCouponService.getOrderCouponList();
@@ -554,6 +567,9 @@
      updateCounponInvalid(uid);
      // 退回券
      sendBackTimeOutCoupon(uid);
      // 活动领取券
//      receivedCoupon(uid);
      // 商品相关的券
      List<SystemCoupon> couponList = systemCouponService.getGoodsCouponList();
@@ -914,7 +930,7 @@
      String progressMsg = "";
      String progressColor = "";
      // 跳转奖励券规则
      userRecordVO.setRuleLink(configService.get("reward_coupon_help"));
      userRecordVO.setRuleLink(configService.get("free_coupon_help"));
      // 进度: 1 灰色 2 红色 3 绿色
      String progressState1 = "3";
@@ -1488,4 +1504,197 @@
      userInfoExtraService.saveUserInfoExtra(userInfoExtra);
   }
   @Override
   @Transactional
   public void receivedCoupon(Long uid) throws Exception {
      List<PushCoupon> list = pushCouponService.listQueryEffective();
      if (list == null || list.size() == 0) {
         return;
      }
      List<PushCouponRecord> listRecord = pushCouponRecordService.listByUid(uid);
      for (PushCoupon pushCoupon: list) {
         boolean receive = false;
         String uids = pushCoupon.getUids();
         if (uids == null || uids.trim().length() == 0) {
            receive = true;
         } else {
            String[] uidArray = uids.split(",");
            if (uidArray != null) {
               for (int i = 0; i < uidArray.length; i++) {
                  String str_uid = uidArray[i];
                  if (str_uid != null && str_uid.trim().length() > 0) {
                     if(str_uid.equals(uid.toString())) {
                        receive = true;
                     }
                  }
               }
            }
         }
         if (!receive) {
            continue;
         }
         if (listRecord != null && listRecord.size() > 0) {
            for (PushCouponRecord PushCouponRecord: listRecord) {
                PushCoupon pushCoupon2 = PushCouponRecord.getPushCoupon();
               if (pushCoupon.getId().equals(pushCoupon2.getId()) ) {
                  receive = false;
                  break;
               }
            }
         }
         if (receive) {
            // 插入记录
            PushCouponRecord pushCouponRecord = new PushCouponRecord();
            pushCouponRecord.setPushCoupon(pushCoupon);
            pushCouponRecord.setUid(uid);
            pushCouponRecord.setCreateTime(new Date());
            pushCouponRecordService.insertSelective(pushCouponRecord);
            // 插入券
            randomRewardCoupon(pushCoupon, uid);
         }
      }
   }
   @Override
   @Transactional
   public void randomRewardCoupon(PushCoupon pushCoupon, Long uid) throws Exception {
      int coupon = 0;
      Integer amount = pushCoupon.getAmount();
      for (int i = 0; i < amount; i++) {
         BigDecimal percent = pushCoupon.getPercent();
         if (percent == null) {
            // 返利比-随机
            percent = new BigDecimal(randomNum());
         }
         // 查询奖励券
         SystemCoupon systemCoupon = systemCouponService.getCouponByTypeAndPercent(
               CouponTypeEnum.rebatePercentCoupon.name(),percent);
         if (systemCoupon == null) {
            return;
         }
         UserSystemCoupon userCoupon = new UserSystemCoupon();
         userCoupon.setUid(uid);
         userCoupon.setSource(UserSystemCoupon.SOURCE_SYSTEM_PUSH);
         userCoupon.setSystemCoupon(systemCoupon);
         userCoupon.setState(UserSystemCoupon.STATE_CAN_USE);
         userCoupon.setStateActivated(1);
         userCoupon.setStartTime(pushCoupon.getStartTime());
         userCoupon.setEndTime(pushCoupon.getEndTime());
         userCoupon.setCreateTime(new Date());
         userCoupon.setUpdateTime(new Date());
         // 插入数据库
         insertSelective(userCoupon);
         // 券数量
         coupon ++;
         // 消息推送
         try {
            if (systemCoupon.getType() == CouponTypeEnum.welfareFreeCoupon) {
               userOtherMsgNotificationService.welfareCouponGet(userCoupon);
            } else if (systemCoupon.getType() == CouponTypeEnum.freeCoupon) {
               userOtherMsgNotificationService.freeSheetCouponGet(userCoupon);
            } else if (systemCoupon.getType() == CouponTypeEnum.rebatePercentCoupon) {
               userOtherMsgNotificationService.rewardCouponGet(userCoupon,systemCoupon.getPercent().intValue());
            }
         } catch(Exception e) {
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
            }
         }
      }
      // 获取额外信息
      UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
      if (userInfoExtra == null) {
         return;
      }
      Integer couponNews = userInfoExtra.getCouponNews();
      if (couponNews == null) {
         userInfoExtra.setCouponNews(coupon);
      } else {
         userInfoExtra.setCouponNews(couponNews + coupon);
      }
      userInfoExtraService.saveUserInfoExtra(userInfoExtra);
   }
   /**
    * 随机券比例
    * @return
    */
   public int randomNum() {
      int result = 1;
      List<RandomProportion> list = new ArrayList<RandomProportion>();
      list.add(new RandomProportion(1,2,30));
      list.add(new RandomProportion(2,4,25));
      list.add(new RandomProportion(4,6,20));
      list.add(new RandomProportion(6,8,6));
      list.add(new RandomProportion(8,10,6));
      list.add(new RandomProportion(10,20,6));
      list.add(new RandomProportion(20,30,2));
      list.add(new RandomProportion(30,40,2));
      list.add(new RandomProportion(40,50,2));
      list.add(new RandomProportion(50,60,1));
      int minRange = 0;
      int maxRange = 0;
      int randomNum = (int) (1 + Math.round(Math.random() * (99)));
      for (int i = 0; i < list.size(); i++) {
         RandomProportion proportion = list.get(i);
         int probability = proportion.probability;
         maxRange = maxRange + probability;
         minRange = maxRange - probability;
         if (i == list.size() && randomNum > minRange && randomNum <= maxRange) {
            result = proportion.minNum + (int) (Math.random() * ((proportion.maxNum - proportion.minNum) + 1));
            break;
         } else if(randomNum > minRange && randomNum <= maxRange) {
            result = proportion.minNum + (int) (Math.random() * ((proportion.maxNum - proportion.minNum)));
            break;
         }
      }
      return result;
   }
   class RandomProportion {
      public int minNum;// 最小
      public int maxNum;// 最大
      public int probability; // 概率
      RandomProportion () {}
      RandomProportion (int minNum, int maxNum, int probability) {
         this.minNum = minNum;
         this.maxNum = maxNum;
         this.probability = probability;
      }
   }
}