yujian
2019-07-31 f4548a3ee46afe45da4ee2a42dc169c575deee9f
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java
@@ -45,6 +45,8 @@
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMapService;
import com.yeshi.fanli.service.inter.order.OrderService;
import com.yeshi.fanli.service.inter.push.PushCouponRecordService;
import com.yeshi.fanli.service.inter.push.PushCouponService;
import com.yeshi.fanli.service.inter.user.DeviceLotteryRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
@@ -126,6 +128,13 @@
   @Resource
   private CommonOrderCountService commonOrderCountService;
   
   @Resource
   private PushCouponService pushCouponService;
   @Resource
   private PushCouponRecordService pushCouponRecordService;
   @Override
   public int insertSelective(UserSystemCoupon record) {
      return userSystemCouponMapper.insertSelective(record);
@@ -155,7 +164,12 @@
   public List<UserSystemCoupon> getUserCouponBySource(Long uid, String source) {
      return userSystemCouponMapper.getUserCouponBySource(uid, source);
   }
   @Override
   public int countTodatyUserCouponBySource(Long uid, String source) {
      return userSystemCouponMapper.countTodatyUserCouponBySource(uid, source);
   }
   @Override
   public long countUserCouponList(Long uid) {
      return userSystemCouponMapper.countUserCouponList(uid);
@@ -170,7 +184,16 @@
         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())) {
         // 随机奖励券
         randomRewardCoupon(1, uid, source);
         return;
      }
      if (coupon == null) {
         throw new UserSystemCouponException(1, "券类型不正确");
      }
@@ -247,7 +270,7 @@
   @Transactional
   @Override
   public List<UserSystemCouponVO> getUserCouponVOList(long start, int count, Long uid)
   public List<UserSystemCouponVO> getUserCouponVOList(long start, int count, Long uid, boolean changeJump)
         throws UserSystemCouponException, Exception {
      if (uid == null) {
@@ -258,14 +281,14 @@
      updateCounponInvalid(uid);
      // 退回券
      sendBackTimeOutCoupon(uid);
      List<UserSystemCouponVO> listVO = userSystemCouponMapper.getUserCouponVOList(start, count, uid);
      if (listVO == null || listVO.size() == 0) {
         return listVO;
      }
      // 数据组织
      listDataFactory(listVO, uid);
      listDataFactory(listVO, uid, changeJump);
      return listVO;
   }
@@ -275,8 +298,14 @@
    * 
    * @param listVO
    */
   public void listDataFactory(List<UserSystemCouponVO> listVO, Long uid) throws Exception {
   public void listDataFactory(List<UserSystemCouponVO> listVO, Long uid, boolean changeJump) throws Exception {
      String inviteCode = null;
      UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
      if (userInfoExtra != null) {
         inviteCode = userInfoExtra.getInviteCode();
      }
      for (UserSystemCouponVO userCouponVO : listVO) {
         SystemCoupon systemCoupon = userCouponVO.getSystemCoupon();
@@ -312,30 +341,26 @@
            // 显示规则
            userCouponVO.setCouponRule(systemCoupon.getRemark());
            userCouponVO.setCouponEffect("待激活");
            // 状态未激活 -且未被使用
            if (UserSystemCoupon.STATE_CAN_USE == state) {
               userCouponVO.setState(0);
            }
            jumpBtn = new HashMap<String, Object>();
            // 邀请队员界面
            /*
             * Map<String, Object> jumpLink = new HashMap<String, Object>();
             * UserInfoExtra userInfoExtra =
             * userInfoExtraService.getUserInfoExtra(uid); if (userInfoExtra
             * != null && userInfoExtra.getInviteCode() != null &&
             * userInfoExtra.getInviteCode().trim().length() > 0) { //
             * 邀请激活成功界面 jumpLink.put("url",
             * configService.get("invite_activation_success_url") +
             * "?alert=true"); } else { // 激活邀请码界面 jumpLink.put("url",
             * configService.get("invite_activation_url")); }
             * jumpBtn.put("params", jumpLink);
             */
            jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("invite"));
            // 福利券需要激活界面
            if (!changeJump) {
               jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("invite"));
            } else {
               if (inviteCode != null && inviteCode.trim().length() > 0) {
                  // 邀请好友界面
                  jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("invite_friends"));
               } else {
                  // 邀请激活界面
                  jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("invite_activate"));
               }
            }
         } else if (stateActivated == 1) {
            // 显示规则
            userCouponVO.setCouponRule(systemCoupon.getRule());
@@ -510,6 +535,7 @@
   @Transactional
   @Override
   public List<UserSystemCouponVO> getOrderCouponList(Long uid) throws UserSystemCouponException, Exception {
      if (uid == null) {
         throw new UserSystemCouponException(1, "用户未登录");
      }
@@ -545,7 +571,7 @@
      updateCounponInvalid(uid);
      // 退回券
      sendBackTimeOutCoupon(uid);
      // 商品相关的券
      List<SystemCoupon> couponList = systemCouponService.getGoodsCouponList();
      if (couponList == null || couponList.size() == 0) {
@@ -583,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, "用户未登录");
      }
@@ -634,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());
@@ -658,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) {
@@ -698,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, "订单信息获取失败");
      }
