yujian
2019-05-14 bbe1a381f99d957d003f48b68dfd5bf0e401f5f0
fanli/src/main/java/com/yeshi/fanli/controller/client/UserCouponController.java
@@ -4,6 +4,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
@@ -17,19 +18,18 @@
import com.yeshi.fanli.entity.bus.homemodule.SwiperPicture;
import com.yeshi.fanli.entity.bus.user.DeviceLotteryRecord;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.bus.user.UserSystemCoupon;
import com.yeshi.fanli.entity.bus.user.UserLotteryRecord;
import com.yeshi.fanli.entity.system.SystemCoupon;
import com.yeshi.fanli.entity.system.SystemCoupon.CouponTypeEnum;
import com.yeshi.fanli.exception.user.UserInfoExtraException;
import com.yeshi.fanli.exception.user.UserLotteryRecordException;
import com.yeshi.fanli.exception.user.UserSystemCouponException;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.config.SystemCouponService;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.hongbao.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.user.DeviceLotteryRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserLotteryRecordService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.vo.user.UserSystemCouponRecordVO;
@@ -54,6 +54,9 @@
   private ConfigService configService;
   @Resource
   private SystemCouponService systemCouponService;
   @Resource
   private UserSystemCouponService UserSystemCouponService;
   @Resource
