Просмотр исходного кода

热装保存、堆垛保存定尺、组批号维护优化

qiangxuan 1 месяц назад
Родитель
Сommit
e7c5b6ee86

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

@@ -152,7 +152,7 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 				.in(BilletBasicInfo::getBilletNo, billetNos);
 		List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(queryWrapperls);
 		if (oConvertUtils.listIsEmpty(billetBasicInfoList)){
-			result.put("fail", "钢坯基础信息不存在,保存失败!");
+			result.put("fail", "钢坯基础信息不存在,棒线保存失败!");
 			return result;
 		}
 		billetBasicInfoList.forEach(x ->{
@@ -187,30 +187,55 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 			result.put("fail", "钢坯装运单不存在,棒线保存操作失败!");
 			return result;
 		}
-		storageBillInfo.setAmountTotal(storageBillInfo.getAmountTotal() + rollClubCommonList.size());
+
 		// 取最新的第一条钢坯信息
-		RollClubCommon rollClubCommon = rollClubCommonList.stream().findFirst().orElse(null);
-		if (rollClubCommon != null) {
-			storageBillInfo.setSteel(rollClubCommon.getGrade());//钢种
-			storageBillInfo.setSpec(rollClubCommon.getSpec());//规格
-			storageBillInfo.setHeatNo(rollClubCommon.getHeatNo());// 炉号
+		BilletBasicInfo billetBasicInfo = billetBasicInfoList.stream().findFirst().orElse(null);
+		if (billetBasicInfo != null) {
+			storageBillInfo.setSteel(billetBasicInfo.getGrade());//钢种
+			storageBillInfo.setSpec(billetBasicInfo.getSpec());//规格
+			storageBillInfo.setHeatNo(billetBasicInfo.getHeatNo());// 炉号
+		}
+		// 装运单编辑确认目的地,同步时,维护定尺
+		List<Integer> sizeIntList = billetBasicInfoList.stream().map(BilletBasicInfo::getLength).distinct().collect(Collectors.toList());
+		List<String> sizeStrList = sizeIntList.stream().map(String::valueOf).collect(Collectors.toList());
+		if(oConvertUtils.listIsNotEmpty(sizeStrList)) {
+			String distinctSizeStr = sizeIntList.stream()
+					.distinct()
+					.map(String::valueOf)
+					.collect(Collectors.joining(","));
+			String finalSizeStr = Optional.ofNullable(storageBillInfo.getSize())
+					.filter(oConvertUtils::isNotEmpty)
+					.map(s -> s + "," + distinctSizeStr)
+					.orElse(distinctSizeStr);
+			// 对 finalSizeStr 再次去重
+			String[] sizeArray = finalSizeStr.split(",");
+			Set<String> uniqueSizes = Arrays.stream(sizeArray)
+					.filter(s -> s != null && !s.isEmpty())
+					.collect(Collectors.toCollection(HashSet::new));
+			finalSizeStr = String.join(",", uniqueSizes);
+			storageBillInfo.setSize(finalSizeStr);
 		}
-		List<Integer> sizeList = rollClubCommonList.stream().map(RollClubCommon::getLength).distinct().collect(Collectors.toList());
-		List<String> sizeLists = sizeList.stream().map(String::valueOf).collect(Collectors.toList());
-		String sizeString = String.join(",", sizeLists);
-		storageBillInfo.setSize(sizeString);// 定尺
-		List<String> stringList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber).filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
-		if(oConvertUtils.listIsNotEmpty(stringList)) {
-			String distinctAssemblyNumber = billetBasicInfoList.stream()
-					.map(BilletBasicInfo::getAssemblyNumber)
-					.filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber))
-					.distinct().collect(Collectors.joining(","));
+
+		// 装运单编辑确认目的地,同步时,维护组批号
+		List<String> assemblyNumberList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber)
+				.filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
+		if(oConvertUtils.listIsNotEmpty(assemblyNumberList)) {
+			String distinctAssemblyNumber = assemblyNumberList.stream().distinct().collect(Collectors.joining(","));
 			String finalAssemblyNumber = Optional.ofNullable(storageBillInfo.getAssemblyNumber())
 					.filter(oConvertUtils::isNotEmpty)
 					.map(s -> s + "," + distinctAssemblyNumber)
 					.orElse(distinctAssemblyNumber);
+
+			// 对 finalAssemblyNumber 再次去重
+			String[] assemblyNumberArray = finalAssemblyNumber.split(",");
+			Set<String> uniqueAssemblyNumbers = Arrays.stream(assemblyNumberArray)
+					.filter(s -> s != null && !s.isEmpty())
+					.collect(Collectors.toCollection(HashSet::new));
+			finalAssemblyNumber = String.join(",", uniqueAssemblyNumbers);
 			storageBillInfo.setAssemblyNumber(finalAssemblyNumber);
 		}
