Bläddra i källkod

码包叠加需求--拆分数量,生成码缺少自动补齐

luyanwen 3 år sedan
förälder
incheckning
ba14ac8814

+ 80 - 12
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/mq/GenerateCodeConsumer.java

@@ -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;
+	}
 }