qiangxuan il y a 2 semaines
Parent
commit
36e8a20653

+ 42 - 36
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsend/service/impl/BilletHotsendBaseServiceImpl.java

@@ -145,9 +145,9 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 	private ConfigMqttMapper configMqttMapper;
 	@Autowired
 	private IBilletRulerConfigService billetRulerConfigService;
+	@Autowired
+	private BilletAssemblyNumberMapper billetAssemblyNumberMapper;
 
-	private static final Random RANDOM = ThreadLocalRandom.current();
-	private static final AtomicInteger COUNTER = new AtomicInteger(0);
 
 	@Override
 	@Transactional
@@ -1374,12 +1374,12 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 
 		String brandNum = String.format("billet:basic:info:brand:num:%s", billetBasicInfoAdd.getCcmNo()); // 牌号
 		String brandNumStr = !oConvertUtils.getString(redisTemplate.opsForValue().get(brandNum)).isEmpty() ? oConvertUtils.getString(redisTemplate.opsForValue().get(brandNum)) : "";
-
+		String result = "";
 		if (billetBasicInfoAdd.getAddType() == 1){
 			// 处理整炉补录钢坯逻辑
-			completeHeatsHandle(billetBasicInfoAdd, brandNumStr);
+			result = completeHeatsHandle(billetBasicInfoAdd, brandNumStr);
 		}