+		// 装运总支数累加
+		storageBillInfo.setAmountTotal(storageBillInfo.getAmountTotal() + rollClubCommonList.size());
 		storageBillService.updateById(storageBillInfo);
 		result.put("success", "棒线保存成功!");
 		return result;
@@ -271,7 +296,6 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 		//
 		List<String> sizeList = new ArrayList<>();
 		List<String> heatNoList = new ArrayList<>();
-		long count = 0l;
 		//根据铸机号、钢坯转运单ID查询定尺信息
 		if ("roll_club_two".equals(billetHotsendDetailsVo.getBelongTable())){
 			LambdaQueryWrapper<RollClubTwoDetails> queryWrapperRC = new LambdaQueryWrapper();
@@ -281,9 +305,6 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 					.collect(Collectors.toList());
 			heatNoList = rollClubTwoDetailsList.stream().map(RollClubTwoDetails::getHeatNo).distinct()
 					.collect(Collectors.toList());
-			if (oConvertUtils.listIsNotEmpty(rollClubTwoDetailsList)){
-				count = rollClubTwoDetailsList.stream().count();
-			}
 		}
 		if ("roll_club_three".equals(billetHotsendDetailsVo.getBelongTable())){
 			LambdaQueryWrapper<RollClubThreeDetails> queryWrapperCT = new LambdaQueryWrapper();
@@ -293,9 +314,6 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 					.collect(Collectors.toList());
 			heatNoList = rollClubThreeDetailsList.stream().map(RollClubThreeDetails::getHeatNo).distinct()
 					.collect(Collectors.toList());
-			if (oConvertUtils.listIsNotEmpty(rollClubThreeDetailsList)){
-				count = rollClubThreeDetailsList.stream().count();
-			}
 		}
 		if ("roll_out_shipp".equals(billetHotsendDetailsVo.getBelongTable())){
 			LambdaQueryWrapper<RollOutShippDetails> queryWrapperROS = new LambdaQueryWrapper();
@@ -305,9 +323,6 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 					.collect(Collectors.toList());
 			heatNoList = rollOutShippDetailsList.stream().map(RollOutShippDetails::getHeatNo).distinct()
 					.collect(Collectors.toList());
-			if (oConvertUtils.listIsNotEmpty(rollOutShippDetailsList)){
-				count = rollOutShippDetailsList.stream().count();
-			}
 		}
 		// 更新装运单 车次总序号、本车车次
 		if (oConvertUtils.isEmpty(billetHotsendDetailsVo.getStorageBill()) || billetHotsendDetailsVo.getStorageBill() == null){
@@ -323,26 +338,56 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 			result.put("fail", "钢坯装运单不存在,棒线发车操作失败!");
 			return result;
 		}
-		storageBillInfo.setAmountTotal(storageBillInfo.getAmountTotal() + rollClubCommonList.size());
+
 		// 取最新的第一条钢坯信息
