|
@@ -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;
|
|
|
|
|
@@ -100,6 +102,9 @@ public class GenerateCodeConsumer {
|
|
|
@Autowired
|
|
|
private QrBoxCodeFormatMapper boxCodeFormatMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private QrBoxCodeFormatSplitMapper qrBoxCodeFormatSplitMapper;
|
|
|
+
|
|
|
//生成码数据
|
|
|
final List<QrData> qrDataList = new LinkedList<>();
|
|
|
|
|
@@ -192,7 +197,6 @@ public class GenerateCodeConsumer {
|
|
|
int repeatTimes = 0;
|
|
|
//获取箱码幅面
|
|
|
QrBoxCodeFormat boxCodeFormat = boxCodeFormatMapper.selectById(qrPackageVo.getBoxCodeFormatId());
|
|
|
- Integer formatNumber = boxCodeFormat.getFormatNumber();
|
|
|
|
|
|
/**
|
|
|
* qrRepertoryColumnList 码库的列
|
|
@@ -202,15 +206,16 @@ public class GenerateCodeConsumer {
|
|
|
* qrNumber 码数量
|
|
|
* batchNumber 批次号
|
|
|
* localDateTime 创建时间
|
|
|
+ * boxCodeFormat 箱码幅面
|
|
|
*/
|
|
|
// 循环生成码
|
|
|
- List<QrData> codeList = loopGenerateCode(qrRepertoryColumnList, qrRepertoryId, urlMap, qrRepertorySerialNumberMap, qrNumber, batchNumber, repeatTimes,formatNumber);
|
|
|
+ List<QrData> codeList = loopGenerateCode(qrRepertoryColumnList, qrRepertoryId, urlMap, qrRepertorySerialNumberMap, qrNumber, batchNumber, repeatTimes,boxCodeFormat);
|
|
|
|
|
|
// table数据库 批量插入
|
|
|
saveTableStore(qrPackageBatch, codeList);
|
|
|
|
|
|
// 创建码文件
|
|
|
- createCodeFile(qrRepertory,batchNumber);
|
|
|
+ createCodeFile(qrRepertory,batchNumber,boxCodeFormat);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -250,6 +255,7 @@ public class GenerateCodeConsumer {
|
|
|
qrPackageService.sendEmailForQrPackageCreated(baseFactory.getEmail(),qrPackage.getSapOrderNo(),aliPath,qrPackage.getZipPassword());
|
|
|
//邮件发送后修改状态
|
|
|
qrPackageMapper.updateById(qrPackage);
|
|
|
+ qrDataList.clear();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -319,7 +325,7 @@ public class GenerateCodeConsumer {
|
|
|
* 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,Integer formatNumber) {
|
|
|
+ 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) {
|
|
|
// 计算还需生成的数量
|
|
@@ -349,14 +355,26 @@ public class GenerateCodeConsumer {
|
|
|
|
|
|
List<QrInnerData> qrInnerDataList = new LinkedList<>();
|
|
|
//箱子码幅面
|
|
|
- for (int a = 0; a < formatNumber; a++) {
|
|
|
+ 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();
|
|
|
+ }
|
|
|
|
|
|
// 判断当前列是否为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);
|
|
@@ -364,12 +382,25 @@ public class GenerateCodeConsumer {
|
|
|
if (code == null) {
|
|
|
throw new RuntimeException("生成码失败,重复生成码次数超过" + REPEAT_BUILD_CODE_TIMES + "次");
|
|
|
}
|
|
|
-
|
|
|
- qrInnerData.setCode(code).setUrl(url);
|
|
|
- qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnId).setSortNumber(qrRepertoryColumn.getSortNumber());
|
|
|
- qrInnerDataList.add(qrInnerData);
|
|
|
+ //判断拆分数量是否为空
|
|
|
+ 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());
|
|
@@ -454,12 +485,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;
|
|
@@ -573,4 +611,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;
|
|
|
+ }
|
|
|
}
|