@@ -712,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;
@@ -734,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());
         /* 用户券信息状态及记录处理 */
@@ -761,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());
@@ -779,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, "订单号不存在");
@@ -815,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, "订单信息获取失败");
@@ -857,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, "订单号不存在");
@@ -885,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, "订单信息获取失败");
      }
@@ -905,7 +937,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";
@@ -1206,8 +1238,8 @@
   @Transactional
   @Override
   public void sendBackTimeOutCoupon(Long uid) {
      // 超过120秒 未被匹配的券
      List<UserSystemCouponRecord> list = userSystemCouponRecordService.getCouponByUsingTimeOut(uid, 120L);
      // 超过10分钟   未被匹配的券
      List<UserSystemCouponRecord> list = userSystemCouponRecordService.getCouponByUsingTimeOut(uid,600L);
      if (list == null || list.size() == 0) {
         return;
      }
@@ -1391,9 +1423,9 @@
         return;
      }
      // 是否有过订单:返利、分享订单
      boolean hasOrder = commonOrderCountService.hasRebateAndShareOrder(uid);
      if (hasOrder) {
      // 是否是新用户
      boolean isNewUser = userInfoExtraService.isNewUser(uid);
      if (!isNewUser) {
         return;
      }
@@ -1431,7 +1463,7 @@
         UserSystemCoupon userCoupon = new UserSystemCoupon();
         userCoupon.setUid(uid);
         userCoupon.setSource(UserSystemCoupon.SOURCE_CHOUJIANG);
         userCoupon.setSource(UserSystemCoupon.SOURCE_NEWBIES);
         userCoupon.setSystemCoupon(systemCoupon);
         userCoupon.setState(UserSystemCoupon.STATE_CAN_USE);
         userCoupon.setStateActivated(stateActivated);
@@ -1479,4 +1511,126 @@
      userInfoExtraService.saveUserInfoExtra(userInfoExtra);
   }
   @Override
   @Transactional
   public void randomRewardCoupon(int num, Long uid, String source) throws Exception {
      if (num < 1) {
         return;
      }
      for (int i = 0; i < num; i++) {
         // 返利比-随机
         BigDecimal percent = new BigDecimal(randomNum());
         // 查询奖励券
         SystemCoupon systemCoupon = systemCouponService.getCouponByTypeAndPercent(
               CouponTypeEnum.rebatePercentCoupon.name(),percent);
         if (systemCoupon == null) {
            return;
         }
         // 结束日期 今天在内  减去一天
         String endDay = DateUtil.plusDay(systemCoupon.getExpiryDay() - 1, new Date());
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         Date endTime = format.parse(endDay);
         UserSystemCoupon userCoupon = new UserSystemCoupon();
         userCoupon.setUid(uid);
         userCoupon.setSource(source);
         userCoupon.setSystemCoupon(systemCoupon);
         userCoupon.setState(UserSystemCoupon.STATE_CAN_USE);
         userCoupon.setStateActivated(1);
         userCoupon.setStartTime(new Date());
         userCoupon.setEndTime(endTime);
         userCoupon.setCreateTime(new Date());
         userCoupon.setUpdateTime(new Date());
         // 插入数据库
         insertSelective(userCoupon);
         // 消息推送
         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(num);
      } else {
         userInfoExtra.setCouponNews(couponNews + num);
      }
      userInfoExtraService.saveUserInfoExtra(userInfoExtra);
   }
   /**
    * 随机券比例
    * @return
    */
   public int randomNum() {
      int result = 1;
      List<RandomProportion> list = new ArrayList<RandomProportion>();
      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() * (199)));
      for (int i = 0; i < list.size(); i++) {
         RandomProportion proportion = list.get(i);
         int probability = proportion.probability;
         maxRange = maxRange + probability;
         minRange = maxRange - probability;
         if(randomNum > minRange && randomNum <= maxRange) {
            result = proportion.num;
            break;
         }
      }
      return result;
   }
   class RandomProportion {
      public int num;//券值
      public int probability; // 概率
      RandomProportion () {}
      RandomProportion (int num, int probability) {
         this.num = num;
         this.probability = probability;
      }
   }
}