Kaynağa Gözat

新增app状态统计接口

donglang 1 ay önce
ebeveyn
işleme
fceebcaff4

+ 1 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/ErrorCodeEnum.java

@@ -68,6 +68,7 @@ public enum ErrorCodeEnum {
     WAYBILL_ORDER_STATUS_ERROR("80005", " 物流运单状态异常"),
     WAYBILL_ORDER_TICKET_NOT_FOUND("80006", " 当前物流运单装卸货信息不存在"),
     WAYBILL_ORDER_NOT_TRUCK("80007", " 物流运单无关联车辆数据"),
+    WAYBILL_ORDER_NOT_TICKET("80007", " 物流运单无关联装卸货数据"),
 
 
 

+ 3 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillV1Enum.java

@@ -59,6 +59,9 @@ public enum CarWaybillV1Enum {
 
 
     public static String geDesc(Integer status) {
+        if (status == null) {
+            return null;
+        }
         for (CarWaybillV1Enum carWaybillV1Enum : EnumSet.allOf(CarWaybillV1Enum.class)) {
             if (carWaybillV1Enum.code.equals(status)) {
                 return carWaybillV1Enum.destination;

+ 26 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppWayBillController.java

@@ -8,6 +8,7 @@ import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.transport.model.dto.WaybillListAppDTO;
 import com.sckw.transport.model.param.*;
 import com.sckw.transport.model.vo.OrderCirculateTotalTakeVo;
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.service.KwtLogisticsConsignmentService;
 import com.sckw.transport.service.KwtWaybillManagementService;
 import com.sckw.transport.service.KwtWaybillManagementV1Service;
@@ -205,7 +206,7 @@ public class AppWayBillController {
     @Operation(summary = "查询完成运单和累计运输量", description = "查询司机关联的完成运单和累计运输量")
     @PostMapping("/queryTotalTake")
     public BaseResult<OrderCirculateTotalTakeVo> queryTotalTake(@RequestBody @Valid OrderCirculateTotalTakeParam param){
-        OrderCirculateTotalTakeVo totalTakeVo = logisticsConsignmentService.queryTotalTake(param);
+        OrderCirculateTotalTakeVo totalTakeVo = waybillOrderService.queryTotalTake(param);
         return BaseResult.success(totalTakeVo);
     }
 
@@ -216,12 +217,34 @@ public class AppWayBillController {
      * @param param
      * @return
      */
-    @Operation(summary = "查询物流订单", description = "查询司机关联车辆的物流订单")
+    @Operation(summary = "分页查询物流订单", description = "查询司机关联车辆的物流订单")
     @PostMapping("/queryTruckLogisticsOrder")
     public BaseResult<PageDataResult<LogisticsOrderResp>> queryTruckLogisticsOrder(@RequestBody @Valid OrderCirculateQueryParam param){
-        PageDataResult<LogisticsOrderResp> LogisticsOrderList = logisticsConsignmentService.queryTruckLogisticsOrder(param);
+        PageDataResult<LogisticsOrderResp> LogisticsOrderList = waybillOrderService.queryTruckLogisticsOrder(param);
         return BaseResult.success(LogisticsOrderList);
     }
+    
+    /**
+     * 分页查询运单
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "分页查询运单", description = "查询司机关联车辆接单的运单")
+    @PostMapping("/queryWaybillOrder")
+    public BaseResult<PageDataResult<WaybillOrderStatusResp>> queryWaybillOrder(@RequestBody @Valid WaybillOrderQueryParam param){
+        PageDataResult<WaybillOrderStatusResp> LogisticsOrderList = waybillOrderService.queryWaybillOrder(param);
+        return BaseResult.success(LogisticsOrderList);
+    }
+
+    /**
+     * 运单状态统计
+     */
+    @GetMapping("/statisticsWaybillOrder")
+    @Operation(summary = "运单状态统计")
+    public BaseResult<StatisticsWaybillResp> statisticsWaybillOrder() {
+        return BaseResult.success(waybillOrderService.statisticsWaybillOrder());
+    }
 
     /**
      * 物流订单接单

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java

@@ -252,6 +252,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         log.info("创建物流运单入参参数:{}", JSON.toJSONString(param));
         KwtWaybillOrder waybillOrder = new KwtWaybillOrder();
         waybillOrder.setEntId(param.getEntId());
+        waybillOrder.setLOrderId(param.getLogOrderId());
         waybillOrder.setWOrderNo(null); //TODO donglang
         waybillOrder.setType(1);
         waybillOrder.setTruckId(truckNo.getId());

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

@@ -32,7 +32,6 @@ public class OrderCirculateQueryParam extends PageReq implements Serializable {
      * 车牌号
      */
     @Schema(description = "车牌号")
-    @NotBlank(message = "车牌号不能为空!")
     private String truckNo;
 
 

+ 46 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderQueryParam.java

@@ -0,0 +1,46 @@
+package com.sckw.transport.model.param;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description :
+ * @create :2025-11-13 08:59:00
+ */
+@Data
+public class WaybillOrderQueryParam extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -9098396227857171692L;
+
+    /**
+     * 企业id
+     */
+    @Schema(description = "企业id")
+    @NotNull(message = "企业id不能为空!")
+    private Long entId;
+
+    /**
+     * 车牌号
+     */
+    @Schema(description = "车牌号")
+    private String truckNo;
+
+    /**
+     * 状态
+     */
+    @Schema(description = "状态")
+    @NotNull(message = "状态不能为空!")
+    private Integer status;
+
+
+
+
+}

+ 174 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderStatusResp.java

@@ -0,0 +1,174 @@
+package com.sckw.transport.model.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 分页查询运单信息响应参数
+ * @create :2025-11-11 20:16:00
+ */
+@Data
+public class WaybillOrderStatusResp implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -6153312023002477484L;
+
+    /**
+     * 物流订单id
+     */
+    @Schema(description = "物流订单id")
+    private String logisticsOrderId;
+
+    /**
+     * 物流订单编号
+     */
+    @Schema(description = "物流订单编号")
+    private String logisticsOrderNo;
+
+    /**
+     * 托运单位id
+     */
+    @Schema(description = "托运单位id")
+    private String consignCompanyId;
+
+    /**
+     * 托运单位名称
+     */
+    @Schema(description = "托运单位名称")
+    private String consignCompanyName;
+
+    /**
+     * 商品id
+     */
+    @Schema(description = "商品id")
+    private String goodsId;
+
+    /**
+     * 商品名称
+     */
+    @Schema(description = "商品名称")
+    private String goodsName;
+
+    /**
+     * 任务量
+     */
+    @Schema(description = "任务量")
+    private BigDecimal taskNum;
+
+    /**
+     * 皮重
+     */
+    @Schema(description = "皮重")
+    private BigDecimal tareAmount;
+
+    /**
+     * 毛重
+     */
+    @Schema(description = "毛重")
+    private BigDecimal grossAmount;
+
+    /**
+     * 装货净重
+     */
+    @Schema(description = "装货净化重")
+    private BigDecimal loadingNetWeight;
+
+    /**
+     * 卸货净重
+     */
+    @Schema(description = "卸货净重")
+    private BigDecimal unloadingNetWeight;
+
+    /**
+     * 法定载重
+     */
+    @Schema(description = "法定载重")
+    private BigDecimal legalLoad;
+
+    /**
+     * 计费方式
+     */
+    @Schema(description = "计费方式")
+    private String chargeType;
+
+    /**
+     * 计费方式描述
+     */
+    @Schema(description = "计费方式描述")
+    private String chargeTypeDesc;
+
+    /**
+     * 司机id
+     */
+    @Schema(description = "司机id")
+    private Long driverId;
+
+    /**
+     * 司机id
+     */
+    @Schema(description = "司机id")
+    private String driverName;
+
+    /**
+     * 司机电话
+     */
+    @Schema(description = "司机id")
+    private String driverPhone;
+
+    /**
+     * 装货地址
+     */
+    @Schema(description = "装货地址")
+    private String loadAddress;
+
+    /**
+     * 卸货地址
+     */
+
+    @Schema(description = "卸货地址")
+    private String unloadAddress;
+
+    /**
+     * 装卸货之间距离
+     */
+    @Schema(description = "装卸货之间距离")
+    private double distanceKm;
+
+    /**
+     * 派单时间
+     */
+    @Schema(description = "派单时间")
+    private String sendTime;
+
+    /**
+     * 派单人
+     */
+    @Schema(description = "派单人")
+    private String sendOperator;
+
+    /**
+     * 派单人电话
+     */
+    @Schema(description = "派单人电话")
+    private String sendPhone;
+
+    /**
+     * 状态
+     */
+    @Schema(description = "状态")
+    private Integer status;
+
+    /**
+     * 状态描述
+     */
+    @Schema(description = "状态描述")
+    private String statusDesc;
+
+
+}

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

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -27,7 +28,7 @@ public class StatisticsWaybillResp implements Serializable {
      * 状态信息集合
      */
     @Schema(description = "状态信息集合")
-    private List<OrderBillStatusStatistics> orderStatusStatistics;
+    private List<OrderBillStatusStatistics> orderStatusStatistics = new ArrayList<>();
     @Data
     public static class OrderBillStatusStatistics implements Serializable{
         @Serial

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

@@ -66,4 +66,11 @@ public class KwtLogisticsOrderCirculateRepository extends ServiceImpl<KwtLogisti
         );
     }
 
+    public List<KwtLogisticsOrderCirculate> queryByLogOrderIdsAndTruckNo(List<Long> logOrderIds, String truckNo) {
+        return list(Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery().eq(KwtLogisticsOrderCirculate::getDelFlag,0)
+                .in(KwtLogisticsOrderCirculate::getLOrderId, logOrderIds)
+                .eq(StringUtils.isNotBlank(truckNo), KwtLogisticsOrderCirculate::getTruckId, truckNo)
+        );
+    }
+
 }

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderTicketRepository.java

@@ -47,5 +47,11 @@ public class KwtWaybillOrderTicketRepository extends ServiceImpl<KwtWaybillOrder
                 .between(KwtWaybillOrderTicket::getOperateTime, loadStartTime, loadEndTime));
     }
 
+    public List<KwtWaybillOrderTicket> queryByWOrderIds(List<Long> wOrderIds) {
+        return list(Wrappers.<KwtWaybillOrderTicket>lambdaQuery()
+                .in(KwtWaybillOrderTicket::getWOrderId, wOrderIds)
+                .eq(KwtWaybillOrderTicket::getDelFlag, 0));
+    }
+
 
 }

+ 0 - 220
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -173,13 +173,6 @@ public class KwtLogisticsConsignmentService {
     private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
     private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
 
-    // 定义禁止运单接单的状态集合
-    private static final Set<Integer> FORBIDDEN_STATUSES = Set.of(1, 5, 10, 15, 30);
-    //载重任务量浮动吨数
-    private static final BigDecimal TWO_TONS = new BigDecimal("2");
-    //载重任务量计算比例
-    private static final BigDecimal EIGHTY_PERCENT = new BigDecimal("0.8");
-
     /**
      * 采购订单-物流托运生成托运订单
      *
@@ -2990,49 +2983,6 @@ public class KwtLogisticsConsignmentService {
     }
 
 
-    /**
-     * 查询司机关联完成运单和累计运输量
-     * @param param
-     * @return
-     */
-    public OrderCirculateTotalTakeVo queryTotalTake(OrderCirculateTotalTakeParam param) {
-        log.info("查询司机关联完成运单和累计运输量:{}", JSON.toJSONString(param));
-        LambdaQueryWrapper<KwtLogisticsOrderCirculate> queryWrapper = Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
-                .eq(KwtLogisticsOrderCirculate::getEntId, param.getEntId())
-                .eq(KwtLogisticsOrderCirculate::getDriverId, param.getDriverId())
-                .eq(KwtLogisticsOrderCirculate::getDelFlag,0)
-                .orderByDesc(KwtLogisticsOrderCirculate::getCreateTime)
-                .orderByDesc(KwtLogisticsOrderCirculate::getId);
-        List<KwtLogisticsOrderCirculate> circulateList = logisticsOrderCirculateRepository.list(queryWrapper);
-        if (CollectionUtils.isEmpty(circulateList)) {
-            log.info("当前司机的无运单,driverId: {}", JSON.toJSONString(param));
-            return new OrderCirculateTotalTakeVo();
-        }
-
-        //总运单量
-        int totalTake = circulateList.stream()
-                .filter(cr -> cr.getTotalTake() != null)
-                .mapToInt(KwtLogisticsOrderCirculate::getTotalTake)
-                .sum();
-        //总运输量
-        BigDecimal toalEntrustAmount = circulateList.stream().map(KwtLogisticsOrderCirculate::getEntrustAmount)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-
-        //单位
-        String unit = circulateList.stream().map(KwtLogisticsOrderCirculate::getUnit)
-                .filter(Objects::nonNull)
-                .findFirst().orElse(null);
-
-        OrderCirculateTotalTakeVo totalTakeVo = new OrderCirculateTotalTakeVo();
-        totalTakeVo.setTotalTake(totalTake);
-        totalTakeVo.setEntrustAmount(toalEntrustAmount);
-        totalTakeVo.setUnit(unit);
-        log.info("查询司机关联完成运单和累计运输量成功,结果:{}", JSON.toJSONString(totalTakeVo));
-
-        return totalTakeVo;
-
-    }
 
     public OrderStatusStatisticsResp orderStatusStatistics() {
         log.info("物流订单状态统计");
@@ -3068,175 +3018,5 @@ public class KwtLogisticsConsignmentService {
         return orderStatusStatistics;
     }
 
-    /**
-     * 查询司机关联车辆的物流订单
-     * @param param
-     * @return
-     */
-    public PageDataResult<LogisticsOrderResp> queryTruckLogisticsOrder(OrderCirculateQueryParam param) {
-        log.info("查询司机关联车辆的物流订单:{}", JSON.toJSONString(param));
-        LambdaQueryWrapper<KwtLogisticsOrderCirculate> queryWrapper = Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
-                .eq(KwtLogisticsOrderCirculate::getEntId, param.getEntId())
-                .eq(KwtLogisticsOrderCirculate::getTruckNo, param.getTruckNo())
-                .eq(KwtLogisticsOrderCirculate::getDelFlag, 0)
-                .orderByDesc(KwtLogisticsOrderCirculate::getCreateTime)
-                .orderByDesc(KwtLogisticsOrderCirculate::getId);//TODO donglang 运单状态
-        //车牌映射的物流订单
-        Page<KwtLogisticsOrderCirculate> logOrderCirculateList = logisticsOrderCirculateRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
-        List<KwtLogisticsOrderCirculate> records = logOrderCirculateList.getRecords();
-        if (CollectionUtils.isEmpty(records)) {
-            log.info("当前车辆辆的无物流订单,truckNo:{}", param.getTruckNo());
-            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
-        }
-        //车牌关联物流订单
-        Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap = records.stream().collect(Collectors.toMap(KwtLogisticsOrderCirculate::getLOrderId,
-                Function.identity(), (x, y) -> x));
-
-        List<Long> logOrderIdList = records.stream().map(KwtLogisticsOrderCirculate::getLOrderId)
-                .filter(Objects::nonNull).collect(Collectors.toList());
-
-        //物流订单
-        List<KwtLogisticsOrder> logOrderList = logisticsOrderRepository.queryByLogisticsOrderIds(logOrderIdList);
-        if (CollectionUtils.isEmpty(logOrderList)) {
-            log.info("当前车辆无物流订单,truckNo:{}", param.getTruckNo());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_STATUS_ERROR, "当前车辆无物流订单");
-        }
-
-        //商品
-        List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
-        if (CollectionUtils.isEmpty(logOrderGoods)) {
-            log.info("当前车辆的物流订单无商品信息,truckNo:{}", param.getTruckNo());
-            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "当前车辆的物流订单无商品信息");
-        }
-
-        //物流id映射物流商品
-        Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap = logOrderGoods.stream().collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId,
-                Function.identity(), (x, y) -> x));
-        List<Long> goodsIds = logOrderGoods.stream().map(KwtLogisticsOrderGoods::getGoodsId).distinct().collect(Collectors.toList());
-
-        //交易商品信息
-        Map<Long, KwpGoods> goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
-        if (MapUtil.isEmpty(goodsIdAndGoodsMap)) {
-            log.info("物流订单无关联商品信息,logOrderId:{}", JSON.toJSONString(logOrderIdList));
-            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "物流订单无关联商品信息");
-        }
-
-        //承运托运企业
-        List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByLogOrderIds(logOrderIdList);
-        if (CollectionUtils.isEmpty(logOrderUnits)) {
-            log.info("物流订单无关联承运托运企业,logOrderId:{}", JSON.toJSONString(logOrderIdList));
-            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ENT, "物流订单无关联承运托运企业");
-        }
-        Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap = logOrderUnits.stream()
-                .collect(Collectors.toMap(unit -> unit.getLOrderId() + "-" + unit.getUnitType(),
-                        Function.identity(), (x, y) -> x));
-
-        //供应企业
-        Set<Long> tradeOrderIds = logOrderList.stream().map(KwtLogisticsOrder::getTOrderId).collect(Collectors.toSet());
-        List<OrderUnitInfoDetailVO> orderUnitDetailVOS = tradeOrderInfoService.queryOrderUnitInfByTOrderId(tradeOrderIds);
-        if (CollectionUtils.isEmpty(orderUnitDetailVOS)) {
-            log.info("交易订单无关联采取/销售企业,tradeOrderIds:{}", JSON.toJSONString(tradeOrderIds));
-            throw new BusinessPlatfromException(ErrorCodeEnum.TRADE_ORDER_NOT_ENT, "交易订单无关联采取/销售企业");
-        }
-        //交易订单Map
-        Map<String, OrderUnitInfoDetailVO> tOrderIdAndUnitMap = orderUnitDetailVOS.stream()
-                .collect(Collectors.toMap(unit -> unit.getTOrderId() + "-" + unit.getUnitType(),
-                        Function.identity(), (x, y) -> x));
-
-        //地址
-        Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap = getKwtLogisticsOrderAddressMap(logOrderIdList);
-
-        //组装数据
-        List<LogisticsOrderResp> ordderList = logOrderList.stream()
-                .map(order -> {
-                    return getLogisticsOrderResp(order, logOrderIdAndGoodsMap, goodsIdAndGoodsMap, logOrderIdAndUnitMap,
-                            tOrderIdAndUnitMap, logOrderIdAndAddressMap, logOrderIdAndCirculateMap);
-                }).collect(Collectors.toList());
-        log.info("查询司机关联车辆的物流订单成功!");
-        return PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) ordderList.size(), ordderList);
-    }
-
-    /**
-     * 装卸货地址
-     * @param logOrderIdList
-     * @return
-     */
-    private Map<String, KwtLogisticsOrderAddress> getKwtLogisticsOrderAddressMap(List<Long> logOrderIdList) {
-        List<KwtLogisticsOrderAddress> logOrderAddressList = logisticsOrderAddressRepository.queryByLogOrderIds(logOrderIdList);
-        if (CollectionUtils.isEmpty(logOrderAddressList)) {
-            log.info("物流订单无装卸货地址信息,logOrderIdList:{}", JSON.toJSONString(logOrderIdList));
-            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ADDRESS, "物流订单无装卸货地址信息");
-        }
-        return logOrderAddressList.stream().collect(Collectors
-                .toMap(address -> address.getLOrderId() + "-" + address.getType(),
-                        Function.identity(), (x, y) -> x));
-    }
-
-    /**
-     * 组装订单列表信息
-     * @param order
-     * @param logOrderIdAndGoodsMap
-     * @param goodsIdAndGoodsMap
-     * @param logOrderIdAndUnitMap
-     * @param tOrderIdAndUnitMap
-     * @param logOrderIdAndAddressMap
-     * @param logOrderIdAndCirculateMap
-     * @return
-     */
-    private LogisticsOrderResp getLogisticsOrderResp(KwtLogisticsOrder order, Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap,
-                                                     Map<Long, KwpGoods> goodsIdAndGoodsMap,
-                                                     Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap,
-                                                     Map<String, OrderUnitInfoDetailVO> tOrderIdAndUnitMap,
-                                                     Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap,
-                                                     Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap) {
-        LogisticsOrderResp orderResp = new LogisticsOrderResp();
-        orderResp.setLogisticsOrderNo(order.getLOrderNo());
-        //商品
-        KwtLogisticsOrderGoods orderGoods = logOrderIdAndGoodsMap.getOrDefault(order.getId(), new KwtLogisticsOrderGoods());
-        KwpGoods goods = goodsIdAndGoodsMap.getOrDefault(orderGoods.getGoodsId(), new KwpGoods());
-        orderResp.setGoodsId(String.valueOf(goods.getId()));
-        orderResp.setGoodsName(goods.getName());
-
-        //托运企业
-        KwtLogisticsOrderUnit consignEnt = logOrderIdAndUnitMap.getOrDefault(order.getId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
-        orderResp.setConsignCompanyId(Optional.ofNullable(consignEnt.getEntId()).map(String::valueOf).orElse(null));
-        orderResp.setConsignCompanyName(consignEnt.getFirmName());
-        //承运企业
-        KwtLogisticsOrderUnit carriageEnt = logOrderIdAndUnitMap.getOrDefault(order.getId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
-        orderResp.setCarriageCompanyId(Optional.ofNullable(carriageEnt.getEntId()).map(String::valueOf).orElse(null));
-        orderResp.setCarriageCompanyName(carriageEnt.getFirmName());
-        //供应企业
-        OrderUnitInfoDetailVO supplierEnt = tOrderIdAndUnitMap.getOrDefault(order.getTOrderId() + "-" + "2", new OrderUnitInfoDetailVO());
-        orderResp.setSupplierCompanyId(Optional.ofNullable(supplierEnt.getEntId()).map(String::valueOf).orElse(null));
-        orderResp.setSupplierCompanyName(supplierEnt.getFirmName());
-
-        //装货地址
-        KwtLogisticsOrderAddress shipmentAddress = logOrderIdAndAddressMap.getOrDefault(order.getId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtLogisticsOrderAddress());
-        orderResp.setLoadAddress(shipmentAddress.getDetailAddress());
-        //卸货地址
-        KwtLogisticsOrderAddress takeAddress = logOrderIdAndAddressMap.getOrDefault(order.getId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtLogisticsOrderAddress());
-        orderResp.setUnloadAddress(takeAddress.getDetailAddress());
-        //装卸地之间距离
-        double distanceKm = DistanceUtils.calculateDistance(
-                Optional.ofNullable(shipmentAddress.getLat()).map(Double::valueOf).orElse(null),
-                Optional.ofNullable(shipmentAddress.getLng()).map(Double::valueOf).orElse(null),
-                Optional.ofNullable(takeAddress.getLat()).map(Double::valueOf).orElse(null),
-                Optional.ofNullable(takeAddress.getLng()).map(Double::valueOf).orElse(null));
-        orderResp.setDistanceKm(distanceKm);
-
-        //时间
-        orderResp.setStartTime(DateUtils.format(order.getStartTime(), DateUtils.DATE_PATTERN));
-        orderResp.setEndTime(DateUtils.format(order.getEndTime(), DateUtils.DATE_PATTERN));
-        KwtLogisticsOrderCirculate orderCirculate = logOrderIdAndCirculateMap.getOrDefault(order.getId(), new KwtLogisticsOrderCirculate());
-        orderResp.setSendTime(DateUtils.format(orderCirculate.getCreateTime(), DateUtils.DATE_PATTERN));
-
-        //派单人信息
-        UserCacheResDto userCacheResDto = remoteSystemService.queryUserCacheById(orderCirculate.getCreateBy());
-        orderResp.setSendOperator(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getName).orElse(null));
-        orderResp.setSendPhone(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getPhone).orElse(null));
-
-        return orderResp;
-    }
-
 
 }

