package com.yeshi.fanli.controller.apph5;
|
|
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.stereotype.Controller;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.yeshi.utils.DateUtil;
|
import org.yeshi.utils.JsonUtil;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.yeshi.fanli.entity.accept.AcceptData;
|
import com.yeshi.fanli.entity.bus.user.DeviceLotteryRecord;
|
import com.yeshi.fanli.entity.bus.user.ShamUser;
|
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
|
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.service.inter.config.ConfigService;
|
import com.yeshi.fanli.service.inter.config.SystemCouponService;
|
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
|
import com.yeshi.fanli.service.inter.user.DeviceLotteryRecordService;
|
import com.yeshi.fanli.service.inter.user.ShamUserService;
|
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
|
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
|
|
import net.sf.json.JSONObject;
|
|
/**
|
* 用户
|
*
|
* @author Administrator
|
*
|
*/
|
@Controller
|
@RequestMapping("api/apph5/v1/user")
|
public class AppH5UserController {
|
|
@Resource
|
private DeviceLotteryRecordService deviceLotteryRecordService;
|
|
@Resource
|
private UserInfoExtraService userInfoExtraService;
|
|
@Resource
|
private CommonOrderCountService commonOrderCountService;
|
|
@Resource
|
private ShamUserService shamUserService;
|
|
@Resource
|
private ConfigService configService;
|
|
@Resource
|
private SystemCouponService systemCouponService;
|
|
|
@Resource
|
private UserSystemCouponService userSystemCouponService;
|
|
// 最大抽奖次数
|
private static int MAX_COUNT = 5;
|
|
/**
|
* 获取抽奖次数
|
*
|
* @param callback
|
* @param acceptData
|
* @param uid
|
* @param out
|
*/
|
@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();
|
}
|
|
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 out
|
*/
|
@RequestMapping(value = "getRadioList")
|
public void getRadioList(String callback, PrintWriter out) {
|
|
try {
|
// 随机20条数据
|
List<ShamUser> listUser = shamUserService.listRandUser(20);
|
|
JSONArray array = new JSONArray();
|
for (ShamUser shamUser : listUser) {
|
JSONObject dataInfo = new JSONObject();
|
|
String name = shamUser.getName();
|
if (name.length() == 1) {
|
name = "Jx****" + name;
|
} else {
|
name = name.substring(0, 1) + "****" + name.substring(name.length() - 2, name.length() - 1);
|
}
|
|
String prize = generateAward();
|
if (prize == null) {
|
prize = "抽中一张福利免单券";
|
}
|
|
dataInfo.put("pic", shamUser.getPicUrl());
|
dataInfo.put("content", name + ",抽中" + prize);
|
array.add(dataInfo);
|
}
|
|
JSONObject data = new JSONObject();
|
data.put("result_list", array);
|
|
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 = "";
|
Long couponId = null;
|
|
if (uid == null) { // 未登录
|
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 hasPrize = 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) {
|
hasPrize++;
|
couponId = systemCouponId;
|
}
|
}
|
count = MAX_COUNT - 1 - list.size();
|
} else {
|
count = MAX_COUNT - 1;
|
}
|
|
// 奖品
|
prize = getLotteryPrize(MAX_COUNT, hasPrize, list.size(), couponId);
|
// 抽中
|
Long newCouponId = null;
|
if (prize != null && prize.trim().length() > 0) {
|
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();
|
}
|
|
// 奖品
|
prize = getLotteryPrize(MAX_COUNT, list.size(), MAX_COUNT- lotteryNewbies, couponId);
|
// 抽中
|
if (prize != null && prize.trim().length() > 0) {
|
SystemCoupon coupon= systemCouponService.getCouponByType(prize);
|
|
String endDay = DateUtil.plusDay(coupon.getExpiryDay(), new Date());
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
Date endTime = format.parse(endDay);
|
|
int stateActivated = 1;
|
if (coupon.getType() == CouponTypeEnum.welfareFreeCoupon) {
|
stateActivated = 0;
|
}
|
|
UserSystemCoupon userCoupon = new UserSystemCoupon();
|
userCoupon.setUid(uid);
|
userCoupon.setSource(UserSystemCoupon.SOURCE_CHOUJIANG);
|
userCoupon.setSystemCoupon(coupon);
|
userCoupon.setState(UserSystemCoupon.STATE_CAN_USE);
|
userCoupon.setStateActivated(stateActivated);
|
userCoupon.setStartTime(new Date());
|
userCoupon.setEndTime(endTime);
|
userCoupon.setCreateTime(new Date());
|
userCoupon.setUpdateTime(new Date());
|
userSystemCouponService.insertSelective(userCoupon);
|
}
|
|
// 剩余次数
|
userInfoExtra.setLotteryNewbies(count);
|
userInfoExtraService.saveUserInfoExtra(userInfoExtra);
|
}
|
|
if (prize == null || prize.trim().length() == 0) {
|
prize = "NoPrize";
|
}
|
|
JSONObject data = new JSONObject();
|
data.put("count", count);
|
data.put("result", prize);
|
|
JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
|
|
} catch (Exception e) {
|
JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("抽奖失败"));
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 奖品抽取
|
* @param maxCount 最大次数
|
* @param hasPrize 拥有奖品数量
|
* @param record 已抽次数
|
* @param couponId 券id
|
* @return
|
*/
|
public String getLotteryPrize(int maxCount, int hasPrize, int record, Long couponId) {
|
|
String prize = null;
|
String freeCoupon = CouponTypeEnum.welfareFreeCoupon.name(); // 福利免费券
|
String rebateCoupon = CouponTypeEnum.rebatePercentCoupon.name(); // 奖励券
|
|
if (hasPrize == 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; // 奖励券
|
}
|
|
} else if (hasPrize == 0 && record == maxCount - 2) {
|
// 前3次没有奖励时、后面两次必中
|
long result = (1 + Math.round(Math.random() * (9)));
|
if (result <= 5) {
|
prize = freeCoupon; // 福利免费券
|
} else {
|
prize = rebateCoupon; // 奖励券
|
}
|
|
} else { // 大于3次机会
|
|
if (hasPrize < 2) { // 不足两个奖品
|
long result = (1 + Math.round(Math.random() * (9)));
|
if (result <= 3) {
|
prize = freeCoupon; // 福利免费券
|
} else if (result <= 6) {
|
prize = rebateCoupon; // 奖励券
|
}
|
}
|
}
|
|
return prize;
|
}
|
|
|
|
|
/**
|
* 获取抽奖结果
|
*
|
* @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
|
*/
|
public String generateAward() {
|
|
RandomGift randomGift1 = new RandomGift();
|
randomGift1.prize = "抽中华为手机20一台";
|
randomGift1.probability = 2;
|
|
RandomGift randomGift2 = new RandomGift();
|
randomGift2.prize = "现金红包¥188";
|
randomGift2.probability = 5;
|
|
RandomGift randomGift3 = new RandomGift();
|
randomGift3.prize = "现金红包¥88";
|
randomGift3.probability = 13;
|
|
RandomGift randomGift4 = new RandomGift();
|
randomGift4.prize = "一张福利免单券";
|
randomGift4.probability = 40;
|
|
RandomGift randomGift5 = new RandomGift();
|
randomGift5.prize = "一张返利奖励券";
|
randomGift5.probability = 40;
|
|
List<RandomGift> giftList = new ArrayList<RandomGift>();
|
giftList.add(randomGift1);
|
giftList.add(randomGift2);
|
giftList.add(randomGift3);
|
giftList.add(randomGift4);
|
giftList.add(randomGift5);
|
|
long result = (1 + Math.round(Math.random() * (99)));
|
|
int minRange = 0;
|
int maxRange = 0;
|
|
String prize = null;
|
|
for (int i = 0; i < giftList.size(); i++) {
|
RandomGift obj2 = giftList.get(i);
|
int probability = obj2.probability;
|
|
maxRange = maxRange + probability;
|
minRange = 100 - maxRange;
|
|
if (probability != 0) {
|
if (result > minRange && result <= maxRange) {
|
prize = obj2.prize;
|
break;
|
}
|
}
|
}
|
|
return prize;
|
}
|
|
class RandomGift {
|
public String prize;// 奖项
|
public int probability; // 概率
|
}
|
}
|