Browse Source

车运新增老区目的地,维护对应的装运单、票据以及原始记录,并且新增老区工作台

lingpeng.li 1 week ago
parent
commit
6affeb3e21
22 changed files with 1424 additions and 7 deletions
  1. 4 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsend/entity/BilletHotsend.java
  2. 170 1
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsend/service/impl/BilletHotsendBaseServiceImpl.java
  3. 86 3
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsendChangeShift/controller/BilletHotsendChangeShiftController.java
  4. 3 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsendChangeShift/entity/BilletHotsendChangeShift.java
  5. 3 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsendChangeShift/entity/BilletShiftPerformance.java
  6. 5 1
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/controller/BilletOriginalProductRecordController.java
  7. 163 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/controller/RollOldAreasController.java
  8. 472 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/controller/RollOldAreasDetailsController.java
  9. 189 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/entity/RollOldAreas.java
  10. 181 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/entity/RollOldAreasDetails.java
  11. 14 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/mapper/RollOldAreasDetailsMapper.java
  12. 14 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/mapper/RollOldAreasMapper.java
  13. 5 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/mapper/xml/RollOldAreasDetailsMapper.xml
  14. 5 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/mapper/xml/RollOldAreasMapper.xml
  15. 14 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/service/IRollOldAreasDetailsService.java
  16. 14 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/service/IRollOldAreasService.java
  17. 19 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/service/impl/RollOldAreasDetailsServiceImpl.java
  18. 19 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/service/impl/RollOldAreasServiceImpl.java
  19. 1 1
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/sampleCardDeliveryRecord/controller/SampleCardDeliveryRecordController.java
  20. 16 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/controller/StorageBillPrintController.java
  21. 18 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/vo/StorageCenterHeatNoInvoicingVO.java
  22. 9 1
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/carUnit/service/impl/CarUnitServiceImpl.java

+ 4 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsend/entity/BilletHotsend.java

@@ -127,6 +127,10 @@ public class BilletHotsend implements Serializable {
     @ApiModelProperty(value = "'付跨总支数'")
     private Integer rollDeputyCrossNum;
 
+    @Excel(name = "老区总支数", width = 15)
+    @ApiModelProperty(value = "'老区总支数'")
+    private Integer rollOldAreasNum;
+
     @Excel(name = "堆垛支数", width = 15)
     @ApiModelProperty(value = "堆垛支数")
     private Integer stackNum;

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

@@ -56,6 +56,10 @@ import org.jeecg.modules.billet.rollHeight.entity.RollHeight;
 import org.jeecg.modules.billet.rollHeight.entity.RollHeightDetails;
 import org.jeecg.modules.billet.rollHeight.service.IRollHeightDetailsService;
 import org.jeecg.modules.billet.rollHeight.service.IRollHeightService;
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreas;
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreasDetails;
+import org.jeecg.modules.billet.rollOldAreas.service.IRollOldAreasDetailsService;
+import org.jeecg.modules.billet.rollOldAreas.service.IRollOldAreasService;
 import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShipp;
 import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShippDetails;
 import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippDetailsService;
@@ -155,8 +159,12 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 	@Autowired
 	private IRollDeputyCrossService rollDeputyCrossService;
 	@Autowired
+	private IRollOldAreasService rollOldAreasService;
+	@Autowired
 	private IRollDeputyCrossDetailsService rollDeputyCrossDetailsService;
 	@Autowired
+	private IRollOldAreasDetailsService rollOldAreasDetailsService;
+	@Autowired
 	private StackingAndLoadingVehiclesMapper stackingAndLoadingVehiclesMapper;
 
 	@Override
@@ -1350,7 +1358,7 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 		}
 
 		/**
-		 * 保存上若信息
+		 * 保存付跨信息
 		 */
 		if ("roll_deputy_cross".equals(billetHotsendDetailsVo.getBelongTable())){
 			billetHotsend.setShift(storageBill.getShift());
@@ -1403,6 +1411,60 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 			updateShiftInfoByType(billetHotsend.getCcmNo(), billetHotsend.getShift(), billetHotsend.getShiftGroup(), rollDeputyCrossDetailsList.size(), "roll_deputy_cross", "hotCharge");
 		}
 
+		/**
+		 * 保存老区信息
+		 */
+		if ("roll_old_areas".equals(billetHotsendDetailsVo.getBelongTable())){
+			billetHotsend.setShift(storageBill.getShift());
+			billetHotsend.setShiftGroup(storageBill.getShiftGroup());
+			RollOldAreas rollOldAreas = new RollOldAreas();
+			BeanUtils.copyProperties(billetHotsend, rollOldAreas);
+			rollOldAreas.setSize(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getLength())); //定尺
+			rollOldAreas.setSteel(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getGrade())); //钢种
+			rollOldAreas.setSpec(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getSpec())); //规格
+			rollOldAreas.setBlankOutput(rollClubCommonList.stream().mapToDouble(RollClubCommon::getBilletWeight).sum());//出坯量总和
+			rollOldAreas.setStorageBillId(storageBill.getId());
+			LambdaQueryWrapper<RollOldAreas> queryWrapper1 = new LambdaQueryWrapper<>();
+			queryWrapper1.eq(RollOldAreas::getCcmNo, billetHotsend.getCcmNo())
+					.eq(RollOldAreas::getHeatNo, billetHotsend.getHeatNo())
+					.eq(RollOldAreas::getShift, billetHotsend.getShift())
+					.eq(RollOldAreas::getShiftGroup, billetHotsend.getShiftGroup())
+					.eq(RollOldAreas::getStorageBillId, storageBill.getId());
+			RollOldAreas rollOldAreas1 = rollOldAreasService.getOne(queryWrapper1);
+			if (oConvertUtils.isEmpty(rollOldAreas1)){
+				rollOldAreas.setCreateDate(new Date());
+				rollOldAreas.setAmountTotal(rollClubCommonList.size());// 总支数
+				rollOldAreasService.save(rollOldAreas);
+			}else {
+				rollOldAreas1.setId(rollOldAreas1.getId());
+				rollOldAreas1.setAmountTotal(rollOldAreas1.getAmountTotal() + rollClubCommonList.size());// 总支数
+				rollOldAreas1.setBlankOutput(rollOldAreas1.getBlankOutput() + rollOldAreas.getBlankOutput());//出坯量
+				rollOldAreas1.setUpdateTime(new Date());
+				rollOldAreasService.updateById(rollOldAreas1);
+			}
+			// 保存老区明细信息
+			List<RollOldAreasDetails> rollOldAreasDetailsList = new ArrayList<>();
+			rollClubCommonList.forEach(x ->{
+				RollOldAreasDetails rollOldAreasDetails = new RollOldAreasDetails();
+				BeanUtils.copyProperties(x, rollOldAreasDetails);
+				rollOldAreasDetails.setId(String.valueOf(IdWorker.getId()));
+				rollOldAreasDetails.setShift(billetHotsend.getShift());
+				rollOldAreasDetails.setShiftGroup(billetHotsend.getShiftGroup());
+				rollOldAreasDetails.setStorageBillId(storageBill.getId());
+				rollOldAreasDetails.setLicensePlate(storageBill.getLicensePlate());
+				rollOldAreasDetails.setSize(String.valueOf(x.getLength()));
+				rollOldAreasDetails.setSteel(x.getGrade());
+				rollOldAreasDetails.setUpdateTime(new Date(System.currentTimeMillis() + timeOffset.get()));
+				rollOldAreasDetails.setCreateTime(new Date(System.currentTimeMillis() + timeOffset.get()));
+				rollOldAreasDetails.setBlankOutput(x.getBilletWeight());//出坯量
+				rollOldAreasDetailsList.add(rollOldAreasDetails);
+				timeOffset.addAndGet(1000); // 这里假设每次增加1秒(1000毫秒)的时间偏移量
+			});
+			rollOldAreasDetailsService.saveBatch(rollOldAreasDetailsList);
+			// 更新交班表中的热装总支数
+			updateShiftInfoByType(billetHotsend.getCcmNo(), billetHotsend.getShift(), billetHotsend.getShiftGroup(), rollOldAreasDetailsList.size(), "roll_old_areas", "hotCharge");
+		}
+
 		return result;
 	}
 
