Procházet zdrojové kódy

Merge remote-tracking branch 'origin/dev_20251130' into dev_20251130

donglang před 2 týdny
rodič
revize
c26aee407f
19 změnil soubory, kde provedl 658 přidání a 90 odebrání
  1. 3 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java
  2. 134 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/KwtLogisticsOrderAddressVo.java
  3. 157 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/KwtWaybillOrderAddressVo.java
  4. 92 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillOrderSubtaskVo.java
  5. 20 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruckRoute.java
  6. 2 2
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/QueryTruckRouteByDriverReq.java
  7. 5 5
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRouteRepository.java
  8. 130 41
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckRouteService.java
  9. 32 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java
  10. 8 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/VehicleExceptionQueryReq.java
  11. 2 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderContractRepository.java
  12. 2 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java
  13. 3 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderUnitRepository.java
  14. 3 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtVehicleExceptionRepository.java
  15. 1 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderRepository.java
  16. 15 6
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwfTaskService.java
  17. 17 6
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtTransportCommonService.java
  18. 2 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/VehicleExceptionService.java
  19. 30 21
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

+ 3 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java

@@ -201,4 +201,7 @@ public interface TransportRemoteService {
 
     RWaybillOrderVo queryWaybillOrderByWayBillOrderId(Long wayBillOrderId);
 
+    WaybillOrderSubtaskVo queryWaybillOrderId(Long wayBillOrderId);
+
+    List<KwtLogisticsOrderAddressVo> queryByWOrderId(Long wayBillOrderId);
 }

+ 134 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/KwtLogisticsOrderAddressVo.java

@@ -0,0 +1,134 @@
+package com.sckw.transport.api.model.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author lfdc
+ * @description 物流订单装卸货地址信息
+ * @date 2023-06-26 16:06:12
+ */
+@Data
+public class KwtLogisticsOrderAddressVo implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_UUID)
+    private Long id;
+
+    /**
+     * 物流订单id
+     */
+    private Long lOrderId;
+
+    /**
+     * 贸易订单地址id
+     */
+    private Long tAddressId;
+
+    /**
+     * 上级物流订单地址id
+     */
+    private Long pAddressId;
+
+    /**
+     * 地址类型(1装货地址、2卸货地址)
+     */
+    private Integer addressType;
+
+    /**
+     * 地址名称
+     */
+    private String name;
+
+    /**
+     * 地址类型
+     */
+    private Long type;
+
+    /**
+     * 联系人姓名
+     */
+    private String contacts;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 所在地区
+     */
+    private Integer cityCode;
+
+    /**
+     * 所属区域名称
+     */
+    private String cityName;
+
+    /**
+     * 详细地址
+     */
+    private String detailAddress;
+
+    /**
+     * 纬度
+     */
+    private String lat;
+
+    /**
+     * 纬度
+     */
+    private String lng;
+
+    /**
+     * 电子围栏
+     */
+    private String fence;
+
+    /**
+     * 入场(1刷身份证、2上报车号、3上报户头、4其它)
+     */
+    private Integer entryType;
+
+    /**
+     * 排序(升序)
+     */
+    private Integer sort;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 用户状态(0正常、1已锁)
+     */
+    private Integer status;
+
+    private Long createBy;
+
+    private Date createTime;
+
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 是否删除(0未删除,1删除)
+     */
+    @TableLogic("0")
+    private Integer delFlag;
+
+    private static final long serialVersionUID = 1L;
+
+}

+ 157 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/KwtWaybillOrderAddressVo.java

@@ -0,0 +1,157 @@
+package com.sckw.transport.api.model.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author lfdc
+ * @description 车辆运单装卸货地址信息
+ * @date 2023-06-26 16:06:12
+ */
+@Data
+public class KwtWaybillOrderAddressVo implements Serializable {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 物流订单id
+     */
+    private Long wOrderId;
+
+    /**
+     * 运单关联子单ID
+     */
+    private Long wSubtaskId;
+
+    /**
+     * 物流订单地址ID
+     */
+    private Long lAddressId;
+
+    /**
+     * 地址类型(1装货地址、2卸货地址)
+     */
+    private Integer addressType;
+
+    /**
+     * 地址名称
+     */
+    private String name;
+
+    /**
+     * 地址类型
+     */
+    private Long type;
+
+    /**
+     * 联系人姓名
+     */
+    private String contacts;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 所在地区
+     */
+    private Integer cityCode;
+
+    /**
+     * 所属区域名称
+     */
+    private String cityName;
+
+    /**
+     * 详细地址
+     */
+    private String detailAddress;
+
+    /**
+     * 纬度
+     */
+    private String lat;
+
+    /**
+     * 经度
+     */
+    private String lng;
+
+    /**
+     * 电子围栏
+     */
+    private String fence;
+
+    /**
+     * 入场(1刷身份证、2上报车号、3上报户头、4其它)
+     */
+    private Integer entryType;
+
+    /**
+     * 计划时间
+     */
+    private Date planTime;
+
+    /**
+     * 排序(升序)
+     */
+    private Integer sort;
+
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 用户状态(0有效、1无效)
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 创建人更新人
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 是否删除(0未删除,1删除)
+     */
+    @TableLogic("0")
+    private Integer delFlag;
+
+    private static final long serialVersionUID = 1L;
+
+    @TableField(exist = false)
+    private String wOrderIdAddressTypeKey;
+    @TableField(exist = false)
+    private String subOrderIdAddressTypeKey;
+}

