Forráskód Böngészése

新增储运中心菜单中分页显示炉号下的对应目的地具体的明细信息

lingpeng.li 1 hónapja
szülő
commit
24f974e974

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

@@ -1546,6 +1546,23 @@ public class StorageBillController extends JeecgController<StorageBill, IStorage
 		return Result.OK(storageCenterHeatNoDetailVO);
 	}
 
+
+	@ApiOperation(value = "储运中心根据炉号展示开票信息", notes = "储运中心根据炉号展示开票信息")
+	@GetMapping(value = "/storageCenterInvoicingInfo")
+	public Result<Page<StorageCenterInvoicingVO>> storageCenterInvoicingInfo(StorageCenterQueryDTO queryDTO) {
+
+		Page<StorageCenterInvoicingVO> storageCenterInvoicingVOPage = storageBillService.storageCenterInvoicingInfo(queryDTO);
+		return Result.OK(storageCenterInvoicingVOPage);
+	}
+
+	@ApiOperation(value = "根据炉号查询储运中心开票信息", notes = "根据炉号查询储运中心开票信息")
+	@GetMapping(value = "/storageCenterInvoicingByHeatNo")
+	public Result<StorageCenterHeatNoInvoicingVO> storageCenterInvoicingByHeatNo(@RequestParam(name="heatNo") String heatNo) {
+
+		StorageCenterHeatNoInvoicingVO storageCenterHeatNoInvoicingVO = storageBillService.storageCenterInvoicingByHeatNo(heatNo);
+		return Result.OK(storageCenterHeatNoInvoicingVO);
+	}
+
 	/**
 	 * 计算 本车车次
 	 * @param ccmNo

+ 27 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/dto/StorageCenterQueryDTO.java

@@ -1,12 +1,39 @@
 package org.jeecg.modules.billet.storageBill.dto;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 @Data
 public class StorageCenterQueryDTO {
 
+    /**
+     * 铸机号
+     */
+    private String ccmNo;
+
+    private String heatsCode;
+
     /**
      * 当前日期
      */
     private String currentDate;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date createTimeBegin;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date createTimeEnd;
+
+    @ApiModelProperty(value = "班组")
+    private String shiftGroup;
+
+    @ApiModelProperty(value = "班别")
+    private String shift;
+
+    private Integer pageNo;
+
+    private Integer pageSize;
 }

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

@@ -1,6 +1,7 @@
 package org.jeecg.modules.billet.storageBill.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfo;
 import org.jeecg.modules.billet.billetHotsend.entity.BilletHotsendDetailsVo;
@@ -89,7 +90,11 @@ public interface IStorageBillService extends IService<StorageBill> {
 
     StorageCenterHeatNoVO storageCenterHeatNoInfo(StorageCenterQueryDTO queryDTO);
 
+    Page<StorageCenterInvoicingVO> storageCenterInvoicingInfo(StorageCenterQueryDTO queryDTO);
+
     StorageCenterHeatNoDetailVO storageCenterByHeatNo(String heatNo);
 
+    StorageCenterHeatNoInvoicingVO storageCenterInvoicingByHeatNo(String heatNo);
+
 
 }

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

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Maps;
 import lombok.extern.slf4j.Slf4j;
@@ -143,7 +144,7 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
 
     @Autowired
     private IStackingUpLogService stackingUpLogService;
-    
+
     @Autowired
     private IHeatsActualsService heatsActualsService;
 
@@ -3882,6 +3883,8 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
                     List<BilletBasicInfo> billets = entry.getValue();
 
                     Integer ccmNo = Optional.ofNullable(billets.get(0).getCcmNo()).orElse(0);
+                    String shift = Optional.ofNullable(billets.get(0).getShift()).orElse("0");
+                    String shiftGroup = Optional.ofNullable(billets.get(0).getShiftGroup()).orElse("0");
 
                     // 计算 weight 总和
                     BigDecimal totalWeight = billets.stream()
@@ -3894,6 +3897,8 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
                     StorageCenterHeatNoVO.HeatNoDetail heatNoDetail = new StorageCenterHeatNoVO.HeatNoDetail();
                     heatNoDetail.setHeatNo(heatNo);
                     heatNoDetail.setCcmNo(ccmNo);