-		return "整炉补录成功!";
+		return result;
 	}
 
 	/**
@@ -1555,7 +1555,7 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 					int start = i;
 					int end = Math.min(i + 4, maxProcessed);
 					// 生成组批号(优化:直接生成随机数,避免雪花算法开销)
-					String assemblyNumber = generateUniqueAssemblyNumber(billetBasicInfoAdd.getHeatNo());
+					String assemblyNumber = generateUniqueAssemblyNumber(billetBasicInfoAdd.getCcmNo(), billetBasicInfoAdd.getHeatNo());
 					// 为当前分组的4条记录设置相同组批号,并添加到更新列表
 					List<BilletBasicInfo> batch = finalBilletBasicInfoList.subList(start, end);
 					batch.forEach(item -> item.setAssemblyNumber(assemblyNumber));
@@ -1618,17 +1618,17 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 				Integer strandNo = item.getStrandNo();
 				Integer length = item.getLength();
 				Integer addSum = item.getAddSum();
-				if (strandNo == 1){
+				if (strandNo == 1 && oConvertUtils.isNotEmpty(billetBasicInfoAdd.getOneStrandNoSum())){
 					oneStrandRemainSum = billetBasicInfoAdd.getOneStrandNoSum() - addSum;
-				}else if (strandNo == 2){
+				}else if (strandNo == 2 && oConvertUtils.isNotEmpty(billetBasicInfoAdd.getTwoStrandNoSum())){
 					twoStrandRemainSum = billetBasicInfoAdd.getTwoStrandNoSum() - addSum;
-				}else if (strandNo == 3){
+				}else if (strandNo == 3 && oConvertUtils.isNotEmpty(billetBasicInfoAdd.getThreeStrandNoSum())){
 					threeStrandRemainSum = billetBasicInfoAdd.getThreeStrandNoSum() - addSum;
-				}else if (strandNo == 4){
+				}else if (strandNo == 4 && oConvertUtils.isNotEmpty(billetBasicInfoAdd.getFourStrandNoSum())){
 					fourStrandRemainSum = billetBasicInfoAdd.getFourStrandNoSum() - addSum;
-				}else if (strandNo == 5){
+				}else if (strandNo == 5 && oConvertUtils.isNotEmpty(billetBasicInfoAdd.getFiveStrandNoSum())){
 					fiveStrandRemainSum = billetBasicInfoAdd.getFiveStrandNoSum() - addSum;
-				}else if (strandNo == 6){
+				}else if (strandNo == 6 && oConvertUtils.isNotEmpty(billetBasicInfoAdd.getSixStrandNoSum())){
 					sixStrandRemainSum = billetBasicInfoAdd.getSixStrandNoSum() - addSum;
 				}
 				// 根据 addSum 生成对应数量的 BilletBasicInfo 对象
@@ -1701,9 +1701,15 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 			}
 			log.info("结束处理每流剩余:{}" + DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
 
-			List<BilletBasicInfo> finalBilletBasicInfoList = updateBilletBasicInfoAndSave(result);
+			result.addAll(rollClubOneResultList);
 
-			billetBasicInfoService.saveOrUpdateBatch(finalBilletBasicInfoList);
+			List<BilletBasicInfo> finalBilletBasicInfoListSort = updateBilletBasicInfoAndSave(result);
+
+			billetBasicInfoService.saveOrUpdateBatch(finalBilletBasicInfoListSort);
+
+			List<BilletBasicInfo> finalBilletBasicInfoList = finalBilletBasicInfoListSort.stream()
+					.filter(x -> !Objects.equals(x.getBelongTable(), "roll_club_one"))
+					.collect(Collectors.toList());
 
 			log.info("开始整炉去除棒一组批更新处理:{}" + DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
 			if (oConvertUtils.listIsNotEmpty(finalBilletBasicInfoList) && finalBilletBasicInfoList.size() >= 4) {
@@ -1715,7 +1721,7 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 					int start = i;
 					int end = Math.min(i + 4, maxProcessed);
 					// 生成组批号(优化:直接生成随机数,避免雪花算法开销)
-					String assemblyNumber = generateUniqueAssemblyNumber(billetBasicInfoAdd.getHeatNo());
+					String assemblyNumber = generateUniqueAssemblyNumber(billetBasicInfoAdd.getCcmNo(), billetBasicInfoAdd.getHeatNo());
 					// 为当前分组的4条记录设置相同组批号,并添加到更新列表
 					List<BilletBasicInfo> batch = finalBilletBasicInfoList.subList(start, end);
 					batch.forEach(item -> item.setAssemblyNumber(assemblyNumber));
@@ -1726,13 +1732,13 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 			log.info("结束整炉去除棒一组批更新处理:{}" + DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
 
 			// 去棒一的和组批的合计钢坯实绩信息
-			finalBilletBasicInfoList.addAll(rollClubOneResultList);
+//			finalBilletBasicInfoList.addAll(rollClubOneResultList);
 
 			// 更新炉次传递单中的总数和坯重
-			double totalBilletWeight = finalBilletBasicInfoList.stream()
+			double totalBilletWeight = finalBilletBasicInfoListSort.stream()
 					.mapToDouble(BilletBasicInfo::getBilletWeight)
 					.sum();
-			billetHotsend.setAmountTotal(finalBilletBasicInfoList.size());
+			billetHotsend.setAmountTotal(finalBilletBasicInfoListSort.size());
 			billetHotsend.setBlankOutput(totalBilletWeight);
 
 			if (oConvertUtils.listIsNotEmpty(rollClubOneResultList) && rollClubOneResultList.size() > 0){
@@ -1743,7 +1749,7 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 
 			// 更新炉次实绩中的总数和坯重
 			heatsActuals.setBlankOutput(totalBilletWeight);
-			heatsActuals.setBilletSum(finalBilletBasicInfoList.size());
+			heatsActuals.setBilletSum(finalBilletBasicInfoListSort.size());
 			log.info("炉次实绩更新:{}" + DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
 			heatsActualsService.updateById(heatsActuals);
 		}
@@ -1757,8 +1763,8 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 	 */
 	private void saveRollClubOneInfo(List<BilletBasicInfo> billetBasicInfoList, BilletBasicInfoAdd  billetBasicInfoAdd) {
 		// 对 resultList 中的元素按 Strandno 分组后重新赋值 StrandnoIndex
-		log.info("整炉去棒一的钢坯总数:{}", billetBasicInfoList.size());
-		billetBasicInfoService.saveOrUpdateBatch(billetBasicInfoList);
+//		log.info("整炉去棒一的钢坯总数:{}", billetBasicInfoList.size());
+//		billetBasicInfoService.saveOrUpdateBatch(billetBasicInfoList);
 
 		// 更新炉次传递单中的总数和坯重
 		double rollClubOneWeight = billetBasicInfoList.stream()
@@ -1875,14 +1881,11 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 	 * @return 坯号
 	 */
 	private String generateUniqueBilletNo(Integer ccmNo, String heatNo) {
-		// 获取当前时间戳的后4位(毫秒级精度)
-		long timestampPart = System.currentTimeMillis() % 10000;
-
-		// 使用原子计数器确保同一毫秒内的唯一性
-		int counterPart = COUNTER.getAndIncrement() % 1000; // 0-999循环
-
-		// 拼接:heatNo + ccmNo + 时间戳后4位 + 3位计数器
-		return heatNo + ccmNo + String.format("%04d", timestampPart) + String.format("%03d", counterPart);
+		String billetNo;
+		do {
+			billetNo = heatNo + String.format("%04d", (int)(Math.random() * 10000));
+		} while (billetBasicInfoService.exists(new QueryWrapper<BilletBasicInfo>().eq("billet_no", billetNo). eq("ccm_no", ccmNo)));
+		return billetNo;
 	}
 
 	/**
@@ -1890,12 +1893,15 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 	 *
 	 * @return 坯号
 	 */
-	private String generateUniqueAssemblyNumber(String heatNo) {
-
-		long snowflakeId = IdWorker.getId();
-
-		int randomPart = (int) (snowflakeId % 900 + 100);
-
-		return heatNo + String.format("%07d", randomPart);
+	private String generateUniqueAssemblyNumber(String ccmNo, String heatNo) {
+		String assembly_number;
+		do {
+			assembly_number = heatNo + String.format("%07d", (int)(Math.random() * 10000000));
+		} while (billetAssemblyNumberMapper.exists(
+				new QueryWrapper<BilletAssemblyNumber>()
+						.eq("assembly_number", assembly_number)
+						.eq("ccm_no", ccmNo))
+		);
+		return assembly_number;
 	}
 }