Ver Fonte

新增原矿报表

donglang há 1 dia atrás
pai
commit
e8207ae112

+ 31 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppWayBillController.java

@@ -12,6 +12,7 @@ import com.sckw.transport.model.dto.WaybillListAppDTO;
 import com.sckw.transport.model.param.*;
 import com.sckw.transport.model.vo.OrderTotalTakeVo;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
+import com.sckw.transport.model.vo.WaybillOrderRawOreReportRespExcelVO;
 import com.sckw.transport.model.vo.WaybillOrderReportRespExcelVO;
 import com.sckw.transport.service.KwtLogisticsConsignmentService;
 import com.sckw.transport.service.KwtWaybillManagementService;
@@ -437,7 +438,7 @@ public class AppWayBillController {
     }
 
     /**
-     * 运单每日报表
+     * 运单每日销售报表
      *
      * @param param
      * @return
@@ -450,7 +451,7 @@ public class AppWayBillController {
 
 
     /**
-     * 导出
+     * 销售报表导出
      * @param params
      * @param response
      */
@@ -463,5 +464,33 @@ public class AppWayBillController {
         ExcelUtil.downData(response, WaybillOrderReportRespExcelVO.class, list);
     }
 
+    /**
+     * 运单每日内转报表
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "运单每日内转报表", description = "运单每日内转报表")
+    @PostMapping("/queryWaybillOrderRawOreReport")
+    public BaseResult<List<WaybillOrderRawOreReportResp>> queryWaybillOrderRawOreReport(@RequestBody @Valid WaybillOrderReportQueryParam param){
+        return BaseResult.success( waybillOrderService.queryWaybillOrderRawOreReport(param));
+    }
+
+
+    /**
+     * 内转台账导出
+     * @param params
+     * @param response
+     */
+    @PostMapping(value = "/exportRawOre")
+    public void exportRawOre(@RequestBody @Validated WaybillOrderReportQueryParam params, HttpServletResponse response) {
+        List<WaybillOrderRawOreReportRespExcelVO> list = waybillOrderService.exportRawOreReport(params);
+        if (CollectionUtils.isEmpty(list)) {
+            throw new CustomPromptException(HttpStatus.SUCCESS_CODE, "暂无数据,请确认");
+        }
+        ExcelUtil.downData(response, WaybillOrderRawOreReportRespExcelVO.class, list);
+    }
+
+
 
 }

+ 144 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderRawOreReportResp.java