+ 92 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillOrderSubtaskVo.java

@@ -0,0 +1,92 @@
+package com.sckw.transport.api.model.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.sckw.core.model.base.BaseModel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author zk
+ * @desc 车辆运单-子运单
+ * @date 2024/3/1 0001
+ */
+@Data
+public class WaybillOrderSubtaskVo extends BaseModel {
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 物流订单id(kwt_logistics_order)
+     */
+    private Long lOrderId;
+
+    /**
+     * 物流订单id
+     */
+    private Long wOrderId;
+
+    /**
+     * 编号
+     */
+    private String wOrderNo;
+
+    /**
+     * 托量单位
+     */
+    private String unit;
+
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 卸货重量
+     */
+    private BigDecimal unloadAmount;
+
+    /**
+     * 卸货时间
+     */
+    private Date unloadTime;
+
+    /**
+     * 装货重量
+     */
+    private BigDecimal loadAmount;
+
+    /**
+     * 装货时间
+     */
+    private Date loadTime;
+
+    /**
+     * 亏吨重量
+     */
+    private BigDecimal deficitAmount;
+
+    /**
+     * 亏吨扣款
+     */
+    private BigDecimal deficitPrice;
+
+    /**
+     * 卸货凭证
+     */
+    private String unloadUrl;
+
+    /**
+     * 卸货凭证上传时间
+     */
+    private Date unloadUploadTime;
+
+    /**
+     * 卸货凭证操作人
+     */
+    private Long unloadOperator;
+}

+ 20 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruckRoute.java

@@ -81,5 +81,24 @@ public class KwfTruckRoute {
     private String truckNo;
     @TableField("truck_id")
     private Long truckId;
-
+    /**
+     * 装货经度
+     */
+    @TableField("load_lng")
+    private String loadLng;
+    /**
+     * 装货纬度
+     */
+    @TableField("load_lat")
+    private String loadLat;
+    /**
+     * 卸货经度
+     */
+    @TableField("unload_lng")
+    private String unloadLng;
+    /**
+     *  卸货纬度
+     */
+    @TableField("unload_lat")
+    private String unloadLat;
 }

+ 2 - 2
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/QueryTruckRouteByDriverReq.java

