Browse Source

票幸运数字计算

chunping 3 years ago
parent
commit
ad6152acbf

+ 103 - 106
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -140,127 +140,124 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     ticketAwardsService.saveBatch(ticketAwardsList);
     ticketAwardsPrizeService.saveBatch(awardsPrizeList);
 
-    // 线下票要分包
-    if (ticketBox.getType() == TicketTypeEnum.OFFLINE) {
-      int pkgNum = ticketBox.getPkgQty();
-      int pkgUnit = ticketBox.getPkgUnit();
+    // 分包
+    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));
+    // 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);
           }
-        } 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;
+        }
+        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 {
-              if (i == pkgNum) {
-                quantity = remainQty;
-              } else {
-                quantity = new BigDecimal(remainQty).divide(new BigDecimal(pkgNum - i + 1), 0,
-                    RoundingMode.HALF_UP).intValue();
-              }
+              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));
           }
+          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)});
       }
+      LogUtil.debug(logger, "奖级{0}分包结果:{1}", new Object[]{k, JSONObject.toJSONString(pkgAwardsMap)});
+    }
 
-      // 生成票包记录和盲票记录
-      int pkgCnt = 0;
-      int ticketCnt = 0;
-      List<TicketPackage> ticketPackageList = new ArrayList<>();
-      for (Integer key : pkgAwardsMap.keySet()) {
-        pkgCnt += 1;
-        TicketPackage ticketPackage = new TicketPackage();
-        ticketPackage.setPkgId(bizIdGenerator.newId());
-        ticketPackage.setBoxId(ticketBox.getBoxId());
-        ticketPackage.setPkgNo(ticketBox.getBoxNo() + "-" + String.format("%1$04d", pkgCnt));
-        ticketPackage.setStartSn(
-            ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + 1));
-        ticketPackage.setEndSn(
-            ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + 200));
-        ticketPackage.setStatus(TicketPkgStatusEnum.FOR_SALE);
-        ticketPackageList.add(ticketPackage);
+    // 生成票包记录和盲票记录
+    int pkgCnt = 0;
+    int ticketCnt = 0;
+    List<TicketPackage> ticketPackageList = new ArrayList<>();
+    for (Integer key : pkgAwardsMap.keySet()) {
+      pkgCnt += 1;
+      TicketPackage ticketPackage = new TicketPackage();
+      ticketPackage.setPkgId(bizIdGenerator.newId());
+      ticketPackage.setBoxId(ticketBox.getBoxId());
+      ticketPackage.setPkgNo(ticketBox.getBoxNo() + "-" + String.format("%1$04d", pkgCnt));
+      ticketPackage.setStartSn(
+          ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + 1));
+      ticketPackage.setEndSn(
+          ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + 200));
+      ticketPackage.setStatus(TicketPkgStatusEnum.FOR_SALE);
+      ticketPackageList.add(ticketPackage);
 
-        List<PkgAwards> pkgAwardsList = pkgAwardsMap.get(key);
-        LogUtil.debug(logger, "第{0}包盲票奖项数量为{1}", new Object[]{pkgCnt, pkgAwardsList});
-        List<Ticket> ticketList = new ArrayList<>();
-        for (int j = 1; j <= pkgUnit; j++) {
-          ticketCnt += 1;
-          Iterator<PkgAwards> iterator = pkgAwardsList.iterator();
-          while (iterator.hasNext()) {
-            PkgAwards next = iterator.next();
-            if (next.getQuantity() == 0) {
-              iterator.remove();
-            }
+      List<PkgAwards> pkgAwardsList = pkgAwardsMap.get(key);
+      LogUtil.debug(logger, "第{0}包盲票奖项数量为{1}", new Object[]{pkgCnt, pkgAwardsList});
+      List<Ticket> ticketList = new ArrayList<>();
+      for (int j = 1; j <= pkgUnit; j++) {
+        ticketCnt += 1;
+        Iterator<PkgAwards> iterator = pkgAwardsList.iterator();
+        while (iterator.hasNext()) {
+          PkgAwards next = iterator.next();
+          if (next.getQuantity() == 0) {
+            iterator.remove();
           }
-          LogUtil.debug(logger, "开始生成第{0}包、第{1}盲票", new Object[]{pkgCnt, j});
-          int random = getPrizeIndex(pkgAwardsList);
-          PkgAwards pkgAwards = pkgAwardsList.get(random);
-          pkgAwards.setQuantity(pkgAwards.getQuantity() - 1);
+        }
+        LogUtil.debug(logger, "开始生成第{0}包、第{1}盲票", new Object[]{pkgCnt, j});
+        int random = getPrizeIndex(pkgAwardsList);
+        PkgAwards pkgAwards = pkgAwardsList.get(random);
+        pkgAwards.setQuantity(pkgAwards.getQuantity() - 1);
 
-          Ticket ticket = new Ticket();
-          ticket.setTicketId(bizIdGenerator.newId());
-          ticket.setBoxId(ticketBox.getBoxId());
-          ticket.setPkgId(ticketPackage.getPkgId());
-          ticket.setTitle(ticketBox.getTitle());
-          ticket.setSerialNo(ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt));
-          ticket.setFacePrice(ticketBox.getFacePrice());
-          int luckyNum = new Random().nextInt(18);
-          ticket.setCipherLuckyNum(String.valueOf(luckyNum));
-          List<TicketDrawNumDTO> drawNumDTOList = new ArrayList<>();
-          for (int i = 1; i <= 18; i++) {
-            if (i == luckyNum) {
-              continue;
-            }
-            TicketDrawNumDTO drawNumDTO = new TicketDrawNumDTO(pkgAwards.getName(), i);
-            drawNumDTOList.add(drawNumDTO);
+        Ticket ticket = new Ticket();
+        ticket.setTicketId(bizIdGenerator.newId());
+        ticket.setBoxId(ticketBox.getBoxId());
+        ticket.setPkgId(ticketPackage.getPkgId());
+        ticket.setTitle(ticketBox.getTitle());
+        ticket.setSerialNo(ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt));
+        ticket.setFacePrice(ticketBox.getFacePrice());
+        int luckyNum = new Random().nextInt(18) + 1;
+        ticket.setCipherLuckyNum(String.valueOf(luckyNum));
+        List<TicketDrawNumDTO> drawNumDTOList = new ArrayList<>();
+        List<Integer> randomNumList = getRandomList(new ArrayList<Integer>(), 18, 18);
+        for (Integer drawNum : randomNumList) {
+          if (drawNum == luckyNum) {
+            drawNumDTOList.add(new TicketDrawNumDTO(pkgAwards.getName(), drawNum));
+            continue;
           }
-          ticket.setDrawNum(JSONObject.toJSONString(drawNumDTOList));
-          ticket.setIsPhysical(1);
-          ticket.setStatus(TicketStatusEnum.NOT_PAY);
-          ticketList.add(ticket);
+          int awardsNum = new Random().nextInt(ticketAwardsList.size());
+          drawNumDTOList.add(new TicketDrawNumDTO(ticketAwardsList.get(awardsNum).getName(), drawNum));
         }
-        ticketService.saveBatch(ticketList);
+        ticket.setDrawNum(JSONObject.toJSONString(drawNumDTOList));
+        ticket.setIsPhysical(1);
+        ticket.setStatus(TicketStatusEnum.NOT_PAY);
+        ticketList.add(ticket);
       }
-      ticketPackageService.saveBatch(ticketPackageList);
-    } else {
-      // TODO 线上票,不用分包
-
+      ticketService.saveBatch(ticketList);
     }
+    ticketPackageService.saveBatch(ticketPackageList);
     return true;
   }