定义好将品类
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="LuckDrawActivityPrizeRel对象", description="抽奖活动奖品表")
public class LuckDrawActivityPrizeRel implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "奖项名称")
private String prizeName;
@ApiModelProperty(value = "最大中奖数")
private Integer maxWinNumber;
@ApiModelProperty(value = "每天最大中奖数")
private Integer dayMaxWinNumber;
@ApiModelProperty(value = "中奖概率")
private Integer probability;
@ApiModelProperty(value = "奖项类型1线下奖品,2积分,3会员卡月,4优惠券,5谢谢惠顾")
private Integer prizeType;
@ApiModelProperty(value = "所需积分")
private Integer needScore;
@ApiModelProperty(value = "图片")
private String imgUrl;
@ApiModelProperty(value = "类型值,积分,金额,优惠券等")
private String prizeVal;
@ApiModelProperty(value = "抽奖活动id")
private Long luckActivityConfigId;
}
概率抽奖工具类
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class LotteryUtil {
public static int lottery(List orignalRates) {
if (orignalRates == null || orignalRates.isEmpty()) {
return -1;
}
int size = orignalRates.size();
// 计算总概率,这样可以保证不一定总概率是1
double sumRate = 0d;
for (double rate : orignalRates) {
sumRate += rate;
}
// 计算每个物品在总概率的基础下的概率情况
List sortOrignalRates = new ArrayList(size);
Double tempSumRate = 0d;
for (double rate : orignalRates) {
tempSumRate += rate;
sortOrignalRates.add(tempSumRate / sumRate);
}
// 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
sortOrignalRates.add(nextDouble);
Collections.sort(sortOrignalRates);
return sortOrignalRates.indexOf(nextDouble);
}
public static int getJD(List orignalRates) {
if (orignalRates == null || orignalRates.isEmpty()) {
return -1;
}
int size = orignalRates.size();
// 计算总概率,这样可以保证不一定总概率是1
double sumRate = 0d;
for (double rate : orignalRates) {
sumRate += rate;
}
// 计算每个物品在总概率的基础下的概率情况
List sortOrignalRates = new ArrayList(size);
Double tempSumRate = 0d;
for (double rate : orignalRates) {
tempSumRate += rate;
sortOrignalRates.add(tempSumRate / sumRate);
}
// 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
sortOrignalRates.add(nextDouble);
Collections.sort(sortOrignalRates);
return sortOrignalRates.indexOf(nextDouble);
}
}
抽奖
//根据活动id抽奖
public LuckDrawActivityPrizeRel winPrize(Long luckDrawActivityId) {
//查询抽奖活动所有奖品
List prizeRelList = prizeRelService.list(new LambdaQueryWrapper()
.eq(LuckDrawActivityPrizeRel::getLuckActivityConfigId, configId));
if (prizeRelList == null) {
throw new BizException("未创建奖品");
}
List orignalRates = new ArrayList(prizeRelList.size());
for (LuckDrawActivityPrizeRel gift : prizeRelList) {
double probability = ((double) gift.getProbability() / 100);//这里创建奖品概率填的是两位数不是小数,所以除以100
if (probability < 0) {
probability = 0;
}
orignalRates.add(probability);
}
//抽奖奖品索引
int orignalIndex = LotteryUtil.lottery(orignalRates);
//根据索引获取中奖奖品
LuckDrawActivityPrizeRel winPrize = prizeRelList.get(orignalIndex);
return winPrize;
}