@@ -27,14 +27,14 @@ public class QueryTruckRouteByDriverReq implements Serializable {
     /**
      * 装货地址(起始点)
      */
-    @NotNull(message = "装货地址不能为空")
+    //@NotNull(message = "装货地址不能为空")
     @Schema(description = "装货地址(起始点)")
     private String startPoint;
 
     /**
      * 卸货地址
      */
-    @NotNull(message = "卸货地址不能为空")
+    //@NotNull(message = "卸货地址不能为空")
     @Schema(description = "卸货地址")
     private String unloadingPoint;
     /**

+ 5 - 5
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRouteRepository.java

@@ -66,15 +66,15 @@ public class KwfTruckRouteRepository extends ServiceImpl<KwfTruckRouteMapper, Kw
     /**
      * 根据司机ID和装货卸货地址查询常用路线
      * @param driverId 司机ID
-     * @param startPoint 装货地址(起始点)
-     * @param unloadingPoint 卸货地址
      * @return 常用路线信息
      */
-    public KwfTruckRoute queryByDriverIdAndAddress(Long driverId, String startPoint, String unloadingPoint) {
+    public KwfTruckRoute queryByDriverIdAndAddress(Long driverId,String startLng, String startLat, String endLng ,String endLat) {
         return getOne(Wrappers.<KwfTruckRoute>lambdaQuery()
                 .eq(KwfTruckRoute::getDriverId, driverId)
-                .eq(KwfTruckRoute::getStartPoint, startPoint)
-                .eq(KwfTruckRoute::getUnloadingPoint, unloadingPoint)
+                .eq(KwfTruckRoute::getLoadLng, startLng)
+                .eq(KwfTruckRoute::getLoadLat, startLat)
+                .eq(KwfTruckRoute::getUnloadLng, endLng)
+                .eq(KwfTruckRoute::getUnloadLat, endLat)
                 .eq(KwfTruckRoute::getDelFlag, 0)
                 .last("limit 1"));
     }

+ 130 - 41
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckRouteService.java

@@ -2,7 +2,10 @@ package com.sckw.fleet.service;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.base.BaseModel;
+import com.sckw.core.model.enums.AddressTypeEnum;
+import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.utils.DateUtils;
 import com.sckw.core.utils.LocUtils;
 import com.sckw.core.utils.StringUtils;
@@ -19,7 +22,10 @@ import com.sckw.fleet.model.vo.QueryTruckRoteVo;
 import com.sckw.fleet.model.vo.TruckRoteDetailVo;
 import com.sckw.fleet.repository.*;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.model.vo.KwtLogisticsOrderAddressVo;
+import com.sckw.transport.api.model.vo.KwtWaybillOrderAddressVo;
 import com.sckw.transport.api.model.vo.RWaybillOrderVo;
+import com.sckw.transport.api.model.vo.WaybillOrderSubtaskVo;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
@@ -190,10 +196,34 @@ public class KwfTruckRouteService {
     public QueryTruckRoteVo queryTruckRouteByDriver(QueryTruckRouteByDriverReq req) {
         log.info("根据司机ID和装货卸货地址查询常用路线,请求参数 :{}", JSON.toJSONString(req));
         // 查询常用路线
+        WaybillOrderSubtaskVo waybillOrderSubtaskVo = transportRemoteService.queryWaybillOrderId(req.getWayBillOrderId());
+        // 根据运单号查询运单信息
+        if (Objects.isNull(waybillOrderSubtaskVo)){
+            throw new BusinessException("运单不存在");
+        }
+        //查询运单装卸货地址
+        List<KwtLogisticsOrderAddressVo> addressList = transportRemoteService.queryByWOrderId(waybillOrderSubtaskVo.getLOrderId());
+        if (CollectionUtils.isEmpty(addressList)){
+            throw new BusinessException("运单地址不存在");
+        }
+        String startLng= "";
+        String startLat= "";
+        String endLng =  "";
+        String endLat = "";
+        for (KwtLogisticsOrderAddressVo kwtLogisticsOrderAddressVo : addressList) {
+            if (Objects.equals(kwtLogisticsOrderAddressVo.getAddressType(), AddressTypeEnum.SHIPMENT.getCode())) {
+                req.setStartPoint(kwtLogisticsOrderAddressVo.getDetailAddress());
+                startLng = kwtLogisticsOrderAddressVo.getLng();
+                startLat = kwtLogisticsOrderAddressVo.getLat();
+            } else if (Objects.equals(kwtLogisticsOrderAddressVo.getAddressType(), AddressTypeEnum.TAKE.getCode())) {
+                req.setUnloadingPoint(kwtLogisticsOrderAddressVo.getDetailAddress());
+                endLng = kwtLogisticsOrderAddressVo.getLng();
+                endLat = kwtLogisticsOrderAddressVo.getLat();
+            }
+        }
         KwfTruckRoute truckRoute = truckRouteRepository.queryByDriverIdAndAddress(
-                req.getDriverId(), 
-                req.getStartPoint(), 
-                req.getUnloadingPoint()
+                req.getDriverId(),
+                startLng, startLat,endLng ,endLat
         );
         
         if (Objects.isNull(truckRoute)) {
@@ -201,11 +231,13 @@ public class KwfTruckRouteService {
             try {
                 log.info("未查询到,开始mock数据司机ID:{},装货地址:{},卸货地址:{} 的常用路线",
                         req.getDriverId(), req.getStartPoint(), req.getUnloadingPoint());
-                saveTruckRote(req);
+                saveTruckRote(req, startLng, startLat, endLng, endLat);
                 truckRoute = truckRouteRepository.queryByDriverIdAndAddress(
                         req.getDriverId(),
-                        req.getStartPoint(),
-                        req.getUnloadingPoint()
+                        startLng,
+                        startLat,
+                        endLng,
+                        endLat
                 );
             } catch (Exception e) {
                 log.error("新增常用路线异常", e);
@@ -251,64 +283,121 @@ public class KwfTruckRouteService {
                     .collect(Collectors.toList());
             vo.setTruckRoteDetails(truckRoteDetails);
         }
+//        else {
+//
+//            log.info("开始调用高德API生成轨迹点位,起点: {},{} 终点: {},{}", startLng, startLat, endLng, endLat);
+//            LocUtils.RouteResult routeResult = generateRoutePointsWithDuration(startLng, startLat, endLng, endLat);
+//            if (routeResult == null || com.sckw.core.utils.StringUtils.isBlank(routeResult.getPointInfo())) {
+//                log.error("高德API生成轨迹点位失败,起点: {},{} 终点: {},{}", startLng, startLat, endLng, endLat);
+//                throw new BusinessException("生成轨迹失败:高德API生成轨迹点位失败");
+//            }
+//            List<LocUtils.RoutePoint> routePoints = JSON.parseArray(routeResult.getPointInfo(), LocUtils.RoutePoint.class);
+//            if (CollectionUtils.isNotEmpty(routePoints)) {
+//                routePoints.stream().map(x->{
+//                    QueryTruckRoteVo.TruckRoteDetail truckRoteDetail = new QueryTruckRoteVo.TruckRoteDetail();
+//                    truckRoteDetail.setTs(truckRoteDetail.getTs());
+//                    truckRoteDetail.setLongitude(truckRoteDetail.getLongitude());
+//                    truckRoteDetail.setLatitude(truckRoteDetail.getLatitude());
+//                    return truckRoteDetail;
+//                }).collect(Collectors.toList());
+//            }
+//        }
 
         return vo;
     }
+    private LocUtils.RouteResult generateRoutePointsWithDuration(String startLng, String startLat, String endLng, String endLat) {
+        try {
+            log.info("开始调用高德API生成轨迹点位和耗时,起点: {},{} 终点: {},{}",
+                    startLng, startLat, endLng, endLat);
+
+            // 调用高德驾车路径规划API,生成20个轨迹点位和耗时
+            LocUtils.RouteResult routeResult = com.sckw.core.utils.LocUtils.getDrivingRoutePointsWithDuration(
+                    startLng,
+                    startLat,
+                    endLng,
+                    endLat,
+                    20
+            );
+
+            if (routeResult != null && com.sckw.core.utils.StringUtils.isNotBlank(routeResult.getPointInfo())) {
+                log.info("高德API生成轨迹点位成功,耗时: {}秒", routeResult.getDuration());
+            } else {
+                log.warn("高德API生成轨迹点位失败或返回空数据");
+            }
 
-    private void saveTruckRote(QueryTruckRouteByDriverReq req) {
+            return routeResult;
+        } catch (Exception e) {
+            log.error("调用高德API生成轨迹点位异常", e);
+            return null;
+        }
+    }
+    private void saveTruckRote(QueryTruckRouteByDriverReq req,String startLng,String startLat,String endLng,String endLat) {
         RWaybillOrderVo rWaybillOrderVo = transportRemoteService.queryWaybillOrderByWayBillOrderId(req.getWayBillOrderId());
         KwfFleetTruck kwfFleetTruck = fleetTruckRepository.findFleetByTruckId(rWaybillOrderVo.getTruckId());
         // 在查询惯用路线之前,调用高德API生成装货地址和卸货地址之间的20个轨迹点位
-        LocUtils.RouteResult routeResult = generateRoutePointsWithDuration(rWaybillOrderVo);
+        LocUtils.RouteResult routeResult = generateRoutePointsWithDuration(startLng, startLat, endLng, endLat);
         KwfTruckRoute kwfTruckRoute = new KwfTruckRoute();
         kwfTruckRoute.setFleetId(Optional.ofNullable(kwfFleetTruck).map(KwfFleetTruck::getFleetId).orElse(0L));
         kwfTruckRoute.setDriverId(req.getDriverId());
         kwfTruckRoute.setEntId(LoginUserHolder.getEntId());
         kwfTruckRoute.setStartPoint(req.getStartPoint());
         kwfTruckRoute.setUnloadingPoint(req.getUnloadingPoint());
+        kwfTruckRoute.setLoadLng(startLng);
+        kwfTruckRoute.setLoadLat(startLat);
+        kwfTruckRoute.setUnloadLng(endLng);
+        kwfTruckRoute.setUnloadLat(endLat);
         // 设置装货点和卸货点的耗时时间(单位:秒)
         if (routeResult != null && StringUtils.isNotBlank(routeResult.getDuration())) {
             kwfTruckRoute.setShortestTime(routeResult.getDuration());
         }
         // 如果生成了轨迹点,更新到数据库的point_info字段
         if (routeResult != null && StringUtils.isNotBlank(routeResult.getPointInfo())) {
-            kwfTruckRoute.setPointInfo(routeResult.getPointInfo());
+            List<LocUtils.RoutePoint> routePoints = JSON.parseArray(routeResult.getPointInfo(), LocUtils.RoutePoint.class);
+            if (CollectionUtils.isNotEmpty(routePoints)) {
+                List<QueryTruckRoteVo.TruckRoteDetail> details = routePoints.stream().map(x -> {
+                    QueryTruckRoteVo.TruckRoteDetail truckRoteDetail = new QueryTruckRoteVo.TruckRoteDetail();
+                    truckRoteDetail.setTs(truckRoteDetail.getTs());
+                    truckRoteDetail.setLongitude(truckRoteDetail.getLongitude());
+                    truckRoteDetail.setLatitude(truckRoteDetail.getLatitude());
+                    return truckRoteDetail;
+                }).collect(Collectors.toList());
+                kwfTruckRoute.setPointInfo(JSON.toJSONString(details));
+            }
+            kwfTruckRoute.setTruckNo(rWaybillOrderVo.getTruckNo());
+            kwfTruckRoute.setTruckId(rWaybillOrderVo.getTruckId());
+            truckRouteRepository.save(kwfTruckRoute);
         }
-        kwfTruckRoute.setTruckNo(rWaybillOrderVo.getTruckNo());
-        kwfTruckRoute.setTruckId(rWaybillOrderVo.getTruckId());
-        truckRouteRepository.save(kwfTruckRoute);
     }
+        /**
+         * 调用高德API生成装货地址和卸货地址之间的20个轨迹点位信息和耗时
+         * @param req 请求参数
+         * @return 轨迹点位和耗时信息
+         */
+        private LocUtils.RouteResult generateRoutePointsWithDuration (RWaybillOrderVo req){
+            try {
+                log.info("开始调用高德API生成轨迹点位和耗时,起点: {},{} 终点: {},{}",
+                        req.getStartLng(), req.getStartLat(), req.getEndLng(), req.getEndLat());
 
-    /**
-     * 调用高德API生成装货地址和卸货地址之间的20个轨迹点位信息和耗时
-     * @param req 请求参数
-     * @return 轨迹点位和耗时信息
-     */
-    private LocUtils.RouteResult generateRoutePointsWithDuration(RWaybillOrderVo req) {
-        try {
-            log.info("开始调用高德API生成轨迹点位和耗时,起点: {},{} 终点: {},{}", 
-                    req.getStartLng(), req.getStartLat(), req.getEndLng(), req.getEndLat());
-            
-            // 调用高德驾车路径规划API,生成20个轨迹点位和耗时
-            LocUtils.RouteResult routeResult = com.sckw.core.utils.LocUtils.getDrivingRoutePointsWithDuration(
-                    req.getStartLng(), 
-                    req.getStartLat(),
-                    req.getEndLng(), 
-                    req.getEndLat(),
-                    20
-            );
-            
-            if (routeResult != null && StringUtils.isNotBlank(routeResult.getPointInfo())) {
-                log.info("高德API生成轨迹点位成功,耗时: {}秒", routeResult.getDuration());
-            } else {
-                log.warn("高德API生成轨迹点位失败或返回空数据");
+                // 调用高德驾车路径规划API,生成20个轨迹点位和耗时
+                LocUtils.RouteResult routeResult = com.sckw.core.utils.LocUtils.getDrivingRoutePointsWithDuration(
+                        req.getStartLng(),
+                        req.getStartLat(),
+                        req.getEndLng(),
+                        req.getEndLat(),
+                        20
+                );
+
+                if (routeResult != null && StringUtils.isNotBlank(routeResult.getPointInfo())) {
+                    log.info("高德API生成轨迹点位成功,耗时: {}秒", routeResult.getDuration());
+                } else {
+                    log.warn("高德API生成轨迹点位失败或返回空数据");
+                }
+
+                return routeResult;
+            } catch (Exception e) {
+                log.error("调用高德API生成轨迹点位异常", e);
+                return null;
             }
-            
-            return routeResult;
-        } catch (Exception e) {
-            log.error("调用高德API生成轨迹点位异常", e);
-            return null;
         }
-    }
 
 }

+ 32 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java

@@ -1,5 +1,6 @@
 package com.sckw.transport.dubbo;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
@@ -1459,4 +1460,35 @@ public class TransportServiceImpl implements TransportRemoteService {
         return rWaybillOrderVo;
     }
 
+    @Override
+    public WaybillOrderSubtaskVo queryWaybillOrderId(Long wayBillOrderId) {
+        KwtWaybillOrderSubtask kwtWaybillOrder = waybillOrderSubtaskRepository.queryByBillOrderId(wayBillOrderId);
+        if (Objects.isNull(kwtWaybillOrder)){
+            return new WaybillOrderSubtaskVo();
+        }
+        WaybillOrderSubtaskVo rWaybillOrderVo = new WaybillOrderSubtaskVo();
+        rWaybillOrderVo.setId(kwtWaybillOrder.getId());
+        rWaybillOrderVo.setEntId(kwtWaybillOrder.getEntId());
+        rWaybillOrderVo.setLOrderId(kwtWaybillOrder.getLOrderId());
+        return rWaybillOrderVo;
+    }
+
+    @Override
+    public List<KwtLogisticsOrderAddressVo> queryByWOrderId(Long wayBillOrderId) {
+        List<KwtLogisticsOrderAddress> addressList = logisticsOrderAddressRepository.queryByLogOrderId(wayBillOrderId);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(addressList)){
+            return List.of();
+        }
+        return addressList.stream().map(address -> {
+            KwtLogisticsOrderAddressVo vo = new KwtLogisticsOrderAddressVo();
+            vo.setId(address.getId());
+            vo.setAddressType(address.getAddressType());
+            vo.setDetailAddress(address.getDetailAddress());
+            vo.setLng(address.getLng());
+            vo.setLat(address.getLat());
+            return vo;
+        }).collect(Collectors.toList());
+
+    }
+
 }

+ 8 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/VehicleExceptionQueryReq.java

@@ -34,6 +34,14 @@ public class VehicleExceptionQueryReq {
     /**
      * 开始时间
      */
+    @Schema(description = "开始时间")
+    private String startDate;
+    /**
+     * 结算时间
+     */
+    @Schema(description = "结算时间")
+    private String endDate;
+
     @Schema(description = "页码", example = "1")
     private Integer pageNum = 1;
     /**

+ 2 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderContractRepository.java

@@ -34,7 +34,8 @@ public class KwtLogisticsOrderContractRepository extends ServiceImpl<KwtLogistic
     public List<KwtLogisticsOrderContract> queryByContractId(Long contractId ) {
         return list(Wrappers.<KwtLogisticsOrderContract>lambdaQuery()
                 .eq(KwtLogisticsOrderContract::getDelFlag,0)
-                .eq(KwtLogisticsOrderContract::getContractId,contractId));
+                .eq(KwtLogisticsOrderContract::getContractId,contractId)
+                .select(KwtLogisticsOrderContract::getId,KwtLogisticsOrderContract::getContractId,KwtLogisticsOrderContract::getLOrderId));
     }
 
     public List<KwtLogisticsOrderContract> queryByLogContractIds(Set<Long> logContractIds) {

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

@@ -116,10 +116,10 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
         );
     }
 
-    public KwtLogisticsOrder queryByLogisticOrderNo(String lOrderNo) {
+    public KwtLogisticsOrder queryByLogisticOrderId(String lOrderNo) {
         return getOne(Wrappers.<KwtLogisticsOrder>lambdaQuery()
                 .eq(KwtLogisticsOrder::getDelFlag,0)
-                .eq(KwtLogisticsOrder::getLOrderNo, lOrderNo)
+                .eq(KwtLogisticsOrder::getId, lOrderNo)
                 .last("limit 1"));
     }
 

+ 3 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderUnitRepository.java

@@ -6,6 +6,7 @@ import com.sckw.transport.dao.KwtLogisticsOrderUnitMapper;
 import com.sckw.transport.model.KwtLogisticsOrderUnit;
 import org.springframework.stereotype.Repository;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -39,7 +40,8 @@ public class KwtLogisticsOrderUnitRepository extends ServiceImpl<KwtLogisticsOrd
     public List<KwtLogisticsOrderUnit> queryByEntIds(Set<Long> entIds) {
         return list(Wrappers.<KwtLogisticsOrderUnit>lambdaQuery()
                 .eq(KwtLogisticsOrderUnit::getDelFlag,0)
-                .in(KwtLogisticsOrderUnit::getEntId,entIds));
+                .in(KwtLogisticsOrderUnit::getEntId,entIds)
+                .select(KwtLogisticsOrderUnit::getId,KwtLogisticsOrderUnit::getLOrderId,KwtLogisticsOrderUnit::getEntId));
     }
 
     public List<KwtLogisticsOrderUnit> queryByLOrderId(Long logOrderId) {

+ 3 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtVehicleExceptionRepository.java

@@ -33,13 +33,15 @@ public class KwtVehicleExceptionRepository extends ServiceImpl<KwtVehicleExcepti
      * @return 分页结果
      */
     public IPage<KwtVehicleException> queryExceptionImagePage(Long entId, Integer exceptionType,
-                                                              String truckNo, int pageNum, int pageSize) {
+                                                              String truckNo,String startDate,String endDate, int pageNum, int pageSize) {
         return page(new Page<>(pageNum, pageSize),
                 Wrappers.<KwtVehicleException>lambdaQuery()
                         .eq(KwtVehicleException::getDelFlag, 0)
                         .eq(Objects.nonNull(entId), KwtVehicleException::getEntId, entId)
                         .eq(Objects.nonNull(exceptionType), KwtVehicleException::getExceptionType, exceptionType)
                         .like(StringUtils.isNotBlank(truckNo), KwtVehicleException::getTruckNo, truckNo)
+                        .ge(StringUtils.isNotBlank(startDate),KwtVehicleException::getCreateTime,startDate)
+                        .le(StringUtils.isNotBlank(endDate),KwtVehicleException::getCreateTime,endDate)
                         .orderByDesc(KwtVehicleException::getExceptionTime));
     }
 

+ 1 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderRepository.java

@@ -241,7 +241,6 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
 
     /**
      * 分页查询地图车辆列表(进行中任务)
-     * @param entIds 企业ID集合
      * @param startDate 开始日期
      * @param endDate 结束日期
      * @param taskingStatus 任务状态列表
@@ -250,12 +249,11 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
      * @param pageSize 每页数量
      * @return 分页结果
      */
-    public IPage<KwtWaybillOrder> queryMapVehicleListPage(Set<Long> entIds, Date startDate, Date endDate,
+    public IPage<KwtWaybillOrder> queryMapVehicleListPage(Date startDate, Date endDate,
                                                            List<Integer> taskingStatus, Set<Long> wayOrderIds,String truckNo, int pageNum, int pageSize) {
         return page(new Page<>(pageNum, pageSize),
                 Wrappers.<KwtWaybillOrder>lambdaQuery()
                         .eq(KwtWaybillOrder::getDelFlag, 0)
-                        .in(CollectionUtils.isNotEmpty(entIds), KwtWaybillOrder::getEntId, entIds)
                         .in(KwtWaybillOrder::getStatus, taskingStatus)
                         .in(CollectionUtils.isNotEmpty(wayOrderIds), KwtWaybillOrder::getId, wayOrderIds)
                         .ge(Objects.nonNull(startDate), KwtWaybillOrder::getCreateTime, startDate)

+ 15 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwfTaskService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
 import com.sckw.core.model.base.BaseModel;
 import com.sckw.core.model.enums.CarWaybillEnum;
+import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.utils.DateUtils;
 import com.sckw.core.web.context.LoginEntHolder;
 import com.sckw.core.web.context.LoginUserHolder;
@@ -36,6 +37,7 @@ import java.time.ZoneId;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author PC
@@ -84,18 +86,25 @@ public class KwfTaskService {
 
         List<KwtWaybillOrder> waybillOrder= kwtWaybillOrderRepository.queryByBillOrderIds(wayOrderIds);
         //任务总数
-        int totalCount = waybillOrder.size();
-        if (totalCount == 0) {
-            return new TaskStatisticsVo();
+        int totalCount =0;
+        List<KwtWaybillOrder> kwtWaybillOrderStream = waybillOrder.stream()
+                .filter(w -> !Objects.equals(w.getStatus(), CarWaybillV1Enum.CANCELLED.getCode()))
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(kwtWaybillOrderStream)) {
+            TaskStatisticsVo taskStatisticsVo = new TaskStatisticsVo();
+            taskStatisticsVo.setTaskTotal(String.valueOf(totalCount));
+            return taskStatisticsVo;
+        }else {
+            totalCount = kwtWaybillOrderStream.size();
         }
-        List<Integer> tasking = CarWaybillEnum.getTasking();
+        List<Integer> tasking = Arrays.asList(CarWaybillV1Enum.CANCELLED.getCode(), CarWaybillV1Enum.COMPLETED.getCode());
         //处理中的任务数
         long taskingCount = waybillOrder.stream()
-                .filter(w -> tasking.contains(w.getStatus()) && StringUtils.isNotBlank(w.getTruckNo()))
+                .filter(w -> !tasking.contains(w.getStatus()) && StringUtils.isNotBlank(w.getTruckNo()))
                 .count();
         //已经完成的任务数
         long completedCount = waybillOrder.stream()
-                .filter(w -> Objects.equals(w.getStatus(), CarWaybillEnum.COMPLETION_UNLOADING.getCode()))
+                .filter(w -> Objects.equals(w.getStatus(),CarWaybillV1Enum.COMPLETED.getCode()))
                 .count();
         //昨日累计任务数
         long yesterdayTaskCount = getYesterdayTaskCount(waybillOrder);

+ 17 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtTransportCommonService.java

@@ -1895,20 +1895,31 @@ public class KwtTransportCommonService {
         log.info("查询物流订单托运/承运企业");
         Long entId = LoginUserHolder.getEntId();
         //根据企业查询物流订单
-        List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByEntId(entId);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)){
+        List<KwtLogisticsOrderUnit> kwtLogisticsOrderUnits = logisticsOrderUnitRepository.queryByEntId(entId);
+        if (CollectionUtils.isEmpty(kwtLogisticsOrderUnits)){
             return List.of();
+
         }
-        List<Long> logIds = logisticsOrders.stream()
-                .map(KwtLogisticsOrder::getId)
+        List<Long> logIds = kwtLogisticsOrderUnits.stream()
+                .map(KwtLogisticsOrderUnit::getLOrderId)
+                .distinct()
                 .collect(Collectors.toList());
         List<KwtLogisticsOrderUnit> units =logisticsOrderUnitRepository.queryByLOrderIds(logIds);
         if (CollectionUtils.isEmpty(units)){
             return List.of();
         }
+        //
+
         return units.stream()
-                .map(KwtTransportCommonService::getLogisticsOrderUnitResp).
-                collect(Collectors.toList());
+                .collect(Collectors.toMap(
+                        unit -> unit.getEntId() + "_" + unit.getUnitType(),
+                        unit -> unit,
+                        (existing, replacement) -> existing,
+                        LinkedHashMap::new))
+                .values()
+                .stream()
+                .map(KwtTransportCommonService::getLogisticsOrderUnitResp)
+                .collect(Collectors.toList());
     }
 
     @NotNull

+ 2 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/VehicleExceptionService.java

@@ -66,6 +66,8 @@ public class VehicleExceptionService {
                 req.getEntId(),
                 req.getExceptionType(),
                 req.getTruckNo(),
+                req.getStartDate(),
+                req.getEndDate(),
                 req.getPageNum(),
                 req.getPageSize()
         );

+ 30 - 21
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

@@ -60,6 +60,7 @@ import com.sckw.transport.response.CollectZjxlResponse;
 import com.sckw.transport.service.zj.VehicleCollectService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.antlr.v4.runtime.misc.Array2DHashSet;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -133,8 +134,10 @@ public class kwfTruckTraceService {
         MapVehicleQueryReq queryReq = new MapVehicleQueryReq();
         queryReq.setCarrierEntId(req.getCarrierEntId());
         queryReq.setLogisticOrderNo(req.getLogisticOrderNo());
-        Set<Long> wayOrderIds = getWayOrderIds(queryReq);
-        if (CollectionUtils.isEmpty(wayOrderIds) && (StringUtils.isNotBlank(req.getLogisticOrderNo()) || Objects.nonNull(req.getCarrierEntId()))) {
+        Set<Long> entList = new HashSet<>();
+        entList.add(LoginUserHolder.getEntId());
+        Set<Long> wayOrderIds = getWayOrderIds(queryReq,entList);
+        if (CollectionUtils.isEmpty(wayOrderIds) && (StringUtils.isNotBlank(req.getLogisticOrderNo()) || Objects.nonNull(req.getCarrierEntId()) || Objects.nonNull(LoginUserHolder.getEntId()))) {
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
         Page<KwtWaybillOrder> page = kwtWaybillOrderRepository.findPage(wayOrderIds,req.getTruckNo(),req.getPageNum(), req.getPageSize(), startDate, endDate);
@@ -992,14 +995,14 @@ public class kwfTruckTraceService {
         }
         
         // 前置条件:根据承运单位和托运单位筛选出符合条件的运单ID
-        Set<Long> wayOrderIds = getWayOrderIds(req);
-        if (CollectionUtils.isEmpty(wayOrderIds) && (StringUtils.isNotBlank(req.getLogisticOrderNo()) || Objects.nonNull(req.getCarrierEntId()) || Objects.nonNull(req.getConsignEntId()))) {
+        Set<Long> wayOrderIds = getWayOrderIds(req,allEnt);
+        if (CollectionUtils.isEmpty(wayOrderIds) && (StringUtils.isNotBlank(req.getLogisticOrderNo()) || Objects.nonNull(req.getCarrierEntId()) || Objects.nonNull(req.getConsignEntId()) || Objects.nonNull(LoginUserHolder.getEntId()))) {
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
 
         // 使用 MyBatis-Plus 分页查询(如果有前置筛选条件,则添加运单ID的IN条件)
 
-        IPage<KwtWaybillOrder> page = kwtWaybillOrderRepository.queryMapVehicleListPage(allEnt,startDate, endDate, taskingStatus, wayOrderIds,req.getTrackNo(), req.getPageNum(),req.getPageSize() );
+        IPage<KwtWaybillOrder> page = kwtWaybillOrderRepository.queryMapVehicleListPage(startDate, endDate, taskingStatus, wayOrderIds,req.getTrackNo(), req.getPageNum(),req.getPageSize() );
         
         List<KwtWaybillOrder> waybillOrders = page.getRecords();
         if (CollectionUtils.isEmpty(waybillOrders)) {
@@ -1156,28 +1159,34 @@ public class kwfTruckTraceService {
     }
 
     @NotNull
-    private Set<Long> getWayOrderIds(MapVehicleQueryReq req) {
+    private Set<Long> getWayOrderIds(MapVehicleQueryReq req,Set<Long> allEnt) {
         Set<Long> wayOrderIds = Sets.newHashSet();
-        List<Long> entIds = new ArrayList<>();
+       // List<Long> entIds = new ArrayList<>();
         if (req.getConsignEntId() != null){
-            entIds.add(req.getConsignEntId());
+            allEnt.add(req.getConsignEntId());
         }
         if (req.getCarrierEntId() != null){
-            entIds.add(req.getCarrierEntId());
+            allEnt.add(req.getCarrierEntId());
         }
-        if (CollectionUtils.isNotEmpty(entIds)) {
+        if (CollectionUtils.isNotEmpty(allEnt)) {
             // 第一步:从物流订单单位表查询符合条件的物流订单ID
             // 同时有托运和承运单位条件,将企业ID和类型组合后批量查询
             List<KwtLogisticsOrderUnit> allUnits = kwtLogisticsOrderUnitRepository.list(
                     Wrappers.<KwtLogisticsOrderUnit>lambdaQuery()
                             .eq(KwtLogisticsOrderUnit::getDelFlag, 0)
-                            .in(KwtLogisticsOrderUnit::getEntId, entIds)
+                            .in(KwtLogisticsOrderUnit::getEntId, allEnt)
                             .in(KwtLogisticsOrderUnit::getUnitType, Arrays.asList(1, 2)));
             if (CollectionUtils.isEmpty(allUnits)) {
                 return Set.of();
             }
+            Set<Long> logisticsOrderIds = allUnits.stream()
+                    .filter(x -> Objects.equals(x.getEntId(), LoginUserHolder.getEntId()))
+                    .map(KwtLogisticsOrderUnit::getLOrderId)
+                    .collect(Collectors.toSet());
+
             Set<Long> lOrderIds = allUnits.stream()
                     .map(KwtLogisticsOrderUnit::getLOrderId)
+                    .filter(logisticsOrderIds::contains)
                     .collect(Collectors.toSet());
             if (CollectionUtils.isEmpty(lOrderIds)) {
                 return Set.of();
@@ -1204,7 +1213,7 @@ public class kwfTruckTraceService {
         }
         if (StringUtils.isNotBlank(req.getLogisticOrderNo())) {
             // 获取物流订单ID
-            KwtLogisticsOrder logOrder = kwtLogisticsOrderRepository.queryByLogisticOrderNo(req.getLogisticOrderNo());
+            KwtLogisticsOrder logOrder = kwtLogisticsOrderRepository.queryByLogisticOrderId(req.getLogisticOrderNo());
             if (Objects.isNull(logOrder)) {
                 return Set.of();
             }
@@ -1481,15 +1490,15 @@ public class kwfTruckTraceService {
         //根据企业类型查询企业
 
         allEnt.add(LoginUserHolder.getEntId());
-        EntCacheResDto entCacheResDto = remoteSystemService.queryEntTreeById(LoginUserHolder.getUserId());
-        if (Objects.nonNull(entCacheResDto)) {
-            EntCacheResDto entCacheResDto1 = remoteSystemService.queryEntTreeById(entCacheResDto.getId());
-            List<EntCacheResDto> child = entCacheResDto1.getChild();
-            if (com.sckw.core.utils.CollectionUtils.isNotEmpty(child)) {
-                allEnt.addAll(child.stream()
-                        .map(EntCacheResDto::getId).toList());
-            }
-        }
+//        EntCacheResDto entCacheResDto = remoteSystemService.queryEntTreeById(LoginUserHolder.getUserId());
+//        if (Objects.nonNull(entCacheResDto)) {
+//            EntCacheResDto entCacheResDto1 = remoteSystemService.queryEntTreeById(entCacheResDto.getId());
+//            List<EntCacheResDto> child = entCacheResDto1.getChild();
+//            if (com.sckw.core.utils.CollectionUtils.isNotEmpty(child)) {
+//                allEnt.addAll(child.stream()
+//                        .map(EntCacheResDto::getId).toList());
+//            }
+//        }
         return allEnt;
     }