-		RollClubCommon rollClubCommon = rollClubCommonList.stream().findFirst().orElse(null);
-		storageBillInfo.setSteel(rollClubCommon.getGrade());//钢种
-		storageBillInfo.setSpec(rollClubCommon.getSpec());//规格
-		storageBillInfo.setHeatNo(rollClubCommon.getHeatNo());// 炉号
-		String sizeString = String.join(",", sizeList.stream().map(String::valueOf).collect(Collectors.toList()));
-		storageBillInfo.setSize(sizeString);// 定尺
-		List<String> assemblyNumberList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber).filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
+		BilletBasicInfo billetBasicInfo = billetBasicInfoList.stream().findFirst().orElse(null);
+		if (billetBasicInfo != null) {
+			storageBillInfo.setSteel(billetBasicInfo.getGrade());//钢种
+			storageBillInfo.setSpec(billetBasicInfo.getSpec());//规格
+			storageBillInfo.setHeatNo(billetBasicInfo.getHeatNo());// 炉号
+		}
+		// 装运单编辑确认目的地,同步时,维护定尺
+		List<Integer> sizeIntList = billetBasicInfoList.stream().map(BilletBasicInfo::getLength).distinct().collect(Collectors.toList());
+		List<String> sizeStrList = sizeIntList.stream().map(String::valueOf).collect(Collectors.toList());
+		if(oConvertUtils.listIsNotEmpty(sizeStrList)) {
+			String distinctSizeStr = sizeIntList.stream()
+					.distinct()
+					.map(String::valueOf)
+					.collect(Collectors.joining(","));
+			String finalSizeStr = Optional.ofNullable(storageBillInfo.getSize())
+					.filter(oConvertUtils::isNotEmpty)
+					.map(s -> s + "," + distinctSizeStr)
+					.orElse(distinctSizeStr);
+			// 对 finalSizeStr 再次去重
+			String[] sizeArray = finalSizeStr.split(",");
+			Set<String> uniqueSizes = Arrays.stream(sizeArray)
+					.filter(s -> s != null && !s.isEmpty())
+					.collect(Collectors.toCollection(HashSet::new));
+			finalSizeStr = String.join(",", uniqueSizes);
+			storageBillInfo.setSize(finalSizeStr);
+		}
+
+		// 装运单编辑确认目的地,同步时,维护组批号
+		List<String> assemblyNumberList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber)
+				.filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
 		if(oConvertUtils.listIsNotEmpty(assemblyNumberList)) {
-			String distinctAssemblyNumber = billetBasicInfoList.stream()
-					.map(BilletBasicInfo::getAssemblyNumber)
-					.filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber))
-					.distinct().collect(Collectors.joining(","));
+			String distinctAssemblyNumber = assemblyNumberList.stream().distinct().collect(Collectors.joining(","));
 			String finalAssemblyNumber = Optional.ofNullable(storageBillInfo.getAssemblyNumber())
 					.filter(oConvertUtils::isNotEmpty)
 					.map(s -> s + "," + distinctAssemblyNumber)
 					.orElse(distinctAssemblyNumber);
+
+			// 对 finalAssemblyNumber 再次去重
+			String[] assemblyNumberArray = finalAssemblyNumber.split(",");
+			Set<String> uniqueAssemblyNumbers = Arrays.stream(assemblyNumberArray)
+					.filter(s -> s != null && !s.isEmpty())
+					.collect(Collectors.toCollection(HashSet::new));
+			finalAssemblyNumber = String.join(",", uniqueAssemblyNumbers);
 			storageBillInfo.setAssemblyNumber(finalAssemblyNumber);
 		}
+		// 装运总支数
+		storageBillInfo.setAmountTotal(storageBillInfo.getAmountTotal() + rollClubCommonList.size());
+		// 发车时间
 		storageBillInfo.setOutTime(new Date());
 		storageBillService.updateById(storageBillInfo);
 
@@ -384,7 +429,7 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 		storageCarLog.setTypeConfigId(storageBillInfo.getTypeConfigId()); // 钢坯配置类型ID
 		storageCarLog.setHeatNo(String.join(",", heatNoList));
 		storageCarLog.setSize(String.join(",", sizeList));// 定尺
-		storageCarLog.setAmount(Integer.valueOf((int) count));// 支数
+		storageCarLog.setAmount(storageBillInfo.getAmountTotal());// 支数
 		storageCarLog.setDataTime(new Date());
 		storageCarLogService.save(storageCarLog);
 		result.put("success", "棒线发车成功!");

+ 83 - 31
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/stackingAndLoadingVehicles/service/impl/StackingAndLoadingVehiclesServiceImpl.java

@@ -211,22 +211,55 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
             result.put("fail", "钢坯装运单信息为空,堆垛保存操作失败!");
             return result;
         }
-        RollClubCommon rollClubCommon = rollClubCommonList.stream().findFirst().orElse(null);
-        storageBillInfo.setSteel(rollClubCommon.getGrade());//钢种
-        storageBillInfo.setSpec(rollClubCommon.getSpec());//规格
+        // 取最新的第一条钢坯信息
+        BilletBasicInfo billetBasicInfo = billetBasicInfoList.stream().findFirst().orElse(null);
+        if (billetBasicInfo != null) {
+            storageBillInfo.setSteel(billetBasicInfo.getGrade());//钢种
+            storageBillInfo.setSpec(billetBasicInfo.getSpec());//规格
+            storageBillInfo.setHeatNo(billetBasicInfo.getHeatNo());// 炉号
+        }
+
         storageBillInfo.setAmountTotal((oConvertUtils.isNotEmpty(storageBillInfo.getAmountTotal()) ? storageBillInfo.getAmountTotal() : 0) + stackingAndLoadingVehiclesList.size() * 4);
         storageBillInfo.setDestination(loadingParams.getDestination());
         storageBillInfo.setTypeConfigId(loadingParams.getDestinationId());
