瀏覽代碼

新增轧钢棒一、棒二、棒三、外运、高线工作台总接收明细信息接口

lingpeng.li 2 月之前
父節點
當前提交
30a4b9ed73
共有 19 個文件被更改,包括 738 次插入107 次删除
  1. 8 0
      zgztBus/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java
  2. 10 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubOne/controller/RollClubOneDetailsController.java
  3. 4 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubOne/service/IRollClubOneDetailsService.java
  4. 102 19
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubOne/service/impl/RollClubOneDetailsServiceImpl.java
  5. 11 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubThree/controller/RollClubThreeDetailsController.java
  6. 4 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubThree/service/IRollClubThreeDetailsService.java
  7. 112 22
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubThree/service/impl/RollClubThreeDetailsServiceImpl.java
  8. 10 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubTwo/controller/RollClubTwoDetailsController.java
  9. 4 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubTwo/service/IRollClubTwoDetailsService.java
  10. 111 22
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubTwo/service/impl/RollClubTwoDetailsServiceImpl.java
  11. 10 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollHeight/controller/RollHeightDetailsController.java
  12. 4 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollHeight/service/IRollHeightDetailsService.java
  13. 104 21
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollHeight/service/impl/RollHeightDetailsServiceImpl.java
  14. 11 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOutShipp/controller/RollOutShippDetailsController.java
  15. 4 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOutShipp/service/IRollOutShippDetailsService.java
  16. 112 23
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOutShipp/service/impl/RollOutShippDetailsServiceImpl.java
  17. 18 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/dto/RollDetailQueryDTO.java
  18. 51 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/vo/RollChargeDetailsVO.java
  19. 48 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/vo/RollSendDetailsVO.java

+ 8 - 0
zgztBus/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -832,4 +832,12 @@ public class DateUtils extends PropertyEditorSupport {
         // 将 Instant 转换为 Date
         return Date.from(instant);
     }
+
+
+    // 获取 N 天前的日期 (不带时间)
+    public static Date getDateBeforeDays(int days) {
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.DAY_OF_YEAR, -days);
+        return cal.getTime();
+    }
 }

+ 10 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubOne/controller/RollClubOneDetailsController.java

@@ -14,7 +14,9 @@ import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.billet.rollClubOne.entity.HotSendRollClubOneDetails;
 import org.jeecg.modules.billet.rollClubOne.entity.RollClubOneDetails;
 import org.jeecg.modules.billet.rollClubOne.service.IRollClubOneDetailsService;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
+import org.jeecg.modules.billet.storageBill.vo.RollSendDetailsVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -226,4 +228,12 @@ public class RollClubOneDetailsController extends JeecgController<RollClubOneDet
 		RollOnDutyDataVo rollOnDutyVo = rollClubOneDetailsService.queryOnDutyRecord(ccmNo);
 		return Result.OK(rollOnDutyVo);
 	}
+
+	@ApiOperation(value = "轧钢棒一工作台总接收明细信息", notes = "轧钢棒一工作台总接收明细信息")
+	@GetMapping(value = "/rollClubOneWorkbenchesDetail")
+	public Result<RollSendDetailsVO> rollClubOneWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
+		RollSendDetailsVO rollSendDetailsVO = rollClubOneDetailsService.queryWorkbenchesDetail(queryDTO);
+		return Result.OK(rollSendDetailsVO);
+	}
 }

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