@@ -2151,6 +2213,17 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 					//统一处理	付跨明细和付跨主表
 					commonBilletRollDeputyCrossHandle(filterBilletBasicInfoList, changeHeatVo, shift, shiftGroup);
 				}
+				List<BilletBasicInfo> rollOldAreasList = originalBilletBasicInfoLists.stream()
+						.filter(item -> "roll_old_areas".equals(item.getBelongTable())) // 筛选 belong_table 等于 "roll_old_areas" 的记录
+						.collect(Collectors.toList());
+				if (rollOldAreasList.size() > 0){
+					//公共方法  处理钢坯实绩、炉次实绩、炉次传递单
+					commonBilletChangeHandle(rollDeputyCrossList, changeHeatVo, shift, shiftGroup, 5);
+					List<BilletBasicInfo> filterBilletBasicInfoList = rollOldAreasList.stream().filter(item -> !oConvertUtils.isEmpty(item.getBelongTable())) // 筛选 belong_table 等于 null 的记录
+							.collect(Collectors.toList());
+					//统一处理	老区明细和老区主表
+					commonBilletRollOldAreasHandle(filterBilletBasicInfoList, changeHeatVo, shift, shiftGroup);
+				}
 				List<BilletBasicInfo> stackingList = originalBilletBasicInfoLists.stream()
 						.filter(item -> "stacking_and_loading_vehicles".equals(item.getBelongTable())) // 筛选 belong_table 等于 "stacking_and_loading_vehicles" 的记录
 						.collect(Collectors.toList());
@@ -2429,6 +2502,57 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 		rollDeputyCrossDetailsService.updateBatchById(originalRollDeputyCrossDetailsList);
 	}
 