@@ -0,0 +1,144 @@
+package com.sckw.transport.model.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 分页查询原矿运单每日报表
+ * @create :2025-11-11 20:16:00
+ */
+@Data
+public class WaybillOrderRawOreReportResp implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = 7250765223450002067L;
+
+    /**
+     * 运单id
+     */
+    @Schema(description = "运单id")
+    private Long id;
+
+    /**
+     * 运单编号
+     */
+    @Schema(description = "运单订单编号")
+    private String logisticsNo;
+
+    /**
+     * 运单编号
+     */
+    @Schema(description = "运单编号")
+    private String waybillNo;
+
+    /**
+     * 商品id
+     */
+    @Schema(description = "商品id")
+    private Long dictId;
+
+    /**
+     * 商品名称
+     */
+    @Schema(description = "商品名称")
+    private String goodsName;
+
+    /**
+     * 车牌号
+     */
+    @Schema(description = "车牌号")
+    private String truckNo;
+
+    /**
+     * 接单时间
+     */
+    @Schema(description = "接单时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date acceptTime;
+
+    /**
+     * 装货皮重
+     */
+    @Schema(description = "装货皮重")
+    private BigDecimal loadTareAmount;
+
+    /**
+     * 装货毛重
+     */
+    @Schema(description = "装货毛重")
+    private BigDecimal loadGrossAmount;
+
+    /**
+     * 装货净重
+     */
+    @Schema(description = "装货净重")
+    private BigDecimal loadAmount;
+
+    /**
+     * 装货皮重时间
+     */
+    @Schema(description = "装货皮重时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date loadTareAmountTime;
+
+    /**
+     * 装货毛重时间
+     */
+    @Schema(description = "装货毛重时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date loadGrossTime;
+
+    /**
+     * 装货过磅联系人
+     */
+    @Schema(description = "装货过磅联系人")
+    private String loadPerson;
+
+    /**
+     * 卸货皮重
+     */
+    @Schema(description = "卸货皮重")
+    private BigDecimal unLoadTareAmount;
+
+    /**
+     * 卸货毛重
+     */
+    @Schema(description = "卸货毛重")
+    private BigDecimal unLoadGrossAmount;
+
+    /**
+     * 卸货净重
+     */
+    @Schema(description = "卸货净重")
+    private BigDecimal unLoadAmount;
+
+    /**
+     * 卸货皮重时间
+     */
+    @Schema(description = "卸货皮重时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date unLoadTareAmountTime;
+
+    /**
+     * 卸货毛重时间
+     */
+    @Schema(description = "卸货毛重时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date unLoadGrossTime;
+
+    /**
+     * 卸货过磅联系人
+     */
+    @Schema(description = "卸货过磅联系人")
+    private String unLoadPerson;
+
+}

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderReportQueryParam.java

@@ -18,7 +18,7 @@ import java.util.List;
  * @create :2025-11-13 08:59:00
  */
 @Data
-public class WaybillOrderReportQueryParam extends PageReq implements Serializable {
+public class WaybillOrderReportQueryParam implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 7250765223450002065L;

+ 99 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderRawOreReportRespExcelVO.java

@@ -0,0 +1,99 @@
+package com.sckw.transport.model.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sckw.excel.annotation.ExcelContext;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 分页查询原矿运单每日报表
+ * @create :2025-11-11 20:16:00
+ */
+@Data
+@ExcelContext(fileName = "内转每日报表", sheetName = "内转报表台账")
+public class WaybillOrderRawOreReportRespExcelVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7250765223450002068L;
+
+
+    @ExcelProperty(value = "运单订单编号")
+    private String logisticsNo;
+
+
+    @ExcelProperty(value = "运单编号")
+    private String waybillNo;
+
+
+    @ExcelProperty(value = "商品名称")
+    private String goodsName;
+
+
+    @ExcelProperty(value = "车牌号")
+    private String truckNo;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelProperty(value = "接单时间")
+    private Date acceptTime;
+
+
+    @ExcelProperty(value = "装货皮重(吨)")
+    private BigDecimal loadTareAmount;
+
+
+    @ExcelProperty(value = "装货毛重(吨)")
+    private BigDecimal loadGrossAmount;
+
+
+    @ExcelProperty(value = "装货净重(吨)")
+    private BigDecimal loadAmount;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelProperty(value = "装货皮重时间")
+    private Date loadTareAmountTime;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelProperty(value = "装货毛重时间")
+    private Date loadGrossTime;
+
+
+    @ExcelProperty(value = "装货过磅联系人")
+    private String loadPerson;
+
+
+    @ExcelProperty(value = "卸货皮重(吨)")
+    private BigDecimal unLoadTareAmount;
+
+
+    @ExcelProperty(value = "卸货毛重(吨)")
+    private BigDecimal unLoadGrossAmount;
+
+
+    @ExcelProperty(value = "卸货净重(吨)")
+    private BigDecimal unLoadAmount;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelProperty(value = "卸货皮重时间")
+    private Date unLoadTareAmountTime;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelProperty(value = "卸货毛重时间")
+    private Date unLoadGrossTime;
+
+
+    @ExcelProperty(value = "卸货过磅联系人")
+    private String unLoadPerson;
+
+}

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderReportRespExcelVO.java

@@ -17,7 +17,7 @@ import java.util.Date;
  * @create :2025-11-11 20:16:00
  */
 @Data
-@ExcelContext(fileName = "每日报表", sheetName = "报表台账")
+@ExcelContext(fileName = "销售每日报表", sheetName = "销售报表台账")
 public class WaybillOrderReportRespExcelVO implements Serializable {
 
     @Serial

+ 7 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java

@@ -177,4 +177,11 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                 .orderByDesc(KwtLogisticsOrder::getCreateTime)
                 .orderByDesc(KwtLogisticsOrder::getId));
     }
+
+    public List<KwtLogisticsOrder> queryByIdsAndOrderType(Set<Long> logOrderIds) {
+        return list(Wrappers.<KwtLogisticsOrder>lambdaQuery()
+                .eq(KwtLogisticsOrder::getDelFlag, 0)
+                .in(KwtLogisticsOrder::getId, logOrderIds)
+                .eq(KwtLogisticsOrder::getOrderType, 1));
+    }
 }

+ 7 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderUnitRepository.java

@@ -97,4 +97,11 @@ public class KwtLogisticsOrderUnitRepository extends ServiceImpl<KwtLogisticsOrd
                         .orderByDesc(KwtLogisticsOrderUnit::getCreateTime)
         );
     }