@@ -2,7 +2,9 @@ package org.jeecg.modules.billet.rollClubOne.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.billet.rollClubOne.entity.RollClubOneDetails;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
+import org.jeecg.modules.billet.storageBill.vo.RollSendDetailsVO;
 
 /**
  * @Description: 棒一明细信息
@@ -13,4 +15,6 @@ import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
 public interface IRollClubOneDetailsService extends IService<RollClubOneDetails> {
 
     RollOnDutyDataVo queryOnDutyRecord(String ccmNo);
+
+    RollSendDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO);
 }

+ 102 - 19
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubOne/service/impl/RollClubOneDetailsServiceImpl.java

@@ -3,23 +3,27 @@ package org.jeecg.modules.billet.rollClubOne.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.billet.billetHotsendChangeShift.entity.BilletHotsendChangeShift;
 import org.jeecg.modules.billet.billetHotsendChangeShift.service.IBilletHotsendChangeShiftService;
 import org.jeecg.modules.billet.rollClubOne.entity.RollClubOneDetails;
 import org.jeecg.modules.billet.rollClubOne.mapper.RollClubOneDetailsMapper;
 import org.jeecg.modules.billet.rollClubOne.service.IRollClubOneDetailsService;
-import org.jeecg.modules.billet.rollHeight.entity.RollHeightDetails;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.mapper.StorageBillMapper;
-import org.jeecg.modules.billet.storageBill.vo.RollHistoryDetailVo;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyInfoVo;
+import org.jeecg.modules.billet.storageBill.vo.RollSendDetailsVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -81,39 +85,118 @@ public class RollClubOneDetailsServiceImpl extends ServiceImpl<RollClubOneDetail
                     return infoVo;
                 }).collect(Collectors.toList());
 
-        // 计算历史数据统计
+        // 组装最终对象
+        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
+
+        return rollOnDutyVo;
+    }
+
+
+
+    @Override
+    public RollSendDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
         LambdaQueryWrapper<RollClubOneDetails> historyQueryWrapper = new LambdaQueryWrapper<>();
-        historyQueryWrapper.eq(RollClubOneDetails::getCcmNo, ccmNo);
+        historyQueryWrapper.eq(RollClubOneDetails::getCcmNo, queryDTO.getCcmNo());
+
+        Date beginDate = queryDTO.getBeginCreateDate();
+        Date endDate = queryDTO.getEndCreateDate();
 
-        List<RollClubOneDetails> rollHeightHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
-        List<RollHistoryDetailVo> historyDetailList = rollHeightHistoryDetailsList.stream()
-                .collect(Collectors.groupingBy(RollClubOneDetails::getSize))
+        // 如果 beginCreateDate 和 endCreateDate 都为空,默认查询最近 7 天的数据
+        if (beginDate == null && endDate == null) {
+            beginDate = DateUtils.getStartOfDayByDate(DateUtils.getDateBeforeDays(7)); // 7 天前 00:00:00
+            endDate = DateUtils.getEndOfDayByDate(new Date()); // 当前时间 23:59:59
+        }
+
+        // 处理 beginCreateDate
+        if (beginDate != null) {
+            historyQueryWrapper.ge(RollClubOneDetails::getCreateTime, DateUtils.getStartOfDayByDate(beginDate));
+        }
+
+        // 处理 endCreateDate
+        if (endDate != null) {
+            historyQueryWrapper.le(RollClubOneDetails::getCreateTime, DateUtils.getEndOfDayByDate(endDate));
+        }
+
+        List<RollClubOneDetails> rollClubHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
+
+        // 计算总支数
+        int totalCount = rollClubHistoryDetailsList.stream()
+                .mapToInt(detail -> 1) // 直接给 1
+                .sum();
+
+        // 计算总重量
+        BigDecimal totalWeight = rollClubHistoryDetailsList.stream()
+                .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+        // 创建 VO 并赋值
+        RollSendDetailsVO rollSendDetailsVO = new RollSendDetailsVO();
+        rollSendDetailsVO.setAmountTotal(totalCount);
+        rollSendDetailsVO.setTotalWeight(totalWeight);
+
+
+        List<RollSendDetailsVO.RollHistoryDetail> rollHistoryDetails = rollClubHistoryDetailsList.stream()
+                .collect(Collectors.groupingBy(detail -> DateUtils.formatDate(detail.getCreateTime())))
                 .entrySet().stream()
                 .map(entry -> {
-                    String size = entry.getKey();
+                    String key = entry.getKey();
                     List<RollClubOneDetails> detailsList = entry.getValue();
 
-                    int totalCount = detailsList.stream()
+                    int currentDateCount = detailsList.stream()
                             .mapToInt(detail -> 1) // 直接给 1
                             .sum();
 
-                    BigDecimal totalBlankOutput = detailsList.stream()
+                    BigDecimal currentBlankOutput = detailsList.stream()
                             .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
                             .reduce(BigDecimal.ZERO, BigDecimal::add)
                             .setScale(4, BigDecimal.ROUND_HALF_UP);
 
-                    RollHistoryDetailVo rollHistoryDetailVo = new RollHistoryDetailVo();
-                    rollHistoryDetailVo.setSize(size);
-                    rollHistoryDetailVo.setAmountTotal(totalCount);
-                    rollHistoryDetailVo.setBlankOutput(totalBlankOutput);
-                    return rollHistoryDetailVo;
+                    RollSendDetailsVO.RollHistoryDetail rollHistoryDetail = new RollSendDetailsVO.RollHistoryDetail();
+                    rollHistoryDetail.setCurrentDate(key);
+                    rollHistoryDetail.setCurrentDateAmount(currentDateCount);
+                    rollHistoryDetail.setCurrentDateWeight(currentBlankOutput);
+
+                    List<RollSendDetailsVO.CurrentDateDetail> currentDateDetails = detailsList.stream()
+                            .collect(Collectors.groupingBy(RollClubOneDetails::getSize))
+                            .entrySet().stream()
+                            .map(sizeEntry -> {
+                                String size = sizeEntry.getKey();
+                                List<RollClubOneDetails> sizeList = sizeEntry.getValue();
+
+                                int sizeCount = sizeList.stream()
+                                        .mapToInt(detail -> 1) // 直接给 1
+                                        .sum();
+
+                                BigDecimal sizeBlankOutput = sizeList.stream()
+                                        .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                        .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+                                RollSendDetailsVO.CurrentDateDetail currentDateDetail = new RollSendDetailsVO.CurrentDateDetail();
+                                currentDateDetail.setSize(size);
+                                currentDateDetail.setAmount(sizeCount);
+                                currentDateDetail.setBlankOutput(sizeBlankOutput);
+                                return currentDateDetail;
+                            }).collect(Collectors.toList());
+
+                    rollHistoryDetail.setCurrentDateDetails(currentDateDetails);
+
+                    return rollHistoryDetail;
                 }).collect(Collectors.toList());
 
-        // 组装最终对象
-        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
-        rollOnDutyVo.setRollHistoryDetailList(historyDetailList);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
-        return rollOnDutyVo;
+        // 按 currentDate 降序排序
+        rollHistoryDetails.sort(Comparator.comparing(
+                detail -> LocalDate.parse(detail.getCurrentDate(), formatter), // 转换 String -> LocalDate
+                Comparator.reverseOrder() // 降序
+        ));
+
+        rollSendDetailsVO.setRollHistoryDetails(rollHistoryDetails);
+
+        return rollSendDetailsVO;
     }
 
 

+ 11 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubThree/controller/RollClubThreeDetailsController.java

@@ -13,6 +13,8 @@ import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.billet.rollClubThree.entity.RollClubThreeDetails;
 import org.jeecg.modules.billet.rollClubThree.service.IRollClubThreeDetailsService;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
+import org.jeecg.modules.billet.storageBill.vo.RollChargeDetailsVO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -169,4 +171,13 @@ public class RollClubThreeDetailsController extends JeecgController<RollClubThre
 		 return Result.OK(rollOnDutyVo);
 	 }
 
+
+	 @ApiOperation(value = "轧钢棒三工作台总接收明细信息", notes = "轧钢棒三工作台总接收明细信息")
+	 @GetMapping(value = "/rollClubThreeWorkbenchesDetail")
+	 public Result<RollChargeDetailsVO> rollClubThreeWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
+		 RollChargeDetailsVO rollChargeDetailsVO = rollClubThreeDetailsService.queryWorkbenchesDetail(queryDTO);
+		 return Result.OK(rollChargeDetailsVO);
+	 }
+
 }

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

@@ -3,6 +3,8 @@ package org.jeecg.modules.billet.rollClubThree.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.billet.rollClubThree.entity.RollClubThreeDetails;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
+import org.jeecg.modules.billet.storageBill.vo.RollChargeDetailsVO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
 
 /**
@@ -15,4 +17,6 @@ public interface IRollClubThreeDetailsService extends IService<RollClubThreeDeta
 
     RollOnDutyDataVo queryOnDutyRecord(String ccmNo);
 
+    RollChargeDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO);
+
 }

+ 112 - 22
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubThree/service/impl/RollClubThreeDetailsServiceImpl.java

@@ -4,12 +4,14 @@ package org.jeecg.modules.billet.rollClubThree.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.billet.billetHotsendChangeShift.entity.BilletHotsendChangeShift;
 import org.jeecg.modules.billet.billetHotsendChangeShift.service.IBilletHotsendChangeShiftService;
 import org.jeecg.modules.billet.rollClubThree.entity.RollClubThreeDetails;
 import org.jeecg.modules.billet.rollClubThree.mapper.RollClubThreeDetailsMapper;
 import org.jeecg.modules.billet.rollClubThree.service.IRollClubThreeDetailsService;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.entity.StorageBill;
 import org.jeecg.modules.billet.storageBill.mapper.StorageBillMapper;
 import org.jeecg.modules.billet.storageBill.vo.*;
@@ -19,9 +21,9 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -120,41 +122,129 @@ public class RollClubThreeDetailsServiceImpl extends ServiceImpl<RollClubThreeDe
                     return infoVo;
                 }).collect(Collectors.toList());
 
-        // 7. 计算历史数据统计
+
+        // 8. 组装最终对象
+        rollOnDutyVo.setRollOnDutyRecordList(recordVoList);
+        rollOnDutyVo.setRollOnDutyDetailList(detailVoList);
+        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
+
+        return rollOnDutyVo;
+    }
+
+
+    @Override
+    public RollChargeDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
         LambdaQueryWrapper<RollClubThreeDetails> historyQueryWrapper = new LambdaQueryWrapper<>();
-        historyQueryWrapper.eq(RollClubThreeDetails::getCcmNo, ccmNo);
+        historyQueryWrapper.eq(RollClubThreeDetails::getCcmNo, queryDTO.getCcmNo());
+
+        Date beginDate = queryDTO.getBeginCreateDate();
+        Date endDate = queryDTO.getEndCreateDate();
+
+        // 如果 beginCreateDate 和 endCreateDate 都为空,默认查询最近 7 天的数据
+        if (beginDate == null && endDate == null) {
+            beginDate = DateUtils.getStartOfDayByDate(DateUtils.getDateBeforeDays(7)); // 7 天前 00:00:00
+            endDate = DateUtils.getEndOfDayByDate(new Date()); // 当前时间 23:59:59
+        }
+
+        // 处理 beginCreateDate
+        if (beginDate != null) {
+            historyQueryWrapper.ge(RollClubThreeDetails::getCreateTime, DateUtils.getStartOfDayByDate(beginDate));
+        }
+
+        // 处理 endCreateDate
+        if (endDate != null) {
+            historyQueryWrapper.le(RollClubThreeDetails::getCreateTime, DateUtils.getEndOfDayByDate(endDate));
+        }
+
+        List<RollClubThreeDetails> rollClubHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
 
-        List<RollClubThreeDetails> rollClubThreeHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
-        List<RollHistoryDetailVo> historyDetailList = rollClubThreeHistoryDetailsList.stream()
-                .collect(Collectors.groupingBy(RollClubThreeDetails::getSize))
+        // 计算总支数
+        int totalCount = rollClubHistoryDetailsList.stream()
+                .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
+                .sum();
+
+        // 计算总重量
+        BigDecimal totalWeight = rollClubHistoryDetailsList.stream()
+                .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+        // 创建 VO 并赋值
+        RollChargeDetailsVO rollChargeDetailsVO = new RollChargeDetailsVO();
+        rollChargeDetailsVO.setAmountTotal(totalCount);
+        rollChargeDetailsVO.setTotalWeight(totalWeight);
+
+
+        List<RollChargeDetailsVO.RollHistoryDetail> rollHistoryDetails = rollClubHistoryDetailsList.stream()
+                .collect(Collectors.groupingBy(detail -> DateUtils.formatDate(detail.getCreateTime())))
                 .entrySet().stream()
                 .map(entry -> {
-                    String size = entry.getKey();
+                    String key = entry.getKey();
                     List<RollClubThreeDetails> detailsList = entry.getValue();
 
-                    int totalCount = detailsList.stream()
+                    // 统计不重复的 storageBillId 个数,返回 Integer 类型
+                    int uniqueStorageBillCount = (int) detailsList.stream()
+                            .map(RollClubThreeDetails::getStorageBillId)
+                            .filter(Objects::nonNull)
+                            .collect(Collectors.toSet()) // 直接收集到 Set 去重
+                            .size();
+
+
+                    int currentDateCount = detailsList.stream()
                             .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
                             .sum();
 
-                    BigDecimal totalBlankOutput = detailsList.stream()
+                    BigDecimal currentBlankOutput = detailsList.stream()
                             .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
                             .reduce(BigDecimal.ZERO, BigDecimal::add)
                             .setScale(4, BigDecimal.ROUND_HALF_UP);
 
-                    RollHistoryDetailVo rollHistoryDetailVo = new RollHistoryDetailVo();
-                    rollHistoryDetailVo.setSize(size);
-                    rollHistoryDetailVo.setAmountTotal(totalCount);
-                    rollHistoryDetailVo.setBlankOutput(totalBlankOutput);
-                    return rollHistoryDetailVo;
+                    RollChargeDetailsVO.RollHistoryDetail rollHistoryDetail = new RollChargeDetailsVO.RollHistoryDetail();
+                    rollHistoryDetail.setCurrentDate(key);
+                    rollHistoryDetail.setCurrentDateAmount(currentDateCount);
+                    rollHistoryDetail.setCurrentDateWeight(currentBlankOutput);
+                    rollHistoryDetail.setCarNum(uniqueStorageBillCount);
+
+                    List<RollChargeDetailsVO.CurrentDateDetail> currentDateDetails = detailsList.stream()
+                            .collect(Collectors.groupingBy(RollClubThreeDetails::getSize))
+                            .entrySet().stream()
+                            .map(sizeEntry -> {
+                                String size = sizeEntry.getKey();
+                                List<RollClubThreeDetails> sizeList = sizeEntry.getValue();
+
+                                int sizeCount = sizeList.stream()
+                                        .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
+                                        .sum();
+
+                                BigDecimal sizeBlankOutput = sizeList.stream()
+                                        .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                        .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+                                RollChargeDetailsVO.CurrentDateDetail currentDateDetail = new RollChargeDetailsVO.CurrentDateDetail();
+                                currentDateDetail.setSize(size);
+                                currentDateDetail.setAmount(sizeCount);
+                                currentDateDetail.setBlankOutput(sizeBlankOutput);
+                                return currentDateDetail;
+                            }).collect(Collectors.toList());
+
+                    rollHistoryDetail.setCurrentDateDetails(currentDateDetails);
+
+                    return rollHistoryDetail;
                 }).collect(Collectors.toList());
 
-        // 8. 组装最终对象
-        rollOnDutyVo.setRollOnDutyRecordList(recordVoList);
-        rollOnDutyVo.setRollOnDutyDetailList(detailVoList);
-        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
-        rollOnDutyVo.setRollHistoryDetailList(historyDetailList);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
-        return rollOnDutyVo;
+        // 按 currentDate 降序排序
+        rollHistoryDetails.sort(Comparator.comparing(
+                detail -> LocalDate.parse(detail.getCurrentDate(), formatter), // 转换 String -> LocalDate
+                Comparator.reverseOrder() // 降序
+        ));
+
+        rollChargeDetailsVO.setRollHistoryDetails(rollHistoryDetails);
+
+        return rollChargeDetailsVO;
     }
 
 

+ 10 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubTwo/controller/RollClubTwoDetailsController.java

@@ -13,6 +13,8 @@ import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.billet.rollClubTwo.entity.RollClubTwoDetails;
 import org.jeecg.modules.billet.rollClubTwo.service.IRollClubTwoDetailsService;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
+import org.jeecg.modules.billet.storageBill.vo.RollChargeDetailsVO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -170,4 +172,12 @@ public class RollClubTwoDetailsController extends JeecgController<RollClubTwoDet
     }
 
 
+    @ApiOperation(value = "轧钢棒二工作台总接收明细信息", notes = "轧钢棒二工作台总接收明细信息")
+    @GetMapping(value = "/rollClubTwoWorkbenchesDetail")
+    public Result<RollChargeDetailsVO> rollClubTwoWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
+        RollChargeDetailsVO rollChargeDetailsVO = rollClubTwoDetailsService.queryWorkbenchesDetail(queryDTO);
+        return Result.OK(rollChargeDetailsVO);
+    }
+
 }

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

@@ -2,6 +2,8 @@ package org.jeecg.modules.billet.rollClubTwo.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.billet.rollClubTwo.entity.RollClubTwoDetails;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
+import org.jeecg.modules.billet.storageBill.vo.RollChargeDetailsVO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
 
 /**
@@ -14,4 +16,6 @@ public interface IRollClubTwoDetailsService extends IService<RollClubTwoDetails>
 
     RollOnDutyDataVo queryOnDutyRecord(String ccmNo);
 
+    RollChargeDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO);
+
 }

+ 111 - 22
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollClubTwo/service/impl/RollClubTwoDetailsServiceImpl.java

@@ -4,12 +4,14 @@ package org.jeecg.modules.billet.rollClubTwo.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.billet.billetHotsendChangeShift.entity.BilletHotsendChangeShift;
 import org.jeecg.modules.billet.billetHotsendChangeShift.service.IBilletHotsendChangeShiftService;
 import org.jeecg.modules.billet.rollClubTwo.entity.RollClubTwoDetails;
 import org.jeecg.modules.billet.rollClubTwo.mapper.RollClubTwoDetailsMapper;
 import org.jeecg.modules.billet.rollClubTwo.service.IRollClubTwoDetailsService;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.entity.StorageBill;
 import org.jeecg.modules.billet.storageBill.mapper.StorageBillMapper;
 import org.jeecg.modules.billet.storageBill.vo.*;
@@ -19,9 +21,9 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -119,41 +121,127 @@ public class RollClubTwoDetailsServiceImpl extends ServiceImpl<RollClubTwoDetail
                     return infoVo;
                 }).collect(Collectors.toList());
 
-        // 7. 计算历史数据统计
+        // 7. 组装最终对象
+        rollOnDutyVo.setRollOnDutyRecordList(recordVoList);
+        rollOnDutyVo.setRollOnDutyDetailList(detailVoList);
+        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
+
+        return rollOnDutyVo;
+    }
+
+    @Override
+    public RollChargeDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
         LambdaQueryWrapper<RollClubTwoDetails> historyQueryWrapper = new LambdaQueryWrapper<>();
-        historyQueryWrapper.eq(RollClubTwoDetails::getCcmNo, ccmNo);
+        historyQueryWrapper.eq(RollClubTwoDetails::getCcmNo, queryDTO.getCcmNo());
+
+        Date beginDate = queryDTO.getBeginCreateDate();
+        Date endDate = queryDTO.getEndCreateDate();
+
+        // 如果 beginCreateDate 和 endCreateDate 都为空,默认查询最近 7 天的数据
+        if (beginDate == null && endDate == null) {
+            beginDate = DateUtils.getStartOfDayByDate(DateUtils.getDateBeforeDays(7)); // 7 天前 00:00:00
+            endDate = DateUtils.getEndOfDayByDate(new Date()); // 当前时间 23:59:59
+        }
+
+        // 处理 beginCreateDate
+        if (beginDate != null) {
+            historyQueryWrapper.ge(RollClubTwoDetails::getCreateTime, DateUtils.getStartOfDayByDate(beginDate));
+        }
+
+        // 处理 endCreateDate
+        if (endDate != null) {
+            historyQueryWrapper.le(RollClubTwoDetails::getCreateTime, DateUtils.getEndOfDayByDate(endDate));
+        }
+
+        List<RollClubTwoDetails> rollClubHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
+
+        // 计算总支数
+        int totalCount = rollClubHistoryDetailsList.stream()
+                .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
+                .sum();
 
-        List<RollClubTwoDetails> rollClubTwoHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
-        List<RollHistoryDetailVo> historyDetailList = rollClubTwoHistoryDetailsList.stream()
-                .collect(Collectors.groupingBy(RollClubTwoDetails::getSize))
+        // 计算总重量
+        BigDecimal totalWeight = rollClubHistoryDetailsList.stream()
+                .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+        // 创建 VO 并赋值
+        RollChargeDetailsVO rollChargeDetailsVO = new RollChargeDetailsVO();
+        rollChargeDetailsVO.setAmountTotal(totalCount);
+        rollChargeDetailsVO.setTotalWeight(totalWeight);
+
+
+        List<RollChargeDetailsVO.RollHistoryDetail> rollHistoryDetails = rollClubHistoryDetailsList.stream()
+                .collect(Collectors.groupingBy(detail -> DateUtils.formatDate(detail.getCreateTime())))
                 .entrySet().stream()
                 .map(entry -> {
-                    String size = entry.getKey();
+                    String key = entry.getKey();
                     List<RollClubTwoDetails> detailsList = entry.getValue();
 
-                    int totalCount = detailsList.stream()
+                    // 统计不重复的 storageBillId 个数,返回 Integer 类型
+                    int uniqueStorageBillCount = (int) detailsList.stream()
+                            .map(RollClubTwoDetails::getStorageBillId)
+                            .filter(Objects::nonNull)
+                            .collect(Collectors.toSet()) // 直接收集到 Set 去重
+                            .size();
+
+
+                    int currentDateCount = detailsList.stream()
                             .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
                             .sum();
 
-                    BigDecimal totalBlankOutput = detailsList.stream()
+                    BigDecimal currentBlankOutput = detailsList.stream()
                             .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
                             .reduce(BigDecimal.ZERO, BigDecimal::add)
                             .setScale(4, BigDecimal.ROUND_HALF_UP);
 
-                    RollHistoryDetailVo rollHistoryDetailVo = new RollHistoryDetailVo();
-                    rollHistoryDetailVo.setSize(size);
-                    rollHistoryDetailVo.setAmountTotal(totalCount);
-                    rollHistoryDetailVo.setBlankOutput(totalBlankOutput);
-                    return rollHistoryDetailVo;
+                    RollChargeDetailsVO.RollHistoryDetail rollHistoryDetail = new RollChargeDetailsVO.RollHistoryDetail();
+                    rollHistoryDetail.setCurrentDate(key);
+                    rollHistoryDetail.setCurrentDateAmount(currentDateCount);
+                    rollHistoryDetail.setCurrentDateWeight(currentBlankOutput);
+                    rollHistoryDetail.setCarNum(uniqueStorageBillCount);
+
+                    List<RollChargeDetailsVO.CurrentDateDetail> currentDateDetails = detailsList.stream()
+                            .collect(Collectors.groupingBy(RollClubTwoDetails::getSize))
+                            .entrySet().stream()
+                            .map(sizeEntry -> {
+                                String size = sizeEntry.getKey();
+                                List<RollClubTwoDetails> sizeList = sizeEntry.getValue();
+
+                                int sizeCount = sizeList.stream()
+                                        .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
+                                        .sum();
+
+                                BigDecimal sizeBlankOutput = sizeList.stream()
+                                        .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                        .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+                                RollChargeDetailsVO.CurrentDateDetail currentDateDetail = new RollChargeDetailsVO.CurrentDateDetail();
+                                currentDateDetail.setSize(size);
+                                currentDateDetail.setAmount(sizeCount);
+                                currentDateDetail.setBlankOutput(sizeBlankOutput);
+                                return currentDateDetail;
+                            }).collect(Collectors.toList());
+
+                    rollHistoryDetail.setCurrentDateDetails(currentDateDetails);
+
+                    return rollHistoryDetail;
                 }).collect(Collectors.toList());
 
-        // 8. 组装最终对象
-        rollOnDutyVo.setRollOnDutyRecordList(recordVoList);
-        rollOnDutyVo.setRollOnDutyDetailList(detailVoList);
-        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
-        rollOnDutyVo.setRollHistoryDetailList(historyDetailList);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
-        return rollOnDutyVo;
+        // 按 currentDate 降序排序
+        rollHistoryDetails.sort(Comparator.comparing(
+                detail -> LocalDate.parse(detail.getCurrentDate(), formatter), // 转换 String -> LocalDate
+                Comparator.reverseOrder() // 降序
+        ));
+
+        rollChargeDetailsVO.setRollHistoryDetails(rollHistoryDetails);
+
+        return rollChargeDetailsVO;
     }
 
 
@@ -168,4 +256,5 @@ public class RollClubTwoDetailsServiceImpl extends ServiceImpl<RollClubTwoDetail
         String key = String.format(keyFormat, ccmNo);
         return oConvertUtils.getString(redisTemplate.opsForValue().get(key));
     }
+
 }

+ 10 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollHeight/controller/RollHeightDetailsController.java

@@ -14,7 +14,9 @@ import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.billet.rollHeight.entity.HotSendRollHeightDetails;
 import org.jeecg.modules.billet.rollHeight.entity.RollHeightDetails;
 import org.jeecg.modules.billet.rollHeight.service.IRollHeightDetailsService;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
+import org.jeecg.modules.billet.storageBill.vo.RollSendDetailsVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -228,4 +230,12 @@ public class RollHeightDetailsController extends JeecgController<RollHeightDetai
 		RollOnDutyDataVo rollOnDutyVo = rollHeightDetailsService.queryOnDutyRecord(ccmNo);
 		return Result.OK(rollOnDutyVo);
 	}
+
+	@ApiOperation(value = "轧钢高线工作台总接收明细信息", notes = "轧钢高线工作台总接收明细信息")
+	@GetMapping(value = "/rollHeightWorkbenchesDetail")
+	public Result<RollSendDetailsVO> rollHeightWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
+		RollSendDetailsVO rollSendDetailsVO = rollHeightDetailsService.queryWorkbenchesDetail(queryDTO);
+		return Result.OK(rollSendDetailsVO);
+	}
 }

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

@@ -2,7 +2,9 @@ package org.jeecg.modules.billet.rollHeight.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.billet.rollHeight.entity.RollHeightDetails;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
+import org.jeecg.modules.billet.storageBill.vo.RollSendDetailsVO;
 
 /**
  * @Description: 高线明细信息
@@ -14,4 +16,6 @@ public interface IRollHeightDetailsService extends IService<RollHeightDetails> {
 
     RollOnDutyDataVo queryOnDutyRecord(String ccmNo);
 
+    RollSendDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO);
+
 }

+ 104 - 21
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollHeight/service/impl/RollHeightDetailsServiceImpl.java

@@ -3,23 +3,27 @@ package org.jeecg.modules.billet.rollHeight.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.billet.billetHotsendChangeShift.entity.BilletHotsendChangeShift;
 import org.jeecg.modules.billet.billetHotsendChangeShift.service.IBilletHotsendChangeShiftService;
-import org.jeecg.modules.billet.rollClubThree.entity.RollClubThreeDetails;
 import org.jeecg.modules.billet.rollHeight.entity.RollHeightDetails;
 import org.jeecg.modules.billet.rollHeight.mapper.RollHeightDetailsMapper;
 import org.jeecg.modules.billet.rollHeight.service.IRollHeightDetailsService;
-import org.jeecg.modules.billet.storageBill.entity.StorageBill;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.mapper.StorageBillMapper;
-import org.jeecg.modules.billet.storageBill.vo.*;
+import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
+import org.jeecg.modules.billet.storageBill.vo.RollOnDutyInfoVo;
+import org.jeecg.modules.billet.storageBill.vo.RollSendDetailsVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.Collections;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -81,39 +85,118 @@ public class RollHeightDetailsServiceImpl extends ServiceImpl<RollHeightDetailsM
                     return infoVo;
                 }).collect(Collectors.toList());
 
-        // 计算历史数据统计
+
+        // 组装最终对象
+        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
+
+        return rollOnDutyVo;
+    }
+
+
+    @Override
+    public RollSendDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
         LambdaQueryWrapper<RollHeightDetails> historyQueryWrapper = new LambdaQueryWrapper<>();
-        historyQueryWrapper.eq(RollHeightDetails::getCcmNo, ccmNo);
+        historyQueryWrapper.eq(RollHeightDetails::getCcmNo, queryDTO.getCcmNo());
+
+        Date beginDate = queryDTO.getBeginCreateDate();
+        Date endDate = queryDTO.getEndCreateDate();
 
-        List<RollHeightDetails> rollHeightHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
-        List<RollHistoryDetailVo> historyDetailList = rollHeightHistoryDetailsList.stream()
-                .collect(Collectors.groupingBy(RollHeightDetails::getSize))
+        // 如果 beginCreateDate 和 endCreateDate 都为空,默认查询最近 7 天的数据
+        if (beginDate == null && endDate == null) {
+            beginDate = DateUtils.getStartOfDayByDate(DateUtils.getDateBeforeDays(7)); // 7 天前 00:00:00
+            endDate = DateUtils.getEndOfDayByDate(new Date()); // 当前时间 23:59:59
+        }
+
+        // 处理 beginCreateDate
+        if (beginDate != null) {
+            historyQueryWrapper.ge(RollHeightDetails::getCreateTime, DateUtils.getStartOfDayByDate(beginDate));
+        }
+
+        // 处理 endCreateDate
+        if (endDate != null) {
+            historyQueryWrapper.le(RollHeightDetails::getCreateTime, DateUtils.getEndOfDayByDate(endDate));
+        }
+
+        List<RollHeightDetails> rollClubHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
+
+        // 计算总支数
+        int totalCount = rollClubHistoryDetailsList.stream()
+                .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
+                .sum();
+
+        // 计算总重量
+        BigDecimal totalWeight = rollClubHistoryDetailsList.stream()
+                .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+        // 创建 VO 并赋值
+        RollSendDetailsVO rollSendDetailsVO = new RollSendDetailsVO();
+        rollSendDetailsVO.setAmountTotal(totalCount);
+        rollSendDetailsVO.setTotalWeight(totalWeight);
+
+
+        List<RollSendDetailsVO.RollHistoryDetail> rollHistoryDetails = rollClubHistoryDetailsList.stream()
+                .collect(Collectors.groupingBy(detail -> DateUtils.formatDate(detail.getCreateTime())))
                 .entrySet().stream()
                 .map(entry -> {
-                    String size = entry.getKey();
+                    String key = entry.getKey();
                     List<RollHeightDetails> detailsList = entry.getValue();
 
-                    int totalCount = detailsList.stream()
+                    int currentDateCount = detailsList.stream()
                             .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
                             .sum();
 
-                    BigDecimal totalBlankOutput = detailsList.stream()
+                    BigDecimal currentBlankOutput = detailsList.stream()
                             .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
                             .reduce(BigDecimal.ZERO, BigDecimal::add)
                             .setScale(4, BigDecimal.ROUND_HALF_UP);
 
-                    RollHistoryDetailVo rollHistoryDetailVo = new RollHistoryDetailVo();
-                    rollHistoryDetailVo.setSize(size);
-                    rollHistoryDetailVo.setAmountTotal(totalCount);
-                    rollHistoryDetailVo.setBlankOutput(totalBlankOutput);
-                    return rollHistoryDetailVo;
+                    RollSendDetailsVO.RollHistoryDetail rollHistoryDetail = new RollSendDetailsVO.RollHistoryDetail();
+                    rollHistoryDetail.setCurrentDate(key);
+                    rollHistoryDetail.setCurrentDateAmount(currentDateCount);
+                    rollHistoryDetail.setCurrentDateWeight(currentBlankOutput);
+
+                    List<RollSendDetailsVO.CurrentDateDetail> currentDateDetails = detailsList.stream()
+                            .collect(Collectors.groupingBy(RollHeightDetails::getSize))
+                            .entrySet().stream()
+                            .map(sizeEntry -> {
+                                String size = sizeEntry.getKey();
+                                List<RollHeightDetails> sizeList = sizeEntry.getValue();
+
+                                int sizeCount = sizeList.stream()
+                                        .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
+                                        .sum();
+
+                                BigDecimal sizeBlankOutput = sizeList.stream()
+                                        .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                        .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+                                RollSendDetailsVO.CurrentDateDetail currentDateDetail = new RollSendDetailsVO.CurrentDateDetail();
+                                currentDateDetail.setSize(size);
+                                currentDateDetail.setAmount(sizeCount);
+                                currentDateDetail.setBlankOutput(sizeBlankOutput);
+                                return currentDateDetail;
+                            }).collect(Collectors.toList());
+
+                    rollHistoryDetail.setCurrentDateDetails(currentDateDetails);
+
+                    return rollHistoryDetail;
                 }).collect(Collectors.toList());
 
-        // 组装最终对象
-        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
-        rollOnDutyVo.setRollHistoryDetailList(historyDetailList);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
-        return rollOnDutyVo;
+        // 按 currentDate 降序排序
+        rollHistoryDetails.sort(Comparator.comparing(
+                detail -> LocalDate.parse(detail.getCurrentDate(), formatter), // 转换 String -> LocalDate
+                Comparator.reverseOrder() // 降序
+        ));
+
+        rollSendDetailsVO.setRollHistoryDetails(rollHistoryDetails);
+
+        return rollSendDetailsVO;
     }
 
 

+ 11 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOutShipp/controller/RollOutShippDetailsController.java

@@ -13,6 +13,8 @@ import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShippDetails;
 import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippDetailsService;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
+import org.jeecg.modules.billet.storageBill.vo.RollChargeDetailsVO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -167,4 +169,13 @@ public class RollOutShippDetailsController extends JeecgController<RollOutShippD
 		 RollOnDutyDataVo rollOnDutyVo = rollOutShippDetailsService.queryOnDutyRecord(ccmNo);
 		 return Result.OK(rollOnDutyVo);
 	 }
+
+
+	 @ApiOperation(value = "轧钢外运工作台总接收明细信息", notes = "轧钢外运工作台总接收明细信息")
+	 @GetMapping(value = "/rollOutShippWorkbenchesDetail")
+	 public Result<RollChargeDetailsVO> rollOutShippWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
+		 RollChargeDetailsVO rollChargeDetailsVO = rollOutShippDetailsService.queryWorkbenchesDetail(queryDTO);
+		 return Result.OK(rollChargeDetailsVO);
+	 }
 }

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

@@ -2,6 +2,8 @@ package org.jeecg.modules.billet.rollOutShipp.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShippDetails;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
+import org.jeecg.modules.billet.storageBill.vo.RollChargeDetailsVO;
 import org.jeecg.modules.billet.storageBill.vo.RollOnDutyDataVo;
 
 /**
@@ -14,4 +16,6 @@ public interface IRollOutShippDetailsService extends IService<RollOutShippDetail
 
     RollOnDutyDataVo queryOnDutyRecord(String ccmNo);
 
+    RollChargeDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO);
+
 }

+ 112 - 23
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/rollOutShipp/service/impl/RollOutShippDetailsServiceImpl.java

@@ -3,13 +3,14 @@ package org.jeecg.modules.billet.rollOutShipp.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.billet.billetHotsendChangeShift.entity.BilletHotsendChangeShift;
 import org.jeecg.modules.billet.billetHotsendChangeShift.service.IBilletHotsendChangeShiftService;
-import org.jeecg.modules.billet.rollClubThree.entity.RollClubThreeDetails;
 import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShippDetails;
 import org.jeecg.modules.billet.rollOutShipp.mapper.RollOutShippDetailsMapper;
 import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippDetailsService;
+import org.jeecg.modules.billet.storageBill.dto.RollDetailQueryDTO;
 import org.jeecg.modules.billet.storageBill.entity.StorageBill;
 import org.jeecg.modules.billet.storageBill.mapper.StorageBillMapper;
 import org.jeecg.modules.billet.storageBill.vo.*;
@@ -19,9 +20,9 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -119,41 +120,129 @@ public class RollOutShippDetailsServiceImpl extends ServiceImpl<RollOutShippDeta
                     return infoVo;
                 }).collect(Collectors.toList());
 
-        // 7. 计算历史数据统计
+
+        // 7. 组装最终对象
+        rollOnDutyVo.setRollOnDutyRecordList(recordVoList);
+        rollOnDutyVo.setRollOnDutyDetailList(detailVoList);
+        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
+
+        return rollOnDutyVo;
+    }
+
+
+    @Override
+    public RollChargeDetailsVO queryWorkbenchesDetail(RollDetailQueryDTO queryDTO) {
+
         LambdaQueryWrapper<RollOutShippDetails> historyQueryWrapper = new LambdaQueryWrapper<>();
-        historyQueryWrapper.eq(RollOutShippDetails::getCcmNo, ccmNo);
+        historyQueryWrapper.eq(RollOutShippDetails::getCcmNo, queryDTO.getCcmNo());
+
+        Date beginDate = queryDTO.getBeginCreateDate();
+        Date endDate = queryDTO.getEndCreateDate();
+
+        // 如果 beginCreateDate 和 endCreateDate 都为空,默认查询最近 7 天的数据
+        if (beginDate == null && endDate == null) {
+            beginDate = DateUtils.getStartOfDayByDate(DateUtils.getDateBeforeDays(7)); // 7 天前 00:00:00
+            endDate = DateUtils.getEndOfDayByDate(new Date()); // 当前时间 23:59:59
+        }
+
+        // 处理 beginCreateDate
+        if (beginDate != null) {
+            historyQueryWrapper.ge(RollOutShippDetails::getCreateTime, DateUtils.getStartOfDayByDate(beginDate));
+        }
+
+        // 处理 endCreateDate
+        if (endDate != null) {
+            historyQueryWrapper.le(RollOutShippDetails::getCreateTime, DateUtils.getEndOfDayByDate(endDate));
+        }
+
+        List<RollOutShippDetails> rollClubHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
 
-        List<RollOutShippDetails> rollOutShippHistoryDetailsList = baseMapper.selectList(historyQueryWrapper);
-        List<RollHistoryDetailVo> historyDetailList = rollOutShippHistoryDetailsList.stream()
-                .collect(Collectors.groupingBy(RollOutShippDetails::getSize))
+        // 计算总支数
+        int totalCount = rollClubHistoryDetailsList.stream()
+                .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
+                .sum();
+
+        // 计算总重量
+        BigDecimal totalWeight = rollClubHistoryDetailsList.stream()
+                .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+        // 创建 VO 并赋值
+        RollChargeDetailsVO rollChargeDetailsVO = new RollChargeDetailsVO();
+        rollChargeDetailsVO.setAmountTotal(totalCount);
+        rollChargeDetailsVO.setTotalWeight(totalWeight);
+
+
+        List<RollChargeDetailsVO.RollHistoryDetail> rollHistoryDetails = rollClubHistoryDetailsList.stream()
+                .collect(Collectors.groupingBy(detail -> DateUtils.formatDate(detail.getCreateTime())))
                 .entrySet().stream()
                 .map(entry -> {
-                    String size = entry.getKey();
+                    String key = entry.getKey();
                     List<RollOutShippDetails> detailsList = entry.getValue();
 
-                    int totalCount = detailsList.stream()
+                    // 统计不重复的 storageBillId 个数,返回 Integer 类型
+                    int uniqueStorageBillCount = (int) detailsList.stream()
+                            .map(RollOutShippDetails::getStorageBillId)
+                            .filter(Objects::nonNull)
+                            .collect(Collectors.toSet()) // 直接收集到 Set 去重
+                            .size();
+
+
+                    int currentDateCount = detailsList.stream()
                             .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
                             .sum();
 
-                    BigDecimal totalBlankOutput = detailsList.stream()
+                    BigDecimal currentBlankOutput = detailsList.stream()
                             .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
                             .reduce(BigDecimal.ZERO, BigDecimal::add)
                             .setScale(4, BigDecimal.ROUND_HALF_UP);
 
-                    RollHistoryDetailVo rollHistoryDetailVo = new RollHistoryDetailVo();
-                    rollHistoryDetailVo.setSize(size);
-                    rollHistoryDetailVo.setAmountTotal(totalCount);
-                    rollHistoryDetailVo.setBlankOutput(totalBlankOutput);
-                    return rollHistoryDetailVo;
+                    RollChargeDetailsVO.RollHistoryDetail rollHistoryDetail = new RollChargeDetailsVO.RollHistoryDetail();
+                    rollHistoryDetail.setCurrentDate(key);
+                    rollHistoryDetail.setCurrentDateAmount(currentDateCount);
+                    rollHistoryDetail.setCurrentDateWeight(currentBlankOutput);
+                    rollHistoryDetail.setCarNum(uniqueStorageBillCount);
+
+                    List<RollChargeDetailsVO.CurrentDateDetail> currentDateDetails = detailsList.stream()
+                            .collect(Collectors.groupingBy(RollOutShippDetails::getSize))
+                            .entrySet().stream()
+                            .map(sizeEntry -> {
+                                String size = sizeEntry.getKey();
+                                List<RollOutShippDetails> sizeList = sizeEntry.getValue();
+
+                                int sizeCount = sizeList.stream()
+                                        .mapToInt(detail -> (detail.getStackAddr() == null || detail.getStackAddr().isEmpty()) ? 1 : 4)
+                                        .sum();
+
+                                BigDecimal sizeBlankOutput = sizeList.stream()
+                                        .map(detail -> BigDecimal.valueOf(detail.getBlankOutput()))
+                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                        .setScale(4, BigDecimal.ROUND_HALF_UP);
+
+                                RollChargeDetailsVO.CurrentDateDetail currentDateDetail = new RollChargeDetailsVO.CurrentDateDetail();
+                                currentDateDetail.setSize(size);
+                                currentDateDetail.setAmount(sizeCount);
+                                currentDateDetail.setBlankOutput(sizeBlankOutput);
+                                return currentDateDetail;
+                            }).collect(Collectors.toList());
+
+                    rollHistoryDetail.setCurrentDateDetails(currentDateDetails);
+
+                    return rollHistoryDetail;
                 }).collect(Collectors.toList());
 
-        // 8. 组装最终对象
-        rollOnDutyVo.setRollOnDutyRecordList(recordVoList);
-        rollOnDutyVo.setRollOnDutyDetailList(detailVoList);
-        rollOnDutyVo.setRollOnDutyInfoList(infoVoList);
-        rollOnDutyVo.setRollHistoryDetailList(historyDetailList);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
-        return rollOnDutyVo;
+        // 按 currentDate 降序排序
+        rollHistoryDetails.sort(Comparator.comparing(
+                detail -> LocalDate.parse(detail.getCurrentDate(), formatter), // 转换 String -> LocalDate
+                Comparator.reverseOrder() // 降序
+        ));
+
+        rollChargeDetailsVO.setRollHistoryDetails(rollHistoryDetails);
+
+        return rollChargeDetailsVO;
     }
 
 

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

@@ -0,0 +1,18 @@
+package org.jeecg.modules.billet.storageBill.dto;
+
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class RollDetailQueryDTO {
+
+    private String ccmNo;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date beginCreateDate;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date endCreateDate;
+}

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

@@ -0,0 +1,51 @@
+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 RollChargeDetailsVO {
+
+    @ApiModelProperty(value = "总支数")
+    private Integer amountTotal;
+
+    @ApiModelProperty(value = "总重量")
+    private BigDecimal totalWeight;
+
+    private List<RollChargeDetailsVO.RollHistoryDetail> rollHistoryDetails;
+
+    @Data
+    public static class RollHistoryDetail {
+
+        public String currentDate;
+
+        @ApiModelProperty(value = "当天支数")
+        private Integer currentDateAmount;
+
+        @ApiModelProperty(value = "当天出坯量")
+        private BigDecimal currentDateWeight;
+
+        @ApiModelProperty(value = "当天车次")
+        private Integer carNum;
+
+        private List<RollChargeDetailsVO.CurrentDateDetail> currentDateDetails;
+
+    }
+
+    @Data
+    public static class CurrentDateDetail {
+
+        @ApiModelProperty(value = "定尺")
+        private String size;
+
+        @ApiModelProperty(value = "支数")
+        private Integer amount;
+
+        @ApiModelProperty(value = "出坯量")
+        private BigDecimal blankOutput;
+
+    }
+}

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

@@ -0,0 +1,48 @@
+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 RollSendDetailsVO {
+
+    @ApiModelProperty(value = "总支数")
+    private Integer amountTotal;
+
+    @ApiModelProperty(value = "总重量")
+    private BigDecimal totalWeight;
+
+    private List<RollSendDetailsVO.RollHistoryDetail> rollHistoryDetails;
+
+    @Data
+    public static class RollHistoryDetail {
+
+        public String currentDate;
+
+        @ApiModelProperty(value = "支数")
+        private Integer currentDateAmount;
+
+        @ApiModelProperty(value = "出坯量")
+        private BigDecimal currentDateWeight;
+
+        private List<RollSendDetailsVO.CurrentDateDetail> currentDateDetails;
+
+    }
+
+    @Data
+    public static class CurrentDateDetail {
+
+        @ApiModelProperty(value = "定尺")
+        private String size;
+
+        @ApiModelProperty(value = "支数")
+        private Integer amount;
+
+        @ApiModelProperty(value = "出坯量")
+        private BigDecimal blankOutput;
+
+    }
+}