+                    heatNoDetail.setShift(shift);
+                    heatNoDetail.setShiftGroup(shiftGroup);
                     heatNoDetail.setHeatNoWeight(totalWeight);
                     heatNoDetail.setHeatNoAmount(billets.size());
 
@@ -3906,6 +3911,123 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
         return storageCenterHeatNoVO;
     }
 
+    @Override
+    public Page<StorageCenterInvoicingVO> storageCenterInvoicingInfo(StorageCenterQueryDTO queryDTO) {
+        int pageNo = Optional.ofNullable(queryDTO.getPageNo()).orElse(1);
+        int pageSize = Optional.ofNullable(queryDTO.getPageSize()).orElse(10);
+
+        // 分页查询 HeatsActuals
+        Page<HeatsActuals> heatsPage = new Page<>(pageNo, pageSize);
+        LambdaQueryWrapper<HeatsActuals> billQueryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(queryDTO.getCcmNo())) {
+            billQueryWrapper.eq(HeatsActuals::getCasterCode, queryDTO.getCcmNo());
+        }
+        if (StringUtils.isNotBlank(queryDTO.getHeatsCode())) {
+            billQueryWrapper.eq(HeatsActuals::getHeatsCode, queryDTO.getHeatsCode());
+        }
+        if (StringUtils.isNotBlank(queryDTO.getShift())) {
+            billQueryWrapper.eq(HeatsActuals::getShift, queryDTO.getShift());
+        }
+        if (StringUtils.isNotBlank(queryDTO.getShiftGroup())) {
+            billQueryWrapper.eq(HeatsActuals::getShiftGroup, queryDTO.getShiftGroup());
+        }
+        Date beginDate = queryDTO.getCreateTimeBegin();
+        Date endDate = queryDTO.getCreateTimeEnd();
+        if (beginDate != null) {
+            billQueryWrapper.ge(HeatsActuals::getCreateTime, DateUtils.getStartOfDayByDate(beginDate));
+        }
+        if (endDate != null) {
+            billQueryWrapper.le(HeatsActuals::getCreateTime, DateUtils.getEndOfDayByDate(endDate));
+        }
+        billQueryWrapper.orderByDesc(HeatsActuals::getCreateTime);
+
+        Page<HeatsActuals> pageResult = heatsActualsService.page(heatsPage, billQueryWrapper);
+        List<HeatsActuals> heatsActuals = pageResult.getRecords();
+        if (heatsActuals.isEmpty()) {
+            return new Page<>(pageNo, pageSize, 0);
+        }
+
+        // 提取 heatNo 集合
+        List<String> heatNoList = heatsActuals.stream()
+                .map(HeatsActuals::getHeatsCode)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        // 查询 BilletBasicInfo 数据
+        LambdaQueryWrapper<BilletBasicInfo> basicInfoQueryWrapper = new LambdaQueryWrapper<>();
+        basicInfoQueryWrapper.in(BilletBasicInfo::getHeatNo, heatNoList);
+        List<BilletBasicInfo> billetList = billetBasicInfoService.list(basicInfoQueryWrapper);
+
+        // heatNo 分组统计
+        Map<String, List<BilletBasicInfo>> groupedByHeatNo = billetList.stream()
+                .filter(b -> b.getHeatNo() != null)
+                .collect(Collectors.groupingBy(BilletBasicInfo::getHeatNo));
+
+        List<StorageCenterInvoicingVO> resultList = heatsActuals.stream()
+                .map(heat -> {
+                    String heatNo = heat.getHeatsCode();
+                    List<BilletBasicInfo> billets = groupedByHeatNo.getOrDefault(heatNo, Collections.emptyList());
+
+                    // 汇总重量
+                    BigDecimal totalWeight = billets.stream()
+                            .map(BilletBasicInfo::getBilletWeight)
+                            .filter(Objects::nonNull)
+                            .map(BigDecimal::valueOf)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    Integer ccmNo = Optional.ofNullable(heat.getCasterCode()).map(Integer::valueOf).orElse(0);
+
+                    StorageCenterInvoicingVO.HeatNoDetail heatNoDetail = new StorageCenterInvoicingVO.HeatNoDetail();
+
+                    StorageCenterHeatNoInvoicingVO storageCenterHeatNoInvoicingVO = storageCenterInvoicingByHeatNo(heatNo);
+
+                    BigDecimal sumWeight = BigDecimal.ZERO;
+                    int sumAmount = 0;
+
+                    if (storageCenterHeatNoInvoicingVO != null) {
+                        if (storageCenterHeatNoInvoicingVO.getRollClubOneDetails() != null) {
+                            sumWeight = sumWeight.add(Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollClubOneDetails().getTotalWeight()).orElse(BigDecimal.ZERO));
+                            sumAmount += Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollClubOneDetails().getTotalAmount()).orElse(0);
+                        }
+                        if (storageCenterHeatNoInvoicingVO.getRollClubTwoDetails() != null) {
+                            sumWeight = sumWeight.add(Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollClubTwoDetails().getTotalWeight()).orElse(BigDecimal.ZERO));
+                            sumAmount += Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollClubTwoDetails().getTotalAmount()).orElse(0);
+                        }
+                        if (storageCenterHeatNoInvoicingVO.getRollClubThreeDetails() != null) {
+                            sumWeight = sumWeight.add(Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollClubThreeDetails().getTotalWeight()).orElse(BigDecimal.ZERO));
+                            sumAmount += Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollClubThreeDetails().getTotalAmount()).orElse(0);
+                        }
+                        if (storageCenterHeatNoInvoicingVO.getRollHeightDetails() != null) {
+                            sumWeight = sumWeight.add(Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollHeightDetails().getTotalWeight()).orElse(BigDecimal.ZERO));
+                            sumAmount += Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollHeightDetails().getTotalAmount()).orElse(0);
+                        }
+                        if (storageCenterHeatNoInvoicingVO.getRollOutShippDetails() != null) {
+                            sumWeight = sumWeight.add(Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollOutShippDetails().getTotalWeight()).orElse(BigDecimal.ZERO));
+                            sumAmount += Optional.ofNullable(storageCenterHeatNoInvoicingVO.getRollOutShippDetails().getTotalAmount()).orElse(0);
+                        }
+                    }
+
+                    // 设置热号基础信息
+                    heatNoDetail.setHeatNo(heatNo);
+                    heatNoDetail.setCcmNo(ccmNo);
+                    heatNoDetail.setHeatNoWeight(sumWeight);
+                    heatNoDetail.setHeatNoAmount(sumAmount);
+
+                    StorageCenterInvoicingVO vo = new StorageCenterInvoicingVO();
+                    vo.setHeatNoDetails(Collections.singletonList(heatNoDetail));
+                    vo.setStorageCenterHeatNoInvoicing(storageCenterHeatNoInvoicingVO);
+                    return vo;
+                })
+                .collect(Collectors.toList());
+
+        Page<StorageCenterInvoicingVO> resultPage = new Page<>(pageNo, pageSize, pageResult.getTotal());
+        resultPage.setRecords(resultList);
+
+        return resultPage;
+    }
+
+
+
 
     @Override
     public StorageCenterHeatNoDetailVO storageCenterByHeatNo(String heatNo) {
@@ -4676,6 +4798,829 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
         return storageCenterHeatNoDetailVO;
     }
 
