yujian
2019-07-31 f4548a3ee46afe45da4ee2a42dc169c575deee9f
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java
@@ -27,8 +27,6 @@
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.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;
@@ -191,8 +189,9 @@
         // 福利免单券
         coupon = systemCouponService.getCouponByType(couponType);
      } else if (couponType.equals(CouponTypeEnum.rebatePercentCoupon.name())) {
         // 奖励券10%
         coupon = systemCouponService.getCouponByTypeAndPercent(couponType,new BigDecimal(10));
         // 随机奖励券
         randomRewardCoupon(1, uid, source);
         return;
      }
      
      if (coupon == null) {
@@ -282,8 +281,6 @@
      updateCounponInvalid(uid);
      // 退回券
      sendBackTimeOutCoupon(uid);
      // 活动领取券
      receivedCoupon(uid);
      
      List<UserSystemCouponVO> listVO = userSystemCouponMapper.getUserCouponVOList(start, count, uid);
      if (listVO == null || listVO.size() == 0) {
@@ -547,8 +544,6 @@
      updateCounponInvalid(uid);
      // 退回券
      sendBackTimeOutCoupon(uid);
      // 活动领取券
      receivedCoupon(uid);
      // 订单相关的券
      List<SystemCoupon> couponList = systemCouponService.getOrderCouponList();
@@ -577,9 +572,6 @@
      // 退回券
      sendBackTimeOutCoupon(uid);
      
      // 活动领取券
      receivedCoupon(uid);
      // 商品相关的券
      List<SystemCoupon> couponList = systemCouponService.getGoodsCouponList();
      if (couponList == null || couponList.size() == 0) {
@@ -617,7 +609,7 @@
   @Transactional
   @Override
   public void useGoodsCoupon(Long uid, Long id, Long goodId) throws UserSystemCouponException, Exception {
   public void useGoodsCoupon(Long uid, Long id, Long goodId, Integer sourceType) throws UserSystemCouponException, Exception {
      if (uid == null) {
         throw new UserSystemCouponException(1, "用户未登录");
      }
@@ -668,7 +660,7 @@
      // 插入使用券记录
      UserSystemCouponRecord couponRecord = new UserSystemCouponRecord();
      couponRecord.setGoodId(goodId);
      couponRecord.setGoodSource(Constant.SOURCE_TYPE_TAOBAO); // 默认淘宝
      couponRecord.setGoodSource(sourceType); // 默认淘宝
      couponRecord.setState(UserSystemCouponRecord.STATE_WAIT); // 正在匹配
      couponRecord.setUserSystemCoupon(userSystemCoupon);
      couponRecord.setCouponType(baseCoupon.getType().name());
@@ -692,12 +684,16 @@
   @Transactional
   @Override
   public void useOrderCoupon(Long uid, Long id, String orderNo) throws UserSystemCouponException, Exception {
   public void useOrderCoupon(Long uid, Long id, String orderNo, Integer sourceType) throws UserSystemCouponException, Exception {
      if (id == null) {
         throw new UserSystemCouponException(1, "券id不存在");
      }
      if (sourceType == null) {
         sourceType = Constant.SOURCE_TYPE_TAOBAO;
      }
      // 用户券
      UserSystemCoupon userSystemCoupon = selectByPrimaryKey(id);
      if (userSystemCoupon == null) {
@@ -732,7 +728,7 @@
      }
      // 订单
      CommonOrderVO orderVO = commonOrderService.getCommonOrderByOrderNo(uid, orderNo, CommonOrder.STATE_JS);
      CommonOrderVO orderVO = commonOrderService.getCommonOrderByOrderNo(uid, orderNo, CommonOrder.STATE_JS, sourceType);
      if (orderVO == null) {
         throw new UserSystemCouponException(1, "订单信息获取失败");
      }
@@ -746,7 +742,7 @@
      // 条件: A:必须是返利订单 、B:必须已经处于已到账状态
      if (HongBaoV2.TYPE_ZIGOU == hongBaoType && HongBaoV2.STATE_YILINGQU == hongBaoState || hongBao != null) {
         Order order = orderService.findOrderByOrderIdAndType(orderNo, Order.ORDER_TYPE_TAOBAO);
         Order order = orderService.findOrderByOrderIdAndType(orderNo, sourceType);
         if (order == null)
            return;
@@ -768,19 +764,20 @@
         hongBaoV2.setUserInfo(new UserInfo(uid));
         hongBaoV2.setPreGetTime(new Date());
         hongBaoV2.setGetTime(new Date());
         hongBaoV2Service.insertSelective(hongBaoV2);
         // 2.插入关联
         orderHongBaoMapService.addOrderHongBaoMap(hongBaoV2, order);
         // 3.插入资金明细,用户余额
         UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createOrderReward(orderNo, money,
         UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createOrderReward(orderNo, sourceType, money,
               new UserInfo(uid));
         userMoneyDetailService.addUserMoneyDetail(userMoneyDetail);
         userInfoService.addMoney(new UserInfo(uid), money);
         // 插入资金通知
         userMoneyMsgNotificationService.orderReward(uid, orderNo, money,
         userMoneyMsgNotificationService.orderReward(uid, orderNo, sourceType, money,
               userInfoService.selectByPKey(uid).getMyHongBao());
         /* 用户券信息状态及记录处理 */
@@ -795,6 +792,7 @@
         // 插入使用券记录
         UserSystemCouponRecord couponRecord = new UserSystemCouponRecord();
         couponRecord.setState(UserSystemCouponRecord.STATE_SUCCESS);
         couponRecord.setGoodSource(sourceType);
         couponRecord.setOrderNo(orderNo);
         couponRecord.setUserSystemCoupon(userSystemCoupon);
         couponRecord.setCouponType(systemCoupon.getType().name());
@@ -813,7 +811,7 @@
   }
   @Override
   public UserSystemCouponRecordVO getRewardCouponRecord(String orderNo) throws UserSystemCouponException, Exception {
   public UserSystemCouponRecordVO getRewardCouponRecord(String orderNo, Integer sourceType) throws UserSystemCouponException, Exception {
      if (orderNo == null || orderNo.trim().length() == 0) {
         throw new UserSystemCouponException(1, "订单号不存在");
@@ -849,7 +847,7 @@
      Long uid = userSystemCoupon.getUid();
      CommonOrderVO commonOrderVO = commonOrderService.getCommonOrderByOrderNo(userSystemCoupon.getUid(), orderNo,
            CommonOrder.STATE_JS);
            CommonOrder.STATE_JS, sourceType);
      if (commonOrderVO == null) {
         throw new UserSystemCouponException(1, "订单信息获取失败");
@@ -891,7 +889,7 @@
   }
   @Override
   public UserSystemCouponRecordVO getFreeCouponRecord(String orderNo) throws UserSystemCouponException, Exception {
   public UserSystemCouponRecordVO getFreeCouponRecord(String orderNo, Integer sourceType) throws UserSystemCouponException, Exception {
      if (orderNo == null || orderNo.trim().length() == 0) {
         throw new UserSystemCouponException(1, "订单号不存在");
@@ -919,7 +917,7 @@
      }
      // 订单
      CommonOrderVO orderVO = commonOrderService.getCommonOrderByOrderNo(userSystemCoupon.getUid(), orderNo, null);
      CommonOrderVO orderVO = commonOrderService.getCommonOrderByOrderNo(userSystemCoupon.getUid(), orderNo, null, sourceType);
      if (orderVO == null) {
         throw new UserSystemCouponException(1, "订单信息获取失败");
      }
@@ -1514,132 +1512,6 @@
   }
   
   @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);
            // 插入券
            randomRewardCouponForPush(pushCoupon, uid);
         }
      }
   }
   @Transactional
   public void randomRewardCouponForPush(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 {
            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);
   }
   
   @Override
   @Transactional
@@ -1712,20 +1584,25 @@
      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));
      list.add(new RandomProportion(1, 22));
      list.add(new RandomProportion(2, 22));
      list.add(new RandomProportion(3, 22));
      list.add(new RandomProportion(4, 22));
      list.add(new RandomProportion(5, 20));
      list.add(new RandomProportion(6, 18));
      list.add(new RandomProportion(7, 16));
      list.add(new RandomProportion(8, 14));
      list.add(new RandomProportion(9, 12));
      list.add(new RandomProportion(10, 10));
      list.add(new RandomProportion(11, 8));
      list.add(new RandomProportion(12, 6));
      list.add(new RandomProportion(13, 4));
      list.add(new RandomProportion(14, 2));
      list.add(new RandomProportion(15, 1));
      int minRange = 0;
      int maxRange = 0;
      int randomNum = (int) (1 + Math.round(Math.random() * (99)));
      int randomNum = (int) (1 + Math.round(Math.random() * (199)));
      
      for (int i = 0; i < list.size(); i++) {
         
@@ -1735,11 +1612,8 @@
         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)));
         if(randomNum > minRange && randomNum <= maxRange) {
            result = proportion.num;
            break;
         }
      }
@@ -1748,15 +1622,13 @@
   }
   
   class RandomProportion {
      public int minNum;// 最小
      public int maxNum;// 最大
      public int num;//券值
      public int probability; // 概率
      
      RandomProportion () {}
      
      RandomProportion (int minNum, int maxNum, int probability) {
         this.minNum = minNum;
         this.maxNum = maxNum;
      RandomProportion (int num, int probability) {
         this.num = num;
         this.probability = probability;
      }
   }