Преглед изворни кода

新增根据炉号查询储运中心工作台对应信息接口

lingpeng.li пре 2 месеци
родитељ
комит
da93e2175c

+ 18 - 1
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/controller/StorageBillController.java

@@ -1479,12 +1479,29 @@ public class StorageBillController extends JeecgController<StorageBill, IStorage
 
 	@ApiOperation(value = "根据装运单id查询储运中心工作台车次信息", notes = "根据装运单id查询储运中心工作台车次信息")
 	@GetMapping(value = "/storageCenterCarById")
-	public Result<StorageCenterCarDetailVO> storageCenterCarInfo(@RequestParam(name="storageBillId") String storageBillId) {
+	public Result<StorageCenterCarDetailVO> storageCenterCarInfoById(@RequestParam(name="storageBillId") String storageBillId) {
 
 		StorageCenterCarDetailVO storageCenterCarDetailVO = storageBillService.storageCenterCarById(storageBillId);
 		return Result.OK(storageCenterCarDetailVO);
 	}
 
+	@ApiOperation(value = "储运中心工作台炉号信息", notes = "储运中心工作台炉号信息")
+	@GetMapping(value = "/storageCenterHeatNoInfo")
+	public Result<StorageCenterHeatNoVO> storageCenterHeatNoInfo(StorageCenterQueryDTO queryDTO) {
+
+		StorageCenterHeatNoVO storageCenterHeatNoVO = storageBillService.storageCenterHeatNoInfo(queryDTO);
+		return Result.OK(storageCenterHeatNoVO);
+	}
+
+
+	@ApiOperation(value = "根据炉号查询储运中心工作台炉号信息", notes = "根据炉号查询储运中心工作台炉号信息")
+	@GetMapping(value = "/storageCenterByHeatNo")
+	public Result<StorageCenterHeatNoDetailVO> storageCenterByHeatNo(@RequestParam(name="heatNo") String heatNo) {
+
+		StorageCenterHeatNoDetailVO storageCenterHeatNoDetailVO = storageBillService.storageCenterByHeatNo(heatNo);
+		return Result.OK(storageCenterHeatNoDetailVO);
+	}
+
 	/**
 	 * 计算 本车车次
 	 * @param ccmNo

+ 4 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/service/IStorageBillService.java

@@ -87,5 +87,9 @@ public interface IStorageBillService extends IService<StorageBill> {
 
     StorageCenterCarDetailVO storageCenterCarById(String storageBillId);
 
+    StorageCenterHeatNoVO storageCenterHeatNoInfo(StorageCenterQueryDTO queryDTO);
+
+    StorageCenterHeatNoDetailVO storageCenterByHeatNo(String heatNo);
+
 
 }

+ 905 - 4
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/service/impl/StorageBillServiceImpl.java

@@ -15,6 +15,8 @@ import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfo;
 import org.jeecg.modules.actualControl.billetActual.billetActual.service.IBilletBasicInfoService;
+import org.jeecg.modules.actualControl.heatsActuals.entity.HeatsActuals;
+import org.jeecg.modules.actualControl.heatsActuals.service.IHeatsActualsService;
 import org.jeecg.modules.billet.billetAutoTmp.entity.BilletAutoTmp;
 import org.jeecg.modules.billet.billetAutoTmp.service.IBilletAutoTmpService;
 import org.jeecg.modules.billet.billetHotsend.entity.BilletHotsend;
@@ -47,6 +49,7 @@ import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippDetailsService
 import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippService;
 import org.jeecg.modules.billet.stackingAndLoadingVehicles.entity.StackingAndLoadingVehicles;
 import org.jeecg.modules.billet.stackingAndLoadingVehicles.entity.StackingUpLog;
+import org.jeecg.modules.billet.stackingAndLoadingVehicles.mapper.StackingAndLoadingVehiclesMapper;
 import org.jeecg.modules.billet.stackingAndLoadingVehicles.service.IStackingUpLogService;
 import org.jeecg.modules.billet.storageBill.dto.StorageCenterQueryDTO;
 import org.jeecg.modules.billet.storageBill.entity.*;
@@ -140,6 +143,12 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
 
     @Autowired
     private IStackingUpLogService stackingUpLogService;
+    
+    @Autowired
+    private IHeatsActualsService heatsActualsService;
+
+    @Autowired
+    private StackingAndLoadingVehiclesMapper stackingAndLoadingVehiclesMapper;
 
     @Override
     public void departHandle(BilletHotsendDetailsVo billetHotsendDetailsVo) {
@@ -3581,8 +3590,6 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
             return storageCenterCarDetailVO;
         }
 
-        List<String> heatNoList = Arrays.asList(bill.getHeatNo().split(","));
-
         List<StorageCenterCarDetailVO.heatNoInfo> heatNoInfos = new ArrayList<>();
         List<StorageCenterCarDetailVO.heatNoDetail> heatNoDetails = new ArrayList<>();
 
@@ -3605,12 +3612,22 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
                     .stream().collect(Collectors.groupingBy(RollOutShippDetails::getHeatNo));
         }
 
+        // **获取所有的炉号 (HeatNo),去重**
+        Set<String> allHeatNos = new HashSet<>();
+
+        allHeatNos.addAll(rollClubTwoMap.keySet());
+        allHeatNos.addAll(rollClubThreeMap.keySet());
+        allHeatNos.addAll(rollOutShippMap.keySet());
+
+
         // **遍历 heatNoList 进行处理**
-        for (String s : heatNoList) {
+        for (String s : allHeatNos) {
+
+            List<StorageCenterCarDetailVO.assemblyNumberDetail> handleSizeList = new ArrayList<>();
+
             StorageCenterCarDetailVO.heatNoDetail heatNoDetail = new StorageCenterCarDetailVO.heatNoDetail();
             heatNoDetail.setHeatNo(s);
             List<StorageCenterCarDetailVO.assemblyNumberDetail> assemblyNumberDetails = new ArrayList<>();
-            List<StorageCenterCarDetailVO.assemblyNumberDetail> handleSizeList = new ArrayList<>();
 
             List<RollClubTwoDetails> rollClubTwoDetailsList = rollClubTwoMap.get(s);
             List<RollClubThreeDetails> rollClubThreeDetailsList = rollClubThreeMap.get(s);
@@ -3770,6 +3787,887 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
         return storageCenterCarDetailVO;
     }
 
+    @Override
+    public StorageCenterHeatNoVO storageCenterHeatNoInfo(StorageCenterQueryDTO queryDTO) {
+        StorageCenterHeatNoVO storageCenterHeatNoVO = new StorageCenterHeatNoVO();
+        if (queryDTO == null || queryDTO.getCurrentDate() == null) {
+            return storageCenterHeatNoVO; // 直接返回空对象,避免后续 NPE
+        }
+
+        // 查询 HeatsActuals 数据
+        LambdaQueryWrapper<HeatsActuals> billQueryWrapper = new LambdaQueryWrapper<>();
+        billQueryWrapper.between(HeatsActuals::getCreateTime,
+                DateUtils.getStartOfDay(queryDTO.getCurrentDate()),
+                DateUtils.getEndOfDay(queryDTO.getCurrentDate()))
+                .orderByDesc(HeatsActuals::getCreateTime); // 按 createTime 降序排列;
+
+        List<HeatsActuals> heatsActuals = heatsActualsService.list(billQueryWrapper);
+        if (oConvertUtils.listIsEmpty(heatsActuals)) {
+            return storageCenterHeatNoVO;
+        }
+
+        // 提取 heatNo 集合
+        List<String> heatNoList = heatsActuals.stream()
+                .map(HeatsActuals::getHeatsCode)
+                .filter(Objects::nonNull) // 避免空值
+                .collect(Collectors.toList());
+
+        storageCenterHeatNoVO.setHeatNoTotalNum(heatNoList.size());
+
+        // 查询 BilletBasicInfo 数据
+        LambdaQueryWrapper<BilletBasicInfo> basicInfoQueryWrapper = new LambdaQueryWrapper<>();
+        basicInfoQueryWrapper.in(BilletBasicInfo::getHeatNo, heatNoList);
+
+        List<BilletBasicInfo> list = billetBasicInfoService.list(basicInfoQueryWrapper);
+        if (oConvertUtils.listIsEmpty(list)) {
+            return storageCenterHeatNoVO;
+        }
+
+        // 计算总重量 & 总条数
+        BigDecimal totalBlankOutput = list.stream()
+                .map(BilletBasicInfo::getBilletWeight)
+                .filter(Objects::nonNull)
+                .map(BigDecimal::valueOf)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        storageCenterHeatNoVO.setAmountTotal(list.size());
+        storageCenterHeatNoVO.setTotalWeight(totalBlankOutput);
+
+        // 按照 getLength 分组
+        Map<Integer, List<BilletBasicInfo>> groupedByLength = list.stream()
+                .filter(b -> b.getLength() != null) // 先过滤掉 null,防止 NPE
+                .collect(Collectors.groupingBy(BilletBasicInfo::getLength));
+
+        List<StorageCenterHeatNoVO.SizeDetail> sizeDetails = groupedByLength.entrySet().stream()
+                .map(entry -> {
+                    Integer length = entry.getKey();
+                    List<BilletBasicInfo> billets = entry.getValue();
+
+                    // 计算 weight 总和
+                    BigDecimal totalWeight = billets.stream()
+                            .map(BilletBasicInfo::getBilletWeight)
+                            .filter(Objects::nonNull)
+                            .map(BigDecimal::valueOf)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    // 创建 SizeDetail
+                    StorageCenterHeatNoVO.SizeDetail sizeDetail = new StorageCenterHeatNoVO.SizeDetail();
+                    sizeDetail.setSize(length);
+                    sizeDetail.setSizeWeight(totalWeight);
+                    sizeDetail.setSizeAmount(billets.size());
+
+                    return sizeDetail;
+                })
+                .collect(Collectors.toList());
+
+        storageCenterHeatNoVO.setSizeDetails(sizeDetails);
+
+        // 按照 heatNo 分组
+        Map<String, List<BilletBasicInfo>> groupedByHeatNo = list.stream()
+                .filter(b -> b.getHeatNo() != null) // 先过滤掉 null
+                .collect(Collectors.groupingBy(BilletBasicInfo::getHeatNo));
+
+        List<StorageCenterHeatNoVO.HeatNoDetail> heatNoDetails = groupedByHeatNo.entrySet().stream()
+                .map(entry -> {
+                    String heatNo = entry.getKey();
+                    List<BilletBasicInfo> billets = entry.getValue();
+
+                    Integer ccmNo = Optional.ofNullable(billets.get(0).getCcmNo()).orElse(0);
+
+                    // 计算 weight 总和
+                    BigDecimal totalWeight = billets.stream()
+                            .map(BilletBasicInfo::getBilletWeight)
+                            .filter(Objects::nonNull)
+                            .map(BigDecimal::valueOf)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    // 创建 HeatNoDetail
+                    StorageCenterHeatNoVO.HeatNoDetail heatNoDetail = new StorageCenterHeatNoVO.HeatNoDetail();
+                    heatNoDetail.setHeatNo(heatNo);
+                    heatNoDetail.setCcmNo(ccmNo);
+                    heatNoDetail.setHeatNoWeight(totalWeight);
+                    heatNoDetail.setHeatNoAmount(billets.size());
+
+                    return heatNoDetail;
+                })
+                .collect(Collectors.toList());
+
+        storageCenterHeatNoVO.setHeatNoDetails(heatNoDetails);
+
+        return storageCenterHeatNoVO;
+    }
+
+
+    @Override
+    public StorageCenterHeatNoDetailVO storageCenterByHeatNo(String heatNo) {
+
+        StorageCenterHeatNoDetailVO storageCenterHeatNoDetailVO = new StorageCenterHeatNoDetailVO();
+
+        StorageCenterHeatNoDetailVO.RollOneHeatNo rollOneHeatNo = new StorageCenterHeatNoDetailVO.RollOneHeatNo();
+        StorageCenterHeatNoDetailVO.RollTwoHeatNo rollTwoHeatNo = new StorageCenterHeatNoDetailVO.RollTwoHeatNo();
+        StorageCenterHeatNoDetailVO.RollThreeHeatNo rollThreeHeatNo = new StorageCenterHeatNoDetailVO.RollThreeHeatNo();
+        StorageCenterHeatNoDetailVO.RollHeightHeatNo rollHeightHeatNo = new StorageCenterHeatNoDetailVO.RollHeightHeatNo();
+        StorageCenterHeatNoDetailVO.RollOutHeatNo rollOutHeatNo = new StorageCenterHeatNoDetailVO.RollOutHeatNo();
+        StorageCenterHeatNoDetailVO.StackHeatNo stackHeatNo = new StorageCenterHeatNoDetailVO.StackHeatNo();
+        StorageCenterHeatNoDetailVO.UnknownHeatNo unknownHeatNo = new StorageCenterHeatNoDetailVO.UnknownHeatNo();
+
+
+        // 查询 BilletBasicInfo 数据
+        LambdaQueryWrapper<BilletBasicInfo> basicInfoQueryWrapper = new LambdaQueryWrapper<>();
+        basicInfoQueryWrapper.eq(BilletBasicInfo::getHeatNo, heatNo);
+
+        List<BilletBasicInfo> list = billetBasicInfoService.list(basicInfoQueryWrapper);
+        if (oConvertUtils.listIsEmpty(list)) {
+            return storageCenterHeatNoDetailVO;
+        }
+
+
+        // 按照 belongTable 分组
+        Map<String, List<BilletBasicInfo>> groupedByBelongTable = list.stream()
+                .collect(Collectors.groupingBy(
+                        b -> Optional.ofNullable(b.getBelongTable()).orElse("unknown") // 处理 null 值
+                ));
+
+
+        if (groupedByBelongTable.containsKey("roll_club_one")) {
+
+            List<BilletBasicInfo> billetBasicInfos = groupedByBelongTable.get("roll_club_one");
+
+            // 计算总重量 & 总条数
+            BigDecimal totalBlankOutput = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getBilletWeight)
+                    .filter(Objects::nonNull)
+                    .map(BigDecimal::valueOf)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            rollOneHeatNo.setTotalAmount(billetBasicInfos.size());
+            rollOneHeatNo.setTotalWeight(totalBlankOutput);
+
+          // 按照 getLength 分组
+            Map<Integer, List<BilletBasicInfo>> groupedByLength = billetBasicInfos.stream()
+                    .filter(b -> b.getLength() != null) // 先过滤掉 null,防止 NPE
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getLength));
+
+         // 一次遍历,构造 sizeDetailsList 和 rollSendDetailList
+            List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetailsList = new ArrayList<>();
+            List<StorageCenterHeatNoDetailVO.RollSendDetail> rollSendDetailList = new ArrayList<>();
+
+            groupedByLength.forEach((length, billets) -> {
+                // 计算 weight 总和
+                BigDecimal totalWeight = billets.stream()
+                        .map(BilletBasicInfo::getBilletWeight)
+                        .filter(Objects::nonNull)
+                        .map(BigDecimal::valueOf)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                int count = billets.size(); // 计算数据条数
+                // 取第一个 spec 值
+                String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown");
+
+                // 创建 SizeDetail
+                StorageCenterHeatNoDetailVO.SizeDetail sizeDetail = new StorageCenterHeatNoDetailVO.SizeDetail();
+                sizeDetail.setSize(length);
+                sizeDetail.setSizeWeight(totalWeight);
+                sizeDetail.setSizeAmount(count);
+                sizeDetailsList.add(sizeDetail);
+
+                // 创建 RollSendDetail
+                StorageCenterHeatNoDetailVO.RollSendDetail rollSendDetail = new StorageCenterHeatNoDetailVO.RollSendDetail();
+                rollSendDetail.setSize(length);
+                rollSendDetail.setWeight(totalWeight);
+                rollSendDetail.setAmount(count);
+                rollSendDetail.setSpec(spec);
+                rollSendDetailList.add(rollSendDetail);
+            });
+
+            // 赋值给 rollOneHeatNo
+            rollOneHeatNo.setSizeDetails(sizeDetailsList);
+            rollOneHeatNo.setRollSendDetails(rollSendDetailList);
+
+            storageCenterHeatNoDetailVO.setRollClubOneDetails(rollOneHeatNo);
+
+        }
+
+        if (groupedByBelongTable.containsKey("roll_height")) {
+
+            List<BilletBasicInfo> billetBasicInfos = groupedByBelongTable.get("roll_height");
+
+            // 计算总重量 & 总条数
+            BigDecimal totalBlankOutput = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getBilletWeight)
+                    .filter(Objects::nonNull)
+                    .map(BigDecimal::valueOf)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            rollHeightHeatNo.setTotalAmount(billetBasicInfos.size());
+            rollHeightHeatNo.setTotalWeight(totalBlankOutput);
+
+            // 按照 getLength 分组
+            Map<Integer, List<BilletBasicInfo>> groupedByLength = billetBasicInfos.stream()
+                    .filter(b -> b.getLength() != null) // 先过滤掉 null,防止 NPE
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getLength));
+
+            // 一次遍历,构造 sizeDetailsList 和 rollSendDetailList
+            List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetailsList = new ArrayList<>();
+            List<StorageCenterHeatNoDetailVO.RollSendDetail> rollSendDetailList = new ArrayList<>();
+
+            groupedByLength.forEach((length, billets) -> {
+                // 计算 weight 总和
+                BigDecimal totalWeight = billets.stream()
+                        .map(BilletBasicInfo::getBilletWeight)
+                        .filter(Objects::nonNull)
+                        .map(BigDecimal::valueOf)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                int count = billets.size(); // 计算数据条数
+                // 取第一个 spec 值
+                String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown");
+
+                // 创建 SizeDetail
+                StorageCenterHeatNoDetailVO.SizeDetail sizeDetail = new StorageCenterHeatNoDetailVO.SizeDetail();
+                sizeDetail.setSize(length);
+                sizeDetail.setSizeWeight(totalWeight);
+                sizeDetail.setSizeAmount(count);
+                sizeDetailsList.add(sizeDetail);
+
+                // 创建 RollSendDetail
+                StorageCenterHeatNoDetailVO.RollSendDetail rollSendDetail = new StorageCenterHeatNoDetailVO.RollSendDetail();
+                rollSendDetail.setSize(length);
+                rollSendDetail.setWeight(totalWeight);
+                rollSendDetail.setAmount(count);
+                rollSendDetail.setSpec(spec);
+                rollSendDetailList.add(rollSendDetail);
+            });
+
+            // 赋值给 rollOneHeatNo
+            rollOneHeatNo.setSizeDetails(sizeDetailsList);
+            rollOneHeatNo.setRollSendDetails(rollSendDetailList);
+
+            storageCenterHeatNoDetailVO.setRollClubOneDetails(rollOneHeatNo);
+
+        }
+
+
+        if (groupedByBelongTable.containsKey("unknown")) {
+
+            List<BilletBasicInfo> billetBasicInfos = groupedByBelongTable.get("unknown");
+
+            // 计算总重量 & 总条数
+            BigDecimal totalBlankOutput = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getBilletWeight)
+                    .filter(Objects::nonNull)
+                    .map(BigDecimal::valueOf)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            unknownHeatNo.setTotalAmount(billetBasicInfos.size());
+            unknownHeatNo.setTotalWeight(totalBlankOutput);
+
+            // 按照 getLength 分组
+            Map<Integer, List<BilletBasicInfo>> groupedByLength = billetBasicInfos.stream()
+                    .filter(b -> b.getLength() != null) // 先过滤掉 null,防止 NPE
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getLength));
+
+            // 一次遍历,构造 sizeDetailsList 和 rollSendDetailList
+            List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetailsList = new ArrayList<>();
+            List<StorageCenterHeatNoDetailVO.RollSendDetail> rollSendDetailList = new ArrayList<>();
+
+            groupedByLength.forEach((length, billets) -> {
+                // 计算 weight 总和
+                BigDecimal totalWeight = billets.stream()
+                        .map(BilletBasicInfo::getBilletWeight)
+                        .filter(Objects::nonNull)
+                        .map(BigDecimal::valueOf)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                int count = billets.size(); // 计算数据条数
+                // 取第一个 spec 值
+                String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown");
+
+                // 创建 SizeDetail
+                StorageCenterHeatNoDetailVO.SizeDetail sizeDetail = new StorageCenterHeatNoDetailVO.SizeDetail();
+                sizeDetail.setSize(length);
+                sizeDetail.setSizeWeight(totalWeight);
+                sizeDetail.setSizeAmount(count);
+                sizeDetailsList.add(sizeDetail);
+
+                // 创建 RollSendDetail
+                StorageCenterHeatNoDetailVO.RollSendDetail rollSendDetail = new StorageCenterHeatNoDetailVO.RollSendDetail();
+                rollSendDetail.setSize(length);
+                rollSendDetail.setWeight(totalWeight);
+                rollSendDetail.setAmount(count);
+                rollSendDetail.setSpec(spec);
+                rollSendDetailList.add(rollSendDetail);
+            });
+
+            // 赋值给 unknownHeatNo
+            unknownHeatNo.setSizeDetails(sizeDetailsList);
+            unknownHeatNo.setRollSendDetails(rollSendDetailList);
+
+            storageCenterHeatNoDetailVO.setUnknownDetails(unknownHeatNo);
+
+        }
+
+
+        if (groupedByBelongTable.containsKey("roll_club_two")) {
+
+            List<BilletBasicInfo> billetBasicInfos = groupedByBelongTable.get("roll_club_two");
+
+            // 计算总重量 & 总条数
+            BigDecimal totalBlankOutput = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getBilletWeight)
+                    .filter(Objects::nonNull)
+                    .map(BigDecimal::valueOf)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            rollTwoHeatNo.setTotalAmount(billetBasicInfos.size());
+            rollTwoHeatNo.setTotalWeight(totalBlankOutput);
+
+            // 批量查询 StorageBill,避免 for 循环里重复查询
+            Set<String> assemblyNumbers = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getAssemblyNumber)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+
+            // 只查询这些组坯号的 StorageBill
+            Map<String, StorageBill> storageBillMap = new HashMap<>();
+
+            // 遍历所有组坯号,使用 `like` 添加查询条件
+            if (!assemblyNumbers.isEmpty()) {
+                LambdaQueryWrapper<StorageBill> billQueryWrapper = new LambdaQueryWrapper<>();
+                billQueryWrapper.and(wrapper -> {
+                    for (String assemblyNumber : assemblyNumbers) {
+                        wrapper.or().like(StorageBill::getAssemblyNumber, assemblyNumber);
+                    }
+                });
+
+                List<StorageBill> storageBillList = storageBillMapper.selectList(billQueryWrapper);
+
+                storageBillMap = storageBillList.stream()
+                        .collect(Collectors.toMap(StorageBill::getAssemblyNumber, Function.identity(), (a, b) -> a));
+            }
+
+            // 按 getLength 分组
+            Map<Integer, List<BilletBasicInfo>> groupedByLength = billetBasicInfos.stream()
+                    .filter(b -> b.getLength() != null)
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getLength));
+
+            List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetailsList = groupedByLength.entrySet().stream()
+                    .map(entry -> {
+                        Integer length = entry.getKey();
+                        List<BilletBasicInfo> billets = entry.getValue();
+
+                        // 计算 weight 总和
+                        BigDecimal totalWeight = billets.stream()
+                                .map(BilletBasicInfo::getBilletWeight)
+                                .filter(Objects::nonNull)
+                                .map(BigDecimal::valueOf)
+                                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                        StorageCenterHeatNoDetailVO.SizeDetail sizeDetail = new StorageCenterHeatNoDetailVO.SizeDetail();
+                        sizeDetail.setSize(length);
+                        sizeDetail.setSizeWeight(totalWeight);
+                        sizeDetail.setSizeAmount(billets.size());
+
+                        return sizeDetail;
+                    })
+                    .collect(Collectors.toList());
+
+            rollTwoHeatNo.setSizeDetails(sizeDetailsList);
+
+            // 按 组坯号 (assemblyNumber) 分组
+            Map<String, List<BilletBasicInfo>> groupedByAssemblyNumber = billetBasicInfos.stream()
+                    .filter(b -> b.getAssemblyNumber() != null)
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getAssemblyNumber));
+
+            List<StorageCenterHeatNoDetailVO.RollChargeDetail> rollChargeDetails = new ArrayList<>();
+
+            for (Map.Entry<String, List<BilletBasicInfo>> entry : groupedByAssemblyNumber.entrySet()) {
+                String assemblyNumber = entry.getKey();
+                List<BilletBasicInfo> billets = entry.getValue();
+
+                if (billets == null || billets.isEmpty()) {
+                    continue;
+                }
+
+                Integer size = Optional.ofNullable(billets.get(0).getLength()).orElse(0);
+                String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown");
+
+                // 计算 weight 总和
+                BigDecimal totalWeight = billets.stream()
+                        .map(BilletBasicInfo::getBilletWeight)
+                        .filter(Objects::nonNull)
+                        .map(BigDecimal::valueOf)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                // 直接从 Map 获取 StorageBill 信息,避免多次查询数据库
+                String licensePlate = storageBillMap.entrySet().stream()
+                        .filter(entryPlate -> Arrays.asList(entryPlate.getKey().split(",")).contains(assemblyNumber))
+                        .map(entryPlate -> entryPlate.getValue().getLicensePlate())
+                        .findFirst()
+                        .orElse("未知车牌");
+
+                StorageCenterHeatNoDetailVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoDetailVO.RollChargeDetail();
+                rollChargeDetail.setSize(size);
+                rollChargeDetail.setSpec(spec);
+                rollChargeDetail.setWeight(totalWeight);
+                rollChargeDetail.setAmount(billets.size());
+                rollChargeDetail.setLicensePlate(licensePlate);
+
+                rollChargeDetails.add(rollChargeDetail);
+            }
+
+            // 按 licensePlate 分组并累加 amount 和 weight
+            Map<String, StorageCenterHeatNoDetailVO.RollChargeDetail> groupedByLicensePlate = rollChargeDetails.stream()
+                    .collect(Collectors.toMap(
+                            StorageCenterHeatNoDetailVO.RollChargeDetail::getLicensePlate,
+                            detail -> {
+                                StorageCenterHeatNoDetailVO.RollChargeDetail newDetail = new StorageCenterHeatNoDetailVO.RollChargeDetail();
+                                newDetail.setSize(detail.getSize());  // 这里可以选择合适的 size 逻辑
+                                newDetail.setSpec(detail.getSpec());
+                                newDetail.setWeight(detail.getWeight());
+                                newDetail.setAmount(detail.getAmount());
+                                newDetail.setLicensePlate(detail.getLicensePlate());
+                                return newDetail;
+                            },
+                            (existing, newDetail) -> {
+                                existing.setAmount(existing.getAmount() + newDetail.getAmount());
+                                existing.setWeight(existing.getWeight().add(newDetail.getWeight())); // BigDecimal 累加
+                                return existing;
+                            }
+                    ));
+
+            // 转换为 List 并赋值
+            List<StorageCenterHeatNoDetailVO.RollChargeDetail> mergedRollChargeDetails = new ArrayList<>(groupedByLicensePlate.values());
+
+            rollTwoHeatNo.setRollChargeDetails(mergedRollChargeDetails);
+            rollTwoHeatNo.setSizeDetails(sizeDetailsList);
+            storageCenterHeatNoDetailVO.setRollClubTwoDetails(rollTwoHeatNo);
+        }
+
+
+        if (groupedByBelongTable.containsKey("roll_club_three")) {
+
+            List<BilletBasicInfo> billetBasicInfos = groupedByBelongTable.get("roll_club_three");
+
+            // 计算总重量 & 总条数
+            BigDecimal totalBlankOutput = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getBilletWeight)
+                    .filter(Objects::nonNull)
+                    .map(BigDecimal::valueOf)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            rollThreeHeatNo.setTotalAmount(billetBasicInfos.size());
+            rollThreeHeatNo.setTotalWeight(totalBlankOutput);
+
+            // 批量查询 StorageBill,避免 for 循环里重复查询
+            Set<String> assemblyNumbers = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getAssemblyNumber)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+
+            // 只查询这些组坯号的 StorageBill
+            Map<String, StorageBill> storageBillMap = new HashMap<>();
+
+            // 遍历所有组坯号,使用 `like` 添加查询条件
+            if (!assemblyNumbers.isEmpty()) {
+                LambdaQueryWrapper<StorageBill> billQueryWrapper = new LambdaQueryWrapper<>();
+                billQueryWrapper.and(wrapper -> {
+                    for (String assemblyNumber : assemblyNumbers) {
+                        wrapper.or().like(StorageBill::getAssemblyNumber, assemblyNumber);
+                    }
+                });
+
+                List<StorageBill> storageBillList = storageBillMapper.selectList(billQueryWrapper);
+
+                storageBillMap = storageBillList.stream()
+                        .collect(Collectors.toMap(StorageBill::getAssemblyNumber, Function.identity(), (a, b) -> a));
+            }
+
+            // 按 getLength 分组
+            Map<Integer, List<BilletBasicInfo>> groupedByLength = billetBasicInfos.stream()
+                    .filter(b -> b.getLength() != null)
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getLength));
+
+            List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetailsList = groupedByLength.entrySet().stream()
+                    .map(entry -> {
+                        Integer length = entry.getKey();
+                        List<BilletBasicInfo> billets = entry.getValue();
+
+                        // 计算 weight 总和
+                        BigDecimal totalWeight = billets.stream()
+                                .map(BilletBasicInfo::getBilletWeight)
+                                .filter(Objects::nonNull)
+                                .map(BigDecimal::valueOf)
+                                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                        StorageCenterHeatNoDetailVO.SizeDetail sizeDetail = new StorageCenterHeatNoDetailVO.SizeDetail();
+                        sizeDetail.setSize(length);
+                        sizeDetail.setSizeWeight(totalWeight);
+                        sizeDetail.setSizeAmount(billets.size());
+
+                        return sizeDetail;
+                    })
+                    .collect(Collectors.toList());
+
+            rollThreeHeatNo.setSizeDetails(sizeDetailsList);
+
+            // 按 组坯号 (assemblyNumber) 分组
+            Map<String, List<BilletBasicInfo>> groupedByAssemblyNumber = billetBasicInfos.stream()
+                    .filter(b -> b.getAssemblyNumber() != null)
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getAssemblyNumber));
+
+            List<StorageCenterHeatNoDetailVO.RollChargeDetail> rollChargeDetails = new ArrayList<>();
+
+            for (Map.Entry<String, List<BilletBasicInfo>> entry : groupedByAssemblyNumber.entrySet()) {
+                String assemblyNumber = entry.getKey();
+                List<BilletBasicInfo> billets = entry.getValue();
+
+                if (billets == null || billets.isEmpty()) {
+                    continue;
+                }
+
+                Integer size = Optional.ofNullable(billets.get(0).getLength()).orElse(0);
+                String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown");
+
+                // 计算 weight 总和
+                BigDecimal totalWeight = billets.stream()
+                        .map(BilletBasicInfo::getBilletWeight)
+                        .filter(Objects::nonNull)
+                        .map(BigDecimal::valueOf)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                // 直接从 Map 获取 StorageBill 信息,避免多次查询数据库
+                String licensePlate = storageBillMap.entrySet().stream()
+                        .filter(entryPlate -> Arrays.asList(entryPlate.getKey().split(",")).contains(assemblyNumber))
+                        .map(entryPlate -> entryPlate.getValue().getLicensePlate())
+                        .findFirst()
+                        .orElse("未知车牌");
+
+                StorageCenterHeatNoDetailVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoDetailVO.RollChargeDetail();
+                rollChargeDetail.setSize(size);
+                rollChargeDetail.setSpec(spec);
+                rollChargeDetail.setWeight(totalWeight);
+                rollChargeDetail.setAmount(billets.size());
+                rollChargeDetail.setLicensePlate(licensePlate);
+
+                rollChargeDetails.add(rollChargeDetail);
+            }
+
+            // 按 licensePlate 分组并累加 amount 和 weight
+            Map<String, StorageCenterHeatNoDetailVO.RollChargeDetail> groupedByLicensePlate = rollChargeDetails.stream()
+                    .collect(Collectors.toMap(
+                            StorageCenterHeatNoDetailVO.RollChargeDetail::getLicensePlate,
+                            detail -> {
+                                StorageCenterHeatNoDetailVO.RollChargeDetail newDetail = new StorageCenterHeatNoDetailVO.RollChargeDetail();
+                                newDetail.setSize(detail.getSize());  // 这里可以选择合适的 size 逻辑
+                                newDetail.setSpec(detail.getSpec());
+                                newDetail.setWeight(detail.getWeight());
+                                newDetail.setAmount(detail.getAmount());
+                                newDetail.setLicensePlate(detail.getLicensePlate());
+                                return newDetail;
+                            },
+                            (existing, newDetail) -> {
+                                existing.setAmount(existing.getAmount() + newDetail.getAmount());
+                                existing.setWeight(existing.getWeight().add(newDetail.getWeight())); // BigDecimal 累加
+                                return existing;
+                            }
+                    ));
+
+            // 转换为 List 并赋值
+            List<StorageCenterHeatNoDetailVO.RollChargeDetail> mergedRollChargeDetails = new ArrayList<>(groupedByLicensePlate.values());
+
+            rollThreeHeatNo.setRollChargeDetails(mergedRollChargeDetails);
+            rollThreeHeatNo.setSizeDetails(sizeDetailsList);
+            storageCenterHeatNoDetailVO.setRollClubThreeDetails(rollThreeHeatNo);
+        }
+
+
+        if (groupedByBelongTable.containsKey("roll_out_shipp")) {
+
+            List<BilletBasicInfo> billetBasicInfos = groupedByBelongTable.get("roll_out_shipp");
+
+            // 计算总重量 & 总条数
+            BigDecimal totalBlankOutput = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getBilletWeight)
+                    .filter(Objects::nonNull)
+                    .map(BigDecimal::valueOf)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            rollOutHeatNo.setTotalAmount(billetBasicInfos.size());
+            rollOutHeatNo.setTotalWeight(totalBlankOutput);
+
+            // 批量查询 StorageBill,避免 for 循环里重复查询
+            Set<String> assemblyNumbers = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getAssemblyNumber)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+
+            // 只查询这些组坯号的 StorageBill
+            Map<String, StorageBill> storageBillMap = new HashMap<>();
+
+            // 遍历所有组坯号,使用 `like` 添加查询条件
+            if (!assemblyNumbers.isEmpty()) {
+                LambdaQueryWrapper<StorageBill> billQueryWrapper = new LambdaQueryWrapper<>();
+                billQueryWrapper.and(wrapper -> {
+                    for (String assemblyNumber : assemblyNumbers) {
+                        wrapper.or().like(StorageBill::getAssemblyNumber, assemblyNumber);
+                    }
+                });
+
+                List<StorageBill> storageBillList = storageBillMapper.selectList(billQueryWrapper);
+
+                storageBillMap = storageBillList.stream()
+                        .collect(Collectors.toMap(StorageBill::getAssemblyNumber, Function.identity(), (a, b) -> a));
+            }
+
+            // 按 getLength 分组
+            Map<Integer, List<BilletBasicInfo>> groupedByLength = billetBasicInfos.stream()
+                    .filter(b -> b.getLength() != null)
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getLength));
+
+            List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetailsList = groupedByLength.entrySet().stream()
+                    .map(entry -> {
+                        Integer length = entry.getKey();
+                        List<BilletBasicInfo> billets = entry.getValue();
+
+                        // 计算 weight 总和
+                        BigDecimal totalWeight = billets.stream()
+                                .map(BilletBasicInfo::getBilletWeight)
+                                .filter(Objects::nonNull)
+                                .map(BigDecimal::valueOf)
+                                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                        StorageCenterHeatNoDetailVO.SizeDetail sizeDetail = new StorageCenterHeatNoDetailVO.SizeDetail();
+                        sizeDetail.setSize(length);
+                        sizeDetail.setSizeWeight(totalWeight);
+                        sizeDetail.setSizeAmount(billets.size());
+
+                        return sizeDetail;
+                    })
+                    .collect(Collectors.toList());
+
+            rollOutHeatNo.setSizeDetails(sizeDetailsList);
+
+            // 按 组坯号 (assemblyNumber) 分组
+            Map<String, List<BilletBasicInfo>> groupedByAssemblyNumber = billetBasicInfos.stream()
+                    .filter(b -> b.getAssemblyNumber() != null)
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getAssemblyNumber));
+
+            List<StorageCenterHeatNoDetailVO.RollChargeDetail> rollChargeDetails = new ArrayList<>();
+
+            for (Map.Entry<String, List<BilletBasicInfo>> entry : groupedByAssemblyNumber.entrySet()) {
+                String assemblyNumber = entry.getKey();
+                List<BilletBasicInfo> billets = entry.getValue();
+
+                if (billets == null || billets.isEmpty()) {
+                    continue;
+                }
+
+                Integer size = Optional.ofNullable(billets.get(0).getLength()).orElse(0);
+                String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown");
+
+                // 计算 weight 总和
+                BigDecimal totalWeight = billets.stream()
+                        .map(BilletBasicInfo::getBilletWeight)
+                        .filter(Objects::nonNull)
+                        .map(BigDecimal::valueOf)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                // 直接从 Map 获取 StorageBill 信息,避免多次查询数据库
+                String licensePlate = storageBillMap.entrySet().stream()
+                        .filter(entryPlate -> Arrays.asList(entryPlate.getKey().split(",")).contains(assemblyNumber))
+                        .map(entryPlate -> entryPlate.getValue().getLicensePlate())
+                        .findFirst()
+                        .orElse("未知车牌");
+
+                StorageCenterHeatNoDetailVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoDetailVO.RollChargeDetail();
+                rollChargeDetail.setSize(size);
+                rollChargeDetail.setSpec(spec);
+                rollChargeDetail.setWeight(totalWeight);
+                rollChargeDetail.setAmount(billets.size());
+                rollChargeDetail.setLicensePlate(licensePlate);
+
+                rollChargeDetails.add(rollChargeDetail);
+            }
+
+            // 按 licensePlate 分组并累加 amount 和 weight
+            Map<String, StorageCenterHeatNoDetailVO.RollChargeDetail> groupedByLicensePlate = rollChargeDetails.stream()
+                    .collect(Collectors.toMap(
+                            StorageCenterHeatNoDetailVO.RollChargeDetail::getLicensePlate,
+                            detail -> {
+                                StorageCenterHeatNoDetailVO.RollChargeDetail newDetail = new StorageCenterHeatNoDetailVO.RollChargeDetail();
+                                newDetail.setSize(detail.getSize());  // 这里可以选择合适的 size 逻辑
+                                newDetail.setSpec(detail.getSpec());
+                                newDetail.setWeight(detail.getWeight());
+                                newDetail.setAmount(detail.getAmount());
+                                newDetail.setLicensePlate(detail.getLicensePlate());
+                                return newDetail;
+                            },
+                            (existing, newDetail) -> {
+                                existing.setAmount(existing.getAmount() + newDetail.getAmount());
+                                existing.setWeight(existing.getWeight().add(newDetail.getWeight())); // BigDecimal 累加
+                                return existing;
+                            }
+                    ));
+
+            // 转换为 List 并赋值
+            List<StorageCenterHeatNoDetailVO.RollChargeDetail> mergedRollChargeDetails = new ArrayList<>(groupedByLicensePlate.values());
+
+            rollOutHeatNo.setRollChargeDetails(mergedRollChargeDetails);
+            rollOutHeatNo.setSizeDetails(sizeDetailsList);
+            storageCenterHeatNoDetailVO.setRollOutShippDetails(rollOutHeatNo);
+        }
+
+        if (groupedByBelongTable.containsKey("stacking_and_loading_vehicles")) {
+
+            List<BilletBasicInfo> billetBasicInfos = groupedByBelongTable.get("stacking_and_loading_vehicles");
+
+            // 计算总重量 & 总条数
+            BigDecimal totalBlankOutput = billetBasicInfos.stream()
+                    .map(BilletBasicInfo::getBilletWeight)
+                    .filter(Objects::nonNull)
+                    .map(BigDecimal::valueOf)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            stackHeatNo.setTotalAmount(billetBasicInfos.size());
+            stackHeatNo.setTotalWeight(totalBlankOutput);
+
+            // 按照 getLength 分组
+            Map<Integer, List<BilletBasicInfo>> groupedByLength = billetBasicInfos.stream()
+                    .filter(b -> b.getLength() != null) // 先过滤掉 null,防止 NPE
+                    .collect(Collectors.groupingBy(BilletBasicInfo::getLength));
+
+            List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetailsList = groupedByLength.entrySet().stream()
+                    .map(entry -> {
+                        Integer length = entry.getKey();
+                        List<BilletBasicInfo> billets = entry.getValue();
+
+                        // 计算 weight 总和
+                        BigDecimal totalWeight = billets.stream()
+                                .map(BilletBasicInfo::getBilletWeight)
+                                .filter(Objects::nonNull)
+                                .map(BigDecimal::valueOf)
+                                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                        // 创建 SizeDetail
+                        StorageCenterHeatNoDetailVO.SizeDetail sizeDetail = new StorageCenterHeatNoDetailVO.SizeDetail();
+                        sizeDetail.setSize(length);
+                        sizeDetail.setSizeWeight(totalWeight);
+                        sizeDetail.setSizeAmount(billets.size());
+
+                        return sizeDetail;
+                    })
+                    .collect(Collectors.toList());
+
+            stackHeatNo.setSizeDetails(sizeDetailsList);
+
+
+            Map<String, List<BilletBasicInfo>> groupedByHeatNoAndBilletNo = billetBasicInfos.stream()
+                    .filter(b -> b.getHeatNo() != null && b.getBilletNo() != null) // 先过滤掉 null,防止 NPE
+                    .collect(Collectors.groupingBy(b -> b.getHeatNo() + "_" + b.getBilletNo()));
+
+
+            List<StorageCenterHeatNoDetailVO.StackingVehiclesDetail> stackingVehiclesDetails = new ArrayList<>();
+
+            for (Map.Entry<String, List<BilletBasicInfo>> entry : groupedByHeatNoAndBilletNo.entrySet()) {
+                String key = entry.getKey();  // 获取拼接的 key
+                String[] parts = key.split("_", 2); // 以 "_" 分割 key,限制最多分割 2 部分
+                String splitHeatNo = parts.length > 0 ? parts[0] : "Unknown";   // 获取 HeatNo
+                String billetNo = parts.length > 1 ? parts[1] : "Unknown"; // 获取 BilletNo
+
+                List<BilletBasicInfo> billets = entry.getValue();
+                if (billets == null || billets.isEmpty()) {
+                    continue; // 避免空数据
+                }
+
+                LambdaQueryWrapper<StackingAndLoadingVehicles> stackingLambdaQueryWrapper = new LambdaQueryWrapper<>();
+
+                stackingLambdaQueryWrapper
+                        .like(StackingAndLoadingVehicles::getHeatNo, splitHeatNo)  // heatNo 模糊匹配
+                        .like(StackingAndLoadingVehicles::getBilletNos, billetNo); // billetNos 模糊匹配
+
+                List<StackingAndLoadingVehicles> stackingAndLoadingVehicles = stackingAndLoadingVehiclesMapper.selectList(stackingLambdaQueryWrapper);
+
+                // 默认值
+                String stackAddr = "未知";
+                String layer = "未知";
+                String address = "未知";
+                String size = "未知";
+
+                if (!stackingAndLoadingVehicles.isEmpty()) {
+                    stackAddr = stackingAndLoadingVehicles.get(0).getStackAddr();
+                    layer = stackingAndLoadingVehicles.get(0).getLayer();
+                    address = stackingAndLoadingVehicles.get(0).getAddress();
+                    size = stackingAndLoadingVehicles.get(0).getSize();
+                }
+
+//                Integer size = Optional.ofNullable(billets.get(0).getLength()).orElse(0); // 避免 NullPointerException
+                String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown"); // 避免 null 赋值
+
+                // 计算 weight 总和
+                BigDecimal totalWeight = billets.stream()
+                        .map(BilletBasicInfo::getBilletWeight)
+                        .filter(Objects::nonNull)
+                        .map(BigDecimal::valueOf)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                // 创建 RollChargeDetail
+                StorageCenterHeatNoDetailVO.StackingVehiclesDetail stackingVehiclesDetail = new StorageCenterHeatNoDetailVO.StackingVehiclesDetail();
+                stackingVehiclesDetail.setSize(size);
+                stackingVehiclesDetail.setSpec(spec);
+                stackingVehiclesDetail.setWeight(totalWeight);
+                stackingVehiclesDetail.setAmount(billets.size());
+                stackingVehiclesDetail.setStackAddr(stackAddr);
+                stackingVehiclesDetail.setLayer(layer);
+                stackingVehiclesDetail.setAddress(address);
+
+                stackingVehiclesDetails.add(stackingVehiclesDetail);
+
+            }
+
+            // 先对 stackDetails 进行分组
+            Map<String, StorageCenterHeatNoDetailVO.StackingVehiclesDetail> groupedStackDetails = stackingVehiclesDetails.stream()
+                    .collect(Collectors.toMap(
+                            // key: stackAddr + layer + address 作为分组依据
+                            detail -> detail.getStackAddr() + "_" + detail.getLayer() + "_" + detail.getAddress(),
+                            // value: 原始数据
+                            detail -> {
+                                StorageCenterHeatNoDetailVO.StackingVehiclesDetail newDetail = new StorageCenterHeatNoDetailVO.StackingVehiclesDetail();
+                                newDetail.setSize(detail.getSize());
+                                newDetail.setSpec(detail.getSpec());
+                                newDetail.setAmount(detail.getAmount());
+                                newDetail.setWeight(detail.getWeight());
+                                newDetail.setStackAddr(detail.getStackAddr());
+                                newDetail.setLayer(detail.getLayer());
+                                newDetail.setAddress(detail.getAddress());
+                                return newDetail;
+                            },
+                            // 合并逻辑:累加 amount 和 weight
+                            (existing, newDetail) -> {
+                                existing.setAmount(existing.getAmount() + newDetail.getAmount());
+                                existing.setWeight(existing.getWeight().add(newDetail.getWeight()));
+                                return existing;
+                            }
+                    ));
+
+            // 转换为 List,并按照 layer 和 address 进行排序
+            List<StorageCenterHeatNoDetailVO.StackingVehiclesDetail> mergedStackDetails = groupedStackDetails.values().stream()
+                    .sorted(Comparator.comparing(StorageCenterHeatNoDetailVO.StackingVehiclesDetail::getLayer)
+                            .thenComparing(StorageCenterHeatNoDetailVO.StackingVehiclesDetail::getAddress)) // 先按 layer,再按 address 排序
+                    .collect(Collectors.toList());// 转换为 List
+
+            // 更新 stackHeatNo
+            stackHeatNo.setStackDetails(mergedStackDetails);
+
+            stackHeatNo.setSizeDetails(sizeDetailsList);
+
+            storageCenterHeatNoDetailVO.setStackingVehicles(stackHeatNo);
+
+        }
+
+        return storageCenterHeatNoDetailVO;
+    }
+
 
     // 计算整数总和的方法
     private int calculateIntSum(List<DestinationStatisticsDetails> list) {
@@ -5510,11 +6408,14 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
                 .map(bill -> {
                     StorageCenterCarVO.RollDetail rollDetail = new StorageCenterCarVO.RollDetail();
                     rollDetail.setStorageBillId(bill.getId());
+                    rollDetail.setCcmNo(bill.getCcmNo());
+                    rollDetail.setCarAllNum(bill.getCarAllNum());
                     rollDetail.setRollAmount(bill.getAmountTotal());
                     rollDetail.setLicensePlate(bill.getLicensePlate());
                     rollDetail.setType("热装");
                     return rollDetail;
                 })
+                .sorted(Comparator.comparing(StorageCenterCarVO.RollDetail::getCarAllNum))
                 .collect(Collectors.toList());
     }
 }

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

@@ -43,6 +43,12 @@ public class StorageCenterCarVO {
         @ApiModelProperty(value = "装运单id")
         private String storageBillId;
 
+        @ApiModelProperty(value = "铸机号")
+        private String ccmNo;
+
+        @ApiModelProperty(value = "车次总序号")
+        private Integer carAllNum;
+
         @ApiModelProperty(value = "车牌号")
         private String licensePlate;
 

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

@@ -0,0 +1,226 @@
+package org.jeecg.modules.billet.storageBill.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class StorageCenterHeatNoDetailVO {
+
+
+    private RollOneHeatNo rollClubOneDetails;
+    private RollTwoHeatNo rollClubTwoDetails;
+    private RollThreeHeatNo rollClubThreeDetails;
+    private RollHeightHeatNo rollHeightDetails;
+    private RollOutHeatNo rollOutShippDetails;
+    private StackHeatNo stackingVehicles;
+    private UnknownHeatNo unknownDetails;
+
+    @Data
+    public static class RollOneHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoDetailVO.RollSendDetail> rollSendDetails;
+
+    }
+
+    @Data
+    public static class RollTwoHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoDetailVO.RollChargeDetail> rollChargeDetails;
+
+    }
+
+
+    @Data
+    public static class RollThreeHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoDetailVO.RollChargeDetail> rollChargeDetails;
+
+    }
+
+
+    @Data
+    public static class RollHeightHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoDetailVO.RollSendDetail> rollSendDetails;
+
+    }
+
+
+    @Data
+    public static class RollOutHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoDetailVO.RollChargeDetail> rollChargeDetails;
+
+    }
+
+
+    @Data
+    public static class StackHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoDetailVO.StackingVehiclesDetail> stackDetails;
+
+    }
+
+    @Data
+    public static class UnknownHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoDetailVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoDetailVO.RollSendDetail> rollSendDetails;
+
+    }
+
+
+    @Data
+    public static class RollSendDetail {
+
+        @ApiModelProperty(value = "定尺")
+        private Integer size;
+
+        @ApiModelProperty(value = "规格")
+        private String spec;
+
+        @ApiModelProperty(value = "支数")
+        private Integer amount;
+
+        @ApiModelProperty(value = "重量")
+        private BigDecimal weight;
+
+
+    }
+
+
+    @Data
+    public static class RollChargeDetail {
+
+        @ApiModelProperty(value = "定尺")
+        private Integer size;
+
+        @ApiModelProperty(value = "规格")
+        private String spec;
+
+        @ApiModelProperty(value = "支数")
+        private Integer amount;
+
+        @ApiModelProperty(value = "重量")
+        private BigDecimal weight;
+
+        @ApiModelProperty(value = "车牌号")
+        private String licensePlate;
+
+
+    }
+
+
+    @Data
+    public static class StackingVehiclesDetail {
+
+        @ApiModelProperty(value = "定尺")
+        private String size;
+
+        @ApiModelProperty(value = "规格")
+        private String spec;
+
+        @ApiModelProperty(value = "支数")
+        private Integer amount;
+
+        @ApiModelProperty(value = "重量")
+        private BigDecimal weight;
+
+        @ApiModelProperty(value = "堆位")
+        private String stackAddr;
+
+        @ApiModelProperty(value = "层")
+        private String layer;
+
+        @ApiModelProperty(value = "位置")
+        private String address;
+
+    }
+
+
+    @Data
+    public static class SizeDetail {
+
+        @ApiModelProperty(value = "当前定尺")
+        public Integer size;
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer sizeAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal sizeWeight;
+
+    }
+}

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

@@ -0,0 +1,59 @@
+package org.jeecg.modules.billet.storageBill.vo;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class StorageCenterHeatNoVO {
+
+    @ApiModelProperty(value = "炉号总数")
+    private Integer heatNoTotalNum;
+
+    @ApiModelProperty(value = "总支数")
+    private Integer amountTotal;
+
+    @ApiModelProperty(value = "总重量")
+    private BigDecimal totalWeight;
+
+    private List<StorageCenterHeatNoVO.SizeDetail> sizeDetails;
+
+    private List<StorageCenterHeatNoVO.HeatNoDetail> heatNoDetails;
+
+
+    @Data
+    public static class SizeDetail {
+
+        @ApiModelProperty(value = "当前定尺")
+        public Integer size;
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer sizeAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal sizeWeight;
+
+    }
+
+    @Data
+    public static class HeatNoDetail {
+
+        @ApiModelProperty(value = "铸机号")
+        private Integer ccmNo;
+
+        @ApiModelProperty(value = "当前炉号")
+        public String heatNo;
+
+        @ApiModelProperty(value = "当前炉号总支数")
+        private Integer heatNoAmount;
+
+        @ApiModelProperty(value = "当前炉号总重量")
+        private BigDecimal heatNoWeight;
+
+    }
+
+
+}