+    @Override
+    public StorageCenterHeatNoInvoicingVO storageCenterInvoicingByHeatNo(String heatNo) {
+        StorageCenterHeatNoInvoicingVO storageCenterHeatNoInvoicingVO = new StorageCenterHeatNoInvoicingVO();
+
+        StorageCenterHeatNoInvoicingVO.RollOneHeatNo rollOneHeatNo = new StorageCenterHeatNoInvoicingVO.RollOneHeatNo();
+        StorageCenterHeatNoInvoicingVO.RollTwoHeatNo rollTwoHeatNo = new StorageCenterHeatNoInvoicingVO.RollTwoHeatNo();
+        StorageCenterHeatNoInvoicingVO.RollThreeHeatNo rollThreeHeatNo = new StorageCenterHeatNoInvoicingVO.RollThreeHeatNo();
+        StorageCenterHeatNoInvoicingVO.RollHeightHeatNo rollHeightHeatNo = new StorageCenterHeatNoInvoicingVO.RollHeightHeatNo();
+        StorageCenterHeatNoInvoicingVO.RollOutHeatNo rollOutHeatNo = new StorageCenterHeatNoInvoicingVO.RollOutHeatNo();
+//        StorageCenterHeatNoInvoicingVO.StackHeatNo stackHeatNo = new StorageCenterHeatNoDetailVO.StackHeatNo();
+//        StorageCenterHeatNoInvoicingVO.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 storageCenterHeatNoInvoicingVO;
+        }
+
+
+        // 按照 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<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetailsList = new ArrayList<>();
+            List<StorageCenterHeatNoInvoicingVO.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
+                StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.SizeDetail();
+                sizeDetail.setSize(length);
+                sizeDetail.setSizeWeight(totalWeight);
+                sizeDetail.setSizeAmount(count);
+                sizeDetailsList.add(sizeDetail);
+
+                // 创建 RollSendDetail
+                StorageCenterHeatNoInvoicingVO.RollSendDetail rollSendDetail = new StorageCenterHeatNoInvoicingVO.RollSendDetail();
+                rollSendDetail.setSize(length);
+                rollSendDetail.setWeight(totalWeight);
+                rollSendDetail.setAmount(count);
+                rollSendDetail.setSpec(spec);
+                rollSendDetailList.add(rollSendDetail);
+            });
+
+            // 赋值给 rollOneHeatNo
+            rollOneHeatNo.setSizeDetails(sizeDetailsList);
+            rollOneHeatNo.setRollSendDetails(rollSendDetailList);
+
+            storageCenterHeatNoInvoicingVO.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<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetailsList = new ArrayList<>();
+            List<StorageCenterHeatNoInvoicingVO.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
+                StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.SizeDetail();
+                sizeDetail.setSize(length);
+                sizeDetail.setSizeWeight(totalWeight);
+                sizeDetail.setSizeAmount(count);
+                sizeDetailsList.add(sizeDetail);
+
+                // 创建 RollSendDetail
+                StorageCenterHeatNoInvoicingVO.RollSendDetail rollSendDetail = new StorageCenterHeatNoInvoicingVO.RollSendDetail();
+                rollSendDetail.setSize(length);
+                rollSendDetail.setWeight(totalWeight);
+                rollSendDetail.setAmount(count);
+                rollSendDetail.setSpec(spec);
+                rollSendDetailList.add(rollSendDetail);
+            });
+
+            // 赋值给 rollHeightHeatNo
+            rollHeightHeatNo.setSizeDetails(sizeDetailsList);
+            rollHeightHeatNo.setRollSendDetails(rollSendDetailList);
+
+            storageCenterHeatNoInvoicingVO.setRollHeightDetails(rollHeightHeatNo);
+
+        }
+
+
+//        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<StorageCenterHeatNoInvoicingVO.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);
+
+                        StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.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<StorageCenterHeatNoInvoicingVO.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);
+
+                // 查找所有匹配当前 assemblyNumber 的 StorageBill
+                List<StorageBill> matchedStorageBills = storageBillMap.entrySet().stream()
+                        .filter(entryPlate -> Arrays.asList(entryPlate.getKey().split(",")).contains(assemblyNumber))
+                        .map(Map.Entry::getValue)
+                        .collect(Collectors.toList());
+
+                String licensePlate = matchedStorageBills.stream()
+                        .map(StorageBill::getLicensePlate)
+                        .findFirst()
+                        .orElse("未知车牌");
+
+                String btype = matchedStorageBills.stream()
+                        .map(StorageBill::getBtype)
+                        .findFirst()
+                        .orElse("未知类型");
+
+                Date createTime = matchedStorageBills.stream()
+                        .map(StorageBill::getCreateTime)
+                        .findFirst()
+                        .orElse(new Date());
+
+                StorageCenterHeatNoInvoicingVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
+                rollChargeDetail.setSize(size);
+                rollChargeDetail.setSpec(spec);
+                rollChargeDetail.setWeight(totalWeight);
+                rollChargeDetail.setAmount(billets.size());
+                rollChargeDetail.setLicensePlate(licensePlate);
+                rollChargeDetail.setBtype(btype);
+                rollChargeDetail.setCreateTime(createTime);
+
+                rollChargeDetails.add(rollChargeDetail);
+            }
+
+            // 按 licensePlate 分组并累加 amount 和 weight
+            Map<String, StorageCenterHeatNoInvoicingVO.RollChargeDetail> groupedByLicensePlate = rollChargeDetails.stream()
+                    .collect(Collectors.toMap(
+                            StorageCenterHeatNoInvoicingVO.RollChargeDetail::getLicensePlate,
+                            detail -> {
+                                StorageCenterHeatNoInvoicingVO.RollChargeDetail newDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
+                                newDetail.setSize(detail.getSize());  // 这里可以选择合适的 size 逻辑
+                                newDetail.setSpec(detail.getSpec());
+                                newDetail.setWeight(detail.getWeight());
+                                newDetail.setAmount(detail.getAmount());
+                                newDetail.setLicensePlate(detail.getLicensePlate());
+                                newDetail.setBtype(detail.getBtype());
+                                newDetail.setCreateTime(detail.getCreateTime());
+                                return newDetail;
+                            },
+                            (existing, newDetail) -> {
+                                existing.setAmount(existing.getAmount() + newDetail.getAmount());
+                                existing.setWeight(existing.getWeight().add(newDetail.getWeight())); // BigDecimal 累加
+                                return existing;
+                            }
+                    ));
+
+            // 转换为 List 并赋值
+            List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> mergedRollChargeDetails = new ArrayList<>(groupedByLicensePlate.values());
+
+            rollTwoHeatNo.setRollChargeDetails(mergedRollChargeDetails);
+            rollTwoHeatNo.setSizeDetails(sizeDetailsList);
+            storageCenterHeatNoInvoicingVO.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<StorageCenterHeatNoInvoicingVO.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);
+
+                        StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.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<StorageCenterHeatNoInvoicingVO.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);
+
+
+                // 查找所有匹配当前 assemblyNumber 的 StorageBill
+                List<StorageBill> matchedStorageBills = storageBillMap.entrySet().stream()
+                        .filter(entryPlate -> Arrays.asList(entryPlate.getKey().split(",")).contains(assemblyNumber))
+                        .map(Map.Entry::getValue)
+                        .collect(Collectors.toList());
+
+                String licensePlate = matchedStorageBills.stream()
+                        .map(StorageBill::getLicensePlate)
+                        .findFirst()
+                        .orElse("未知车牌");
+
+                String btype = matchedStorageBills.stream()
+                        .map(StorageBill::getBtype)
+                        .findFirst()
+                        .orElse("未知类型");
+
+                Date createTime = matchedStorageBills.stream()
+                        .map(StorageBill::getCreateTime)
+                        .findFirst()
+                        .orElse(new Date());
+
+                StorageCenterHeatNoInvoicingVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
+                rollChargeDetail.setSize(size);
+                rollChargeDetail.setSpec(spec);
+                rollChargeDetail.setWeight(totalWeight);
+                rollChargeDetail.setAmount(billets.size());
+                rollChargeDetail.setLicensePlate(licensePlate);
+                rollChargeDetail.setBtype(btype);
+                rollChargeDetail.setCreateTime(createTime);
+
+                rollChargeDetails.add(rollChargeDetail);
+            }
+
+            // 按 licensePlate 分组并累加 amount 和 weight
+            Map<String, StorageCenterHeatNoInvoicingVO.RollChargeDetail> groupedByLicensePlate = rollChargeDetails.stream()
+                    .collect(Collectors.toMap(
+                            StorageCenterHeatNoInvoicingVO.RollChargeDetail::getLicensePlate,
+                            detail -> {
+                                StorageCenterHeatNoInvoicingVO.RollChargeDetail newDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
+                                newDetail.setSize(detail.getSize());  // 这里可以选择合适的 size 逻辑
+                                newDetail.setSpec(detail.getSpec());
+                                newDetail.setWeight(detail.getWeight());
+                                newDetail.setAmount(detail.getAmount());
+                                newDetail.setLicensePlate(detail.getLicensePlate());
+                                newDetail.setBtype(detail.getBtype());
+                                newDetail.setCreateTime(detail.getCreateTime());
+                                return newDetail;
+                            },
+                            (existing, newDetail) -> {
+                                existing.setAmount(existing.getAmount() + newDetail.getAmount());
+                                existing.setWeight(existing.getWeight().add(newDetail.getWeight())); // BigDecimal 累加
+                                return existing;
+                            }
+                    ));
+
+            // 转换为 List 并赋值
+            List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> mergedRollChargeDetails = new ArrayList<>(groupedByLicensePlate.values());
+
+            rollThreeHeatNo.setRollChargeDetails(mergedRollChargeDetails);
+            rollThreeHeatNo.setSizeDetails(sizeDetailsList);
+            storageCenterHeatNoInvoicingVO.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<StorageCenterHeatNoInvoicingVO.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);
+
+                        StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.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<StorageCenterHeatNoInvoicingVO.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);
+
+                // 查找所有匹配当前 assemblyNumber 的 StorageBill
+                List<StorageBill> matchedStorageBills = storageBillMap.entrySet().stream()
+                        .filter(entryPlate -> Arrays.asList(entryPlate.getKey().split(",")).contains(assemblyNumber))
+                        .map(Map.Entry::getValue)
+                        .collect(Collectors.toList());
+
+                String licensePlate = matchedStorageBills.stream()
+                        .map(StorageBill::getLicensePlate)
+                        .findFirst()
+                        .orElse("未知车牌");
+
+                String btype = matchedStorageBills.stream()
+                        .map(StorageBill::getBtype)
+                        .findFirst()
+                        .orElse("未知类型");
+
+                Date createTime = matchedStorageBills.stream()
+                        .map(StorageBill::getCreateTime)
+                        .findFirst()
+                        .orElse(new Date());
+
+                StorageCenterHeatNoInvoicingVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
+                rollChargeDetail.setSize(size);
+                rollChargeDetail.setSpec(spec);
+                rollChargeDetail.setWeight(totalWeight);
+                rollChargeDetail.setAmount(billets.size());
+                rollChargeDetail.setLicensePlate(licensePlate);
+                rollChargeDetail.setBtype(btype);
+                rollChargeDetail.setCreateTime(createTime);
+
+                rollChargeDetails.add(rollChargeDetail);
+            }
+
+            // 按 licensePlate 分组并累加 amount 和 weight
+            Map<String, StorageCenterHeatNoInvoicingVO.RollChargeDetail> groupedByLicensePlate = rollChargeDetails.stream()
+                    .collect(Collectors.toMap(
+                            StorageCenterHeatNoInvoicingVO.RollChargeDetail::getLicensePlate,
+                            detail -> {
+                                StorageCenterHeatNoInvoicingVO.RollChargeDetail newDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
+                                newDetail.setSize(detail.getSize());  // 这里可以选择合适的 size 逻辑
+                                newDetail.setSpec(detail.getSpec());
+                                newDetail.setWeight(detail.getWeight());
+                                newDetail.setAmount(detail.getAmount());
+                                newDetail.setLicensePlate(detail.getLicensePlate());
+                                newDetail.setBtype(detail.getBtype());
+                                newDetail.setCreateTime(detail.getCreateTime());
+                                return newDetail;
+                            },
+                            (existing, newDetail) -> {
+                                existing.setAmount(existing.getAmount() + newDetail.getAmount());
+                                existing.setWeight(existing.getWeight().add(newDetail.getWeight())); // BigDecimal 累加
+                                return existing;
+                            }
+                    ));
+
+            // 转换为 List 并赋值
+            List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> mergedRollChargeDetails = new ArrayList<>(groupedByLicensePlate.values());
+
+            rollOutHeatNo.setRollChargeDetails(mergedRollChargeDetails);
+            rollOutHeatNo.setSizeDetails(sizeDetailsList);
+            storageCenterHeatNoInvoicingVO.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 = "未知";
+//
+//                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 storageCenterHeatNoInvoicingVO;
+    }
+
 
     // 计算整数总和的方法
     private int calculateIntSum(List<DestinationStatisticsDetails> list) {
@@ -6422,6 +7367,8 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
                     rollDetail.setLicensePlate(bill.getLicensePlate());
                     rollDetail.setOutTime(bill.getOutTime());
                     rollDetail.setType("热装");
+                    rollDetail.setShift(bill.getShift());
+                    rollDetail.setShiftGroup(bill.getShiftGroup());
                     return rollDetail;
                 }).sorted(Comparator.comparing(StorageCenterCarVO.RollDetail::getOutTime, Comparator.nullsLast(Comparator.reverseOrder()))).collect(Collectors.toList());
     }

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

