|
@@ -374,83 +374,84 @@ public class GenerateCodeServiceImpl implements GenerateCodeService {
|
|
|
* formatNumber 幅面数量
|
|
|
*/
|
|
|
private List<QrData> doLoopGenerateCode(List<QrRepertoryColumnVO> qrRepertoryColumnList, Long qrRepertoryId, Map<Long, String> urlMap, Map<String, QrRepertorySerialNumber> qrRepertorySerialNumberMap, Long qrNumber, String batchNumber, int repeatTimes, QrBoxCodeFormat boxCodeFormat, Map<Long, QrBoxCodeFormatSplit> splitCache ) {
|
|
|
+ if (qrNumber <= 0) {
|
|
|
+ log.info("批次号:{},码生成完毕", batchNumber);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
//生成码数据
|
|
|
final List<QrData> qrDataList = new LinkedList<>();
|
|
|
Long qrIndex = getQrIndex();
|
|
|
|
|
|
- while (true) {
|
|
|
- log.info("doLoopGenerateCode 的疑似死循环.1");
|
|
|
- LocalDateTime localDateTime = LocalDateTime.now();
|
|
|
- // 计算还需生成的数量
|
|
|
- long needGenerateNumber = qrNumber;
|
|
|
- if (needGenerateNumber <= 0) {
|
|
|
- log.info("批次号:{},码生成完毕", batchNumber);
|
|
|
- break;
|
|
|
- }
|
|
|
- // 用Set存放不重复的码
|
|
|
- HashSet<String> uniqueSet = new HashSet<>();
|
|
|
- // 生成码要用的参数
|
|
|
- Map<String, Object> paramMap = new HashMap<>();
|
|
|
- // 码
|
|
|
- StringBuilder codeSb = new StringBuilder();
|
|
|
- for (int i = 0; i < needGenerateNumber; i++) {
|
|
|
- log.info("doLoopGenerateCode 的疑似死循环.2");
|
|
|
- QrData qrData = new QrData()
|
|
|
- .setQrRepertoryId(qrRepertoryId)
|
|
|
- .setBatchNumber(batchNumber)
|
|
|
- .setQrRepertoryType(QrRepertoryTypeEnum.SYSTEM_GENERATE.getCode())
|
|
|
- .setCreateTime(localDateTime);
|
|
|
-
|
|
|
- List<QrInnerData> qrInnerDataList = new LinkedList<>();
|
|
|
- //箱子码幅面
|
|
|
- for (int a = 0; a < boxCodeFormat.getFormatNumber(); a++) {
|
|
|
- log.info("doLoopGenerateCode 的疑似死循环.3");
|
|
|
- for (int j = 0; j < qrRepertoryColumnList.size(); j++) {
|
|
|
- log.info("doLoopGenerateCode 的疑似死循环.4");
|
|
|
- QrRepertoryColumnVO qrRepertoryColumn = qrRepertoryColumnList.get(j);
|
|
|
- Long qrRepertoryColumnId = qrRepertoryColumn.getId();
|
|
|
- //声明拆分数量
|
|
|
- int splitNum = 0;
|
|
|
- if(splitCache.containsKey(qrRepertoryColumnId)){
|
|
|
- splitNum = splitCache.get(qrRepertoryColumnId).getSplitNum();
|
|
|
- }
|
|
|
- // 非clone列,设置code和url
|
|
|
- String code = buildUniqueCode(uniqueSet, qrRepertoryColumn, codeSb, paramMap, qrRepertorySerialNumberMap, 0);
|
|
|
- if (code == null) {
|
|
|
- throw new RuntimeException("生成码失败,重复生成码次数超过" + REPEAT_BUILD_CODE_TIMES + "次");
|
|
|
- }
|
|
|
- //判断拆分数量是否为空
|
|
|
- if( splitNum >0){
|
|
|
- List<char[]> codeStr = segmentation(code, splitNum);
|
|
|
- for (char[] chars:codeStr) {
|
|
|
- QrInnerData qrInnerData = new QrInnerData();
|
|
|
- qrInnerData.setCode(String.valueOf(chars));
|
|
|
- qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
- qrInnerData.setCodeIndex(++qrIndex);
|
|
|
- qrInnerDataList.add(qrInnerData);
|
|
|
- }
|
|
|
- } else {
|
|
|
+ log.info("doLoopGenerateCode 的疑似死循环.1");
|
|
|
+ LocalDateTime localDateTime = LocalDateTime.now();
|
|
|
+ // 计算还需生成的数量
|
|
|
+ long needGenerateNumber = qrNumber;
|
|
|
+
|
|
|
+ // 用Set存放不重复的码
|
|
|
+ HashSet<String> uniqueSet = new HashSet<>();
|
|
|
+ // 生成码要用的参数
|
|
|
+ Map<String, Object> paramMap = new HashMap<>();
|
|
|
+ // 码
|
|
|
+ StringBuilder codeSb = new StringBuilder();
|
|
|
+
|
|
|
+ for (int i = 0; i < needGenerateNumber; i++) {
|
|
|
+ log.info("doLoopGenerateCode 的疑似死循环.2");
|
|
|
+ QrData qrData = new QrData()
|
|
|
+ .setQrRepertoryId(qrRepertoryId)
|
|
|
+ .setBatchNumber(batchNumber)
|
|
|
+ .setQrRepertoryType(QrRepertoryTypeEnum.SYSTEM_GENERATE.getCode())
|
|
|
+ .setCreateTime(localDateTime);
|
|
|
+
|
|
|
+ List<QrInnerData> qrInnerDataList = new LinkedList<>();
|
|
|
+ //箱子码幅面
|
|
|
+ for (int a = 0; a < boxCodeFormat.getFormatNumber(); a++) {
|
|
|
+ log.info("doLoopGenerateCode 的疑似死循环.3");
|
|
|
+ for (int j = 0; j < qrRepertoryColumnList.size(); j++) {
|
|
|
+ log.info("doLoopGenerateCode 的疑似死循环.4");
|
|
|
+ QrRepertoryColumnVO qrRepertoryColumn = qrRepertoryColumnList.get(j);
|
|
|
+ Long qrRepertoryColumnId = qrRepertoryColumn.getId();
|
|
|
+ //声明拆分数量
|
|
|
+ int splitNum = 0;
|
|
|
+ if(splitCache.containsKey(qrRepertoryColumnId)){
|
|
|
+ splitNum = splitCache.get(qrRepertoryColumnId).getSplitNum();
|
|
|
+ }
|
|
|
+ // 非clone列,设置code和url
|
|
|
+ String code = buildUniqueCode(uniqueSet, qrRepertoryColumn, codeSb, paramMap, qrRepertorySerialNumberMap, 0);
|
|
|
+ if (code == null) {
|
|
|
+ throw new RuntimeException("生成码失败,重复生成码次数超过" + REPEAT_BUILD_CODE_TIMES + "次");
|
|
|
+ }
|
|
|
+ //判断拆分数量是否为空
|
|
|
+ if( splitNum >0){
|
|
|
+ List<char[]> codeStr = segmentation(code, splitNum);
|
|
|
+ for (char[] chars:codeStr) {
|
|
|
QrInnerData qrInnerData = new QrInnerData();
|
|
|
- qrInnerData.setCode(code);
|
|
|
+ qrInnerData.setCode(String.valueOf(chars));
|
|
|
qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
qrInnerData.setCodeIndex(++qrIndex);
|
|
|
qrInnerDataList.add(qrInnerData);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ QrInnerData qrInnerData = new QrInnerData();
|
|
|
+ qrInnerData.setCode(code);
|
|
|
+ qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
+ qrInnerData.setCodeIndex(++qrIndex);
|
|
|
+ qrInnerDataList.add(qrInnerData);
|
|
|
}
|
|
|
}
|
|
|
- qrData.setInnerDataList(qrInnerDataList);
|
|
|
- qrDataList.add(qrData);
|
|
|
}
|
|
|
- //保存index
|
|
|
- setQrIndex(qrIndex);
|
|
|
-
|
|
|
- try {
|
|
|
- return qrDataList;
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("封装码失败", e);
|
|
|
- if (++repeatTimes >= REPEAT_BUILD_CODE_TIMES) {
|
|
|
- throw new RuntimeException("生成码失败,重复生成码次数超过" + REPEAT_BUILD_CODE_TIMES + "次");
|
|
|
- }
|
|
|
+ qrData.setInnerDataList(qrInnerDataList);
|
|
|
+ qrDataList.add(qrData);
|
|
|
+ }
|
|
|
+ //保存index
|
|
|
+ setQrIndex(qrIndex);
|
|
|
+
|
|
|
+ try {
|
|
|
+ return qrDataList;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("封装码失败", e);
|
|
|
+ if (++repeatTimes >= REPEAT_BUILD_CODE_TIMES) {
|
|
|
+ throw new RuntimeException("生成码失败,重复生成码次数超过" + REPEAT_BUILD_CODE_TIMES + "次");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -563,6 +564,7 @@ public class GenerateCodeServiceImpl implements GenerateCodeService {
|
|
|
}
|
|
|
|
|
|
// 码重复,递归执行下一次
|
|
|
+ log.info("码重复,递归执行下一次");
|
|
|
return buildUniqueCode(uniqueSet, qrRepertoryColumn, codeSb, paramMap, qrRepertorySerialNumberMap, ++buildTimes);
|
|
|
}
|
|
|
|