@@ -66,22 +69,16 @@
   private DeviceLotteryRecordService deviceLotteryRecordService;
   @Resource
   private SystemCouponService systemCouponService;
   @Resource
   private UserSystemCouponService userSystemCouponService;
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private CommonOrderCountService commonOrderCountService;
   private UserLotteryRecordService userLotteryRecordService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   // 最大抽奖次数
   private static int MAX_COUNT = 5;
   /**
    * 用户券列表查询
@@ -111,10 +108,20 @@
               topPicture = listswiper.get(0).getSrc();
            }
         }
         boolean changeJump = false;
         String version = acceptData.getVersion();
         int tversion = Integer.parseInt(version);
         String platform = acceptData.getPlatform();
         if ("android".equalsIgnoreCase(platform) && tversion > 34) {
            changeJump = true;
         } else if (tversion > 44){
            changeJump = true;
         }
         long count = 0;
         List<UserSystemCouponVO> resultList = UserSystemCouponService
               .getUserCouponVOList((page - 1) * Constant.PAGE_SIZE, Constant.PAGE_SIZE, uid);
               .getUserCouponVOList((page - 1) * Constant.PAGE_SIZE, Constant.PAGE_SIZE, uid, changeJump);
         if (resultList != null && resultList.size() > 0) {
            count = UserSystemCouponService.countUserCouponList(uid);
@@ -360,63 +367,45 @@
   @RequestMapping(value = "getLotteryCount")
   public void getLotteryCount(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
      try {
         // 默认最大抽奖次数
         int count = 5;
         if (uid == null || uid == 0) { // 未登录
            int platformType = 0;
            String platform = acceptData.getPlatform();
            if ("android".equals(platform)) {
               platformType = 1;
            } else if ("ios".equals(platform)) {
               platformType = 2;
            } else {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("平台有误"));
               return;
            }
            String device = acceptData.getDevice();
            if (device == null || device.trim().length() == 0) {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("设备不存在"));
               return;
            }
            List<DeviceLotteryRecord> list = deviceLotteryRecordService.listByPlatformAndDevice(platformType,
                  device);
            if (list != null && list.size() > 0) {
               count = count - list.size();
            }
         } else { // 已登录
            UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
            if (userInfoExtra == null) {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户信息不存在"));
               return;
            }
            Integer lotteryNewbies = userInfoExtra.getLotteryNewbies();
            if (lotteryNewbies == null) { // 未抽过
               // 是否有过订单:返利、分享订单
               boolean hasOrder = commonOrderCountService.hasRebateAndShareOrder(uid);
               if (hasOrder) {
                  count = 0; // 不算新用户
               }
               userInfoExtra.setLotteryNewbies(count);
               userInfoExtraService.saveUserInfoExtra(userInfoExtra);
            } else {
               count = lotteryNewbies; // 剩余次数
            }
         // 1、已登录系统
         if (uid != null) {
            JSONObject data = userLotteryRecordService.getLotteryCountNewbies(uid);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
            return;
         }
         // 2、未登录系统 - 记录设备
         int platformType = 0;
         String platform = acceptData.getPlatform();
         if ("android".equals(platform)) {
            platformType = 1;
         } else if ("ios".equals(platform)) {
            platformType = 2;
         } else {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("平台有误"));
            return;
         }
         String device = acceptData.getDevice();
         if (device == null || device.trim().length() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("设备不存在"));
            return;
         }
         List<DeviceLotteryRecord> list = deviceLotteryRecordService.listByPlatformAndDevice(platformType, device);
         int count = UserLotteryRecord.COUNT_NEWBIES;
         if (list != null && list.size() > 0) {
            count = count - list.size();
         }
         // 抽奖规则
         String lotteryRule = configService.get("lottery_rule_newbies");
         JSONObject data = new JSONObject();
         data.put("count", count);
         data.put("rule", lotteryRule);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (UserLotteryRecordException e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
         e.printStackTrace();
@@ -425,7 +414,6 @@
   /**
    * 获取抽奖结果
    *
    * @param callback
    * @param acceptData
    * @param uid
@@ -435,187 +423,157 @@
   public void getLotteryResult(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
      try {
         // 奖品
         int count = 0;
         String prize = "";
         String hasPrize = "";
         Long couponId = null;
         if (uid == null || uid == 0) { // 未登录
            int platformType = 0;
            String platform = acceptData.getPlatform();
            if ("android".equals(platform)) {
               platformType = 1;
            } else if ("ios".equals(platform)) {
               platformType = 2;
            } else {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("平台有误"));
               return;
            }
            String device = acceptData.getDevice();
            if (device == null || device.trim().length() == 0) {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("设备不存在"));
               return;
            }
            int countPrize = 0;
            List<DeviceLotteryRecord> list = deviceLotteryRecordService.listByPlatformAndDevice(platformType,
                  device);
            if (list != null && list.size() == MAX_COUNT) { // 无抽奖机会
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(2, "抽奖次数不足"));
               return;
            } else if (list != null && list.size() < MAX_COUNT) { // 拥有抽奖机会
               for (DeviceLotteryRecord deviceLotteryRecord : list) {
                  Long systemCouponId = deviceLotteryRecord.getSystemCouponId();
                  if (systemCouponId != null) {
                     countPrize++;
                     couponId = systemCouponId;
                  }
                  if (countPrize == 1) {
                     SystemCoupon coupon = systemCouponService.selectByPrimaryKey(systemCouponId);
                     hasPrize = coupon.getType().name();
                  }
               }
               count = MAX_COUNT - 1 - list.size();
            } else {
               count = MAX_COUNT - 1;
            }
            // 奖品
            prize = getLotteryPrize(MAX_COUNT, countPrize, list.size(), couponId);
            // 抽中
            Long newCouponId = null;
            if (prize != null && prize.trim().length() > 0) {
               // 已存在此券
               if (hasPrize.equals(prize)) {
                  prize = null;
               } else {
                  SystemCoupon coupon = systemCouponService.getCouponByType(prize);
                  newCouponId = coupon.getId();
               }
            }
            // 插入记录
            DeviceLotteryRecord record = new DeviceLotteryRecord();
            record.setDevice(device);
            record.setPlatform(platformType);
            record.setSystemCouponId(newCouponId);
            record.setCreateTime(new Date());
            deviceLotteryRecordService.insertSelective(record);
         } else { // 已登录
            UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
            if (userInfoExtra == null) {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("信息不正确"));
               return;
            }
            Integer lotteryNewbies = userInfoExtra.getLotteryNewbies();
            if (lotteryNewbies == null || lotteryNewbies < 1) { // 次数已用光
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(2, "抽奖次数不足"));
               return;
            } else {
               count = lotteryNewbies - 1; // 剩余次数
            }
            List<UserSystemCoupon> list = userSystemCouponService.getUserCouponBySource(uid,
                  UserSystemCoupon.SOURCE_CHOUJIANG);
            if (list != null && list.size() == 1) {
               couponId = list.get(0).getSystemCoupon().getId();
               SystemCoupon coupon = systemCouponService.selectByPrimaryKey(couponId);
               hasPrize = coupon.getType().name();
            }
            // 奖品
            prize = getLotteryPrize(MAX_COUNT, list.size(), MAX_COUNT - lotteryNewbies, couponId);
            // 抽中
            if (prize != null && prize.trim().length() > 0) {
               if (hasPrize.equals(prize)) {
                  prize = null;
               } else {
                  // 插入券信息
                  userSystemCouponService.insertUserCoupon(uid, prize, UserSystemCoupon.SOURCE_CHOUJIANG);
               }
            }
            // 剩余次数
            userInfoExtra.setLotteryNewbies(count);
            userInfoExtraService.saveUserInfoExtra(userInfoExtra);
         // 1、已登录用户抽奖
         if (uid != null) {
            Map<String, Object> map = userLotteryRecordService.executeLotteryNewbies(uid);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(map));
            return;
         }
         // 2、未登录用户抽奖
         int platformType = 0;
         String platform = acceptData.getPlatform();
         if ("android".equals(platform)) {
            platformType = 1;
         } else if ("ios".equals(platform)) {
            platformType = 2;
         } else {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("平台有误"));
            return;
         }
         String device = acceptData.getDevice();
         if (device == null || device.trim().length() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("设备不存在"));
            return;
         }
         if (prize == null || prize.trim().length() == 0) {
            prize = "NoPrize";
         }
         JSONObject data = new JSONObject();
         data.put("count", count);
         data.put("result", prize);
         List<DeviceLotteryRecord> list = deviceLotteryRecordService.listByPlatformAndDevice(platformType, device);
         if (list != null && list.size() >= UserLotteryRecord.COUNT_NEWBIES) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(2, "抽奖次数不足"));
            return;
         }
         // 设备抽奖
         JSONObject data = getDevicePrize(list, device, platformType);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (UserLotteryRecordException e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("抽奖失败"));
         e.printStackTrace();
      }
   }
   /**
    * 奖品抽取
    *
    * @param maxCount 最大次数
    * @param hasPrize 拥有奖品数量
    * @param record   已抽次数
    * @param couponId 券id
    * 设备信息抽奖-未登录
    * @param list
    * @param device
    * @param platformType
    * @return
    */
   public String getLotteryPrize(int maxCount, int countPrize, int record, Long couponId) {
   public JSONObject getDevicePrize(List<DeviceLotteryRecord> list, String device, int platformType) {
      int count = 0;
      int countPrize = 0;
      Long couponId = null;
      if (list == null || list.size() == 0) { // 拥有抽奖机会
         count = UserLotteryRecord.COUNT_NEWBIES;
      } else {
         for (DeviceLotteryRecord deviceLotteryRecord : list) {
            Long systemCouponId = deviceLotteryRecord.getSystemCouponId();
            if (systemCouponId != null) {
               countPrize++;
               couponId = systemCouponId;
            }
         }
         count = UserLotteryRecord.COUNT_NEWBIES - list.size();
      }
      String prize = null;
      String freeCoupon = CouponTypeEnum.welfareFreeCoupon.name(); // 福利免费券
      String rebateCoupon = CouponTypeEnum.rebatePercentCoupon.name(); // 奖励券
      if (countPrize == 1 && record == maxCount - 1) {
         // 最后一次: 只收到一个奖品
         SystemCoupon systemCoupon = systemCouponService.selectByPrimaryKey(couponId);
         if (systemCoupon != null) {
            CouponTypeEnum type = systemCoupon.getType();
            if (type.name() == freeCoupon) {
               prize = rebateCoupon; // 奖励券
            } else {
               prize = freeCoupon; // 福利免费券
            }
         } else {
            prize = rebateCoupon; // 奖励券
      String couponType = null;
      if (countPrize == 0) {
         prize = userLotteryRecordService.getLotteryPrizeNewbies(count, countPrize, null);
      } else if (countPrize == 1) {
         if (couponId != null) {
            SystemCoupon coupon = systemCouponService.selectByPrimaryKey(couponId);
            couponType = coupon.getType().name();
         }
      } else if (countPrize == 0 && record == maxCount - 2) {
         // 前3次没有奖励时、后面两次必中
         long result = (1 + Math.round(Math.random() * (9)));
         if (result <= 5) {
            prize = freeCoupon; // 福利免费券
         } else {
            prize = rebateCoupon; // 奖励券
         }
      } else { // 大于3次机会
         if (countPrize < 2) { // 不足两个奖品
            long result = (1 + Math.round(Math.random() * (9)));
            if (result <= 3) {
               prize = freeCoupon; // 福利免费券
            } else if (result <= 6) {
               prize = rebateCoupon; // 奖励券
            }
         if(couponType != null && couponType.trim().length() > 0) {
            prize = userLotteryRecordService.getLotteryPrizeNewbies(count, countPrize, couponType);
         }
      }
      Long newCouponId = null;
      if (prize == null || prize.trim().length() == 0) {
         prize = "NoPrize";
      } else if (prize.equals(couponType)) {
         // 已存在此券
         prize = "NoPrize";
      } else {
         SystemCoupon coupon = systemCouponService.getCouponByType(prize);
         if (coupon != null) {
            newCouponId = coupon.getId();
         }
      }
      count --;
      // 插入记录
      DeviceLotteryRecord record = new DeviceLotteryRecord();
      record.setDevice(device);
      record.setPlatform(platformType);
      record.setSystemCouponId(newCouponId);
      record.setCreateTime(new Date());
      deviceLotteryRecordService.insertSelective(record);
      return prize;
      JSONObject data = new JSONObject();
      data.put("count", count);
      data.put("result", prize);
      return data;
   }
   /**
    * 获取抽奖次数- 天天抽奖励券
    *
    * @param callback
    * @param acceptData
    * @param uid
    * @param out
    */
   @RequestMapping(value = "getDailyCount")
   public void getDailyCount(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
      try {
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(userLotteryRecordService.getLotteryCountDaily(uid)));
      } catch (UserLotteryRecordException e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(),e.getMsg()));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("信息获取失败"));
         e.printStackTrace();
      }
   }
   /**
    * 获取抽奖结果 - 天天抽奖励券`
    * @param callback
    * @param acceptData
    * @param uid
    * @param out
    */
   @RequestMapping(value = "getDailyResult")
   public void getDailyResult(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
      try {
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(userLotteryRecordService.executeLotteryDaily(uid)));
      } catch (UserLotteryRecordException e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(),e.getMsg()));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("抽奖失败"));
         e.printStackTrace();
      }
   }
}