+
+    public List<KwtLogisticsOrderUnit> queryByEntIdAndUnitType(Long entId, int unitType) {
+        return list(Wrappers.<KwtLogisticsOrderUnit>lambdaQuery()
+                .eq(KwtLogisticsOrderUnit::getDelFlag,0)
+                .eq(KwtLogisticsOrderUnit::getEntId, entId)
+                .eq(KwtLogisticsOrderUnit::getUnitType,unitType));
+    }
 }

+ 267 - 10
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -36,6 +36,7 @@ import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.*;
 import com.sckw.transport.model.vo.OrderTotalTakeVo;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
+import com.sckw.transport.model.vo.WaybillOrderRawOreReportRespExcelVO;
 import com.sckw.transport.model.vo.WaybillOrderReportRespExcelVO;
 import com.sckw.transport.repository.*;
 import com.sckw.transport.service.KwtWaybillOrderV1Service;
@@ -1983,7 +1984,7 @@ public class WaybillOrderService {
      * @return
      */
     public List<WaybillOrderReportResp> queryWaybillOrderReport(WaybillOrderReportQueryParam param) {
-        log.info("[报表]开始查询运单每日报表:{}", JSON.toJSONString(param));
+        log.info("[报表]开始查询销售运单每日报表:{}", JSON.toJSONString(param));
         // 查询运单数据
         List<WaybillOrderReportResp> orderRepoost = getWaybillOrderRepoost(param);
         // 过滤
@@ -2098,6 +2099,7 @@ public class WaybillOrderService {
                 .ge(KwtWaybillOrder::getCreateTime, startOfDay)
                 .le(KwtWaybillOrder::getCreateTime, endOfDay)
                 .eq(KwtWaybillOrder::getStatus,25)
+                .isNull(KwtWaybillOrder::getRemark)
                 .eq(KwtWaybillOrder::getDelFlag, 0)
                 .orderByDesc(KwtWaybillOrder::getUpdateTime);
 
@@ -2171,7 +2173,7 @@ public class WaybillOrderService {
      * 将扁平的运单列表转换为“汇总行在前,明细在后”的报表格式
      */
     public List<WaybillOrderReportResp> filter(WaybillOrderReportQueryParam param, List<WaybillOrderReportResp> orderRepoost) {
-        log.info("[报表]开始每日报表模糊查询,size:{}", orderRepoost.size());
+        log.info("[报表]开始每日销售报表模糊查询,size:{}", orderRepoost.size());
         if (orderRepoost == null || orderRepoost.isEmpty()) {
             return Collections.emptyList();
         }
@@ -2195,7 +2197,7 @@ public class WaybillOrderService {
 
                 }).collect(Collectors.toList());
 
-        log.info("[报表]每日报表模糊查询结束,size:{}", reportResps.size());
+        log.info("[报表]每日销售报表模糊查询结束,size:{}", reportResps.size());
         return reportResps;
     }
 
@@ -2204,7 +2206,7 @@ public class WaybillOrderService {
      * 将扁平的运单列表转换为“汇总行在前,明细在后”的报表格式
      */
     public List<WaybillOrderReportResp> buildGroupedReport(List<WaybillOrderReportResp> rawList) {
-        log.info("[报表]开始分组汇总!");
+        log.info("[报表]开始销售报表分组汇总!");
         if (rawList == null || rawList.isEmpty()) {
             return Collections.emptyList();
         }
@@ -2239,7 +2241,7 @@ public class WaybillOrderService {
             WaybillOrderReportResp summaryRow = createSummaryRow(firstItem, details);
             resultList.add(summaryRow);
         }
-        log.info("[报表]分组汇总结束!");
+        log.info("[报表]销售报表分组汇总结束!");
         return resultList;
     }
 
@@ -2284,14 +2286,269 @@ public class WaybillOrderService {
      * @return
      */
     public List<WaybillOrderReportRespExcelVO> exportReport(WaybillOrderReportQueryParam param) {
-        log.info("[报表]开始查询运单每日报表:{}", JSON.toJSONString(param));
+        log.info("[报表]导出销售运单每日报表:{}", JSON.toJSONString(param));
         // 查询运单数据
-        List<WaybillOrderReportResp> orderRepoost = getWaybillOrderRepoost(param);
+        List<WaybillOrderReportResp> orderGroupedReportList = queryWaybillOrderReport(param);
+
+        return BeanUtils.copyToList(orderGroupedReportList, WaybillOrderReportRespExcelVO.class);
+    }
+
+    /**
+     * 查询运单每日内转报表
+     * @param param
+     * @return
+     */
+    public List<WaybillOrderRawOreReportResp> queryWaybillOrderRawOreReport(WaybillOrderReportQueryParam param) {
+        log.info("[报表]开始查询原矿运单每日报表:{}", JSON.toJSONString(param));
+        // 查询运单数据
+        List<WaybillOrderRawOreReportResp> orderRepoost = getWaybillOrderRawOreRepoost(param);
         // 过滤
-        List<WaybillOrderReportResp> filterOrderRepoost = filter(param, orderRepoost);
+        List<WaybillOrderRawOreReportResp> filterOrderRepoost = filterRawOre(param, orderRepoost);
+
         //汇总数据
-        List<WaybillOrderReportResp> orderGroupedReportList = buildGroupedReport(filterOrderRepoost);
-        return BeanUtils.copyToList(orderGroupedReportList, WaybillOrderReportRespExcelVO.class);
+        List<WaybillOrderRawOreReportResp> orderGroupedReportList = buildGroupedRawOreReport(filterOrderRepoost);
+
+        return orderGroupedReportList;
+    }
+
+    /**
+     * 原矿订单
+     * @param param
+     * @return
+     */
+    private List<WaybillOrderRawOreReportResp> getWaybillOrderRawOreRepoost(WaybillOrderReportQueryParam param) {
+        // 1. 物流企业
+        List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByEntIdAndUnitType(param.getEntId(), Global.NUMERICAL_ONE);
+        if (CollectionUtils.isEmpty(logOrderUnits)) {
+            log.info("当前企业无物流订单企业信息!,entId:{}", param.getEntId());
+            return Collections.emptyList();
+        }
+        log.info("物流关联企业,size:{}", logOrderUnits.size());
+        Set<Long> logOrderIds = logOrderUnits.stream().map(KwtLogisticsOrderUnit::getLOrderId).collect(Collectors.toSet());
+
+        // 2. 物流订单
+        List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByIdsAndOrderType(logOrderIds);
+        if (CollectionUtils.isEmpty(logisticsOrders)) {
+            log.info("当前无物流订单信息!,entId:{}", JSON.toJSONString(logisticsOrders));
+            return Collections.emptyList();
+        }
+        log.info("物流订单,size:{}", logisticsOrders.size());
+
+        Set<Long> lOrderIds= logisticsOrders.stream().map(KwtLogisticsOrder::getId).collect(Collectors.toSet());
+        Map<Long, KwtLogisticsOrder> logOrderMap = logisticsOrders.stream()
+                .collect(Collectors.toMap(KwtLogisticsOrder::getId, Function.identity(), (x, y) -> x));
+
+
+        // 3.运单
+        List<KwtWaybillOrder> waybillOrderList = queryWaybillOrders(param, lOrderIds);
+        if (CollectionUtils.isEmpty(waybillOrderList)) {
+            return new ArrayList<>();
+        }
+        List<Long> wOrderIds = waybillOrderList.stream().map(KwtWaybillOrder::getId).collect(Collectors.toList());
+        log.info("运单,size:{}", wOrderIds.size());
+
+        // 4. 运单装货单
+        List<KwtWaybillOrderTicket> ticketList = waybillOrderTicketRepository.queryByWOrderIds(wOrderIds);
+        if (CollectionUtils.isEmpty(ticketList)) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "运单装货单不存在,wOrderIds:" + JSON.toJSONString(wOrderIds));
+        }
+        log.info("运单装货单,size:{}", ticketList.size());
+        Map<String, KwtWaybillOrderTicket> ticketMap = ticketList.stream().collect(Collectors
+                .toMap(ticket -> ticket.getWOrderId() + "-" + ticket.getType(), Function.identity(), (x, y) -> x));
+
+        // 5.门卫
+        List<KwtGatekeeperWaybillOrder> gatekeepers = gatekeeperWaybillOrderRepository.queryGatekeeperByWaybillOrders(wOrderIds, Global.ADDRESS_LOAD);
+        if (CollectionUtils.isEmpty(gatekeepers)) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "门卫运单不存在,wOrderIds:" + JSON.toJSONString(wOrderIds));
+        }
+        log.info("门卫,size:{}", gatekeepers.size());
+        Map<String, KwtGatekeeperWaybillOrder> gatekeeperMap = gatekeepers.stream().collect(Collectors
+                .toMap(gate ->gate.getWOrderId() + "-" + gate.getType(), Function.identity(), (x, y) -> x));
+
+        //6.铲车
+        List<KwtForkliftWaybillOrder> forklifts = forkliftWaybillOrderRepository.queryForkliftByWOrderIdsAndType(wOrderIds, Global.NUMERICAL_ZERO);
+        if (CollectionUtils.isEmpty(forklifts)) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "铲车订单不存在,wOrderIds:" + JSON.toJSONString(wOrderIds));
+        }
+        log.info("铲车,size:{}", forklifts.size());
+        Map<Long, KwtForkliftWaybillOrder> forkliftMap = forklifts.stream().collect(Collectors.toMap(KwtForkliftWaybillOrder::getWOrderId, Function.identity(), (x, y) -> x));
+
+        //组装参数
+        List<WaybillOrderRawOreReportResp> orderList = waybillOrderList.stream()
+                .map(waybillOrder -> {
+                    return getWaybillOrderRawOreReport(waybillOrder,logOrderMap, ticketMap, gatekeeperMap, forkliftMap);
+                }).collect(Collectors.toList());
+        log.info("[报表]查询运单每日报表结束,还未分组, size:{}",orderList.size());
+        return orderList;
+    }
+
+
+    /**
+     * 查询正常流程物流运单
+     * @param param
+     * @return
+     */
+    private WaybillOrderRawOreReportResp getWaybillOrderRawOreReport(KwtWaybillOrder waybillOrder,
+                                                                     Map<Long, KwtLogisticsOrder> logOrderMap,
+                                                                     Map<String, KwtWaybillOrderTicket> ticketMap,
+                                                                     Map<String, KwtGatekeeperWaybillOrder> gatekeeperMap,
+                                                                     Map<Long, KwtForkliftWaybillOrder> forkliftMap) {
+
+        //订单
+        KwtLogisticsOrder logOrder = logOrderMap.getOrDefault(waybillOrder.getLOrderId(), new KwtLogisticsOrder());
+        //运单装货单
+        KwtWaybillOrderTicket loadTicket = ticketMap.getOrDefault(waybillOrder.getId() + "-" + 1, new KwtWaybillOrderTicket());
+        //运单卸货单
+        KwtWaybillOrderTicket unLoadTicket = ticketMap.getOrDefault(waybillOrder.getId() + "-" + 2, new KwtWaybillOrderTicket());
+        //门卫装货单
+        KwtGatekeeperWaybillOrder loadGatekeeper = gatekeeperMap.getOrDefault(waybillOrder.getId() + "-" + 1, new KwtGatekeeperWaybillOrder());
+        //门卫卸货单
+        KwtGatekeeperWaybillOrder unLoadGatekeeper = gatekeeperMap.getOrDefault(waybillOrder.getId() + "-" + 2, new KwtGatekeeperWaybillOrder());
+        //铲车
+        KwtForkliftWaybillOrder forklift = forkliftMap.getOrDefault(waybillOrder.getId(), new KwtForkliftWaybillOrder());
+
+        WaybillOrderRawOreReportResp resp = new WaybillOrderRawOreReportResp();
+        resp.setId(waybillOrder.getId());
+        resp.setLogisticsNo(logOrder.getLOrderNo());
+        resp.setTruckNo(waybillOrder.getTruckNo());
+        resp.setAcceptTime(forklift.getWaybillAcceptTime());
+        resp.setLoadTareAmount(loadTicket.getTareAmount());
+        resp.setLoadGrossAmount(loadTicket.getGrossAmount());
+        resp.setLoadAmount(loadTicket.getAmount());
+        resp.setLoadTareAmountTime(loadTicket.getUpdateTime()); //  todo 修改
+        resp.setLoadGrossTime(loadTicket.getUpdateTime());
+        resp.setLoadPerson(loadGatekeeper.getGatekeeperName());
+
+        resp.setUnLoadTareAmount(unLoadTicket.getTareAmount());
+        resp.setUnLoadGrossAmount(unLoadTicket.getGrossAmount());
+        resp.setUnLoadAmount(unLoadTicket.getAmount());
+        resp.setUnLoadTareAmountTime(unLoadTicket.getUpdateTime());
+        resp.setUnLoadGrossTime(unLoadTicket.getUpdateTime()); // todo 修改
+        resp.setUnLoadPerson(unLoadGatekeeper.getGatekeeperName());
+
+        resp.setDictId(forklift.getDictId());
+        String goodsName = loadGatekeeper.getGoodsName();
+        // 商品名称
+        if (StringUtils.isNotBlank(goodsName)) {
+            int lastSlashIndex = goodsName.lastIndexOf("/");
+            String dictName = lastSlashIndex >= 0 ? goodsName.substring(lastSlashIndex + 1) : goodsName;
+            resp.setGoodsName(dictName);
+        }
+
+        return resp;
+
+    }
+
+    /**
+     * 将扁平的运单列表转换为“汇总行在前,明细在后”的报表格式
+     */
+    public List<WaybillOrderRawOreReportResp> filterRawOre(WaybillOrderReportQueryParam param, List<WaybillOrderRawOreReportResp> orderRepoost) {
+        log.info("[报表]开始每日原矿报表模糊查询,size:{}", orderRepoost.size());
+        if (orderRepoost == null || orderRepoost.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        //过滤
+        List<WaybillOrderRawOreReportResp> reportResps = orderRepoost.stream().filter(
+                report ->
+                        // 商品ID过滤
+                        CollectionUtils.isNotEmpty(param.getDictIds()) || param.getDictIds().contains(report.getDictId())
+        ).collect(Collectors.toList());
+
+        log.info("[报表]每日原矿报表模糊查询结束,size:{}", reportResps.size());
+        return reportResps;
+    }
+
+    /**
+     * 将扁平的运单列表转换为“汇总行在前,明细在后”的报表格式
+     */
+    public List<WaybillOrderRawOreReportResp> buildGroupedRawOreReport(List<WaybillOrderRawOreReportResp> rawList) {
+        log.info("[报表]开始原矿运单分组汇总!");
+        if (CollectionUtils.isEmpty(rawList)) {
+            return Collections.emptyList();
+        }
+
+        // 1. 排序优先级:商品名称 -> 离场时间(倒序或正序均可)
+        rawList.sort(Comparator.comparing(WaybillOrderRawOreReportResp::getGoodsName, Comparator.nullsLast(String::compareTo))
+                .thenComparing(WaybillOrderRawOreReportResp::getAcceptTime, Comparator.nullsLast(Date::compareTo)));
+
+        // 2. 分组:LinkedHashMap保持插入顺序
+        Map<String, List<WaybillOrderRawOreReportResp>> groupedMap = rawList.stream()
+                .collect(Collectors.groupingBy(
+                        WaybillOrderRawOreReportResp::getGoodsName,
+                        LinkedHashMap::new,
+                        Collectors.toList()
+                ));
+
+        List<WaybillOrderRawOreReportResp> resultList = new ArrayList<>();
+
+        // 3. 遍历组装:【汇总行】 -> 【明细行】
+        for (Map.Entry<String, List<WaybillOrderRawOreReportResp>> entry : groupedMap.entrySet()) {
+            List<WaybillOrderRawOreReportResp> details = entry.getValue();
+            if (details.isEmpty())  {
+                continue;
+            }
+
+            WaybillOrderRawOreReportResp firstItem = details.get(0);
+            // A. 添加【明细行】 ---
+            resultList.addAll(details);
+
+            // B. 创建并添加【汇总行】 ---
+            WaybillOrderRawOreReportResp summaryRow = createRawOreSummaryRow(firstItem, details);
+            resultList.add(summaryRow);
+        }
+        log.info("[报表]原矿运单分组汇总结束!");
+        return resultList;
+    }
+
+    /**
+     * 计算并生成一行汇总数据
+     */
+    private WaybillOrderRawOreReportResp createRawOreSummaryRow(WaybillOrderRawOreReportResp sample, List<WaybillOrderRawOreReportResp> details) {
+        log.info("[报表]开始生成一行汇总数据!");
+        WaybillOrderRawOreReportResp summary = new WaybillOrderRawOreReportResp();
+
+        // 复制分组维度的信息
+        summary.setId(-1L);
+
+        BigDecimal totalLoadTareAmount = BigDecimal.ZERO;
+        BigDecimal totalLoadGrossAmount = BigDecimal.ZERO;
+        BigDecimal totalLoadNetAmount = BigDecimal.ZERO;
+        BigDecimal totalUnLoadTareAmount = BigDecimal.ZERO;
+        BigDecimal totalUnLoadGrossAmount = BigDecimal.ZERO;
+        BigDecimal totalUnLoadAmountt = BigDecimal.ZERO;
+
+        // 累加计算
+        for (WaybillOrderRawOreReportResp item : details) {
+            totalLoadTareAmount = totalLoadTareAmount.add(item.getLoadTareAmount() != null ? item.getLoadTareAmount() : BigDecimal.ZERO);
+            totalLoadGrossAmount = totalLoadGrossAmount.add(item.getLoadGrossAmount() != null ? item.getLoadGrossAmount() : BigDecimal.ZERO);
+            totalLoadNetAmount = totalLoadNetAmount.add(item.getLoadAmount() != null ? item.getLoadAmount() : BigDecimal.ZERO);
+            totalUnLoadTareAmount = totalUnLoadTareAmount.add(item.getUnLoadTareAmount() != null ? item.getUnLoadTareAmount() : BigDecimal.ZERO);
+            totalUnLoadGrossAmount = totalUnLoadGrossAmount.add(item.getUnLoadGrossAmount() != null ? item.getUnLoadGrossAmount() : BigDecimal.ZERO);
+            totalUnLoadAmountt = totalUnLoadAmountt.add(item.getUnLoadAmount() != null ? item.getUnLoadAmount() : BigDecimal.ZERO);
+        }
+
+        // 赋值给汇总行
+        summary.setLoadTareAmount(totalLoadTareAmount);
+        summary.setLoadGrossAmount(totalLoadGrossAmount);
+        summary.setLoadAmount(totalLoadNetAmount);
+        summary.setUnLoadTareAmount(totalUnLoadTareAmount);
+        summary.setUnLoadGrossAmount(totalUnLoadGrossAmount);
+        summary.setUnLoadAmount(totalUnLoadAmountt);
+
+        log.info("[报表]生成一行汇总数据结束!");
+        return summary;
+    }
+
+    /**
+     * 查询运单每日报表
+     * @param param
+     * @return
+     */
+    public List<WaybillOrderRawOreReportRespExcelVO> exportRawOreReport(WaybillOrderReportQueryParam param) {
+        log.info("[报表]导出原矿运单每日报表:{}", JSON.toJSONString(param));
+        List<WaybillOrderRawOreReportResp> orderGroupedRawOreReportList = queryWaybillOrderRawOreReport(param);
+        return BeanUtils.copyToList(orderGroupedRawOreReportList, WaybillOrderRawOreReportRespExcelVO.class);
     }