-        List<String> stringList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber).filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
-        if(oConvertUtils.listIsNotEmpty(stringList)) {
-            String distinctAssemblyNumber = billetBasicInfoList.stream()
-                    .map(BilletBasicInfo::getAssemblyNumber)
-                    .filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber))
-                    .distinct().collect(Collectors.joining(","));
+
+        // 装运单编辑确认目的地,同步时,维护定尺
+        List<Integer> sizeIntList = billetBasicInfoList.stream().map(BilletBasicInfo::getLength).distinct().collect(Collectors.toList());
+        List<String> sizeStrList = sizeIntList.stream().map(String::valueOf).collect(Collectors.toList());
+        if(oConvertUtils.listIsNotEmpty(sizeStrList)) {
+            String distinctSizeStr = sizeIntList.stream()
+                    .distinct()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+            String finalSizeStr = Optional.ofNullable(storageBillInfo.getSize())
+                    .filter(oConvertUtils::isNotEmpty)
+                    .map(s -> s + "," + distinctSizeStr)
+                    .orElse(distinctSizeStr);
+            // 对 finalSizeStr 再次去重
+            String[] sizeArray = finalSizeStr.split(",");
+            Set<String> uniqueSizes = Arrays.stream(sizeArray)
+                    .filter(s -> s != null && !s.isEmpty())
+                    .collect(Collectors.toCollection(HashSet::new));
+            finalSizeStr = String.join(",", uniqueSizes);
+            storageBillInfo.setSize(finalSizeStr);
+        }
+
+        // 装运单编辑确认目的地,同步时,维护组批号
+        List<String> assemblyNumberList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber)
+                .filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
+        if(oConvertUtils.listIsNotEmpty(assemblyNumberList)) {
+            String distinctAssemblyNumber = assemblyNumberList.stream().distinct().collect(Collectors.joining(","));
             String finalAssemblyNumber = Optional.ofNullable(storageBillInfo.getAssemblyNumber())
                     .filter(oConvertUtils::isNotEmpty)
                     .map(s -> s + "," + distinctAssemblyNumber)
                     .orElse(distinctAssemblyNumber);
+
+            // 对 finalAssemblyNumber 再次去重
+            String[] assemblyNumberArray = finalAssemblyNumber.split(",");
+            Set<String> uniqueAssemblyNumbers = Arrays.stream(assemblyNumberArray)
+                    .filter(s -> s != null && !s.isEmpty())
+                    .collect(Collectors.toCollection(HashSet::new));
+            finalAssemblyNumber = String.join(",", uniqueAssemblyNumbers);
             storageBillInfo.setAssemblyNumber(finalAssemblyNumber);
         }
         storageBillService.updateById(storageBillInfo);
@@ -639,7 +672,6 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
         List<String> sizeList = new ArrayList<>();
         List<String> heatNoList = new ArrayList<>();
 
-        long count = 0L;
         if ("roll_club_two".equals(loadingParams.getDestinationTable())) {
             LambdaQueryWrapper<RollClubTwoDetails> queryWrapperRC = new LambdaQueryWrapper();
             queryWrapperRC.eq(RollClubTwoDetails::getCcmNo, storageBill.getCcmNo()).eq(RollClubTwoDetails::getStorageBillId, storageBill.getId());
@@ -648,9 +680,6 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
                     .collect(Collectors.toList());
             heatNoList = rollClubTwoDetailsList.stream().map(RollClubTwoDetails::getHeatNo).distinct()
                     .collect(Collectors.toList());
-            if (oConvertUtils.listIsNotEmpty(rollClubTwoDetailsList)) {
-                count = rollClubTwoDetailsList.stream().count();
-            }
         }
         if ("roll_club_three".equals(loadingParams.getDestinationTable())) {
             LambdaQueryWrapper<RollClubThreeDetails> queryWrapperCT = new LambdaQueryWrapper();
@@ -660,9 +689,6 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
                     .collect(Collectors.toList());
             heatNoList = rollClubThreeDetailsList.stream().map(RollClubThreeDetails::getHeatNo).distinct()
                     .collect(Collectors.toList());
-            if (oConvertUtils.listIsNotEmpty(rollClubThreeDetailsList)) {
-                count = rollClubThreeDetailsList.stream().count();
-            }
         }
         if ("roll_out_shipp".equals(loadingParams.getDestinationTable())) {
             LambdaQueryWrapper<RollOutShippDetails> queryWrapperROS = new LambdaQueryWrapper();
@@ -672,9 +698,6 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
                     .collect(Collectors.toList());
             heatNoList = rollOutShippDetailsList.stream().map(RollOutShippDetails::getHeatNo).distinct()
                     .collect(Collectors.toList());
-            if (oConvertUtils.listIsNotEmpty(rollOutShippDetailsList)) {
-                count = rollOutShippDetailsList.stream().count();
-            }
         }
         if ("roll_height".equals(loadingParams.getDestinationTable())) {
             result.put("success", "堆垛去高线发车操作成功!");
@@ -689,26 +712,55 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
             result.put("fail", "钢坯装运单信息为空,堆垛发车操作失败!");
             return result;
         }
