/**
* 抽奖
* @param activity618DrawsEvt
* @return
*/
public Message getTurntableLottery(Activity618DrawsEvt activity618DrawsEvt) {
//获取抽奖手机号码
String phone = activity618DrawsEvt.getPhone();
//查询订单获取的抽奖次数
Integer count=queryWeborderIdBy618SignAnd618UserPhone(phone,"618");
//已经使用的抽奖次数
Integer alreadyDraw=queryAlreadylotteryCountByPhone(phone);
Integer remain=count-alreadyDraw;
if(remain<=0){
return R.error("您暂时没有抽奖机会");
}
//获取活动所有奖品列表
TfActivityGift tfActivityGift = new TfActivityGift();
List<TfActivityGift>list= tfActivityGiftDao.queryAll(tfActivityGift);
//抽奖
int random =tfActivityUserOperationService.getPrize(list);
TfActivityGift prize = tfActivityGiftDao.queryById(random + 1);
//循环抽奖
Integer giftNum = prize.getGiftNum();
while(giftNum==0){
int random1 = tfActivityUserOperationService.getPrize(list);
prize = tfActivityGiftDao.queryById(random1 + 1);
giftNum = prize.getGiftNum();
}
//改变奖品个数
giftNum--;
prize.setGiftNum(giftNum);
tfActivityGiftDao.update(prize);
//用户明细操作--抽奖记录
ActUserOperation build1 = ActUserOperation.builder().phone(phone).createTime(new Date()).userOperation("6").luckDraw("-1").prizeName(prize.getGiftName()).activityId("20210618").build();
ActUserOperation insert = actUserOperationService.insert(build1);
Integer id = insert.getId();
PrizeReceiveVo prizeReceiveVo = new PrizeReceiveVo();
prizeReceiveVo.setAngle(prize.getAngle());
prizeReceiveVo.setGiftName(prize.getGiftName());
prizeReceiveVo.setUserDrawOperationId(id);
prizeReceiveVo.setDraws(String.valueOf(remain-1));
return R.success(prizeReceiveVo);
}
关键代码是这里
public int getPrize(List list) {
int random = -1;
try{
//计算权重和
double sumWeight = 0;
for(TfActivityGift tfActivityGift : list){
sumWeight += tfActivityGift.getWeight();
}
//产生随机数
double randomNumber;
randomNumber = Math.random();
//根据随机数在所有奖品分布的区域并确定所抽奖品
double d1 = 0;
double d2 = 0;
for(int i=0;i<list.size();i++){
d2 += Double.parseDouble(String.valueOf(list.get(i).getWeight()))/sumWeight;
if(i==0){
d1 = 0;
}else{
d1 +=Double.parseDouble(String.valueOf(list.get(i-1).getWeight()))/sumWeight;
}
if(randomNumber >= d1 && randomNumber <= d2){
random = i;
break;
}
}
}catch(Exception e){
log.error("生成抽奖随机数出错,出错原因:" +e.getMessage());
}
return random;
}