|
@@ -32,6 +32,7 @@ import java.time.LocalTime;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.Random;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -184,35 +185,17 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
|
|
|
// 查看奖级下的奖品
|
|
|
List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
|
|
|
|
|
|
- // 开奖
|
|
|
- int random = -1;
|
|
|
- // 计算总权重
|
|
|
- double sumWeight = 0;
|
|
|
- for (TicketAwardsPrize ticketAwardsPrize : ticketAwardsPrizes) {
|
|
|
- sumWeight += ticketAwardsPrize.getRemainQty();
|
|
|
- }
|
|
|
+ List<TicketAwardsPrize> newTicketAwardsPrizes = new ArrayList<>();
|
|
|
|
|
|
- //产生随机数
|
|
|
- double randomNumber;
|
|
|
- randomNumber = Math.random();
|
|
|
-
|
|
|
- //根据随机数在所有奖品分布的区域并确定所抽奖品
|
|
|
- double d1 = 0;
|
|
|
- double d2 = 0;
|
|
|
- for (int i = 0; i < ticketAwardsPrizes.size(); i++) {
|
|
|
- d2 += Double.parseDouble(String.valueOf(ticketAwardsPrizes.get(i).getQuantity())) / sumWeight;
|
|
|
- if (i == 0) {
|
|
|
- d1 = 0;
|
|
|
- } else {
|
|
|
- d1 += Double.parseDouble(String.valueOf(ticketAwardsPrizes.get(i - 1).getQuantity())) / sumWeight;
|
|
|
- }
|
|
|
- if (randomNumber > d1 && randomNumber <= d2) {
|
|
|
- random = i;
|
|
|
- break;
|
|
|
+ for (TicketAwardsPrize ticketAwardsPrize : ticketAwardsPrizes) {
|
|
|
+ if (ticketAwardsPrize.getRemainQty() != 0) {
|
|
|
+ newTicketAwardsPrizes.add(ticketAwardsPrize);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizes.get(random);
|
|
|
+ int random = getRandom(newTicketAwardsPrizes);
|
|
|
+
|
|
|
+ TicketAwardsPrize ticketAwardsPrize = newTicketAwardsPrizes.get(random);
|
|
|
|
|
|
userHitPrizeDetailVO.setPrizeId(ticketAwardsPrize.getPrizeId());
|
|
|
userHitPrizeDetailVO.setPicUrl(ticketAwardsPrize.getPicUrl());
|
|
@@ -229,6 +212,43 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取中奖索引
|
|
|
+ * @param newTicketAwardsPrizes
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private int getRandom(List<TicketAwardsPrize> newTicketAwardsPrizes) {
|
|
|
+ // 开奖
|
|
|
+ int random = -1;
|
|
|
+ // 计算总权重
|
|
|
+ double sumWeight = 0;
|
|
|
+ for (TicketAwardsPrize ticketAwardsPrize : newTicketAwardsPrizes) {
|
|
|
+ sumWeight += ticketAwardsPrize.getRemainQty();
|
|
|
+ }
|
|
|
+
|
|
|
+ //产生随机数
|
|
|
+ double randomNumber;
|
|
|
+ randomNumber = Math.random();
|
|
|
+
|
|
|
+ //根据随机数在所有奖品分布的区域并确定所抽奖品
|
|
|
+ double d1 = 0;
|
|
|
+ double d2 = 0;
|
|
|
+ for (int i = 0; i < newTicketAwardsPrizes.size(); i++) {
|
|
|
+ d2 += Double.parseDouble(String.valueOf(newTicketAwardsPrizes.get(i).getRemainQty())) / sumWeight;
|
|
|
+ if (i == 0) {
|
|
|
+ d1 = 0;
|
|
|
+ } else {
|
|
|
+ d1 += Double.parseDouble(String.valueOf(newTicketAwardsPrizes.get(i - 1).getRemainQty())) / sumWeight;
|
|
|
+ }
|
|
|
+ if (randomNumber >= d1 && randomNumber < d2) {
|
|
|
+ random = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return random;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId) {
|