@@ -65,5 +65,11 @@ public class StorageCenterCarVO {
         @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
         @ApiModelProperty(value = "发车时间")
         private Date outTime;
+
+        @ApiModelProperty(value = "班组")
+        private String shiftGroup;
+
+        @ApiModelProperty(value = "班别")
+        private String shift;
     }
 }

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

@@ -0,0 +1,237 @@
+package org.jeecg.modules.billet.storageBill.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class StorageCenterHeatNoInvoicingVO {
+
+    private StorageCenterHeatNoInvoicingVO.RollOneHeatNo rollClubOneDetails;
+    private StorageCenterHeatNoInvoicingVO.RollTwoHeatNo rollClubTwoDetails;
+    private StorageCenterHeatNoInvoicingVO.RollThreeHeatNo rollClubThreeDetails;
+    private StorageCenterHeatNoInvoicingVO.RollHeightHeatNo rollHeightDetails;
+    private StorageCenterHeatNoInvoicingVO.RollOutHeatNo rollOutShippDetails;
+//    private StorageCenterHeatNoInvoicingVO.StackHeatNo stackingVehicles;
+//    private StorageCenterHeatNoInvoicingVO.UnknownHeatNo unknownDetails;
+
+    @Data
+    public static class RollOneHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoInvoicingVO.RollSendDetail> rollSendDetails;
+
+    }
+
+    @Data
+    public static class RollTwoHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> rollChargeDetails;
+
+    }
+
+
+    @Data
+    public static class RollThreeHeatNo {
+
+
+        @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 {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoInvoicingVO.RollSendDetail> rollSendDetails;
+
+    }
+
+
+    @Data
+    public static class RollOutHeatNo {
+
+
+        @ApiModelProperty(value = "当前定尺总支数")
+        private Integer totalAmount;
+
+        @ApiModelProperty(value = "当前定尺总重量")
+        private BigDecimal totalWeight;
+
+
+        private List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails;
+
+        private List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> rollChargeDetails;
+
+    }
+
+
+//    @Data
+//    public static class StackHeatNo {
+//
+//
+//        @ApiModelProperty(value = "当前定尺总支数")
+//        private Integer totalAmount;
+//
+//        @ApiModelProperty(value = "当前定尺总重量")
+//        private BigDecimal totalWeight;
+//
+//
+//        private List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails;
+//
+//        private List<StorageCenterHeatNoInvoicingVO.StackingVehiclesDetail> stackDetails;
+//
+//    }
+//
+//    @Data
+//    public static class UnknownHeatNo {
+//
+//
+//        @ApiModelProperty(value = "当前定尺总支数")
+//        private Integer totalAmount;
+//
+//        @ApiModelProperty(value = "当前定尺总重量")
+//        private BigDecimal totalWeight;
+//
+//
+//        private List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails;
+//
+//        private List<StorageCenterHeatNoInvoicingVO.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;
+
+        @ApiModelProperty(value = "类型")
+        private String btype;
+
+        @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        @ApiModelProperty(value = "创建日期")
+        private Date createTime;
+
+    }
+
+
+//    @Data
+//    public static class StackingVehiclesDetail {
+//
+//        @ApiModelProperty(value = "定尺")
+//        private Integer 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;
+
+    }
+
+
+}

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

@@ -53,6 +53,12 @@ public class StorageCenterHeatNoVO {
         @ApiModelProperty(value = "当前炉号总重量")
         private BigDecimal heatNoWeight;
 
+        @ApiModelProperty(value = "班组")
+        private String shiftGroup;
+
+        @ApiModelProperty(value = "班别")
+        private String shift;
+
     }
 
 

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

@@ -0,0 +1,58 @@
+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 StorageCenterInvoicingVO {
+
+//    @ApiModelProperty(value = "炉号总数")
+//    private Integer heatNoTotalNum;
+//
+//    @ApiModelProperty(value = "总支数")
+//    private Integer amountTotal;
+//
+//    @ApiModelProperty(value = "总重量")
+//    private BigDecimal totalWeight;
+//
+//    private List<StorageCenterInvoicingVO.SizeDetail> sizeDetails;
+
+    private List<StorageCenterInvoicingVO.HeatNoDetail> heatNoDetails;
+
+    private StorageCenterHeatNoInvoicingVO storageCenterHeatNoInvoicing;
+
+
+//    @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;
+
+    }
+}