|
@@ -140,62 +140,17 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
|
|
|
ticketAwardsService.saveBatch(ticketAwardsList);
|
|
|
ticketAwardsPrizeService.saveBatch(awardsPrizeList);
|
|
|
|
|
|
+ generateTicket(ticketBox, ticketAwardsList);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void generateTicket(TicketBox ticketBox, List<TicketAwards> ticketAwardsList) {
|
|
|
// 分包
|
|
|
int pkgNum = ticketBox.getPkgQty();
|
|
|
int pkgUnit = ticketBox.getPkgUnit();
|
|
|
|
|
|
- // 1.把各奖级的中奖数量分摊到每包上
|
|
|
- Map<Integer, List<PkgAwards>> pkgAwardsMap = new HashMap<>();
|
|
|
- for (int m = 1; m <= pkgNum; m++) {
|
|
|
- pkgAwardsMap.put(m, new ArrayList<PkgAwards>());
|
|
|
- }
|
|
|
- List<Integer> excludePkgList = new ArrayList<>();
|
|
|
- for (int k = 0; k < ticketAwardsList.size(); k++) {
|
|
|
- TicketAwards ticketAwards = ticketAwardsList.get(k);
|
|
|
- if (ticketAwards.getQuantity() < pkgNum) {
|
|
|
- // 奖级数量少于包数的,随机不重复分配,随机数从1开始
|
|
|
- int totalNone = pkgNum - ticketAwards.getQuantity(); // 轮空数
|
|
|
- int moreExInt = excludePkgList.size() - totalNone; // 本轮要排除的数 - 轮空数
|
|
|
- if (moreExInt > 0) {
|
|
|
- // 多出来的数,从末尾开始删除
|
|
|
- for (int l = 0; l < moreExInt; l++) {
|
|
|
- excludePkgList.remove(excludePkgList.size() - 1);
|
|
|
- }
|
|
|
- }
|
|
|
- List<Integer> randomList = getRandomList(excludePkgList, ticketAwards.getQuantity(), pkgNum);
|
|
|
- excludePkgList.addAll(randomList);
|
|
|
- LogUtil.debug(logger, "随机分配到的包序号为:{0}", new Object[]{JSONObject.toJSONString(randomList)});
|
|
|
- for (Integer pkgId : randomList) {
|
|
|
- pkgAwardsMap.get(pkgId).add(
|
|
|
- new PkgAwards(ticketAwards.getAwardsId(), ticketAwards.getName(),
|
|
|
- ticketAwards.getSort(), 1));
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 奖级数量大于包数的,平均分配,四舍五入
|
|
|
- int remainQty = ticketAwards.getQuantity();
|
|
|
- for (int i = 1; i <= pkgNum; i++) {
|
|
|
- int quantity;
|
|
|
- if (k == ticketAwardsList.size() - 1) {
|
|
|
- // 最后一个奖项直接分配奖级数量差额即可
|
|
|
- int hasQty = pkgAwardsMap.get(i).stream().mapToInt(PkgAwards::getQuantity).sum();
|
|
|
- quantity = pkgUnit - hasQty;
|
|
|
- } else {
|
|
|
- if (i == pkgNum) {
|
|
|
- quantity = remainQty;
|
|
|
- } else {
|
|
|
- quantity = new BigDecimal(remainQty).divide(new BigDecimal(pkgNum - i + 1), 0,
|
|
|
- RoundingMode.HALF_UP).intValue();
|
|
|
- }
|
|
|
- }
|
|
|
- remainQty -= quantity;
|
|
|
- Assert.isTrue(remainQty >= 0, "剩余奖级数量不足分配。boxId:" + ticketBox.getBoxId());
|
|
|
- pkgAwardsMap.get(i).add(
|
|
|
- new PkgAwards(ticketAwards.getAwardsId(), ticketAwards.getName(),
|
|
|
- ticketAwards.getSort(), quantity));
|
|
|
- }
|
|
|
- }
|
|
|
- LogUtil.debug(logger, "奖级{0}分包结果:{1}", new Object[]{k, JSONObject.toJSONString(pkgAwardsMap)});
|
|
|
- }
|
|
|
+ Map<Integer, List<PkgAwards>> pkgAwardsMap = generatePkgAwards(
|
|
|
+ ticketBox, ticketAwardsList, pkgNum, pkgUnit);
|
|
|
|
|
|
// 生成票包记录和盲票记录
|
|
|
int pkgCnt = 0;
|
|
@@ -258,7 +213,63 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
|
|
|
ticketService.saveBatch(ticketList);
|
|
|
}
|
|
|
ticketPackageService.saveBatch(ticketPackageList);
|
|
|
- return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<Integer, List<PkgAwards>> generatePkgAwards(TicketBox ticketBox,
|
|
|
+ List<TicketAwards> ticketAwardsList, int pkgNum, int pkgUnit) {
|
|
|
+ // 1.把各奖级的中奖数量分摊到每包上
|
|
|
+ Map<Integer, List<PkgAwards>> pkgAwardsMap = new HashMap<>();
|
|
|
+ for (int m = 1; m <= pkgNum; m++) {
|
|
|
+ pkgAwardsMap.put(m, new ArrayList<PkgAwards>());
|
|
|
+ }
|
|
|
+ List<Integer> excludePkgList = new ArrayList<>();
|
|
|
+ for (int k = 0; k < ticketAwardsList.size(); k++) {
|
|
|
+ TicketAwards ticketAwards = ticketAwardsList.get(k);
|
|
|
+ if (ticketAwards.getQuantity() < pkgNum) {
|
|
|
+ // 奖级数量少于包数的,随机不重复分配,随机数从1开始
|
|
|
+ int totalNone = pkgNum - ticketAwards.getQuantity(); // 轮空数
|
|
|
+ int moreExInt = excludePkgList.size() - totalNone; // 本轮要排除的数 - 轮空数
|
|
|
+ if (moreExInt > 0) {
|
|
|
+ // 多出来的数,从末尾开始删除
|
|
|
+ for (int l = 0; l < moreExInt; l++) {
|
|
|
+ excludePkgList.remove(excludePkgList.size() - 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<Integer> randomList = getRandomList(excludePkgList, ticketAwards.getQuantity(), pkgNum);
|
|
|
+ excludePkgList.addAll(randomList);
|
|
|
+ LogUtil.debug(logger, "随机分配到的包序号为:{0}", new Object[]{JSONObject.toJSONString(randomList)});
|
|
|
+ for (Integer pkgId : randomList) {
|
|
|
+ pkgAwardsMap.get(pkgId).add(
|
|
|
+ new PkgAwards(ticketAwards.getAwardsId(), ticketAwards.getName(),
|
|
|
+ ticketAwards.getSort(), 1));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 奖级数量大于包数的,平均分配,四舍五入
|
|
|
+ int remainQty = ticketAwards.getQuantity();
|
|
|
+ for (int i = 1; i <= pkgNum; i++) {
|
|
|
+ int quantity;
|
|
|
+ if (k == ticketAwardsList.size() - 1) {
|
|
|
+ // 最后一个奖项直接分配奖级数量差额即可
|
|
|
+ int hasQty = pkgAwardsMap.get(i).stream().mapToInt(PkgAwards::getQuantity).sum();
|
|
|
+ quantity = pkgUnit - hasQty;
|
|
|
+ } else {
|
|
|
+ if (i == pkgNum) {
|
|
|
+ quantity = remainQty;
|
|
|
+ } else {
|
|
|
+ quantity = new BigDecimal(remainQty).divide(new BigDecimal(pkgNum - i + 1), 0,
|
|
|
+ RoundingMode.HALF_UP).intValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ remainQty -= quantity;
|
|
|
+ Assert.isTrue(remainQty >= 0, "剩余奖级数量不足分配。boxId:" + ticketBox.getBoxId());
|
|
|
+ pkgAwardsMap.get(i).add(
|
|
|
+ new PkgAwards(ticketAwards.getAwardsId(), ticketAwards.getName(),
|
|
|
+ ticketAwards.getSort(), quantity));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ LogUtil.debug(logger, "奖级{0}分包结果:{1}", new Object[]{k, JSONObject.toJSONString(pkgAwardsMap)});
|
|
|
+ }
|
|
|
+ return pkgAwardsMap;
|
|
|
}
|
|
|
|
|
|
/**
|