|
@@ -31,6 +31,7 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.fileupload.FileItem;
|
|
|
import org.apache.commons.fileupload.FileItemFactory;
|
|
|
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
|
|
|
+import org.apache.commons.lang3.ObjectUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.redisson.api.RLock;
|
|
|
import org.redisson.api.RedissonClient;
|
|
@@ -46,6 +47,7 @@ import net.lingala.zip4j.core.ZipFile;
|
|
|
import net.lingala.zip4j.exception.ZipException;
|
|
|
import net.lingala.zip4j.model.ZipParameters;
|
|
|
import net.lingala.zip4j.util.Zip4jConstants;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
|
|
|
@@ -97,6 +99,12 @@ public class GenerateCodeConsumer {
|
|
|
@Autowired
|
|
|
private BaseFactoryMapper baseFactoryMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private QrBoxCodeFormatMapper boxCodeFormatMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private QrBoxCodeFormatSplitMapper qrBoxCodeFormatSplitMapper;
|
|
|
+
|
|
|
//生成码数据
|
|
|
final List<QrData> qrDataList = new LinkedList<>();
|
|
|
|
|
@@ -187,6 +195,8 @@ public class GenerateCodeConsumer {
|
|
|
String batchNumber = qrPackageBatch.getBatchNumber();
|
|
|
//重复次数
|
|
|
int repeatTimes = 0;
|
|
|
+ //获取箱码幅面
|
|
|
+ QrBoxCodeFormat boxCodeFormat = boxCodeFormatMapper.selectById(qrPackageVo.getBoxCodeFormatId());
|
|
|
|
|
|
/**
|
|
|
* qrRepertoryColumnList 码库的列
|
|
@@ -196,15 +206,27 @@ public class GenerateCodeConsumer {
|
|
|
* qrNumber 码数量
|
|
|
* batchNumber 批次号
|
|
|
* localDateTime 创建时间
|
|
|
+ * boxCodeFormat 箱码幅面
|
|
|
*/
|
|
|
// 循环生成码
|
|
|
- List<QrData> codeList = loopGenerateCode(qrRepertoryColumnList, qrRepertoryId, urlMap, qrRepertorySerialNumberMap, qrNumber, batchNumber, repeatTimes);
|
|
|
+ List<QrData> codeList = loopGenerateCode(qrRepertoryColumnList, qrRepertoryId, urlMap, qrRepertorySerialNumberMap, qrNumber, batchNumber, repeatTimes,boxCodeFormat);
|
|
|
+
|
|
|
+ // 更新码库流水号
|
|
|
+ if (!qrRepertorySerialNumberMap.isEmpty()) {
|
|
|
+ for (Map.Entry<String, QrRepertorySerialNumber> entry : qrRepertorySerialNumberMap.entrySet()) {
|
|
|
+ QrRepertorySerialNumber qrRepertorySerialNumber = entry.getValue();
|
|
|
+ QrRepertorySerialNumber updateSerialNumber = new QrRepertorySerialNumber()
|
|
|
+ .setId(qrRepertorySerialNumber.getId())
|
|
|
+ .setSerialNumber(qrRepertorySerialNumber.getSerialNumber());
|
|
|
+ qrRepertorySerialNumberMapper.updateById(updateSerialNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// table数据库 批量插入
|
|
|
saveTableStore(qrPackageBatch, codeList);
|
|
|
|
|
|
// 创建码文件
|
|
|
- createCodeFile(qrRepertory,batchNumber);
|
|
|
+ createCodeFile(qrRepertory,batchNumber,boxCodeFormat);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -223,7 +245,7 @@ public class GenerateCodeConsumer {
|
|
|
if(null != returDat){
|
|
|
Map<String,Object> result =(Map<String, Object>)returDat;
|
|
|
//放入oss地址
|
|
|
- qrPackage.setDownloadPath(null == (String) result.get("data") ? null :(String) result.get("data"));
|
|
|
+ qrPackage.setDownloadPath(null == result.get("data") ? "" :(String) result.get("data"));
|
|
|
}
|
|
|
// //放入oss地址和密码
|
|
|
qrPackage.setZipPassword(pas);
|
|
@@ -244,6 +266,7 @@ public class GenerateCodeConsumer {
|
|
|
qrPackageService.sendEmailForQrPackageCreated(baseFactory.getEmail(),qrPackage.getSapOrderNo(),aliPath,qrPackage.getZipPassword());
|
|
|
//邮件发送后修改状态
|
|
|
qrPackageMapper.updateById(qrPackage);
|
|
|
+ qrDataList.clear();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -311,8 +334,9 @@ public class GenerateCodeConsumer {
|
|
|
* batchNumber 批次号
|
|
|
* localDateTime 创建时间
|
|
|
* repeatTimes 失败次数
|
|
|
+ * formatNumber 幅面数量
|
|
|
*/
|
|
|
- private List<QrData> loopGenerateCode(List<QrRepertoryColumnVO> qrRepertoryColumnList, Long qrRepertoryId, Map<Long, String> urlMap, Map<String, QrRepertorySerialNumber> qrRepertorySerialNumberMap, Long qrNumber, String batchNumber, int repeatTimes) {
|
|
|
+ private List<QrData> loopGenerateCode(List<QrRepertoryColumnVO> qrRepertoryColumnList, Long qrRepertoryId, Map<Long, String> urlMap, Map<String, QrRepertorySerialNumber> qrRepertorySerialNumberMap, Long qrNumber, String batchNumber, int repeatTimes,QrBoxCodeFormat boxCodeFormat) {
|
|
|
LocalDateTime localDateTime = LocalDateTime.now();
|
|
|
while (true) {
|
|
|
// 计算还需生成的数量
|
|
@@ -341,35 +365,63 @@ public class GenerateCodeConsumer {
|
|
|
.setCreateTime(localDateTime);
|
|
|
|
|
|
List<QrInnerData> qrInnerDataList = new LinkedList<>();
|
|
|
- for (int j = 0; j < qrRepertoryColumnList.size(); j++) {
|
|
|
- QrRepertoryColumnVO qrRepertoryColumn = qrRepertoryColumnList.get(j);
|
|
|
- Long qrRepertoryColumnId = qrRepertoryColumn.getId();
|
|
|
-
|
|
|
- // 判断当前列是否为clone列
|
|
|
- Integer cloneColumn = qrRepertoryColumn.getCloneColumn();
|
|
|
- QrInnerData qrInnerData = new QrInnerData();
|
|
|
- if (cloneColumn.compareTo(-1) == 0) {
|
|
|
- // 非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 + "次");
|
|
|
+ //箱子码幅面
|
|
|
+ for (int a = 0; a < boxCodeFormat.getFormatNumber(); a++) {
|
|
|
+ for (int j = 0; j < qrRepertoryColumnList.size(); j++) {
|
|
|
+ QrRepertoryColumnVO qrRepertoryColumn = qrRepertoryColumnList.get(j);
|
|
|
+ Long qrRepertoryColumnId = qrRepertoryColumn.getId();
|
|
|
+ //判断是否有拆分数量 0 或者空不拆分 ,根据箱码幅面id,码库id,码库列id 查询拆分数量
|
|
|
+ QueryWrapper<QrBoxCodeFormatSplit> boxCodeFormatSplit = new QueryWrapper<>();
|
|
|
+ boxCodeFormatSplit.eq("box_code_format_id",boxCodeFormat.getId() );
|
|
|
+ boxCodeFormatSplit.eq("qr_repertory_id", boxCodeFormat.getQrRepertoryId());
|
|
|
+ boxCodeFormatSplit.eq("qr_repertory_column_id",qrRepertoryColumnId );
|
|
|
+ QrBoxCodeFormatSplit qrBoxCodeFormatSplits = qrBoxCodeFormatSplitMapper.selectOne(boxCodeFormatSplit);
|
|
|
+ //声明拆分数量
|
|
|
+ int splitNum = 0;
|
|
|
+ //判断是否为空
|
|
|
+ if(ObjectUtils.isNotEmpty(qrBoxCodeFormatSplits)){
|
|
|
+ //查分数量
|
|
|
+ splitNum = qrBoxCodeFormatSplits.getSplitNum();
|
|
|
}
|
|
|
|
|
|
- qrInnerData.setCode(code).setUrl(url);
|
|
|
- qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
- qrInnerDataList.add(qrInnerData);
|
|
|
- } else {
|
|
|
- // clone列,设置相同的code和url
|
|
|
- QrInnerData originalQrInnerData = qrInnerDataList.get(cloneColumn);
|
|
|
- qrInnerData.setCode(originalQrInnerData.getCode()).setUrl(originalQrInnerData.getUrl());
|
|
|
- qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
- qrInnerDataList.add(qrInnerData);
|
|
|
+ // 判断当前列是否为clone列
|
|
|
+ Integer cloneColumn = qrRepertoryColumn.getCloneColumn();
|
|
|
+ if (cloneColumn.compareTo(-1) == 0) {
|
|
|
+ // 非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);
|
|
|
+ for (char[] chars:codeStr) {
|
|
|
+ QrInnerData qrInnerData = new QrInnerData();
|
|
|
+ qrInnerData.setCode(String.valueOf(chars)).setUrl(url);
|
|
|
+ qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
+ qrInnerDataList.add(qrInnerData);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ QrInnerData qrInnerData = new QrInnerData();
|
|
|
+ qrInnerData.setCode(code).setUrl(url);
|
|
|
+ qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
+ qrInnerDataList.add(qrInnerData);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //鼎昌提供的clone列,暂时未知可用性
|
|
|
+ // clone列,设置相同的code和url
|
|
|
+ QrInnerData qrInnerData = new QrInnerData();
|
|
|
+ QrInnerData originalQrInnerData = qrInnerDataList.get( a * qrRepertoryColumnList.size() + cloneColumn );
|
|
|
+ qrInnerData.setCode(originalQrInnerData.getCode()).setUrl(originalQrInnerData.getUrl());
|
|
|
+ qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
+ qrInnerDataList.add(qrInnerData);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
qrData.setInnerDataList(qrInnerDataList);
|
|
|
qrDataList.add(qrData);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
try {
|
|
@@ -444,12 +496,19 @@ public class GenerateCodeConsumer {
|
|
|
/**
|
|
|
* 创建码文件
|
|
|
*/
|
|
|
- private void createCodeFile( QrRepertoryVO qrRepertory,String batchNumber) {
|
|
|
+ private void createCodeFile( QrRepertoryVO qrRepertory,String batchNumber,QrBoxCodeFormat boxCodeFormat) {
|
|
|
List<QrRepertoryColumnVO> qrRepertoryColumnList = qrRepertory.getQrRepertoryColumnList();
|
|
|
StringBuilder content = new StringBuilder();
|
|
|
// 第一行为每列的名称,用“,”分隔
|
|
|
String dataComposition = qrRepertoryColumnList.stream().map(col -> col.getAlias()).collect(Collectors.joining(","));
|
|
|
- content.append(dataComposition).append("\r\n");
|
|
|
+ content.append(dataComposition);
|
|
|
+ //暂时根据项目幅面分,没有根据拆分数量分
|
|
|
+ if(boxCodeFormat.getFormatNumber() > 1){
|
|
|
+ for (int i = 1; i < boxCodeFormat.getFormatNumber(); i++) {
|
|
|
+ content.append(",").append(dataComposition);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ content.append("\r\n");
|
|
|
// 拼接码
|
|
|
List<QrInnerData> innerDataList;
|
|
|
String innerData;
|
|
@@ -563,4 +622,34 @@ public class GenerateCodeConsumer {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ public static List<char[]> a(String str, int groupSum){
|
|
|
+ List<char[]> result = new ArrayList<>();
|
|
|
+
|
|
|
+ if (null == str){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (groupSum < 0 || str.length() < groupSum){
|
|
|
+ result.add(str.toCharArray());
|
|
|
+ }else {
|
|
|
+
|
|
|
+ int group = str.length() / groupSum ;
|
|
|
+
|
|
|
+ int count = 0;
|
|
|
+
|
|
|
+ while (true){
|
|
|
+ if (result.size() + 1 == groupSum){
|
|
|
+ result.add(str.substring(count * group).toCharArray());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ result.add(str.substring(count * group ,count * group + group ).toCharArray());
|
|
|
+ count ++ ;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|