+ 489 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -1,35 +1,51 @@
 package com.sckw.transport.service.app;
 
 
+import cn.hutool.core.map.MapUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.sckw.contract.api.RemoteContractService;
+import com.sckw.core.common.enums.enums.DictEnum;
+import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.AddressTypeEnum;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.model.enums.LogisticsOrderV1Enum;
+import com.sckw.core.model.enums.UnitTypeEnum;
 import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtils;
+import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RDriverVo;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import com.sckw.order.api.dubbo.RemoteTradeOrderAmountService;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.OrderDetailVo;
+import com.sckw.order.api.model.OrderUnitInfoDetailVO;
 import com.sckw.order.api.model.UpdateActualAmountParam;
 import com.sckw.product.api.dubbo.GoodsInfoService;
+import com.sckw.product.api.model.KwpGoods;
 import com.sckw.redis.config.RedisLockUtil;
 import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import com.sckw.transport.common.config.MessageUrlConfig;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.handler.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.*;
+import com.sckw.transport.model.vo.OrderCirculateTotalTakeVo;
+import com.sckw.transport.model.vo.OrderStatusStatisticsResp;
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.repository.*;
 import com.sckw.transport.service.*;
+import com.sckw.transport.utils.DistanceUtils;
 import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -56,18 +72,25 @@ import java.util.stream.Collectors;
 public class WaybillOrderService {
 
     private final KwtLogisticsOrderRepository logisticsOrderRepository;
+    private final KwtLogisticsOrderCirculateRepository logisticsOrderCirculateRepository;
+    private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
     private final KwtLogisticsOrderAddressRepository logisticsOrderAddressRepository;
+    private final KwtLogisticsOrderUnitRepository logisticsOrderUnitRepository;
+
     private final KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
     private final KwtWaybillOrderRepository waybillOrderRepository;
     private final KwtWaybillOrderAddressRepository waybillOrderAddressRepository;
     private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
     private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
 
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    RemoteSystemService remoteSystemService;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 80000)
     TradeOrderInfoService tradeOrderInfoService;