+
+	/**
+	 * 老区统一公共处理
+	 * @param originalBilletBasicInfoList
+	 * @param changeHeatVo
+	 * @param shift
+	 * @param shiftGroup
+	 */
+	private void commonBilletRollOldAreasHandle(List<BilletBasicInfo> originalBilletBasicInfoList, ChangeHeatVo changeHeatVo, String shift, String shiftGroup) {
+
+		// 所有原始炉号的总重量
+		double changeTotalWeight = originalBilletBasicInfoList.stream().mapToDouble(BilletBasicInfo::getBilletWeight).sum();
+		// 副跨 主表
+		RollOldAreas originalRollOldAreas = getRollOldAreas(changeHeatVo.getOriginalHeatNo(), changeHeatVo.getCcmNo(), shift, shiftGroup);
+		if (originalRollOldAreas == null) {
+			throw new RuntimeException("原老区主表为空,操作失败!");
+		}
+		// 获取当前值
+		Integer currentAmount = originalRollOldAreas.getAmountTotal();
+		Double currentOutput = originalRollOldAreas.getBlankOutput();
+
+		// 计算新值(确保不小于 0)
+		int newAmount = Math.max(0, currentAmount - changeHeatVo.getNumber());
+		double newOutput = Math.max(0, currentOutput - changeTotalWeight);
+
+		// 设置新值并更新
+		originalRollOldAreas.setAmountTotal(newAmount);
+		originalRollOldAreas.setBlankOutput(newOutput);
+		rollOldAreasService.updateById(originalRollOldAreas);
+
+		RollOldAreas changeRollOldAreas = getRollOldAreas(changeHeatVo.getChangeHeatNo(), changeHeatVo.getCcmNo(), shift, shiftGroup);
+		if (changeRollOldAreas == null) {
+			throw new RuntimeException("变更付跨主表为空,操作失败!");
+		}
+		changeRollOldAreas.setAmountTotal(changeRollOldAreas.getAmountTotal() + changeHeatVo.getNumber());
+		changeRollOldAreas.setBlankOutput(changeRollOldAreas.getBlankOutput() + changeTotalWeight);
+		rollOldAreasService.updateById(changeRollOldAreas);
+
+		List<String> originalBilletNos = originalBilletBasicInfoList.stream().map(BilletBasicInfo::getBilletNo).collect(Collectors.toList());
+		// 副跨明细
+		List<RollOldAreasDetails> originalRollOldAreasDetailsList = getRollOldAreasDetailsList(changeHeatVo.getOriginalHeatNo(), changeHeatVo.getCcmNo(), shift, shiftGroup, originalBilletNos);
+		if (oConvertUtils.listIsEmpty(originalRollOldAreasDetailsList)) {
+			throw new RuntimeException("原老区明细为空,操作失败!");
+		}
+		for (RollOldAreasDetails originalRollOldAreasDetails : originalRollOldAreasDetailsList){
+			originalRollOldAreasDetails.setHeatNo(changeHeatVo.getChangeHeatNo());
+			originalRollOldAreasDetails.setUpdateTime(new Date());
+		}
+		rollOldAreasDetailsService.updateBatchById(originalRollOldAreasDetailsList);
+	}
+
 	/**
 	 * 堆垛容器 统一公共处理
 	 * @param originalBilletBasicInfoList
@@ -2718,6 +2842,20 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 		);
 	}
 
+
+	// 提取查询老区主表的公共方法
+	private RollOldAreas getRollOldAreas(String heatNo, String ccmNo, String shift, String shiftGroup) {
+		return rollOldAreasService.getOne(
+				new LambdaQueryWrapper<RollOldAreas>()
+						.eq(RollOldAreas::getHeatNo, heatNo)
+						.eq(RollOldAreas::getCcmNo, ccmNo)
+						.eq(RollOldAreas::getShift, shift)
+						.eq(RollOldAreas::getShiftGroup, shiftGroup)
+						.orderByDesc(RollOldAreas::getCreateTime)
+						.last("LIMIT 1")
+		);
+	}
+
 	// 提取查询棒一明细表的公共方法
 	private List<RollClubOneDetails> getRollClubOneDetailsList(String heatNo, String ccmNo, String shift, String shiftGroup, List<String> billetNos) {
 		return rollClubOneDetailsService.list(
@@ -2849,4 +2987,35 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 		});
 		return rollDeputyCrossDetailsService.list(queryWrapper);
 	}
+
+
+	// 提取查询老区明细表的公共方法 - 调整为支持stackAddr和逗号分隔的billetNo
+	private List<RollOldAreasDetails> getRollOldAreasDetailsList(String heatNo, String ccmNo, String shift, String shiftGroup, List<String> billetNos) {
+		if (billetNos.isEmpty()) {
+			return Collections.emptyList();
+		}
+		LambdaQueryWrapper<RollOldAreasDetails> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(RollOldAreasDetails::getHeatNo, heatNo)
+				.eq(RollOldAreasDetails::getCcmNo, ccmNo)
+				.eq(RollOldAreasDetails::getShift, shift)
+				.eq(RollOldAreasDetails::getShiftGroup, shiftGroup)
+				.orderByDesc(RollOldAreasDetails::getCreateTime);
+		// 处理两种情况的查询条件
+		queryWrapper.and(wrapper -> {
+			// stackAddr为NULL时,直接查询单个坯号
+			wrapper.eq(RollOldAreasDetails::getStackAddr, null)
+					.in(RollOldAreasDetails::getBilletNo, billetNos);
+			// stackAddr不为NULL时,使用FIND_IN_SET查询逗号分隔的坯号
+			wrapper.or()
+					.isNotNull(RollOldAreasDetails::getStackAddr);
+			// 为非NULL情况添加FIND_IN_SET条件
+			if (!billetNos.isEmpty()) {
+				String inCondition = billetNos.stream()
+						.map(no -> "FIND_IN_SET('" + no + "', billet_no) > 0")
+						.collect(Collectors.joining(" OR "));
+				wrapper.apply(inCondition);
+			}
+		});
+		return rollOldAreasDetailsService.list(queryWrapper);
+	}
 }

+ 86 - 3
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsendChangeShift/controller/BilletHotsendChangeShiftController.java

@@ -38,6 +38,8 @@ import org.jeecg.modules.billet.rollDeputyCross.service.IRollDeputyCrossDetailsS
 import org.jeecg.modules.billet.rollHeight.entity.DestinationStatisticsDetails;
 import org.jeecg.modules.billet.rollHeight.entity.RollHeightDetails;
 import org.jeecg.modules.billet.rollHeight.service.IRollHeightDetailsService;
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreasDetails;
+import org.jeecg.modules.billet.rollOldAreas.service.IRollOldAreasDetailsService;
 import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShippDetails;
 import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippDetailsService;
 import org.jeecg.modules.billet.sampleCardDeliveryRecord.entity.SampleCardDeliveryRecord;
@@ -119,6 +121,9 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 	@Autowired
 	private IRollDeputyCrossDetailsService rollDeputyCrossDetailsService;
 
+	@Autowired
+	private IRollOldAreasDetailsService rollOldAreasDetailsService;
+
 	@Autowired
 	private ISampleCardDeliveryRecordService sampleCardDeliveryRecordService;
 
@@ -1033,6 +1038,7 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 		List<DestinationStatisticsDetails> statisticsDetailsList2 = new ArrayList<>();
 		List<DestinationStatisticsDetails> statisticsDetailsList3 = new ArrayList<>();
 		List<DestinationStatisticsDetails> statisticsDetailsList4 = new ArrayList<>();
+		List<DestinationStatisticsDetails> statisticsDetailsList5 = new ArrayList<>();
 		// 根据铸机号、班组、班别、交班的创建时间,交班时间,查询所有目的地是棒二的钢坯基础信息
 		LambdaQueryWrapper<BilletBasicInfo> queryWrapper1 = new LambdaQueryWrapper<>();
 		queryWrapper1.eq(BilletBasicInfo::getCcmNo, billetHotsendChangeShift.getCcmNo())
@@ -1061,6 +1067,10 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 				.filter(info -> "roll_deputy_cross".equals(info.getBelongTable()))
 				.collect(Collectors.toList());
 
+		List<BilletBasicInfo> rollOldAreasList = billetBasicInfoList.stream()
+				.filter(info -> "roll_old_areas".equals(info.getBelongTable()))
+				.collect(Collectors.toList());
+
 		if (oConvertUtils.listIsNotEmpty(rollClubTwoList)){
 			List<DestinationStatisticsDetails> currentList1 = rollClubTwoList.stream()
 					.collect(Collectors.groupingBy(BilletBasicInfo::getLength))
@@ -1140,12 +1150,33 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 			statisticsDetailsList4.addAll(currentList4);
 		}
 
+		if (oConvertUtils.listIsNotEmpty(rollOldAreasList)){
+			List<DestinationStatisticsDetails> currentList5 = rollOldAreasList.stream()
+					.collect(Collectors.groupingBy(BilletBasicInfo::getLength))
+					.entrySet().stream()
+					.map(entry -> {
+						String size = String.valueOf(entry.getKey());
+						List<BilletBasicInfo> group = entry.getValue();
+						// 统计 blankOutput 总和
+						Double totalBlankOutput = group.stream()
+								.mapToDouble(BilletBasicInfo::getBilletWeight)
+								.sum();
+						BigDecimal bd = BigDecimal.valueOf(totalBlankOutput).setScale(4, BigDecimal.ROUND_HALF_UP);
+						totalBlankOutput = bd.doubleValue();
+						int totalNums = group.size();
+						String ccmNos = group.isEmpty() ? null : String.valueOf(group.get(0).getCcmNo());
+						return new DestinationStatisticsDetails(size, totalNums, totalBlankOutput, ccmNos);
+					}).collect(Collectors.toList());
+			statisticsDetailsList5.addAll(currentList5);
+		}
+
 		// 合并三个列表并根据 size 分组统计
 		List<DestinationStatisticsDetails> mergedList = Stream.of(
 						statisticsDetailsList1,
 						statisticsDetailsList2,
 						statisticsDetailsList3,
-						statisticsDetailsList4
+						statisticsDetailsList4,
+						statisticsDetailsList5
 				).filter(Objects::nonNull) // 过滤可能的 null 列表
 				.flatMap(List::stream)    // 将多个列表的流合并为一个流
 				.collect(Collectors.groupingBy(DestinationStatisticsDetails::getSize))
@@ -1270,6 +1301,26 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 		List<DestinationStatisticsDetails> statisticsDetailsGroup4List = new ArrayList<>(result4.values());
 		billetHotsendChangeShift.setRollDeputyCrossDetails(JSON.toJSONString(statisticsDetailsGroup4List));
 
+		// 轧钢老区明细
+		// 按照 size 分组,计算 nums 和 blankOutput 的总和,取每组第一条记录的 ccmNo
+		Map<String, DestinationStatisticsDetails> result5 = statisticsDetailsList5.stream()
+				.collect(Collectors.groupingBy(
+						DestinationStatisticsDetails::getSize,
+						Collectors.collectingAndThen(
+								Collectors.reducing((first, second) -> {
+									DestinationStatisticsDetails combined = new DestinationStatisticsDetails();
+									combined.setSize(first.getSize());
+									combined.setNums(first.getNums() + second.getNums());
+									combined.setBlankOutput(roundToFourDecimals(first.getBlankOutput() + second.getBlankOutput()));
+									combined.setCcmNo(first.getCcmNo());
+									return combined;
+								}),
+								Optional::get
+						)
+				));
+		List<DestinationStatisticsDetails> statisticsDetailsGroup5List = new ArrayList<>(result5.values());
+		billetHotsendChangeShift.setRollOldAreasDetails(JSON.toJSONString(statisticsDetailsGroup5List));
+
 		billetHotsendChangeShiftService.updateById(billetHotsendChangeShift);
 	}
 
@@ -1587,6 +1638,7 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 				List<DestinationStatisticsDetails> statisticsDetailsList2 = new ArrayList<>();
 				List<DestinationStatisticsDetails> statisticsDetailsList3 = new ArrayList<>();
 				List<DestinationStatisticsDetails> statisticsDetailsList4 = new ArrayList<>();
+				List<DestinationStatisticsDetails> statisticsDetailsList5 = new ArrayList<>();
 
 				for (StorageBill storageBill : storageBillList) {
 					if ("棒二".equals(storageBill.getDestination())) {
@@ -1704,14 +1756,44 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 							statisticsDetailsList4.addAll(currentList4);
 						}
 					}
+
+					if ("老区".equals(storageBill.getDestination())) {
+						LambdaQueryWrapper<RollOldAreasDetails> queryWrapper6 = new LambdaQueryWrapper<>();
+						queryWrapper6.eq(RollOldAreasDetails::getCcmNo, billetHotsendChangeShift1.getCcmNo())
+								.eq(RollOldAreasDetails::getStorageBillId, storageBill.getId());
+						List<RollOldAreasDetails> rollOldAreasDetailsList = rollOldAreasDetailsService.list(queryWrapper6);
+						if (oConvertUtils.listIsNotEmpty(rollOldAreasDetailsList)) {
+							List<DestinationStatisticsDetails> currentList5 = rollOldAreasDetailsList.stream()
+									.collect(Collectors.groupingBy(RollOldAreasDetails::getSize))
+									.entrySet().stream()
+									.map(entry -> {
+										String size = entry.getKey();
+										List<RollOldAreasDetails> group = entry.getValue();
+										// 统计 blankOutput 总和
+										Double totalBlankOutput = group.stream()
+												.mapToDouble(RollOldAreasDetails::getBlankOutput)
+												.sum();
+										BigDecimal bd = BigDecimal.valueOf(totalBlankOutput).setScale(4, BigDecimal.ROUND_HALF_UP);
+										totalBlankOutput = bd.doubleValue();
+										// 统计数量
+										Integer totalNums = group.stream()
+												.mapToInt(detail -> detail.getStackAddr() != null ? 4 : 1).sum();
+										// 取第一个元素的 ccmNo 作为该分组的 ccmNo
+										String ccmNos = group.isEmpty() ? null : group.get(0).getCcmNo();
+										return new DestinationStatisticsDetails(size, totalNums, totalBlankOutput, ccmNos);
+									}).collect(Collectors.toList());
+							statisticsDetailsList5.addAll(currentList5);
+						}
+					}
 				}
 
-				// 合并四个列表并根据 size 分组统计
+				// 合并个列表并根据 size 分组统计
 				List<DestinationStatisticsDetails> mergedList = Stream.of(
 								statisticsDetailsList1,
 								statisticsDetailsList2,
 								statisticsDetailsList3,
-								statisticsDetailsList4 // 添加第四个列表
+								statisticsDetailsList4, // 添加第四个列表
+								statisticsDetailsList5 // 添加第四个列表
 						).filter(Objects::nonNull) // 过滤可能的null列表
 						.flatMap(List::stream)    // 将多个列表合并为一个流
 						.collect(Collectors.groupingBy(DestinationStatisticsDetails::getSize))
@@ -1740,6 +1822,7 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 				billetShiftPerformance.setRollClubThreeDetailsList(statisticsDetailsList2);
 				billetShiftPerformance.setRollOutShippDetailsList(statisticsDetailsList3);
 				billetShiftPerformance.setRollDeputyCrossDetailsList(statisticsDetailsList4);
+				billetShiftPerformance.setRollOldAreasDetailsList(statisticsDetailsList5);
 			}
 
 			// 班次实绩, 统计轧钢棒一

+ 3 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsendChangeShift/entity/BilletHotsendChangeShift.java

@@ -176,6 +176,9 @@ public class BilletHotsendChangeShift implements Serializable {
     @ApiModelProperty(value = "轧钢付跨明细")
     private String rollDeputyCrossDetails;
 
+    @ApiModelProperty(value = "轧钢老区明细")
+    private String rollOldAreasDetails;
+
     // 班组定尺明细
     @ApiModelProperty(value = "班组定尺明细")
     private String sizeDetailsList;

+ 3 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsendChangeShift/entity/BilletShiftPerformance.java

@@ -131,4 +131,7 @@ public class BilletShiftPerformance {
 
     @ApiModelProperty(value = "轧钢付跨明细")
     private List<DestinationStatisticsDetails> rollDeputyCrossDetailsList;
+
+    @ApiModelProperty(value = "轧钢老区明细")
+    private List<DestinationStatisticsDetails> rollOldAreasDetailsList;
 }

+ 5 - 1
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/controller/BilletOriginalProductRecordController.java

@@ -1644,7 +1644,9 @@ public class BilletOriginalProductRecordController extends JeecgController<Bille
 				destination = "roll_out_shipp";
 			} else if ("付跨".equals(print.getDestination())) {
 			    destination = "roll_deputy_cross";
-		    }
+		    } else if ("老区".equals(print.getDestination())) {
+				destination = "roll_old_areas";
+			}
 			hotChargeMap.put("hotChargeDestination", destination);
 			// 将当前记录的热装信息添加到列表
 			hotChargeList.add(hotChargeMap);
@@ -1719,6 +1721,8 @@ public class BilletOriginalProductRecordController extends JeecgController<Bille
 			billetDetailsInfoList = querSstorageBillPrintStatistics(ccmNo, "棒三", queryDate, changeShiftId, heatNo, licensePlate, startTime, endTime, size, btype, brandNum);
 		}else if(queryType.equals("4")){ // 查询上若,指定班次的统计明细
 			billetDetailsInfoList = querSstorageBillPrintStatistics(ccmNo, "上若", queryDate, changeShiftId, heatNo, licensePlate, startTime, endTime, size, btype, brandNum);
+		}else if(queryType.equals("6")){ // 查询老区,指定班次的统计明细
+			billetDetailsInfoList = querSstorageBillPrintStatistics(ccmNo, "老区", queryDate, changeShiftId, heatNo, licensePlate, startTime, endTime, size, btype, brandNum);
 		}
 		return Result.OK(billetDetailsInfoList);
 	}

+ 163 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/controller/RollOldAreasController.java

@@ -0,0 +1,163 @@
+package org.jeecg.modules.billet.rollOldAreas.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreas;
+import org.jeecg.modules.billet.rollOldAreas.service.IRollOldAreasService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 老区
+ * @Author: jeecg-boot
+ * @Date:   2025-07-16
+ * @Version: V1.0
+ */
+@Api(tags="老区")
+@RestController
+@RequestMapping("/billet/rollOldAreas")
+@Slf4j
+public class RollOldAreasController extends JeecgController<RollOldAreas, IRollOldAreasService> {
+	@Autowired
+	private IRollOldAreasService rollOldAreasService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param rollOldAreas
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "老区-分页列表查询")
+	@ApiOperation(value="老区-分页列表查询", notes="老区-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<RollOldAreas>> queryPageList(RollOldAreas rollOldAreas,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<RollOldAreas> queryWrapper = QueryGenerator.initQueryWrapper(rollOldAreas, req.getParameterMap());
+		Page<RollOldAreas> page = new Page<RollOldAreas>(pageNo, pageSize);
+		IPage<RollOldAreas> pageList = rollOldAreasService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param rollOldAreas
+	 * @return
+	 */
+	@AutoLog(value = "老区-添加")
+	@ApiOperation(value="老区-添加", notes="老区-添加")
+	@RequiresPermissions("billet:roll_old_areas:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody RollOldAreas rollOldAreas) {
+		rollOldAreasService.save(rollOldAreas);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param rollOldAreas
+	 * @return
+	 */
+	@AutoLog(value = "老区-编辑")
+	@ApiOperation(value="老区-编辑", notes="老区-编辑")
+	@RequiresPermissions("billet:roll_old_areas:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody RollOldAreas rollOldAreas) {
+		rollOldAreasService.updateById(rollOldAreas);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "老区-通过id删除")
+	@ApiOperation(value="老区-通过id删除", notes="老区-通过id删除")
+	@RequiresPermissions("billet:roll_old_areas:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		rollOldAreasService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "老区-批量删除")
+	@ApiOperation(value="老区-批量删除", notes="老区-批量删除")
+	@RequiresPermissions("billet:roll_old_areas:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.rollOldAreasService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "老区-通过id查询")
+	@ApiOperation(value="老区-通过id查询", notes="老区-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<RollOldAreas> queryById(@RequestParam(name="id",required=true) String id) {
+		RollOldAreas rollOldAreas = rollOldAreasService.getById(id);
+		if(rollOldAreas==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(rollOldAreas);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param rollOldAreas
+    */
+    @RequiresPermissions("billet:roll_old_areas:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, RollOldAreas rollOldAreas) {
+        return super.exportXls(request, rollOldAreas, RollOldAreas.class, "老区");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("billet:roll_old_areas:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, RollOldAreas.class);
+    }
+
+}

+ 472 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/controller/RollOldAreasDetailsController.java

@@ -0,0 +1,472 @@
+package org.jeecg.modules.billet.rollOldAreas.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.SpringContextUtils;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletRulerConfig;
+import org.jeecg.modules.actualControl.billetActual.billetActual.mapper.BilletRulerConfigMapper;
+import org.jeecg.modules.billet.billetHotsendChangeShift.entity.BilletHotsendChangeShift;
+import org.jeecg.modules.billet.billetHotsendChangeShift.service.IBilletHotsendChangeShiftService;
+import org.jeecg.modules.billet.rollClubThree.entity.RollClubThreeDetails;
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreasDetails;
+import org.jeecg.modules.billet.rollOldAreas.service.IRollOldAreasDetailsService;
+import org.jeecg.modules.billet.storageBill.entity.StorageBillPrint;
+import org.jeecg.modules.billet.storageBill.service.IStorageBillPrintService;
+import org.jeecg.modules.billet.storageBill.vo.StorageCenterExportRow;
+import org.jeecg.modules.carUnit.entity.SysDict;
+import org.jeecg.modules.carUnit.entity.SysDictItem;
+import org.jeecg.modules.carUnit.mapper.CarUnitMapper;
+import org.jeecg.modules.carUnit.service.ISysDictItemService;
+import org.jeecg.modules.carUnit.service.ISysDictService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+/**
+ * @Description: 老区明细
+ * @Author: jeecg-boot
+ * @Date: 2025-07-16
+ * @Version: V1.0
+ */
+@Api(tags = "老区明细")
+@RestController
+@RequestMapping("/billet/rollOldAreasDetails")
+@Slf4j
+public class RollOldAreasDetailsController extends JeecgController<RollOldAreasDetails, IRollOldAreasDetailsService> {
+    @Autowired
+    private IRollOldAreasDetailsService rollOldAreasDetailsService;
+    @Autowired
+    private IBilletHotsendChangeShiftService billetHotsendChangeShiftService;
+    @Autowired
+    private ISysDictService sysDictService;
+    @Autowired
+    private BilletRulerConfigMapper billetRulerConfigMapper;
+    @Autowired
+    private IStorageBillPrintService storageBillPrintService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param rollOldAreasDetails
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "老区明细-分页列表查询")
+    @ApiOperation(value = "老区明细-分页列表查询", notes = "老区明细-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<RollOldAreasDetails>> queryPageList(RollOldAreasDetails rollOldAreasDetails,
+                                                            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                            HttpServletRequest req) {
+        QueryWrapper<RollOldAreasDetails> queryWrapper = QueryGenerator.initQueryWrapper(rollOldAreasDetails, req.getParameterMap());
+        Page<RollOldAreasDetails> page = new Page<RollOldAreasDetails>(pageNo, pageSize);
+        IPage<RollOldAreasDetails> pageList = rollOldAreasDetailsService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 添加
+     *
+     * @param rollOldAreasDetails
+     * @return
+     */
+    @AutoLog(value = "老区明细-添加")
+    @ApiOperation(value = "老区明细-添加", notes = "老区明细-添加")
+    @RequiresPermissions("billet:roll_old_areas_details:add")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody RollOldAreasDetails rollOldAreasDetails) {
+        rollOldAreasDetailsService.save(rollOldAreasDetails);
+        return Result.OK("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param rollOldAreasDetails
+     * @return
+     */
+    @AutoLog(value = "老区明细-编辑")
+    @ApiOperation(value = "老区明细-编辑", notes = "老区明细-编辑")
+    @RequiresPermissions("billet:roll_old_areas_details:edit")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<String> edit(@RequestBody RollOldAreasDetails rollOldAreasDetails) {
+        rollOldAreasDetailsService.updateById(rollOldAreasDetails);
+        return Result.OK("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "老区明细-通过id删除")
+    @ApiOperation(value = "老区明细-通过id删除", notes = "老区明细-通过id删除")
+    @RequiresPermissions("billet:roll_old_areas_details:delete")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
+        rollOldAreasDetailsService.removeById(id);
+        return Result.OK("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "老区明细-批量删除")
+    @ApiOperation(value = "老区明细-批量删除", notes = "老区明细-批量删除")
+    @RequiresPermissions("billet:roll_old_areas_details:deleteBatch")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.rollOldAreasDetailsService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "老区明细-通过id查询")
+    @ApiOperation(value = "老区明细-通过id查询", notes = "老区明细-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<RollOldAreasDetails> queryById(@RequestParam(name = "id", required = true) String id) {
+        RollOldAreasDetails rollOldAreasDetails = rollOldAreasDetailsService.getById(id);
+        if (rollOldAreasDetails == null) {
+            return Result.error("未找到对应数据");
+        }
+        return Result.OK(rollOldAreasDetails);
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param rollOldAreasDetails
+     */
+    @RequiresPermissions("billet:roll_old_areas_details:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, RollOldAreasDetails rollOldAreasDetails) {
+        return super.exportXls(request, rollOldAreasDetails, RollOldAreasDetails.class, "老区明细");
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequiresPermissions("billet:roll_old_areas_details:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, RollOldAreasDetails.class);
+    }
+
+
+    /**
+     * 导出excel
+     *
+     * @param response
+     * @param storageBillPrint
+     */
+    @ApiOperation(value = "老区工作台导出", notes = "老区工作台导出")
+    @GetMapping(value = "/exportOldXls")
+    public void exportOldXls(HttpServletResponse response, StorageBillPrint storageBillPrint) {
+        try {
+            QueryWrapper<StorageBillPrint> queryWrapper = new QueryWrapper<StorageBillPrint>();
+            // 铸机号查询条件
+            queryWrapper.eq("ccm_no", storageBillPrint.getCcmNo());
+            // 目的地
+            queryWrapper.eq("destination", "老区");
+            Boolean search = true; // 定义未传任何条件
+            if (oConvertUtils.isNotEmpty(storageBillPrint.getChangeShiftId())) { // 班组取班组时间
+                // 根据铸机号、交班记录ID,获取交班记录中的班别、班次、创建时间
+                LambdaQueryWrapper<BilletHotsendChangeShift> changeQueryWrapper = new LambdaQueryWrapper<>();
+                changeQueryWrapper.eq(BilletHotsendChangeShift::getId, storageBillPrint.getChangeShiftId()).eq(BilletHotsendChangeShift::getCcmNo, storageBillPrint.getCcmNo());
+                BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(changeQueryWrapper);
+                if (billetHotsendChangeShift == null) {
+                    throw new RuntimeException("未查询到交班记录,无法导出!");
+                }
+                Date startChnageTime = billetHotsendChangeShift.getCreateTime();
+                String classes = billetHotsendChangeShift.getShift() + "/" + billetHotsendChangeShift.getShiftGroup();
+                queryWrapper.eq("classes", classes);
+                Date endChnageTime = oConvertUtils.isNotEmpty(billetHotsendChangeShift.getChangeShiftTime()) ? billetHotsendChangeShift.getChangeShiftTime() : new Date();
+                // 修改时间范围查询条件为 >= startTime 且 <= endTime
+                queryWrapper.ge("arrival_time", startChnageTime)  // 大于等于开始时间
+                        .le("arrival_time", endChnageTime);   // 小于等于结束时间
+                search = false;
+            } else if (oConvertUtils.isNotEmpty(storageBillPrint.getStartTime()) && oConvertUtils.isNotEmpty(storageBillPrint.getEndTime())) { // 时间范围
+                // 修改时间范围查询条件为 >= startTime 且 <= endTime
+                queryWrapper.ge("arrival_time", storageBillPrint.getStartTime())  // 大于等于开始时间
+                        .le("arrival_time", storageBillPrint.getEndTime());   // 小于等于结束时间
+                search = false;
+            }
+            // 如果什么条件都没有默认当日
+            if (oConvertUtils.isNotEmpty(storageBillPrint.getQueryDate()) || search == true) { // 具体时间
+                // 获取当前年月日
+                if (StringUtils.isBlank(storageBillPrint.getQueryDate())) {
+                    storageBillPrint.setQueryDate(DateUtils.formatDate(new Date(), "yyyy-MM-dd"));
+                }
+                Date startArrivalTime = DateUtils.getStartOfDayByDate(DateUtils.getStartOfDay(storageBillPrint.getQueryDate()));
+                // 结束时间 减一个小时
+                Date endArrivalTime = DateUtils.getEndOfDayByDate(startArrivalTime);
+                log.info("查询时间范围:startTime={}, endTime={}", storageBillPrint.getStartTime(), storageBillPrint.getEndTime());
+                // 修改时间范围查询条件为 >= startTime 且 <= endTime
+                queryWrapper.ge("arrival_time", startArrivalTime)  // 大于等于开始时间
+                        .le("arrival_time", endArrivalTime);   // 小于等于结束时间
+            }
+            // 炉号查询
+            if (oConvertUtils.isNotEmpty(storageBillPrint.getHeatNo())) {
+                queryWrapper.like("heat_no", storageBillPrint.getHeatNo());
+            }
+            // 车辆查询
+            if (oConvertUtils.isNotEmpty(storageBillPrint.getLicensePlate())) {
+                queryWrapper.like("license_plate", storageBillPrint.getLicensePlate());
+            }
+            // 定尺查询
+            if (oConvertUtils.isNotEmpty(storageBillPrint.getSize())) {
+                queryWrapper.like("size", storageBillPrint.getSize());
+            }
+            // 热坯/冷坯查询
+            if (oConvertUtils.isNotEmpty(storageBillPrint.getBtype())) {
+                queryWrapper.eq("btype", storageBillPrint.getBtype());
+            }
+            // 牌号查询
+            if (oConvertUtils.isNotEmpty(storageBillPrint.getBrandNum())) {
+                queryWrapper.eq("brand_num", storageBillPrint.getBrandNum());
+            }
+
+            queryWrapper.eq("withdraw_status", 0);
+            // 根据到站时间排序
+            queryWrapper.orderByDesc("arrival_time");
+            List<StorageBillPrint> exportList = storageBillPrintService.list(queryWrapper);
+
+            // 用于存储拆分后的新数据
+            List<StorageBillPrint> splitList = new ArrayList<>();
+            // 遍历原始数据,拆分heatNo字段
+            for (StorageBillPrint item : exportList) {
+                String heatNoJson = item.getHeatNo();
+                if (heatNoJson != null && !heatNoJson.isEmpty()) {
+                    try {
+                        // 使用FastJSON解析JSON字符串
+                        JSONObject heatNoObj = JSON.parseObject(heatNoJson);
+
+                        // 遍历JSON中的每个键值对
+                        for (Map.Entry<String, Object> entry : heatNoObj.entrySet()) {
+                            String heatNoKey = entry.getKey();
+                            int quantity = Integer.parseInt(entry.getValue().toString());
+
+                            // 复制原始对象
+                            StorageBillPrint newItem = new StorageBillPrint();
+                            BeanUtils.copyProperties(item, newItem);
+                            // 设置新的heatNo和支数
+                            newItem.setHeatNo(heatNoKey);
+                            newItem.setAmountTotal(quantity);
+
+                            // 添加到新列表
+                            splitList.add(newItem);
+                        }
+                    } catch (Exception e) {
+                        // 处理JSON解析异常
+                        log.error("解析heatNo JSON失败: {}", heatNoJson, e);
+                        // 如果解析失败,保留原始数据
+                        splitList.add(item);
+                    }
+                } else {
+                    // 如果heatNo为空,保留原始数据
+                    splitList.add(item);
+                }
+            }
+
+            // 第二步:根据size字段拆分
+            List<StorageBillPrint> finalList = new ArrayList<>();
+            for (StorageBillPrint item : splitList) {
+                String sizeStr = item.getSize();
+                if (sizeStr != null && sizeStr.contains(",")) {
+                    // 按逗号分割定尺字符串
+                    String[] sizes = sizeStr.split(",");
+                    for (int i = 0; i < sizes.length; i++) {
+                        // 复制对象
+                        StorageBillPrint newItem = new StorageBillPrint();
+                        BeanUtils.copyProperties(item, newItem);
+                        newItem.setAmountTotal(0);
+                        newItem.setWeight(BigDecimal.ZERO);
+                        // 根据装运单ID、炉号、铸机号、定尺、目的地查询对应的明细信息
+
+
+                        if ("老区".equals(item.getDestination())) {
+                            LambdaQueryWrapper<RollOldAreasDetails> queryWrapper3 = new LambdaQueryWrapper<>();
+                            queryWrapper3.eq(RollOldAreasDetails::getStorageBillId, item.getId())
+                                    .eq(RollOldAreasDetails::getCcmNo, item.getCcmNo())
+                                    .eq(RollOldAreasDetails::getSize, sizes[i])
+                                    .eq(RollOldAreasDetails::getHeatNo, item.getHeatNo());
+                            List<RollOldAreasDetails> rollOldAreasDetailsList = rollOldAreasDetailsService.list(queryWrapper3);
+                            if (rollOldAreasDetailsList.size() > 0) {
+                                newItem.setAmountTotal(rollOldAreasDetailsList.size());
+                                newItem.setWeight(BigDecimal.valueOf(rollOldAreasDetailsList.stream().mapToDouble(RollOldAreasDetails::getBlankOutput).sum()));
+                            }
+                        }
+                        // 设置单个定尺
+                        newItem.setSize(sizes[i]);
+                        finalList.add(newItem);
+                    }
+                } else {
+                    // 如果定尺没有逗号分隔,直接添加
+                    finalList.add(item);
+                }
+            }
+            List<StorageCenterExportRow> exportRows = new ArrayList<>();
+            finalList.forEach(x -> {
+                StorageCenterExportRow exportRow = new StorageCenterExportRow();
+                exportRow.setAmount(x.getAmountTotal());
+                exportRow.setCcmNo(Integer.valueOf(x.getCcmNo()));
+                exportRow.setEndPoint(x.getDestination());
+                exportRow.setFactoryDate(DateUtils.date2Str(x.getArrivalTime(), DateUtils.datetimeFormat.get()));
+                exportRow.setHeatNo(x.getHeatNo());
+                exportRow.setLicensePlate(x.getLicensePlate());
+                BigDecimal result = safeToBigDecimal(x.getSize()).divide(BigDecimal.valueOf(1000));
+                if (result != null) {
+                    exportRow.setSize("170*170*" + result.toPlainString());
+                }
+                exportRow.setSpec(x.getName());
+                exportRow.setTransportUnit(getTransportUnitNameByCarNumber(x.getLicensePlate()));
+                exportRow.setTotalWeight(x.getWeight());
+
+                String brandNum = Optional.ofNullable(x.getBrandNum())
+                        .map(bn -> sysDictService.queryDictTextByKey("billet_spec", bn))
+                        .orElseGet(() -> sysDictService.queryDictTextByKey("billet_spec", "5"));
+                exportRow.setBrand(brandNum);
+
+                // 查询定尺规则
+                LambdaQueryWrapper<BilletRulerConfig> queryWrapperbilletRulerConfig = new LambdaQueryWrapper<BilletRulerConfig>().eq(BilletRulerConfig::getLength, Integer.valueOf(safeToInteger(x.getSize())));
+                BilletRulerConfig billetRulerConfig = billetRulerConfigMapper.selectOne(queryWrapperbilletRulerConfig);
+                Double weight = 0.0;
+                if (oConvertUtils.isEmpty(billetRulerConfig)) {
+                    exportRow.setWeightPerPiece(new BigDecimal(0.0));
+                } else {
+                    weight = billetRulerConfig.getWeight();
+                    exportRow.setWeightPerPiece(BigDecimal.valueOf(weight));
+                    Integer amount = x.getAmountTotal();
+                    BigDecimal totalWeight = (amount == null) ? BigDecimal.ZERO :
+                            BigDecimal.valueOf(weight).multiply(BigDecimal.valueOf(amount));
+                    exportRow.setTotalWeight(totalWeight);
+                }
+
+                String btype = Optional.ofNullable(x.getBtype()).orElse("");
+                exportRow.setBtype("0".equals(btype) ? "热坯" : "凉坯");
+                exportRows.add(exportRow);
+            });
+
+            // 设置响应
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            String fileName = URLEncoder.encode("老区工作台装运打印信息", String.valueOf(StandardCharsets.UTF_8)).replaceAll("\\+", "%20");
+            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+
+            // 导出
+            EasyExcel.write(response.getOutputStream(), StorageCenterExportRow.class)
+                    .sheet("装运打印信息")
+                    .doWrite(exportRows);
+        } catch (Exception e) {
+            log.error("导出Excel失败:", e);
+        }
+
+    }
+
+
+    public static String getTransportUnitNameByCarNumber(String carNumber) {
+        if (StringUtils.isBlank(carNumber)) return "";
+
+        CarUnitMapper carUnitMapper = SpringContextUtils.getBean(CarUnitMapper.class);
+        ISysDictItemService sysDictItemService = SpringContextUtils.getBean(ISysDictItemService.class);
+        // 查询 unitCode
+        String unitCode = carUnitMapper.getUnitByCarNumber(carNumber);
+        if (StringUtils.isBlank(unitCode)) return "其他";
+
+        // 查询 car_unit_type 下所有字典项(item_text + item_value)
+        String dictId = getDictId("car_unit_type");
+        if (StringUtils.isBlank(dictId)) return "其他";
+
+        List<SysDictItem> sysDictItems = sysDictItemService.list(
+                new LambdaQueryWrapper<SysDictItem>()
+                        .eq(SysDictItem::getDictId, dictId)
+        );
+
+        // 遍历匹配 unitCode 是否在 item_value 中
+        for (SysDictItem item : sysDictItems) {
+            if (unitCode.equals(item.getItemValue())) {
+                return item.getItemText(); // 匹配成功返回单位名称(如“辉腾”)
+            }
+        }
+
+        return "其他";
+    }
+
+    private static String getDictId(String dictCode) {
+        ISysDictService sysDictService = SpringContextUtils.getBean(ISysDictService.class);
+        SysDict dict = sysDictService.getOne(
+                new LambdaQueryWrapper<SysDict>()
+                        .eq(SysDict::getDictCode, dictCode)
+                        .last("LIMIT 1")
+        );
+        return dict != null ? dict.getId() : null;
+    }
+
+    public static BigDecimal safeToBigDecimal(String str) {
+        if (StringUtils.isBlank(str)) {
+            return BigDecimal.ZERO;
+        }
+        try {
+            return new BigDecimal(str);
+        } catch (NumberFormatException e) {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    public static Integer safeToInteger(String str) {
+        if (StringUtils.isBlank(str)) {
+            return 0;
+        }
+        try {
+            return Integer.parseInt(str);
+        } catch (NumberFormatException e) {
+            try {
+                // 尝试转成小数再取整
+                return new BigDecimal(str).intValue();
+            } catch (Exception ex) {
+                return 0;
+            }
+        }
+    }
+
+}

+ 189 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/entity/RollOldAreas.java

@@ -0,0 +1,189 @@
+package org.jeecg.modules.billet.rollOldAreas.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 老区
+ * @Author: jeecg-boot
+ * @Date: 2025-07-16
+ * @Version: V1.0
+ */
+@Data
+@TableName("roll_old_areas")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "roll_old_areas对象", description = "老区")
+public class RollOldAreas implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "id")
+    private String id;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+    /**
+     * 日期
+     */
+    @Excel(name = "日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "日期")
+    private Date createDate;
+    /**
+     * 铸机号
+     */
+    @Excel(name = "铸机号", width = 15)
+    @ApiModelProperty(value = "铸机号")
+    private String ccmNo;
+    /**
+     * 炉号
+     */
+    @Excel(name = "炉号", width = 15)
+    @ApiModelProperty(value = "炉号")
+    private String heatNo;
+    /**
+     * 班组
+     */
+    @Excel(name = "班组", width = 15)
+    @ApiModelProperty(value = "班组")
+    private String shiftGroup;
+    /**
+     * 班别
+     */
+    @Excel(name = "班别", width = 15)
+    @ApiModelProperty(value = "班别")
+    private String shift;
+    /**
+     * 定尺
+     */
+    @Excel(name = "定尺", width = 15)
+    @ApiModelProperty(value = "定尺")
+    private String size;
+    /**
+     * 钢种
+     */
+    @Excel(name = "钢种", width = 15)
+    @ApiModelProperty(value = "钢种")
+    private String steel;
+    /**
+     * 规格
+     */
+    @Excel(name = "规格", width = 15)
+    @ApiModelProperty(value = "规格")
+    private String spec;
+    /**
+     * 定重
+     */
+    @Excel(name = "定重", width = 15)
+    @ApiModelProperty(value = "定重")
+    private Double decideWeight;
+    /**
+     * 总支数
+     */
+    @Excel(name = "总支数", width = 15)
+    @ApiModelProperty(value = "总支数")
+    private Integer amountTotal;
+    /**
+     * 出坯量
+     */
+    @Excel(name = "出坯量", width = 15)
+    @ApiModelProperty(value = "出坯量")
+    private Double blankOutput;
+    /**
+     * 装运单ID
+     */
+    @Excel(name = "装运单ID", width = 15)
+    @ApiModelProperty(value = "装运单ID")
+    private String storageBillId;
+    /**
+     * C
+     */
+    @Excel(name = "C", width = 15)
+    @ApiModelProperty(value = "C")
+    private Double cc;
+    /**
+     * Mn
+     */
+    @Excel(name = "Mn", width = 15)
+    @ApiModelProperty(value = "Mn")
+    private Double mn;
+    /**
+     * Si
+     */
+    @Excel(name = "Si", width = 15)
+    @ApiModelProperty(value = "Si")
+    private Double si;
+    /**
+     * S
+     */
+    @Excel(name = "S", width = 15)
+    @ApiModelProperty(value = "S")
+    private Double ss;
+    /**
+     * P
+     */
+    @Excel(name = "P", width = 15)
+    @ApiModelProperty(value = "P")
+    private Double pp;
+    /**
+     * V
+     */
+    @Excel(name = "V", width = 15)
+    @ApiModelProperty(value = "V")
+    private Double vv;
+    /**
+     * Nb
+     */
+    @Excel(name = "Nb", width = 15)
+    @ApiModelProperty(value = "Nb")
+    private Double nb;
+    /**
+     * 是否已编辑
+     */
+    @Excel(name = "是否已编辑", width = 15)
+    @ApiModelProperty(value = "是否已编辑")
+    private Integer isUpd;
+}

+ 181 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/entity/RollOldAreasDetails.java

@@ -0,0 +1,181 @@
+package org.jeecg.modules.billet.rollOldAreas.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 老区明细
+ * @Author: jeecg-boot
+ * @Date: 2025-07-16
+ * @Version: V1.0
+ */
+@Data
+@TableName("roll_old_areas_details")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "roll_old_areas_details对象", description = "老区明细")
+public class RollOldAreasDetails implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "id")
+    private String id;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+    /**
+     * 炉号
+     */
+    @Excel(name = "炉号", width = 15)
+    @ApiModelProperty(value = "炉号")
+    private String heatNo;
+    /**
+     * 坯号
+     */
+    @Excel(name = "坯号", width = 15)
+    @ApiModelProperty(value = "坯号")
+    private String billetNo;
+    /**
+     * 装运单ID
+     */
+    @Excel(name = "装运单ID", width = 15)
+    @ApiModelProperty(value = "装运单ID")
+    private String storageBillId;
+    /**
+     * 起始根数
+     */
+    @Excel(name = "起始根数", width = 15)
+    @ApiModelProperty(value = "起始根数")
+    private Integer startNum;
+    /**
+     * 结束根数
+     */
+    @Excel(name = "结束根数", width = 15)
+    @ApiModelProperty(value = "结束根数")
+    private Integer endNum;
+    /**
+     * 堆垛层号(1-20)
+     */
+    @Excel(name = "堆垛层号(1-20)", width = 15)
+    @ApiModelProperty(value = "堆垛层号(1-20)")
+    private String stackStorey;
+    /**
+     * 堆垛编号(1-9)
+     */
+    @Excel(name = "堆垛编号(1-9)", width = 15)
+    @ApiModelProperty(value = "堆垛编号(1-9)")
+    private String stackNum;
+    /**
+     * 垛位
+     */
+    @Excel(name = "垛位", width = 15)
+    @ApiModelProperty(value = "垛位")
+    private String stackAddr;
+    /**
+     * 堆垛起始跟
+     */
+    @Excel(name = "堆垛起始跟", width = 15)
+    @ApiModelProperty(value = "堆垛起始跟")
+    private Integer startNumStack;
+    /**
+     * 堆垛结束跟
+     */
+    @Excel(name = "堆垛结束跟", width = 15)
+    @ApiModelProperty(value = "堆垛结束跟")
+    private Integer endNumStack;
+    /**
+     * 班别
+     */
+    @Excel(name = "班别", width = 15)
+    @ApiModelProperty(value = "班别")
+    private String shift;
+    /**
+     * 班组
+     */
+    @Excel(name = "班组", width = 15)
+    @ApiModelProperty(value = "班组")
+    private String shiftGroup;
+    /**
+     * 钢种
+     */
+    @Excel(name = "钢种", width = 15)
+    @ApiModelProperty(value = "钢种")
+    private String steel;
+    /**
+     * 规格
+     */
+    @Excel(name = "规格", width = 15)
+    @ApiModelProperty(value = "规格")
+    private String spec;
+    /**
+     * 定尺
+     */
+    @Excel(name = "定尺", width = 15)
+    @ApiModelProperty(value = "定尺")
+    private String size;
+    /**
+     * 车牌号
+     */
+    @Excel(name = "车牌号", width = 15)
+    @ApiModelProperty(value = "车牌号")
+    private String licensePlate;
+    /**
+     * 铸机号
+     */
+    @Excel(name = "铸机号", width = 15)
+    @ApiModelProperty(value = "铸机号")
+    private String ccmNo;
+    /**
+     * 出坯量
+     */
+    @Excel(name = "出坯量", width = 15)
+    @ApiModelProperty(value = "出坯量")
+    private Double blankOutput;
+    /**
+     * 组坯号
+     */
+    @Excel(name = "组坯号", width = 15)
+    @ApiModelProperty(value = "组坯号")
+    private String assemblyNumber;
+}

+ 14 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/mapper/RollOldAreasDetailsMapper.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.billet.rollOldAreas.mapper;
+
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreasDetails;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 老区明细
+ * @Author: jeecg-boot
+ * @Date:   2025-07-16
+ * @Version: V1.0
+ */
+public interface RollOldAreasDetailsMapper extends BaseMapper<RollOldAreasDetails> {
+
+}

+ 14 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/mapper/RollOldAreasMapper.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.billet.rollOldAreas.mapper;
+
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreas;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 老区
+ * @Author: jeecg-boot
+ * @Date:   2025-07-16
+ * @Version: V1.0
+ */
+public interface RollOldAreasMapper extends BaseMapper<RollOldAreas> {
+
+}

+ 5 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/mapper/xml/RollOldAreasDetailsMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.billet.rollOldAreas.mapper.RollOldAreasDetailsMapper">
+
+</mapper>

+ 5 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/mapper/xml/RollOldAreasMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.billet.rollOldAreas.mapper.RollOldAreasMapper">
+
+</mapper>

+ 14 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/service/IRollOldAreasDetailsService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.billet.rollOldAreas.service;
+
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreasDetails;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 老区明细
+ * @Author: jeecg-boot
+ * @Date:   2025-07-16
+ * @Version: V1.0
+ */
+public interface IRollOldAreasDetailsService extends IService<RollOldAreasDetails> {
+
+}

+ 14 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/service/IRollOldAreasService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.billet.rollOldAreas.service;
+
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreas;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 老区
+ * @Author: jeecg-boot
+ * @Date:   2025-07-16
+ * @Version: V1.0
+ */
+public interface IRollOldAreasService extends IService<RollOldAreas> {
+
+}

+ 19 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/service/impl/RollOldAreasDetailsServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.billet.rollOldAreas.service.impl;
+
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreasDetails;
+import org.jeecg.modules.billet.rollOldAreas.mapper.RollOldAreasDetailsMapper;
+import org.jeecg.modules.billet.rollOldAreas.service.IRollOldAreasDetailsService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 老区明细
+ * @Author: jeecg-boot
+ * @Date:   2025-07-16
+ * @Version: V1.0
+ */
+@Service
+public class RollOldAreasDetailsServiceImpl extends ServiceImpl<RollOldAreasDetailsMapper, RollOldAreasDetails> implements IRollOldAreasDetailsService {
+
+}

+ 19 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOldAreas/service/impl/RollOldAreasServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.billet.rollOldAreas.service.impl;
+
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreas;
+import org.jeecg.modules.billet.rollOldAreas.mapper.RollOldAreasMapper;
+import org.jeecg.modules.billet.rollOldAreas.service.IRollOldAreasService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 老区
+ * @Author: jeecg-boot
+ * @Date:   2025-07-16
+ * @Version: V1.0
+ */
+@Service
+public class RollOldAreasServiceImpl extends ServiceImpl<RollOldAreasMapper, RollOldAreas> implements IRollOldAreasService {
+
+}

+ 1 - 1
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/sampleCardDeliveryRecord/controller/SampleCardDeliveryRecordController.java

@@ -104,7 +104,7 @@ public class SampleCardDeliveryRecordController extends JeecgController<SampleCa
         String finalShiftGroup = redisShiftGroup;
 
         // 处理 changeShiftId
-        String changeShiftId = sampleCardDeliveryRecord.getChangeShiftId(); // 假设实体有该字段
+        String changeShiftId = sampleCardDeliveryRecord.getChangeShiftId();
         BilletHotsendChangeShift billetHotsendChangeShift = null;
 
         if (StringUtils.isNotBlank(changeShiftId)) {

+ 16 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/controller/StorageBillPrintController.java

@@ -31,6 +31,8 @@ import org.jeecg.modules.billet.rollClubTwo.entity.RollClubTwoDetails;
 import org.jeecg.modules.billet.rollClubTwo.service.IRollClubTwoDetailsService;
 import org.jeecg.modules.billet.rollDeputyCross.entity.RollDeputyCrossDetails;
 import org.jeecg.modules.billet.rollDeputyCross.service.IRollDeputyCrossDetailsService;
+import org.jeecg.modules.billet.rollOldAreas.entity.RollOldAreasDetails;
+import org.jeecg.modules.billet.rollOldAreas.service.IRollOldAreasDetailsService;
 import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShippDetails;
 import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippDetailsService;
 import org.jeecg.modules.billet.storageBill.entity.StorageBill;
@@ -81,6 +83,9 @@ public class StorageBillPrintController extends JeecgController<StorageBillPrint
     @Autowired
     private IRollDeputyCrossDetailsService rollDeputyCrossDetailsService;
 
+    @Autowired
+    private IRollOldAreasDetailsService rollOldAreasDetailsService;
+
     @Autowired
     private IStorageBillService storageBillService;
 
@@ -418,6 +423,17 @@ public class StorageBillPrintController extends JeecgController<StorageBillPrint
                                 newItem.setAmountTotal(rollDeputyCrossDetailsList.size());
                                 newItem.setWeight(BigDecimal.valueOf(rollDeputyCrossDetailsList.stream().mapToDouble(RollDeputyCrossDetails::getBlankOutput).sum()));
                             }
+                        } else if ("老区".equals(item.getDestination())) {
+                            LambdaQueryWrapper<RollOldAreasDetails> queryWrapper6 = new LambdaQueryWrapper<>();
+                            queryWrapper6.eq(RollOldAreasDetails::getStorageBillId, item.getId())
+                                    .eq(RollOldAreasDetails::getCcmNo, item.getCcmNo())
+                                    .eq(RollOldAreasDetails::getSize, sizes[i])
+                                    .eq(RollOldAreasDetails::getHeatNo, item.getHeatNo());
+                            List<RollOldAreasDetails> rollOldAreasDetailsList = rollOldAreasDetailsService.list(queryWrapper6);
+                            if (rollOldAreasDetailsList.size() > 0) {
+                                newItem.setAmountTotal(rollOldAreasDetailsList.size());
+                                newItem.setWeight(BigDecimal.valueOf(rollOldAreasDetailsList.stream().mapToDouble(RollOldAreasDetails::getBlankOutput).sum()));
+                            }
                         }
                         // 设置单个定尺
                         newItem.setSize(sizes[i]);

+ 18 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/vo/StorageCenterHeatNoInvoicingVO.java

@@ -18,6 +18,7 @@ public class StorageCenterHeatNoInvoicingVO {
     private StorageCenterHeatNoInvoicingVO.RollHeightHeatNo rollHeightDetails;
     private StorageCenterHeatNoInvoicingVO.RollOutHeatNo rollOutShippDetails;
     private StorageCenterHeatNoInvoicingVO.RollDeputyHeatNo rollDeputyDetails;
+    private StorageCenterHeatNoInvoicingVO.RollOldAreasHeatNo rollOldAreasDetails;
 //    private StorageCenterHeatNoInvoicingVO.StackHeatNo stackingVehicles;
 //    private StorageCenterHeatNoInvoicingVO.UnknownHeatNo unknownDetails;
 
@@ -91,6 +92,23 @@ public class StorageCenterHeatNoInvoicingVO {
     }
 
 
+    @Data
+    public static class RollOldAreasHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+        private List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> rollChargeDetails;
+
+    }
+
+
     @Data
     public static class RollHeightHeatNo {
 

+ 9 - 1
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/carUnit/service/impl/CarUnitServiceImpl.java

@@ -151,7 +151,7 @@ public class CarUnitServiceImpl extends ServiceImpl<CarUnitMapper, CarUnit> impl
                 }
             }
 
-            // 棒三 rollDeputyDetails
+            // 付跨 rollDeputyDetails
             if (invoicing.getRollDeputyDetails() != null) {
                 for (StorageCenterHeatNoInvoicingVO.RollChargeDetail detail : invoicing.getRollDeputyDetails().getRollChargeDetails()) {
                     StorageCenterExportRow row = convert(detail, ccmNo, "付跨");
@@ -159,6 +159,14 @@ public class CarUnitServiceImpl extends ServiceImpl<CarUnitMapper, CarUnit> impl
                 }
             }
 
+            // 老区 rollOldAreasDetails
+            if (invoicing.getRollOldAreasDetails() != null) {
+                for (StorageCenterHeatNoInvoicingVO.RollChargeDetail detail : invoicing.getRollOldAreasDetails().getRollChargeDetails()) {
+                    StorageCenterExportRow row = convert(detail, ccmNo, "老区");
+                    rows.add(row);
+                }
+            }
+
             // 上若 rollOutShippDetails(如有)
             if (invoicing.getRollOutShippDetails() != null) {
                 for (StorageCenterHeatNoInvoicingVO.RollChargeDetail detail : invoicing.getRollOutShippDetails().getRollChargeDetails()) {