|
@@ -135,8 +135,11 @@ public class GenerateCodeConsumer {
|
|
|
@RabbitHandler
|
|
|
@RabbitListener(queues = GenerateCodeConsumer.GENERATE_CODE_BY_REPERTORY_QUEUE)
|
|
|
public void onMessage(String id, Message message, Channel channel) {
|
|
|
- String str = JsonUtil.toBean(id, String.class);
|
|
|
- QrPackageVO qrPackageVO = qrPackageMapper.selectQrPackageDetailById(Long.parseLong(str));
|
|
|
+ //判断rabbit消息是否为空
|
|
|
+ if(StringUtils.isEmpty(id)){
|
|
|
+ throw new BusinessException("队列监听数据为空!");
|
|
|
+ }
|
|
|
+ QrPackageVO qrPackageVO = qrPackageMapper.selectQrPackageDetailById(Long.parseLong(id));
|
|
|
try {
|
|
|
Object code_qr_index = redisClient.get("code_qr_index");
|
|
|
if(ObjectUtils.isEmpty(code_qr_index)){
|
|
@@ -147,6 +150,8 @@ public class GenerateCodeConsumer {
|
|
|
codeIndex = qrIndex.getIndexCurrent();
|
|
|
}
|
|
|
redisClient.set("code_qr_index",codeIndex);
|
|
|
+ } else {
|
|
|
+ codeIndex = Long.parseLong(code_qr_index.toString());
|
|
|
}
|
|
|
// 生成码
|
|
|
loopGenerateCode(qrPackageVO);
|
|
@@ -244,7 +249,7 @@ public class GenerateCodeConsumer {
|
|
|
|
|
|
// 创建码文件
|
|
|
createCodeFile(qrRepertory,batchNumber,boxCodeFormat);
|
|
|
-
|
|
|
+ qrDataList.clear();
|
|
|
}
|
|
|
|
|
|
//2-保存压缩文件并上传oss
|
|
@@ -291,7 +296,6 @@ public class GenerateCodeConsumer {
|
|
|
qrIndexMapper.insert(index);
|
|
|
redisClient.set("code_qr_index",codeIndex);
|
|
|
codeIndex = 0L;
|
|
|
- qrDataList.clear();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -359,22 +363,18 @@ public class GenerateCodeConsumer {
|
|
|
while (true) {
|
|
|
// 计算还需生成的数量
|
|
|
long needGenerateNumber = qrNumber --;
|
|
|
-
|
|
|
if (needGenerateNumber <= 0) {
|
|
|
log.info("批次号:{},码生成完毕", batchNumber);
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
// 计算本次最多生成多少码
|
|
|
long currentMaxGenerateNumber = needGenerateNumber <= ONCE_GENERATE_NUMBER ? needGenerateNumber : ONCE_GENERATE_NUMBER;
|
|
|
-
|
|
|
// 用Set存放不重复的码
|
|
|
HashSet<String> uniqueSet = new HashSet<>();
|
|
|
// 生成码要用的参数
|
|
|
Map<String, Object> paramMap = new HashMap<>();
|
|
|
// 码
|
|
|
StringBuilder codeSb = new StringBuilder();
|
|
|
-
|
|
|
for (int i = 0; i < currentMaxGenerateNumber; i++) {
|
|
|
QrData qrData = new QrData()
|
|
|
.setQrRepertoryId(qrRepertoryId)
|
|
@@ -401,16 +401,14 @@ public class GenerateCodeConsumer {
|
|
|
//查分数量
|
|
|
splitNum = qrBoxCodeFormatSplits.getSplitNum();
|
|
|
}
|
|
|
-
|
|
|
// 非clone列,设置code和url
|
|
|
String code = buildUniqueCode(uniqueSet, qrRepertoryColumn, codeSb, paramMap, qrRepertorySerialNumberMap, 0);
|
|
|
- String url = urlMap.get(qrRepertoryColumnId);
|
|
|
if (code == null) {
|
|
|
throw new RuntimeException("生成码失败,重复生成码次数超过" + REPEAT_BUILD_CODE_TIMES + "次");
|
|
|
}
|
|
|
//判断拆分数量是否为空
|
|
|
if( splitNum >0){
|
|
|
- List<char[]> codeStr = a(code, splitNum);
|
|
|
+ List<char[]> codeStr = segmentation(code, splitNum);
|
|
|
for (char[] chars:codeStr) {
|
|
|
QrInnerData qrInnerData = new QrInnerData();
|
|
|
qrInnerData.setCode(String.valueOf(chars));
|
|
@@ -451,19 +449,7 @@ public class GenerateCodeConsumer {
|
|
|
for (int i = 0; i < qrRepertoryColumnList.size(); i++) {
|
|
|
QrRepertoryColumnVO qrRepertoryColumn = qrRepertoryColumnList.get(i);
|
|
|
Long qrRepertoryColumnId = qrRepertoryColumn.getId();
|
|
|
-
|
|
|
- // 每列的url格式
|
|
|
-// Integer urlType = qrRepertoryColumn.getUrlType();
|
|
|
-// String url = "";
|
|
|
-// if (QrFormatUrlEnum.SYSTEM_URL.is(urlType)) {
|
|
|
-// url = systemUrl;
|
|
|
-// }
|
|
|
-// // 如果url没有以/结尾,则加上/
|
|
|
-// if (StringUtils.isNotBlank(url) && !url.endsWith("/")) {
|
|
|
-// url += "/";
|
|
|
-// }
|
|
|
urlMap.put(qrRepertoryColumnId, "");
|
|
|
-
|
|
|
// 使用到流水号参数的列
|
|
|
String[] buildClassArr = qrRepertoryColumn.getQrFormatVO().getCodeVariableBuildClass().split(",");
|
|
|
for (int j = 0; j < buildClassArr.length; j++) {
|
|
@@ -473,7 +459,6 @@ public class GenerateCodeConsumer {
|
|
|
QueryWrapper<QrRepertorySerialNumber> qrRepertorySerialNumberQw = new QueryWrapper<>();
|
|
|
qrRepertorySerialNumberQw.eq("qr_repertory_column_id", qrRepertoryColumnId);
|
|
|
qrRepertorySerialNumberQw.eq("child_index", j);
|
|
|
-
|
|
|
// 加锁查询插入流水号
|
|
|
RLock lock = redissonClient.getLock("serial_number_lock_" + qrRepertoryColumnId + "_" + j);
|
|
|
QrRepertorySerialNumber qrRepertorySerialNumber = null;
|
|
@@ -492,12 +477,10 @@ public class GenerateCodeConsumer {
|
|
|
} finally {
|
|
|
lock.unlock();
|
|
|
}
|
|
|
-
|
|
|
// key:qr_repertory_column_id + child_index
|
|
|
qrRepertorySerialNumberMap.put(qrRepertoryColumnId + "_" + j, qrRepertorySerialNumber);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -635,8 +618,13 @@ public class GenerateCodeConsumer {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- public static List<char[]> a(String str, int groupSum){
|
|
|
+ /**
|
|
|
+ * 分割数量 -- 码.length / 要分割数量 = 最后一组+余数;
|
|
|
+ * @param str 要分割码
|
|
|
+ * @param groupSum 分割数量
|
|
|
+ * @return 分割后的码
|
|
|
+ */
|
|
|
+ public static List<char[]> segmentation(String str, int groupSum){
|
|
|
List<char[]> result = new ArrayList<>();
|
|
|
|
|
|
if (null == str){
|