yujian
2019-03-27 cdcbed9af813b2a02cdc01eefa24db8bec6b51a9
fanli/src/main/java/com/yeshi/fanli/controller/client/UserCouponController.java
@@ -1,17 +1,16 @@
package com.yeshi.fanli.controller.client;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.yeshi.utils.DateUtil;
import org.yeshi.utils.JsonUtil;
import com.yeshi.fanli.entity.accept.AcceptData;
@@ -21,6 +20,7 @@
import com.yeshi.fanli.entity.bus.user.UserSystemCoupon;
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.UserSystemCouponException;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.config.SystemCouponService;
@@ -39,12 +39,16 @@
/**
 * 福利中心
 *
 * @author Administrator
 *
 */
@Controller
@RequestMapping("api/v1/user/coupon")
public class UserCouponController {
   @Resource(name = "taskExecutor")
   private TaskExecutor executor;
   @Resource
   private ConfigService configService;
@@ -53,34 +57,33 @@
   private UserSystemCouponService UserSystemCouponService;
   @Resource
   private  SwiperPictureService swiperPictureService;
   private SwiperPictureService swiperPictureService;
   @Resource
   private CommonOrderService commonOrderService;
   @Resource
   private DeviceLotteryRecordService deviceLotteryRecordService;
   @Resource
   private SystemCouponService systemCouponService;
   @Resource
   private UserSystemCouponService userSystemCouponService;
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private CommonOrderCountService commonOrderCountService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   // 最大抽奖次数
   private static int MAX_COUNT = 5;
   /**
    * 用户券列表查询
    *
    * @param acceptData
    * @param page
    * @param uid
@@ -92,31 +95,31 @@
         out.print(JsonUtil.loadFalseResult("用户未登录"));
         return;
      }
      try {
         if (page == null || page < 1) {
            page = 1;
         }
         // 福利中心图片
         String topPicture = null;
         if(page == 1) {
         String topPicture = null;
         if (page == 1) {
            List<SwiperPicture> listswiper = swiperPictureService.getByBannerCard("welfare_top");
            if (listswiper != null && listswiper.size() > 0) {
               topPicture = listswiper.get(0).getSrc();
            }
         }
         long count = 0;
         List<UserSystemCouponVO> resultList = UserSystemCouponService.getUserCouponVOList((page - 1) * Constant.PAGE_SIZE,
               Constant.PAGE_SIZE, uid );
         List<UserSystemCouponVO> resultList = UserSystemCouponService
               .getUserCouponVOList((page - 1) * Constant.PAGE_SIZE, Constant.PAGE_SIZE, uid);
         if (resultList != null && resultList.size() > 0) {
            count = UserSystemCouponService.countUserCouponList(uid);
         } else if (resultList == null) {
            resultList = new ArrayList<UserSystemCouponVO>();
         }
         JSONObject data = new JSONObject();
         data.put("topPicture", topPicture);
         data.put("count", count);
@@ -124,6 +127,26 @@
         out.print(JsonUtil.loadTrueResult(data));
         // 更新福利中心未读数量
         if (page == 1) {
            executor.execute(new Runnable() {
               @Override
               public void run() {
                  UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
                  // 未读券是否大于0
                  if (userInfoExtra != null && userInfoExtra.getCouponNews() > 0) {
                     userInfoExtra.setCouponNews(0);
                     try {
                        userInfoExtraService.saveUserInfoExtra(userInfoExtra);
                     } catch (UserInfoExtraException e) {
                        e.printStackTrace();
                     }
                  }
               }
            });
         }
      } catch (UserSystemCouponException e) {
         out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
@@ -131,40 +154,42 @@
         e.printStackTrace();
      }
   }
   /**
    * 用户奖励券
    *
    * @param acceptData
    * @param page
    * @param uid
    * @param auctionId  商品id
    * @param out
    */
   @RequestMapping(value = "getGoodsCouponList", method = RequestMethod.POST)
   public void getGoodsCouponList(AcceptData acceptData, Long uid, PrintWriter out) {
   public void getGoodsCouponList(AcceptData acceptData, Long uid, Long auctionId, PrintWriter out) {
      if (uid == null) {
         out.print(JsonUtil.loadFalseResult("用户未登录"));
         return;
      }
      try {
         List<UserSystemCouponVO> resultList = UserSystemCouponService.getGoodsCouponList(uid);
         if (resultList == null ) {
            resultList =new ArrayList<UserSystemCouponVO>();
         List<UserSystemCouponVO> resultList = UserSystemCouponService.getGoodsCouponList(uid, auctionId);
         if (resultList == null) {
            resultList = new ArrayList<UserSystemCouponVO>();
         }
         JSONObject dataTip = new JSONObject();
         dataTip.put("content", configService.get("free_coupon_tip"));
         dataTip.put("fontColor", "#F14242");
         JSONObject data = new JSONObject();
         data.put("helpLink", configService.get("free_coupon_help"));
         data.put("tip", dataTip);
         data.put("count", resultList.size());
         data.put("result_list", JsonUtil.getApiCommonGson().toJson(resultList));
         out.print(JsonUtil.loadTrueResult(data));
      } catch (UserSystemCouponException e) {
         out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
@@ -172,10 +197,10 @@
         e.printStackTrace();
      }
   }
   /**
    *  免单券使用记录 以及状态修改
    * 免单券使用记录 以及状态修改
    *
    * @param acceptData
    * @param page
    * @param uid
@@ -187,7 +212,7 @@
         out.print(JsonUtil.loadFalseResult("用户未登录"));
         return;
      }
      try {
         UserSystemCouponService.useGoodsCoupon(uid, cid, goodId);
         out.print(JsonUtil.loadTrueResult("使用成功"));
@@ -198,10 +223,10 @@
         e.printStackTrace();
      }
   }
   /**
    * 用户奖励券
    *
    * @param acceptData
    * @param page
    * @param uid
@@ -209,26 +234,26 @@
    */
   @RequestMapping(value = "getOrderCouponList", method = RequestMethod.POST)
   public void getOrderCouponList(AcceptData acceptData, Long uid, PrintWriter out) {
      if (uid == null) {
         out.print(JsonUtil.loadFalseResult("用户未登录"));
         return;
      }
      try {
         List<UserSystemCouponVO> resultList = UserSystemCouponService.getOrderCouponList(uid);
         if (resultList == null ) {
            resultList =new ArrayList<UserSystemCouponVO>();
         if (resultList == null) {
            resultList = new ArrayList<UserSystemCouponVO>();
         }
         JSONObject data = new JSONObject();
         data.put("helpLink", configService.get("reward_coupon_help"));
         data.put("count", resultList.size());
         data.put("result_list", JsonUtil.getApiCommonGson().toJson(resultList));
         out.print(JsonUtil.loadTrueResult(data));
      } catch (UserSystemCouponException e) {
         out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
@@ -236,10 +261,10 @@
         e.printStackTrace();
      }
   }
   /**
    *  免单券使用记录 以及状态修改
    * 免单券使用记录 以及状态修改
    *
    * @param acceptData
    * @param page
    * @param uid
@@ -247,19 +272,19 @@
    */
   @RequestMapping(value = "useRewardCoupon", method = RequestMethod.POST)
   public void useRewardCoupon(AcceptData acceptData, Long uid, Long cid, String orderNo, PrintWriter out) {
      if (uid == null) {
         out.print(JsonUtil.loadFalseResult("用户未登录"));
         return;
      }
      try {
         UserSystemCouponService.useOrderCoupon(uid, cid, orderNo);
         JSONObject data = commonOrderService.getRewardJumpInfo(orderNo);
         out.print(JsonUtil.loadTrueResult(data));
      } catch (UserSystemCouponException e) {
         out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
@@ -267,25 +292,26 @@
         e.printStackTrace();
      }
   }
   /**
    *  订单-奖励进度详情
    * 订单-奖励进度详情
    *
    * @param acceptData
    * @param orderNo 订单号
    * @param orderNo    订单号
    * @param out
    */
   @RequestMapping(value = "getRewardRecord", method = RequestMethod.POST)
   public void getRewardCounponRecord(AcceptData acceptData, String orderNo, PrintWriter out) {
      try {
         UserSystemCouponRecordVO rewardRecord = UserSystemCouponService.getRewardCouponRecord(orderNo);
         JSONObject data = new JSONObject();
         data.put("rewardRecord", rewardRecord);
         out.print(JsonUtil.loadTrueResult(data));
      } catch (UserSystemCouponException e) {
         out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
@@ -293,25 +319,26 @@
         e.printStackTrace();
      }
   }
   /**
    *  订单-奖励进度详情
    * 订单-奖励进度详情
    *
    * @param acceptData
    * @param orderNo 订单号
    * @param orderNo    订单号
    * @param out
    */
   @RequestMapping(value = "getFreeCounponRecord", method = RequestMethod.POST)
   public void getFreeCounponRecord(AcceptData acceptData, String orderNo, PrintWriter out) {
      try {
         UserSystemCouponRecordVO rewardRecord = UserSystemCouponService.getFreeCouponRecord(orderNo);
         JSONObject data = new JSONObject();
         data.put("frreCouponRecord", rewardRecord);
         out.print(JsonUtil.loadTrueResult(data));
      } catch (UserSystemCouponException e) {
         out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
@@ -319,7 +346,6 @@
         e.printStackTrace();
      }
   }
   /**
    * 获取抽奖次数
@@ -331,50 +357,11 @@
    */
   @RequestMapping(value = "getLotteryCount")
   public void getLotteryCount(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
      int count = 0;
      try {
         count = getSurplusCount(acceptData, uid);
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMessage()));
         e.printStackTrace();
      }
         // 默认最大抽奖次数
         int count = 5;
      try {
         // 抽奖规则
         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 (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
         e.printStackTrace();
      }
   }
   /**
    * 获取抽奖结果
    *
    * @param callback
    * @param acceptData
    * @param uid
    * @param out
    */
   @RequestMapping(value = "getLotteryResult")
   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) { // 未登录
         if (uid == null || uid == 0) { // 未登录
            int platformType = 0;
            String platform = acceptData.getPlatform();
            if ("android".equals(platform)) {
@@ -391,14 +378,103 @@
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("设备不存在"));
               return;
            }
            int countPrize = 0;
            List<DeviceLotteryRecord> list = deviceLotteryRecordService.listByPlatformAndDevice(platformType,
                  device);
            if (list != null && list.size() == MAX_COUNT) { // 无抽奖机会
            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; // 剩余次数
            }
         }
         // 抽奖规则
         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 (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
         e.printStackTrace();
      }
   }
   /**
    * 获取抽奖结果
    *
    * @param callback
    * @param acceptData
    * @param uid
    * @param out
    */
   @RequestMapping(value = "getLotteryResult")
   public void getLotteryResult(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
      try {
         // 剩余抽奖次数
         int count = 0;
         // 本次抽中的奖品
         String prize = null;
         // 已使用抽奖次数
         int countUsed = 0;
         // 已拥有奖品数量
         int countPrize = 0;
         // 已有券类型
         String couponType = 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;
            }
            List<DeviceLotteryRecord> list = deviceLotteryRecordService.listByPlatformAndDevice(platformType,
                  device);
            if (list != null && list.size() >= Constant.MAX_COUNT_LOTTERY_NEWBIES) { // 无抽奖机会
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(2, "抽奖次数不足"));
               return;
            } else if (list != null && list.size() < MAX_COUNT) { // 拥有抽奖机会
            }
            Long couponId = null;
            if (list == null || list.size() == 0) { // 拥有抽奖机会
               count = Constant.MAX_COUNT_LOTTERY_NEWBIES - 1;
            } else {
               
               for (DeviceLotteryRecord deviceLotteryRecord : list) {
                  Long systemCouponId = deviceLotteryRecord.getSystemCouponId();
@@ -406,35 +482,35 @@
                     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;
               count = Constant.MAX_COUNT_LOTTERY_NEWBIES - 1 - list.size();
            }
            // 奖品
            prize = getLotteryPrize(MAX_COUNT, countPrize, list.size(), couponId);
            // 奖品小于2时才抽奖
            if (countPrize < 2) {
               if (couponId != null) {
                  SystemCoupon coupon = systemCouponService.selectByPrimaryKey(couponId);
                  // 已有券
                  couponType = coupon.getType().name();
               }
               // 奖品
               prize = getLotteryPrize(Constant.MAX_COUNT_LOTTERY_NEWBIES, countPrize, list.size(), couponType);
            }
            // 抽中
            Long newCouponId = null;
            if (prize != null && prize.trim().length() > 0) {
               // 已存在此券
               if (hasPrize.equals(prize)) {
               if (prize.equals(couponType)) {
                  prize = null;
               } else {
                  SystemCoupon coupon= systemCouponService.getCouponByType(prize);
                  newCouponId = coupon.getId();
                  SystemCoupon coupon = systemCouponService.getCouponByType(prize);
                  if (coupon != null) {
                     newCouponId = coupon.getId();
                  }
               }
            }
            // 插入记录
            DeviceLotteryRecord record = new DeviceLotteryRecord();
            record.setDevice(device);
@@ -442,35 +518,57 @@
            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 ) { // 次数已用光
            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();
            }
            // 剩余次数
            count = lotteryNewbies - 1;
            // 已使用次数
            countUsed = Constant.MAX_COUNT_LOTTERY_NEWBIES - lotteryNewbies;
            
            // 奖品
            prize = getLotteryPrize(MAX_COUNT, list.size(), MAX_COUNT- lotteryNewbies, couponId);
            // 已抽中的奖品
            List<UserSystemCoupon> list = userSystemCouponService.getUserCouponBySource(uid,
                  UserSystemCoupon.SOURCE_CHOUJIANG);
            if (list == null || list.size() == 0) {
               // 抽奖
               prize = getLotteryPrize(Constant.MAX_COUNT_LOTTERY_NEWBIES, countPrize , countUsed, couponType);
            } else if (list.size() == 1) {
               UserSystemCoupon userSystemCoupon = list.get(0);
               SystemCoupon systemCoupon = userSystemCoupon.getSystemCoupon();
               if (systemCoupon != null) {
                  SystemCoupon coupon = systemCouponService.selectByPrimaryKey(systemCoupon.getId());
                  // 已有券
                  couponType = coupon.getType().name();
               }
               // 拥有奖品数量
               countPrize = 1;
               // 抽奖
               prize = getLotteryPrize(Constant.MAX_COUNT_LOTTERY_NEWBIES, countPrize, countUsed, couponType);
            }
            // 抽中
            if (prize != null && prize.trim().length() > 0) {
               if (hasPrize.equals(prize)) {
               if (prize.equals(couponType)) {
                  // 已有此券
                  prize = null;
               } else {
                  // 插入券信息
@@ -482,7 +580,7 @@
            userInfoExtra.setLotteryNewbies(count);
            userInfoExtraService.saveUserInfoExtra(userInfoExtra);
         }
         if (prize == null || prize.trim().length() == 0) {
            prize = "NoPrize";
         }
@@ -498,35 +596,30 @@
         e.printStackTrace();
      }
   }
   /**
    * 奖品抽取
    * @param maxCount  最大次数
    *
    * @param maxCount 最大次数
    * @param hasPrize 拥有奖品数量
    * @param record  已抽次数
    * @param record   已抽次数
    * @param couponId 券id
    * @return
    */
   public String getLotteryPrize(int maxCount, int countPrize, int record, Long couponId) {
      String prize = null;
   public String getLotteryPrize(int maxCount, int countPrize, int record, String couponType) {
      String prize = null;
      String freeCoupon = CouponTypeEnum.welfareFreeCoupon.name(); // 福利免费券
      String rebateCoupon =  CouponTypeEnum.rebatePercentCoupon.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; // 福利免费券
            }
         if (rebateCoupon.equals(couponType)) {
            prize = freeCoupon; // 福利免费券
         } else {
            prize = rebateCoupon; // 奖励券
            prize = rebateCoupon;  // 奖励券
         }
      } else if (countPrize == 0 && record == maxCount - 2) {
         // 前3次没有奖励时、后面两次必中
         long result = (1 + Math.round(Math.random() * (9)));
@@ -544,77 +637,10 @@
               prize = freeCoupon; // 福利免费券
            } else if (result <= 6) {
               prize = rebateCoupon; // 奖励券
            }
         }
      }
      return prize;
   }
   public static void main(String[] args) {
      long result = (1 + Math.round(Math.random() * (9)));
      System.out.println(result);
   }
   /**
    * 获取抽奖结果
    *
    * @param callback
    * @param acceptData
    * @param uid
    * @param out
    */
   public int getSurplusCount(AcceptData acceptData, Long uid) throws Exception {
      // 默认最大抽奖次数
      int count = 5;
      if (uid == null) { // 未登录
         int platformType = 0;
         String platform = acceptData.getPlatform();
         if ("android".equals(platform)) {
            platformType = 1;
         } else if ("ios".equals(platform)) {
            platformType = 2;
         } else {
            throw new Exception("平台有误");
         }
         String device = acceptData.getDevice();
         if (device == null || device.trim().length() == 0) {
            throw new Exception("设备不存在");
         }
         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) {
            throw new Exception("信息不正确");
         }
         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; // 剩余次数
         }
         }
      }
      return count;
      return prize;
   }
}