-        RollClubCommon rollClubCommon = rollClubCommonList.stream().findFirst().orElse(null);
-        if (rollClubCommon != null){
-            storageBillInfo.setSteel(rollClubCommon.getGrade());//钢种
-            storageBillInfo.setSpec(rollClubCommon.getSpec());//规格
-            storageBillInfo.setHeatNo(rollClubCommon.getHeatNo());//炉号
+
+        // 取最新的第一条钢坯信息
+        BilletBasicInfo billetBasicInfo = billetBasicInfoList.stream().findFirst().orElse(null);
+        if (billetBasicInfo != null) {
+            storageBillInfo.setSteel(billetBasicInfo.getGrade());//钢种
+            storageBillInfo.setSpec(billetBasicInfo.getSpec());//规格
+            storageBillInfo.setHeatNo(billetBasicInfo.getHeatNo());// 炉号
         }
-        storageBillInfo.setSize(String.join(",", sizeList));
-        storageBillInfo.setAmountTotal((oConvertUtils.isNotEmpty(storageBillInfo.getAmountTotal()) ? storageBillInfo.getAmountTotal() : 0) + stackingAndLoadingVehiclesList.size() * 4);
-        List<String> assemblyNumberList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber).filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
+
+        // 装运单编辑确认目的地,同步时,维护定尺
+        List<Integer> sizeIntList = billetBasicInfoList.stream().map(BilletBasicInfo::getLength).distinct().collect(Collectors.toList());
+        List<String> sizeStrList = sizeIntList.stream().map(String::valueOf).collect(Collectors.toList());
+        if(oConvertUtils.listIsNotEmpty(sizeStrList)) {
+            String distinctSizeStr = sizeIntList.stream()
+                    .distinct()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+            String finalSizeStr = Optional.ofNullable(storageBillInfo.getSize())
+                    .filter(oConvertUtils::isNotEmpty)
+                    .map(s -> s + "," + distinctSizeStr)
+                    .orElse(distinctSizeStr);
+            // 对 finalSizeStr 再次去重
+            String[] sizeArray = finalSizeStr.split(",");
+            Set<String> uniqueSizes = Arrays.stream(sizeArray)
+                    .filter(s -> s != null && !s.isEmpty())
+                    .collect(Collectors.toCollection(HashSet::new));
+            finalSizeStr = String.join(",", uniqueSizes);
+            storageBillInfo.setSize(finalSizeStr);
+        }
+
+        // 装运单编辑确认目的地,同步时,维护组批号
+        List<String> assemblyNumberList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber)
+                .filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
         if(oConvertUtils.listIsNotEmpty(assemblyNumberList)) {
-            String distinctAssemblyNumber = billetBasicInfoList.stream()
-                    .map(BilletBasicInfo::getAssemblyNumber)
-                    .filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber))
-                    .distinct().collect(Collectors.joining(","));
+            String distinctAssemblyNumber = assemblyNumberList.stream().distinct().collect(Collectors.joining(","));
             String finalAssemblyNumber = Optional.ofNullable(storageBillInfo.getAssemblyNumber())
                     .filter(oConvertUtils::isNotEmpty)
                     .map(s -> s + "," + distinctAssemblyNumber)
                     .orElse(distinctAssemblyNumber);
+
+            // 对 finalAssemblyNumber 再次去重
+            String[] assemblyNumberArray = finalAssemblyNumber.split(",");
+            Set<String> uniqueAssemblyNumbers = Arrays.stream(assemblyNumberArray)
+                    .filter(s -> s != null && !s.isEmpty())
+                    .collect(Collectors.toCollection(HashSet::new));
+            finalAssemblyNumber = String.join(",", uniqueAssemblyNumbers);
             storageBillInfo.setAssemblyNumber(finalAssemblyNumber);
         }
+        storageBillInfo.setAmountTotal((oConvertUtils.isNotEmpty(storageBillInfo.getAmountTotal()) ? storageBillInfo.getAmountTotal() : 0) + stackingAndLoadingVehiclesList.size() * 4);
         storageBillInfo.setOutTime(new Date());
         storageBillService.updateById(storageBillInfo);
         // 7 发车后,新增钢坯堆垛储运信息,生成储运单 storage_car_log