-
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     RemoteFleetService remoteFleetService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    GoodsInfoService goodsInfoService;
 
     private final TakingOrderHandler takingOrderHandler;
     private final CancelHandler cancelHandler;
@@ -77,6 +100,8 @@ public class WaybillOrderService {
     private final LeaveHandler leaveHandler;
     private final UnloadingHandler unloadingHandler;
 
+    private final KwtWaybillOrderV1Service waybillOrderV1Service;
+
     //载重任务量浮动吨数
     private static final BigDecimal TWO_TONS = new BigDecimal("2");
     //载重任务量计算比例
@@ -90,6 +115,469 @@ public class WaybillOrderService {
             CarWaybillV1Enum.COMPLETION_UNLOADING.getCode()
     );
 
+    // 定义进行中的状态集合
+    private static final List<Integer> UNDER_WAY = Arrays.asList(
+            CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
+            CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
+            CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
+            CarWaybillV1Enum.WAIT_LOADING.getCode());
+
+    // 定义审核的状态集合
+    private static final List<Integer> REVIEW = Arrays.asList(
+            CarWaybillV1Enum.COMPLETION_LOADING.getCode(),
+            CarWaybillV1Enum.COMPLETION_UNLOADING.getCode());
+
+    // 定义已完成的状态集合
+    private static final List<Integer> COMPLETED = Arrays.asList(
+            CarWaybillV1Enum.WAIT_UNLOADING.getCode(),
+            CarWaybillV1Enum.APPROVAL_TREAT.getCode());
+
+
+
+
+    /**
+     * 查询司机关联完成运单和累计运输量
+     * @param param
+     * @return
+     */
+    public OrderCirculateTotalTakeVo queryTotalTake(OrderCirculateTotalTakeParam param) {
+        log.info("查询司机关联完成运单和累计运输量:{}", JSON.toJSONString(param));
+        LambdaQueryWrapper<KwtLogisticsOrderCirculate> queryWrapper = Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
+                .eq(KwtLogisticsOrderCirculate::getEntId, param.getEntId())
+                .eq(KwtLogisticsOrderCirculate::getDriverId, param.getDriverId())
+                .eq(KwtLogisticsOrderCirculate::getDelFlag,0)
+                .orderByDesc(KwtLogisticsOrderCirculate::getCreateTime)
+                .orderByDesc(KwtLogisticsOrderCirculate::getId);
+        List<KwtLogisticsOrderCirculate> circulateList = logisticsOrderCirculateRepository.list(queryWrapper);
+        if (CollectionUtils.isEmpty(circulateList)) {
+            log.info("当前司机的无运单,driverId: {}", JSON.toJSONString(param));
+            return new OrderCirculateTotalTakeVo();
+        }
+
+        //总运单量
+        int totalTake = circulateList.stream()
+                .filter(cr -> cr.getTotalTake() != null)
+                .mapToInt(KwtLogisticsOrderCirculate::getTotalTake)
+                .sum();
+        //总运输量
+        BigDecimal toalEntrustAmount = circulateList.stream().map(KwtLogisticsOrderCirculate::getEntrustAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        //单位
+        String unit = circulateList.stream().map(KwtLogisticsOrderCirculate::getUnit)
+                .filter(Objects::nonNull)
+                .findFirst().orElse(null);
+
+        OrderCirculateTotalTakeVo totalTakeVo = new OrderCirculateTotalTakeVo();
+        totalTakeVo.setTotalTake(totalTake);
+        totalTakeVo.setEntrustAmount(toalEntrustAmount);
+        totalTakeVo.setUnit(unit);
+        log.info("查询司机关联完成运单和累计运输量成功,结果:{}", JSON.toJSONString(totalTakeVo));
+
+        return totalTakeVo;
+
+    }
+
+    /**
+     * 查询司机关联车辆的物流订单
+     * @param param
+     * @return
+     */
+    public PageDataResult<LogisticsOrderResp> queryTruckLogisticsOrder(OrderCirculateQueryParam param) {
+        log.info("查询司机关联车辆的物流订单:{}", JSON.toJSONString(param));
+        LambdaQueryWrapper<KwtLogisticsOrderCirculate> queryWrapper = Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
+                .eq(KwtLogisticsOrderCirculate::getEntId, param.getEntId())
+                .eq(KwtLogisticsOrderCirculate::getTruckNo, param.getTruckNo())
+                .eq(KwtLogisticsOrderCirculate::getDelFlag, 0)
+                .orderByDesc(KwtLogisticsOrderCirculate::getCreateTime)
+                .orderByDesc(KwtLogisticsOrderCirculate::getId);//TODO donglang 运单状态
+        //车牌映射的物流订单
+        Page<KwtLogisticsOrderCirculate> logOrderCirculateList = logisticsOrderCirculateRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
+        List<KwtLogisticsOrderCirculate> records = logOrderCirculateList.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("当前车辆无派单订单,truckNo:{}", param.getTruckNo());
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
+        //车牌关联物流订单
+        Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap = records.stream().collect(Collectors.toMap(KwtLogisticsOrderCirculate::getLOrderId,
+                Function.identity(), (x, y) -> x));
+
+        List<Long> logOrderIdList = records.stream().map(KwtLogisticsOrderCirculate::getLOrderId)
+                .filter(Objects::nonNull).collect(Collectors.toList());
+
+        //物流订单
+        List<KwtLogisticsOrder> logOrderList = logisticsOrderRepository.queryByLogisticsOrderIds(logOrderIdList);
+        if (CollectionUtils.isEmpty(logOrderList)) {
+            log.info("当前车辆无物流订单,truckNo:{}", param.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_STATUS_ERROR, "当前车辆无物流订单");
+        }
+
+        //商品
+        List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
+        if (CollectionUtils.isEmpty(logOrderGoods)) {
+            log.info("当前车辆的物流订单无商品信息,truckNo:{}", param.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "当前车辆的物流订单无商品信息");
+        }
+
+        //物流id映射物流商品
+        Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap = logOrderGoods.stream().collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId,
+                Function.identity(), (x, y) -> x));
+        List<Long> goodsIds = logOrderGoods.stream().map(KwtLogisticsOrderGoods::getGoodsId).distinct().collect(Collectors.toList());
+
+        //交易商品信息
+        Map<Long, KwpGoods> goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
+        if (MapUtil.isEmpty(goodsIdAndGoodsMap)) {
+            log.info("物流订单无关联商品信息,logOrderId:{}", JSON.toJSONString(logOrderIdList));
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "物流订单无关联商品信息");
+        }
+
+        //承运托运企业
+        List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByLogOrderIds(logOrderIdList);
+        if (CollectionUtils.isEmpty(logOrderUnits)) {
+            log.info("物流订单无关联承运托运企业,logOrderId:{}", JSON.toJSONString(logOrderIdList));
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ENT, "物流订单无关联承运托运企业");
+        }
+        Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap = logOrderUnits.stream()
+                .collect(Collectors.toMap(unit -> unit.getLOrderId() + "-" + unit.getUnitType(),
+                        Function.identity(), (x, y) -> x));
+
+        //供应企业
+        Set<Long> tradeOrderIds = logOrderList.stream().map(KwtLogisticsOrder::getTOrderId).collect(Collectors.toSet());
+        List<OrderUnitInfoDetailVO> orderUnitDetailVOS = tradeOrderInfoService.queryOrderUnitInfByTOrderId(tradeOrderIds);
+        if (CollectionUtils.isEmpty(orderUnitDetailVOS)) {
+            log.info("交易订单无关联采取/销售企业,tradeOrderIds:{}", JSON.toJSONString(tradeOrderIds));
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRADE_ORDER_NOT_ENT, "交易订单无关联采取/销售企业");
+        }
+        //交易订单Map
+        Map<String, OrderUnitInfoDetailVO> tOrderIdAndUnitMap = orderUnitDetailVOS.stream()
+                .collect(Collectors.toMap(unit -> unit.getTOrderId() + "-" + unit.getUnitType(),
+                        Function.identity(), (x, y) -> x));
+
+        //地址
+        Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap = getKwtLogisticsOrderAddressMap(logOrderIdList);
+
+        //组装数据
+        List<LogisticsOrderResp> ordderList = logOrderList.stream()
+                .map(order -> {
+                    return getLogisticsOrderResp(order, logOrderIdAndGoodsMap, goodsIdAndGoodsMap, logOrderIdAndUnitMap,
+                            tOrderIdAndUnitMap, logOrderIdAndAddressMap, logOrderIdAndCirculateMap);
+                }).collect(Collectors.toList());
+        log.info("查询司机关联车辆的物流订单成功!");
+        return PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) ordderList.size(), ordderList);
+    }
+
+    /**
+     * 装卸货地址
+     * @param logOrderIdList
+     * @return
+     */
+    private Map<String, KwtLogisticsOrderAddress> getKwtLogisticsOrderAddressMap(List<Long> logOrderIdList) {
+        List<KwtLogisticsOrderAddress> logOrderAddressList = logisticsOrderAddressRepository.queryByLogOrderIds(logOrderIdList);
+        if (CollectionUtils.isEmpty(logOrderAddressList)) {
+            log.info("物流订单无装卸货地址信息,logOrderIdList:{}", JSON.toJSONString(logOrderIdList));
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ADDRESS, "物流订单无装卸货地址信息");
+        }
+        return logOrderAddressList.stream().collect(Collectors
+                .toMap(address -> address.getLOrderId() + "-" + address.getType(),
+                        Function.identity(), (x, y) -> x));
+    }
+
+    /**
+     * 组装订单列表信息
+     * @param order
+     * @param logOrderIdAndGoodsMap
+     * @param goodsIdAndGoodsMap
+     * @param logOrderIdAndUnitMap
+     * @param tOrderIdAndUnitMap
+     * @param logOrderIdAndAddressMap
+     * @param logOrderIdAndCirculateMap
+     * @return
+     */
+    private LogisticsOrderResp getLogisticsOrderResp(KwtLogisticsOrder order, Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap,
+                                                     Map<Long, KwpGoods> goodsIdAndGoodsMap,
+                                                     Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap,
+                                                     Map<String, OrderUnitInfoDetailVO> tOrderIdAndUnitMap,
+                                                     Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap,
+                                                     Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap) {
+        LogisticsOrderResp orderResp = new LogisticsOrderResp();
+        orderResp.setLogisticsOrderNo(order.getLOrderNo());
+        //商品
+        KwtLogisticsOrderGoods orderGoods = logOrderIdAndGoodsMap.getOrDefault(order.getId(), new KwtLogisticsOrderGoods());
+        KwpGoods goods = goodsIdAndGoodsMap.getOrDefault(orderGoods.getGoodsId(), new KwpGoods());
+        orderResp.setGoodsId(String.valueOf(goods.getId()));
+        orderResp.setGoodsName(goods.getName());
+
+        //托运企业
+        KwtLogisticsOrderUnit consignEnt = logOrderIdAndUnitMap.getOrDefault(order.getId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
+        orderResp.setConsignCompanyId(Optional.ofNullable(consignEnt.getEntId()).map(String::valueOf).orElse(null));
+        orderResp.setConsignCompanyName(consignEnt.getFirmName());
+        //承运企业
+        KwtLogisticsOrderUnit carriageEnt = logOrderIdAndUnitMap.getOrDefault(order.getId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
+        orderResp.setCarriageCompanyId(Optional.ofNullable(carriageEnt.getEntId()).map(String::valueOf).orElse(null));
+        orderResp.setCarriageCompanyName(carriageEnt.getFirmName());
+        //供应企业
+        OrderUnitInfoDetailVO supplierEnt = tOrderIdAndUnitMap.getOrDefault(order.getTOrderId() + "-" + "2", new OrderUnitInfoDetailVO());
+        orderResp.setSupplierCompanyId(Optional.ofNullable(supplierEnt.getEntId()).map(String::valueOf).orElse(null));
+        orderResp.setSupplierCompanyName(supplierEnt.getFirmName());
+
+        //装货地址
+        KwtLogisticsOrderAddress shipmentAddress = logOrderIdAndAddressMap.getOrDefault(order.getId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtLogisticsOrderAddress());
+        orderResp.setLoadAddress(shipmentAddress.getDetailAddress());
+        //卸货地址
+        KwtLogisticsOrderAddress takeAddress = logOrderIdAndAddressMap.getOrDefault(order.getId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtLogisticsOrderAddress());
+        orderResp.setUnloadAddress(takeAddress.getDetailAddress());
+        //装卸地之间距离
+        double distanceKm = DistanceUtils.calculateDistance(
+                Optional.ofNullable(shipmentAddress.getLat()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(shipmentAddress.getLng()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(takeAddress.getLat()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(takeAddress.getLng()).map(Double::valueOf).orElse(null));
+        orderResp.setDistanceKm(distanceKm);
+
+        //时间
+        orderResp.setStartTime(DateUtils.format(order.getStartTime(), DateUtils.DATE_PATTERN));
+        orderResp.setEndTime(DateUtils.format(order.getEndTime(), DateUtils.DATE_PATTERN));
+        KwtLogisticsOrderCirculate orderCirculate = logOrderIdAndCirculateMap.getOrDefault(order.getId(), new KwtLogisticsOrderCirculate());
+        orderResp.setSendTime(DateUtils.format(orderCirculate.getCreateTime(), DateUtils.DATE_PATTERN));
+
+        //派单人信息
+        UserCacheResDto userCacheResDto = remoteSystemService.queryUserCacheById(orderCirculate.getCreateBy());
+        orderResp.setSendOperator(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getName).orElse(null));
+        orderResp.setSendPhone(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getPhone).orElse(null));
+
+        return orderResp;
+    }
+
+    /**
+     * 查询司机关联车辆的物流订单
+     * @param param
+     * @return
+     */
+    public PageDataResult<WaybillOrderStatusResp> queryWaybillOrder(WaybillOrderQueryParam param) {
+        log.info("查询司机的物流运单:{}", JSON.toJSONString(param));
+        LambdaQueryWrapper<KwtWaybillOrder> queryWrapper = Wrappers.<KwtWaybillOrder>lambdaQuery()
+                .eq(KwtWaybillOrder::getEntId, param.getEntId())
+                .eq(KwtWaybillOrder::getTruckNo, param.getTruckNo())
+                .eq(KwtWaybillOrder::getDelFlag, 0)
+                .orderByDesc(KwtWaybillOrder::getCreateTime)
+                .orderByDesc(KwtWaybillOrder::getId);
+        //进行中
+        if (Objects.equals(param.getStatus(), Global.NUMERICAL_ONE)) {
+            queryWrapper.in(KwtWaybillOrder::getStatus, UNDER_WAY);
+        } else if (Objects.equals(param.getStatus(), Global.NUMERICAL_TWO)) {
+            //单证审核
+            queryWrapper.in(KwtWaybillOrder::getStatus, REVIEW);
+        } else if (Objects.equals(param.getStatus(), Global.NUMERICAL_THREE)) {
+            //已完成
+            queryWrapper.in(KwtWaybillOrder::getStatus, COMPLETED);
+        }
+
+        //当前车辆的运单
+        Page<KwtWaybillOrder> waybillOrderList = waybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
+        List<KwtWaybillOrder> records = waybillOrderList.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("当前车辆辆的无物流运单,truckNo:{}", param.getTruckNo());
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
+
+        //物流运单id
+        List<Long>  wbOrderIdList = records.stream().map(KwtWaybillOrder::getId)
+                .filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        //物流订单id
+        List<Long> logOrderIdList = records.stream().map(KwtWaybillOrder::getLOrderId)
+                .filter(Objects::nonNull).distinct().collect(Collectors.toList());
+
+        //子运单
+        List<KwtWaybillOrderSubtask> orderSubtaskList = waybillOrderSubtaskRepository.queryByWOrderIds(wbOrderIdList);
+        if (CollectionUtils.isEmpty(orderSubtaskList)) {
+            log.info("当前车辆辆的无物流子运单,truckNo:{}", param.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "当前物流子运单不存在");
+        }
+        Map<Long, KwtWaybillOrderSubtask> subtaskMap = orderSubtaskList.stream().collect(Collectors.toMap(subtask -> subtask.getWOrderId(),
+                Function.identity(), (x, y) -> x));
+
+        //派单信息
+        List<KwtLogisticsOrderCirculate> logOrderCirculateList = logisticsOrderCirculateRepository.queryByLogOrderIdsAndTruckNo(logOrderIdList, param.getTruckNo());
+        if (CollectionUtils.isEmpty(logOrderCirculateList)) {
+            log.info("当前车辆无派单订单,truckNo:{}", param.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_FOUND, "当前车辆无派单订单");
+        }
+        //车牌关联物流订单
+        Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap = logOrderCirculateList.stream().collect(
+                Collectors.toMap(KwtLogisticsOrderCirculate::getLOrderId, Function.identity(), (x, y) -> x));
+
+        //物流订单
+        List<KwtLogisticsOrder> logOrderList = logisticsOrderRepository.queryByLogisticsOrderIds(logOrderIdList);
+        if (CollectionUtils.isEmpty(logOrderList)) {
+            log.info("当前车辆无物流订单,truckNo:{}", param.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_STATUS_ERROR, "当前车辆无物流订单");
+        }
+        Map<Long, KwtLogisticsOrder> logOrderMap = logOrderList.stream().collect(Collectors.toMap(logOrder -> logOrder.getId(),
+                Function.identity(), (x, y) -> x));
+
+        //物流订单商品
+        List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
+        if (CollectionUtils.isEmpty(logOrderGoods)) {
+            log.info("当前车辆的物流订单无商品信息,truckNo:{}", param.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "当前车辆的物流订单无商品信息");
+        }
+        //物流id映射商品
+        Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap = logOrderGoods.stream().collect(
+                Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId, Function.identity(), (x, y) -> x));
+
+
+        //承运托运企业
+        List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByLogOrderIds(logOrderIdList);
+        if (CollectionUtils.isEmpty(logOrderUnits)) {
+            log.info("物流订单无关联承运托运企业,logOrderId:{}", JSON.toJSONString(logOrderIdList));
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ENT, "物流订单无关联承运托运企业");
+        }
+        Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap = logOrderUnits.stream().collect(
+                Collectors.toMap(unit -> unit.getLOrderId() + "-" + unit.getUnitType(),
+                        Function.identity(), (x, y) -> x));
+        //地址
+        Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap = getKwtLogisticsOrderAddressMap(logOrderIdList);
+
+        //装卸货信息
+        List<KwtWaybillOrderTicket> orderTicketList = waybillOrderTicketRepository.queryByWOrderIds(wbOrderIdList);
+        if (CollectionUtils.isEmpty(orderTicketList)) {
+            log.info("当前车辆无物流运单装卸货信息,truckNo:{}", param.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_TICKET, "当前车辆无物流运单装卸货信息");
+        }
+        Map<String, KwtWaybillOrderTicket> ticketMap = orderTicketList.stream().collect(
+                Collectors.toMap(ticket -> ticket.getWOrderId() + "-" + ticket.getType(),
+                        Function.identity(), (x, y) -> x));
+
+        List<WaybillOrderStatusResp> ordderList = records.stream().map(
+                billOrder -> {
+                    return getWaybillOrderResp(billOrder, subtaskMap, logOrderMap, logOrderIdAndCirculateMap,
+                            logOrderIdAndGoodsMap, logOrderIdAndUnitMap, logOrderIdAndAddressMap, ticketMap);
+                }).collect(Collectors.toList());
+        log.info("查询司机的物流运单成功!");
+        return PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) ordderList.size(), ordderList);
+
+    }
+
+
+    /**
+     * 组装运单列表信息
+     * @param order
+     * @param logOrderIdAndGoodsMap
+     * @param logOrderIdAndUnitMap
+     * @param logOrderIdAndAddressMap
+     * @return
+     */
+    private WaybillOrderStatusResp getWaybillOrderResp(KwtWaybillOrder wbOrder,  Map<Long, KwtWaybillOrderSubtask> subtaskMap,
+                                                       Map<Long, KwtLogisticsOrder> logOrderMap,
+                                                       Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap,
+                                                       Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap,
+                                                       Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap,
+                                                       Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap,
+                                                       Map<String, KwtWaybillOrderTicket> ticketMap) {
+        WaybillOrderStatusResp wbOrderResp = new WaybillOrderStatusResp();
+
+        //装货、卸货净重、任务量
+        KwtWaybillOrderSubtask subtask = subtaskMap.getOrDefault(wbOrder.getId(), new KwtWaybillOrderSubtask());
+        wbOrderResp.setLoadingNetWeight(subtask.getLoadAmount());
+        wbOrderResp.setUnloadingNetWeight(subtask.getUnloadAmount());
+        wbOrderResp.setTaskNum(subtask.getEntrustAmount());
+
+        //物流订单信息
+        KwtLogisticsOrder logOrder = logOrderMap.getOrDefault(wbOrder.getLOrderId(), new KwtLogisticsOrder());
+        wbOrderResp.setLogisticsOrderNo(logOrder.getLOrderNo());
+        wbOrderResp.setChargeType(logOrder.getBillingMode());
+        wbOrderResp.setChargeTypeDesc(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(), logOrder.getBillingMode()));
+
+        //托运企业
+        KwtLogisticsOrderUnit consignEnt = logOrderIdAndUnitMap.getOrDefault(wbOrder.getLOrderId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
+        wbOrderResp.setConsignCompanyId(Optional.ofNullable(consignEnt.getEntId()).map(String::valueOf).orElse(null));
+        wbOrderResp.setConsignCompanyName(consignEnt.getFirmName());
+
+        //商品
+        KwtLogisticsOrderGoods orderGoods = logOrderIdAndGoodsMap.getOrDefault(wbOrder.getLOrderId(), new KwtLogisticsOrderGoods());
+        wbOrderResp.setGoodsId(Optional.ofNullable(orderGoods.getId()).map(String::valueOf).orElse(null));
+        wbOrderResp.setGoodsName(orderGoods.getGoodsName());
+
+        //装货地址
+        KwtLogisticsOrderAddress shipmentAddress = logOrderIdAndAddressMap.getOrDefault(wbOrder.getLOrderId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtLogisticsOrderAddress());
+        wbOrderResp.setLoadAddress(shipmentAddress.getDetailAddress());
+        //卸货地址
+        KwtLogisticsOrderAddress takeAddress = logOrderIdAndAddressMap.getOrDefault(wbOrder.getLOrderId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtLogisticsOrderAddress());
+        wbOrderResp.setUnloadAddress(takeAddress.getDetailAddress());
+        //装卸地之间距离
+        double distanceKm = DistanceUtils.calculateDistance(
+                Optional.ofNullable(shipmentAddress.getLat()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(shipmentAddress.getLng()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(takeAddress.getLat()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(takeAddress.getLng()).map(Double::valueOf).orElse(null));
+        wbOrderResp.setDistanceKm(distanceKm);
+
+        //皮重
+        KwtWaybillOrderTicket tareAmountTicket = ticketMap.getOrDefault(wbOrder.getId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtWaybillOrderTicket());
+        wbOrderResp.setTareAmount(tareAmountTicket.getTareAmount());
+        //毛重
+        KwtWaybillOrderTicket grossAmountTicket = ticketMap.getOrDefault(wbOrder.getId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtWaybillOrderTicket());
+        wbOrderResp.setGrossAmount(grossAmountTicket.getTareAmount());
+
+        //司机信息
+        wbOrderResp.setDriverId(wbOrder.getDriverId());
+        wbOrderResp.setDriverName(wbOrder.getDriverName());
+        wbOrderResp.setDriverPhone(wbOrder.getDriverPhone());
+
+        //派车信息
+        KwtLogisticsOrderCirculate orderCirculate = logOrderIdAndCirculateMap.getOrDefault(wbOrder.getLOrderId(), new KwtLogisticsOrderCirculate());
+        wbOrderResp.setSendTime(DateUtils.format(orderCirculate.getCreateTime(), DateUtils.DATE_PATTERN));
+        //法定载重
+        RTruckVo truckByTruckNo = remoteFleetService.findTruckByTruckNo(orderCirculate.getTruckNo());
+        if (truckByTruckNo != null) {
+            wbOrderResp.setLegalLoad(truckByTruckNo.getActualWeight());
+        }
+
+        //派单人信息
+        UserCacheResDto userCacheResDto = remoteSystemService.queryUserCacheById(orderCirculate.getCreateBy());
+        wbOrderResp.setSendOperator(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getName).orElse(null));
+        wbOrderResp.setSendPhone(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getPhone).orElse(null));
+
+        //状态
+        wbOrderResp.setStatus(wbOrder.getStatus());
+        wbOrderResp.setStatusDesc(CarWaybillV1Enum.geDesc(wbOrder.getStatus()));
+        return wbOrderResp;
+
+    }
+
+    public StatisticsWaybillResp statisticsWaybillOrder() {
+        log.info("运单状态统计");
+        StatisticsWaybillResp statisticsWaybillResp = waybillOrderV1Service.statisticsWaybillOrder();
+        if (statisticsWaybillResp == null || CollectionUtils.isEmpty(statisticsWaybillResp.getOrderStatusStatistics())) {
+            return new StatisticsWaybillResp();
+        }
+        // 定义状态码聚合规则
+        Map<List<String>, String[]> aggregateRules = Map.of(
+                Arrays.asList("1", "5", "10", "15"), new String[]{"1", "进行中"},
+                Arrays.asList("20", "30"), new String[]{"2", "审核中"},
+                Arrays.asList("25", "99"), new String[]{"3", "已完成"}
+        );
+        List<StatisticsWaybillResp.OrderBillStatusStatistics> orderStatusStatistics = statisticsWaybillResp.getOrderStatusStatistics();
+
+        List<StatisticsWaybillResp.OrderBillStatusStatistics> aggregatedList = aggregateRules.entrySet()
+                .stream().map(rule -> {
+                    List<String> originalStatuses = rule.getKey();
+                    String[] aggregateInfo = rule.getValue();
+                    // 过滤并汇总对应状态的数量
+                    int totalNum = orderStatusStatistics.stream()
+                            .filter(stat -> originalStatuses.contains(stat.getOrderStatus()))
+                            .mapToInt(stat -> Integer.parseInt(stat.getOrderNum()))
+                            .sum();
+            // 构建聚合结果对象
+            StatisticsWaybillResp.OrderBillStatusStatistics aggregateStat = new StatisticsWaybillResp.OrderBillStatusStatistics();
+            aggregateStat.setOrderStatus(aggregateInfo[0]); // 聚合状态编码
+            aggregateStat.setOrderStatusDesc(aggregateInfo[1]); // 聚合状态描述
+            aggregateStat.setOrderNum(String.valueOf(totalNum)); // 汇总数量
+            return aggregateStat;
+        }).collect(Collectors.toList());
+        return new StatisticsWaybillResp();
+    }
 
     /**
      * 物流订单接单