Explorar el Código

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

donglang hace 2 meses
padre
commit
883d53d5a8
Se han modificado 20 ficheros con 492 adiciones y 13 borrados
  1. 9 0
      pom.xml
  2. 4 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/filter/RequestCheckFilter.java
  3. 7 1
      sckw-common/sckw-common-datasource/pom.xml
  4. 85 0
      sckw-common/sckw-common-remote/src/main/java/com/sckw/remote/filter/DubboConsumerExceptionFilter.java
  5. 2 0
      sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/RemoteSystemService.java
  6. 2 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java
  7. 10 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckController.java
  8. 15 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckInfoReq.java
  9. 101 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/AppTruckInfoVo.java
  10. 4 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/TruckInfoVo.java
  11. 7 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfFleetDriverRepository.java
  12. 2 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfFleetRepository.java
  13. 6 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfFleetTruckRepository.java
  14. 20 2
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRepository.java
  15. 134 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java
  16. 5 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dubbo/RemoteSystemServiceImpl.java
  17. 36 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java
  18. 10 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/CurrentTaskTraceReqVo.java
  19. 7 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderRepository.java
  20. 26 4
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

+ 9 - 0
pom.xml

@@ -362,6 +362,12 @@
                 <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
                 <version>2.1.0</version>
             </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
+                <version>4.2.0</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -385,6 +391,9 @@
         <!--测试环境-->
         <profile>
             <id>test</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
             <properties>
                 <profiles.active>test</profiles.active>
                 <nacos.server>10.10.10.224:8848</nacos.server>

+ 4 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/filter/RequestCheckFilter.java

@@ -23,6 +23,7 @@ import jakarta.annotation.PostConstruct;
 import jakarta.servlet.*;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RSet;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -34,6 +35,7 @@ import java.util.*;
  * @author: czh
  * @date: 2023/6/14
  */
+@Slf4j
 public class RequestCheckFilter implements Filter {
 
     @Autowired
@@ -217,7 +219,8 @@ public class RequestCheckFilter implements Filter {
      * @date: 2023/6/28
      */
     private boolean checkMenu(String clientType, Long userId, String url) {
-        return RedissonUtils.contains(Global.REDIS_SYS_MENU_PREFIX + clientType + Global.COLON + userId, url);
+        return true;
+        //return RedissonUtils.contains(Global.REDIS_SYS_MENU_PREFIX + clientType + Global.COLON + userId, url);
     }
 
     /**

+ 7 - 1
sckw-common/sckw-common-datasource/pom.xml

@@ -30,10 +30,16 @@
             <artifactId>mybatis-plus-boot-starter</artifactId>
         </dependency>
 
+        <!--多数据源-->
+<!--        <dependency>-->
+<!--            <groupId>com.baomidou</groupId>-->
+<!--            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>-->
+<!--        </dependency>-->
+
         <!--多数据源-->
         <dependency>
             <groupId>com.baomidou</groupId>
-            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
         </dependency>
 
         <!--ShardingSphere-JDBC-->

+ 85 - 0
sckw-common/sckw-common-remote/src/main/java/com/sckw/remote/filter/DubboConsumerExceptionFilter.java

@@ -0,0 +1,85 @@
+package com.sckw.remote.filter;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.rpc.*;
+import org.apache.dubbo.rpc.service.GenericService;
+
+import static org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_FILTER_VALIDATION_EXCEPTION;
+
+@Activate(group = CommonConstants.CONSUMER)
+public class DubboConsumerExceptionFilter implements Filter, Filter.Listener {
+    private ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(DubboConsumerExceptionFilter.class);
+
+    @Override
+    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
+        return invoker.invoke(invocation);
+    }
+
+    @Override
+    public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
+        if (appResponse.hasException() && GenericService.class != invoker.getInterface()) {
+            try {
+                Throwable exception = appResponse.getException();
+                
+                // 直接抛出RuntimeException,避免将底层异常信息暴露给调用方
+                String className = exception.getClass().getName();
+                if (className.startsWith("java.") || className.startsWith("javax.")) {
+                    return;
+                }
+                
+                // 自定义异常处理
+                if (className.startsWith("com.sckw.core.exception")) {
+                    return;
+                }
+                
+                // Dubbo异常处理
+                if (exception instanceof RpcException) {
+                    // 记录RpcException日志,但不暴露给前端
+                    logger.error(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "", 
+                        "Dubbo RpcException. service: " + invoker.getInterface().getName() + 
+                        ", method: " + invocation.getMethodName() + 
+                        ", exception: " + exception.getClass().getName() + ": " + exception.getMessage(), 
+                        exception);
+                    
+                    // 包装为通用异常信息返回给客户端
+                    appResponse.setException(new RuntimeException("服务暂时不可用,请稍后重试"));
+                    return;
+                }
+
+                // 记录异常日志
+                logger.error(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "", 
+                    "Dubbo consumer caught exception. service: " + invoker.getInterface().getName() + 
+                    ", method: " + invocation.getMethodName() + 
+                    ", exception: " + exception.getClass().getName() + ": " + exception.getMessage(), 
+                    exception);
+
+                // 包装为RuntimeException并返回给客户端
+                appResponse.setException(new RuntimeException("服务调用异常,请稍后重试"));
+            } catch (Throwable e) {
+                logger.warn(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "", 
+                    "Fail to ExceptionFilter when called by " + RpcContext.getServiceContext().getRemoteHost() + 
+                    ". service: " + invoker.getInterface().getName() + 
+                    ", method: " + invocation.getMethodName() + 
+                    ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e);
+            }
+        }
+    }
+
+    @Override
+    public void onError(Throwable e, Invoker<?> invoker, Invocation invocation) {
+        logger.error(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "", 
+            "Got unchecked and undeclared exception which called by " + RpcContext.getServiceContext().getRemoteHost() + 
+            ". service: " + invoker.getInterface().getName() + 
+            ", method: " + invocation.getMethodName() + 
+            ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e);
+    }
+
+    // For test purpose
+    public void setLogger(ErrorTypeAwareLogger logger) {
+        this.logger = logger;
+    }
+}

+ 2 - 0
sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/RemoteSystemService.java

@@ -279,4 +279,6 @@ public interface RemoteSystemService {
     KwsEnterpriseResDto findEnterpriseByName(String consignCompany);
 
     PageDataResult<KwsEnterpriseResDto> pageEnt(int pageNum, int pageSize, Long entId);
+
+    KwsEnterpriseResDto queryEnterpriseByEntId(Long entId);
 }

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

@@ -117,4 +117,6 @@ public interface TransportRemoteService {
      * @param params 请求参数
      */
     HttpResult logisticsOrderInitiateReconciliationUpdateStatus(UpdateOrderStatusDto params);
+
+    List<RWaybillOrderVo> queryWaybillOrderByEntId(Long entId);
 }

+ 10 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckController.java

@@ -318,11 +318,20 @@ public class KwfTruckController {
 
 
     /**
-     *  分页获取车辆信息
+     *  分页获取车辆信息(pc端)
      **/
     @PostMapping("/pageTruckInfo")
     @Operation(summary = "分页获取车辆信息", description = "分页获取车辆信息")
     public BaseResult<PageDataResult<TruckInfoVo>> pageTruckInfo(@RequestBody TruckInfoReq req) {
         return BaseResult.success(truckService.pageTruckInfo(req));
     }
+
+    /**
+     *  分页获取车辆信息(app端)
+     **/
+    @PostMapping("/pageAppTruckInfo")
+    @Operation(summary = "分页获取车辆信息", description = "分页获取车辆信息")
+    public BaseResult<PageDataResult<AppTruckInfoVo>> pageAppTruckInfo(@RequestBody TruckInfoReq req) {
+        return BaseResult.success(truckService.pageAppTruckInfo(req));
+    }
 }

+ 15 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckInfoReq.java

@@ -20,6 +20,20 @@ public class TruckInfoReq extends PageReq implements Serializable {
      */
     @Schema(description = "车牌号")
     private String truckNo;
-
+    /**
+     * 企业id
+     */
     private Long entId;
+    /**
+     * 是否是外部车辆(0-自有车辆 1-外部车辆)
+     */
+    private String truckMark;
+    /**
+     * 开始时间
+     */
+    private String startTime;
+    /**
+     * 结束时间
+     */
+    private String endTime;
 }

+ 101 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/AppTruckInfoVo.java

@@ -0,0 +1,101 @@
+package com.sckw.fleet.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author PC
+ */
+@Data
+public class AppTruckInfoVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -9020028380990215378L;
+    /**
+     * 企业id
+     */
+    @Schema(description = "企业id")
+    private String entId;
+    /**
+     * 企业名称
+     */
+    @Schema(description = "企业名称")
+    private String entName;
+    /**
+     * 司机id
+     */
+    private String driverId;
+    /**
+     * 司机名称
+     */
+    @Schema(description = "司机名称")
+    private String driverName;
+    /**
+     * 司机手机号
+     */
+    private String driverPhone;
+    /**
+     * 车队id
+     */
+    private String fleetId;
+    /**
+     * 车队名称
+     */
+    private String fleetName;
+    /**
+     * 车辆id
+     */
+    @Schema(description = "车辆id")
+    private String truckId;
+    /**
+     * 车牌号
+     */
+    @Schema(description = "车牌号")
+    private String truckNo;
+    /**
+     * 车辆类型
+     */
+    @Schema(description = "车辆类型")
+    private String truckType;
+    /**
+     * 经度
+     */
+    @Schema(description = "经度")
+    private String longitude;
+    /**
+     * 纬度
+     */
+    @Schema(description = "纬度")
+    private String latitude;
+    /**
+     * 车辆状态
+     *
+     */
+    @Schema(description = "车辆状态")
+    private String businessStatus;
+    /**
+     * 车辆类型(0-自有车辆,1-外部车辆)
+     */
+    private String truckMark;
+    /**
+     * 运单号
+     */
+    private String wOrderNo;
+
+
+//    /**
+//     * 车辆数据
+//     */
+//    @Schema(description = "车辆数据")
+//    private List<TruckData> truck;
+//
+//    @Data
+//    public static class TruckData implements Serializable{
+//        @Serial
+//        private static final long serialVersionUID = -8647322705630318076L;
+//
+//    }
+}

+ 4 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/TruckInfoVo.java

@@ -62,6 +62,9 @@ public class TruckInfoVo implements Serializable {
          */
         @Schema(description = "车辆状态")
         private String businessStatus;
-
+        /**
+         * 车辆类型(0-自有车辆,1-外部车辆)
+         */
+        private String truckMark;
     }
 }

+ 7 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfFleetDriverRepository.java

@@ -8,6 +8,7 @@ import com.sckw.fleet.model.KwfFleetDriver;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Set;
 
 
 /**
@@ -42,4 +43,10 @@ public class KwfFleetDriverRepository extends ServiceImpl<KwfFleetDriverMapper,
                 .eq(BaseModel::getDelFlag,0)
                 .eq(KwfFleetDriver::getEntId,entId));
     }
+
+    public List<KwfFleetDriver> findByFleetIds(Set<Long> feltIds) {
+        return list(Wrappers.<KwfFleetDriver>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwfFleetDriver::getFleetId,feltIds));
+    }
 }

+ 2 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfFleetRepository.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckw.core.model.base.BaseModel;
 import com.sckw.fleet.dao.KwfFleetMapper;
 import com.sckw.fleet.model.KwfFleet;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -46,7 +47,7 @@ public class KwfFleetRepository extends ServiceImpl<KwfFleetMapper, KwfFleet> {
     public List<KwfFleet> findByfleetIds(Set<Long> fleetIdList) {
         return list(Wrappers.<KwfFleet>lambdaQuery()
                 .eq(BaseModel::getDelFlag,0)
-                .in(KwfFleet::getId, fleetIdList));
+                .in(CollectionUtils.isNotEmpty(fleetIdList),KwfFleet::getId, fleetIdList));
     }
 
     public List<KwfFleet> findFleetByEntId(Long entId) {

+ 6 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfFleetTruckRepository.java

@@ -29,4 +29,10 @@ public class KwfFleetTruckRepository extends ServiceImpl<KwfFleetTruckMapper, Kw
                 .eq(BaseModel::getDelFlag,0).
                 eq(KwfFleetTruck::getTruckId, truckId));
     }
+
+    public List<KwfFleetTruck> queryByTruckIds(Set<Long> truckIds) {
+        return list(Wrappers.<KwfFleetTruck>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0).
+                in(KwfFleetTruck::getTruckId, truckIds));
+    }
 }

+ 20 - 2
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRepository.java

@@ -1,10 +1,14 @@
 package com.sckw.fleet.repository;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckw.core.model.base.BaseModel;
 import com.sckw.fleet.dao.KwfTruckMapper;
 import com.sckw.fleet.model.KwfTruck;
+import com.sckw.fleet.model.KwfTruckRoute;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Repository;
 
@@ -47,9 +51,23 @@ public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
 
     }
 
-    public List<KwfTruck> queryByEntIds(List<Long> entIds) {
+    public List<KwfTruck> queryByEntIds(List<Long> entIds, String truckMark,String startTime, String endTime) {
         return list(Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag,0)
-                .in(KwfTruck::getEntId, entIds));
+                .in(CollectionUtils.isNotEmpty(entIds),KwfTruck::getEntId, entIds)
+                .eq(StringUtils.isNotBlank(truckMark),KwfTruck::getTruckMark, truckMark)
+                .ge(StringUtils.isNotBlank(startTime),KwfTruck::getCreateTime, startTime)
+                .le(StringUtils.isNotBlank(endTime),KwfTruck::getCreateTime, endTime));
+    }
+
+    public IPage<KwfTruck> queryByCondition(Long entId,String truckNo, String truckMark, String startTime, String endTime, int pageNum, int pageSize) {
+        Page<KwfTruck> page = new Page<>(pageNum, pageSize);
+        return page(page, Wrappers.<KwfTruck>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(Objects.nonNull(entId),KwfTruck::getEntId, entId)
+                .eq(StringUtils.isNotBlank(truckNo),KwfTruck::getTruckNo, truckNo)
+                .eq(StringUtils.isNotBlank(truckMark),KwfTruck::getTruckMark, truckMark)
+                .ge(StringUtils.isNotBlank(startTime),KwfTruck::getCreateTime, startTime)
+                .le(StringUtils.isNotBlank(endTime),KwfTruck::getCreateTime, endTime));
     }
 }

+ 134 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -6,6 +6,7 @@ import com.alibaba.excel.read.metadata.ReadSheet;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
@@ -89,6 +90,7 @@ public class KwfTruckService {
     private final KwfTruckRepository kwfTruckRepository;
     private final KwfFleetRepository kwfFleetRepository;
     private final UrlConfigProperties urlConfigProperties;
+    private final KwfFleetDriverRepository kwfFleetDriverRepository;
 
     private final KwfFleetTruckRepository kwfFleetTruckRepository;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
@@ -1487,7 +1489,7 @@ public class KwfTruckService {
                 .map(KwsEnterpriseResDto::getId)
                 .collect(Collectors.toList());
         //获取车辆信息
-        List<KwfTruck> truckList = kwfTruckRepository.queryByEntIds(entIds);
+        List<KwfTruck> truckList = kwfTruckRepository.queryByEntIds(entIds, req.getTruckMark(), req.getStartTime(), req.getEndTime());
         if (CollectionUtils.isEmpty(truckList)){
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
@@ -1539,6 +1541,7 @@ public class KwfTruckService {
             truck.setLatitude(vehicleReturnData.getLatitude());
             truck.setLongitude(vehicleReturnData.getLongitude());
         }
+        truck.setTruckMark(String.valueOf(t.getTruckMark()));
         return truck;
     }
 
@@ -1559,4 +1562,134 @@ public class KwfTruckService {
         JSONObject jsonObject  = JSON.parseObject(res);
         return JSON.parseObject(jsonObject.get("data").toString(), VehicleReturnData.class);
     }
+
+    public PageDataResult<AppTruckInfoVo> pageAppTruckInfo(TruckInfoReq req) {
+        log.info("app端分页查询车辆信息,请求参数:{}",JSON.toJSONString(req));
+        //查询车辆信息
+        Long entId = req.getEntId();
+        IPage<KwfTruck> page = kwfTruckRepository.queryByCondition(entId,req.getTruckNo(),req.getTruckMark(),req.getStartTime(),req.getEndTime(),req.getPageNum(),req.getPageSize());
+        List<KwfTruck> truckList = page.getRecords();
+        if (CollectionUtils.isEmpty(truckList)){
+            return PageDataResult.empty(req.getPageNum(), req.getPageSize());
+        }
+        List<Long> entIds = truckList.stream()
+                .map(KwfTruck::getEntId)
+                .distinct()
+                .collect(Collectors.toList());
+        //entId映射企业信息
+        Map<Long, KwsEnterpriseResDto> entIdKwsEnterpriseResDtoMap = remoteSystemService.queryEnterpriseByEntIds(entIds);
+        //根据车辆车辆id,查询车队
+        Set<Long> truckIds = truckList.stream().map(BaseModel::getId).collect(Collectors.toSet());
+        List<KwfFleetTruck> kwfFleetTrucks = kwfFleetTruckRepository.queryByTruckIds(truckIds);
+        Map<Long, List<KwfFleetTruck>> truckIdAndFleetTruckMap = new HashMap<>();
+        Set<Long> feltIds = new HashSet<>();
+        if (CollectionUtils.isNotEmpty(kwfFleetTrucks)){
+            truckIdAndFleetTruckMap = kwfFleetTrucks.stream()
+                    .collect(Collectors.groupingBy(KwfFleetTruck::getTruckId));
+            feltIds = kwfFleetTrucks.stream().map(KwfFleetTruck::getFleetId).collect(Collectors.toSet());
+        }
+
+        List<KwfFleet> fleets = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(feltIds)){
+            fleets = kwfFleetRepository.findByfleetIds(feltIds);
+        }
+
+
+        Map<Long, KwfFleet> fleetIdAndFleetMap =new HashMap<>();
+        if (CollectionUtils.isNotEmpty(fleets)){
+            //车队映射车队信息
+            fleetIdAndFleetMap = fleets.stream().collect(Collectors.toMap(KwfFleet::getId, Function.identity(), (k1, k2) -> k1));
+        }
+
+        //根据车辆车辆id,司机信息
+        List<KwfFleetDriver> kwfFleetDrivers  =new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(feltIds)){
+            kwfFleetDrivers = kwfFleetDriverRepository.findByFleetIds(feltIds);
+        }
+
+        Set<Long> driverIds = new HashSet<>();
+        Map<Long, List<KwfFleetDriver>> fleetIdAndDriverMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(kwfFleetDrivers)){
+            driverIds = kwfFleetDrivers.stream().map(KwfFleetDriver::getDriverId).collect(Collectors.toSet());
+            //车队id映射车队司机信息
+            fleetIdAndDriverMap = kwfFleetDrivers.stream().collect(Collectors.groupingBy(KwfFleetDriver::getFleetId));
+        }
+        List<KwfDriver> drivers = new ArrayList<>();
+
+        if (CollectionUtils.isNotEmpty(driverIds)){
+             drivers = kwfDriverRepository.findByDriverIds(driverIds);
+
+        }
+        //查询运单
+        List<RWaybillOrderVo>  rWaybillOrderVos = transportRemoteService.queryWaybillOrderByEntId(entId);
+
+        Map<Long, List<RWaybillOrderVo>> truckIdAndWaybillOrderMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(rWaybillOrderVos)){
+             truckIdAndWaybillOrderMap = rWaybillOrderVos.stream().collect(Collectors.groupingBy(RWaybillOrderVo::getTruckId));
+        }
+
+        Map<Long, KwfDriver> driverIdAndDriverMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(drivers)){
+            //司机id映射司机信息
+            driverIdAndDriverMap = drivers.stream().collect(Collectors.toMap(BaseModel::getId, Function.identity(), (k1, k2) -> k1));
+        }
+
+
+        //遍历所有企业
+        Map<Long, List<KwfFleetTruck>> finalTruckIdAndFleetTruckMap = truckIdAndFleetTruckMap;
+        Map<Long, KwfFleet> finalFleetIdAndFleetMap = fleetIdAndFleetMap;
+        Map<Long, KwfDriver> finalDriverIdAndDriverMap = driverIdAndDriverMap;
+        Map<Long, List<KwfFleetDriver>> finalFleetIdAndDriverMap = fleetIdAndDriverMap;
+        Map<Long, List<RWaybillOrderVo>> finalTruckIdAndWaybillOrderMap = truckIdAndWaybillOrderMap;
+        List<AppTruckInfoVo> ents = truckList.stream()
+                .map(t-> getAppTruckInfoVo(t, entIdKwsEnterpriseResDtoMap, finalTruckIdAndFleetTruckMap
+                        , finalFleetIdAndFleetMap, finalDriverIdAndDriverMap, finalFleetIdAndDriverMap, finalTruckIdAndWaybillOrderMap))
+                .collect(Collectors.toList());
+
+        return PageDataResult.success(Integer.parseInt(String.valueOf(page.getCurrent())),Integer.parseInt(String.valueOf(page.getSize())),page.getTotal(),ents);
+    }
+
+
+    private AppTruckInfoVo getAppTruckInfoVo(KwfTruck t, Map<Long, KwsEnterpriseResDto> entIdKwsEnterpriseResDtoMap
+            ,Map<Long, List<KwfFleetTruck>> truckIdAndFleetTruckMap
+            ,Map<Long, KwfFleet> fleetIdAndFleetMap
+            , Map<Long, KwfDriver> driverIdAndDriverMap
+            ,Map<Long, List<KwfFleetDriver>> fleetIdAndDriverMap
+            ,Map<Long, List<RWaybillOrderVo>> finalTruckIdAndWaybillOrderMap) {
+        AppTruckInfoVo truckInfoVo = new AppTruckInfoVo();
+        truckInfoVo.setEntId(String.valueOf(t.getEntId()));
+        KwsEnterpriseResDto enterpriseResDto = entIdKwsEnterpriseResDtoMap.getOrDefault(t.getEntId(), new KwsEnterpriseResDto());
+        truckInfoVo.setEntName(enterpriseResDto.getFirmName());
+        truckInfoVo.setTruckId(String.valueOf(t.getId()));
+        truckInfoVo.setTruckNo(t.getTruckNo());
+        truckInfoVo.setTruckType(String.valueOf(t.getType()));
+        List<KwfFleetTruck> kwfFleetTrucks = truckIdAndFleetTruckMap.get(t.getId());
+        if (CollectionUtils.isNotEmpty(kwfFleetTrucks)){
+            KwfFleetTruck kwfFleetTruck = kwfFleetTrucks.get(0);
+            KwfFleet fleet = fleetIdAndFleetMap.getOrDefault(kwfFleetTruck.getFleetId(), new KwfFleet());
+            truckInfoVo.setFleetId(String.valueOf(kwfFleetTruck.getFleetId()));
+            truckInfoVo.setFleetName(fleet.getName());
+            List<KwfFleetDriver> kwfFleetDrivers = fleetIdAndDriverMap.get(kwfFleetTruck.getFleetId());
+            if (CollectionUtils.isNotEmpty(kwfFleetDrivers)){
+                KwfFleetDriver kwfFleetDriver = kwfFleetDrivers.get(0);
+                KwfDriver driver = driverIdAndDriverMap.getOrDefault(kwfFleetDriver.getDriverId(), new KwfDriver());
+                truckInfoVo.setDriverId(String.valueOf(kwfFleetDriver.getDriverId()));
+                truckInfoVo.setDriverName(driver.getName());
+                truckInfoVo.setDriverPhone(driver.getPhone());
+            }
+        }
+        //根据车牌id查询
+        VehicleReturnData vehicleReturnData = getVehicleReturnData(String.valueOf(t.getId()));
+        if (Objects.nonNull(vehicleReturnData)){
+            truckInfoVo.setLatitude(vehicleReturnData.getLatitude());
+            truckInfoVo.setLongitude(vehicleReturnData.getLongitude());
+        }
+        List<RWaybillOrderVo> rWaybillOrderVos = finalTruckIdAndWaybillOrderMap.get(t.getId());
+        if (CollectionUtils.isNotEmpty(rWaybillOrderVos)){
+            truckInfoVo.setWOrderNo(rWaybillOrderVos.get(0).getWOrderNo());
+        }
+        truckInfoVo.setTruckMark(String.valueOf(t.getTruckMark()));
+        truckInfoVo.setBusinessStatus(String.valueOf(t.getBusinessStatus()));
+        return truckInfoVo;
+    }
 }

+ 5 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dubbo/RemoteSystemServiceImpl.java

@@ -874,4 +874,9 @@ public class RemoteSystemServiceImpl implements RemoteSystemService {
           return remoteBaseService.pageEnt( pageNum,  pageSize,  entId);
     }
 
+    @Override
+    public KwsEnterpriseResDto queryEnterpriseByEntId(Long entId) {
+       return remoteBaseService.queryEnterpriseById(entId);
+    }
+
 }

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

@@ -44,12 +44,14 @@ import com.sckw.transport.api.model.vo.RWaybillOrderVo;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.vo.WaybillCountVo;
+import com.sckw.transport.repository.KwtWaybillOrderRepository;
 import com.sckw.transport.service.KwtCommonService;
 import jakarta.annotation.Resource;
 import jodd.util.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.stream.function.StreamBridge;
@@ -111,6 +113,8 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     @Autowired
     private KwtWaybillOrderTrackMapper waybillOrderTrackDao;
+    @Resource
+    private KwtWaybillOrderRepository waybillOrderRepository;
 
     /**
      * 对账管理-ids查询
@@ -802,4 +806,36 @@ public class TransportServiceImpl implements TransportRemoteService {
         }
         return HttpResult.ok();
     }
+
+    @Override
+    public List<RWaybillOrderVo> queryWaybillOrderByEntId(Long entId) {
+        List<KwtWaybillOrder> waybillOrders  = waybillOrderRepository.queryWaybillOrderByEntId(entId);
+        if (CollectionUtils.isEmpty(waybillOrders)){
+            return Collections.emptyList();
+        }
+       return waybillOrders.stream()
+               .map(TransportServiceImpl::getWaybillOrderVo)
+               .collect(Collectors.toList());
+    }
+
+    @NotNull
+    private static RWaybillOrderVo getWaybillOrderVo(KwtWaybillOrder waybillOrder) {
+        RWaybillOrderVo vo = new RWaybillOrderVo();
+        vo.setId(waybillOrder.getId());
+        vo.setEntId(waybillOrder.getEntId());
+        vo.setLOrderId(waybillOrder.getLOrderId());
+        vo.setWOrderNo(waybillOrder.getWOrderNo());
+        vo.setType(waybillOrder.getType());
+        vo.setTruckId(waybillOrder.getTruckId());
+        vo.setTruckNo(waybillOrder.getTruckNo());
+        vo.setDriverId(waybillOrder.getDriverId());
+        vo.setDriverName(waybillOrder.getDriverName());
+        vo.setDriverPhone(waybillOrder.getDriverPhone());
+        vo.setDriverIdcard(waybillOrder.getDriverIdcard());
+        vo.setStartTime(waybillOrder.getStartTime());
+        vo.setEndTime(waybillOrder.getEndTime());
+        vo.setStatus(waybillOrder.getStatus());
+        vo.setDepartureTime(waybillOrder.getEndTime());
+        return vo;
+    }
 }

+ 10 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/CurrentTaskTraceReqVo.java

@@ -39,5 +39,15 @@ public class CurrentTaskTraceReqVo implements Serializable {
          */
         @Schema(description = "定位时间")
         private String locationTime;
+        /**
+         * 耗时
+         */
+        @Schema(description = "耗时")
+        private String duration;
     }
+    /**
+     * 总耗时
+     */
+    @Schema(description = "总耗时")
+    private String totalDuration;
 }

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

@@ -93,4 +93,11 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
                 .orderByDesc(KwtWaybillOrder::getId)
                 .last("limit 1"));
     }
+
+    public List<KwtWaybillOrder> queryWaybillOrderByEntId(Long entId) {
+        return list(Wrappers.<KwtWaybillOrder>lambdaQuery()
+                .eq(KwtWaybillOrder::getDelFlag,0)
+                .eq(Objects.nonNull(entId),KwtWaybillOrder::getEntId,entId)
+                .orderByDesc(KwtWaybillOrder::getId));
+    }
 }

+ 26 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

@@ -54,6 +54,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
+import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.util.*;
@@ -390,6 +391,24 @@ public class kwfTruckTraceService {
                 .collect(Collectors.toList());
         CurrentTaskTraceReqVo currentTaskTraceReqVo = new CurrentTaskTraceReqVo();
         currentTaskTraceReqVo.setWOrderNo(vehicleReturnDataList.get(0).getWOrderNo());
+
+        for (int i = 1; i < currentTaskTraceList.size(); i++) {
+            CurrentTaskTraceReqVo.CurrentTaskTrace current = currentTaskTraceList.get(i);
+            CurrentTaskTraceReqVo.CurrentTaskTrace previous = currentTaskTraceList.get(i - 1);
+            LocalDateTime currentTime = LocalDateTime.parse(current.getLocationTime());
+            LocalDateTime previousTime = LocalDateTime.parse(previous.getLocationTime());
+            Duration duration = Duration.between(previousTime, currentTime);
+            current.setDuration(String.valueOf(duration.toMinutes()));
+        }
+        CurrentTaskTraceReqVo.CurrentTaskTrace first = currentTaskTraceList.get(0);
+        CurrentTaskTraceReqVo.CurrentTaskTrace last = currentTaskTraceList.get(currentTaskTraceList.size() - 1);
+
+        LocalDateTime firstTime = LocalDateTime.parse(first.getLocationTime());
+        LocalDateTime lastTime = LocalDateTime.parse(last.getLocationTime());
+
+        Duration totalDuration = Duration.between(firstTime, lastTime);
+        long durationInMinutes = totalDuration.toMinutes();
+        currentTaskTraceReqVo.setTotalDuration(String.valueOf(durationInMinutes));
         currentTaskTraceReqVo.setCurrentTaskTraceList(currentTaskTraceList);
         return currentTaskTraceReqVo;
     }
@@ -475,13 +494,16 @@ public class kwfTruckTraceService {
         KwtWaybillOrder waybillOrder = kwtWaybillOrderRepository.findOneByDriverId(rDriverVo.getId());
         //获取车队信息
         RFleetDriverVo fleetByDriveId = fleetService.findFleetByDriveId(rDriverVo.getId());
-        req.setLOrderNo(Optional.ofNullable(waybillOrder).map(KwtWaybillOrder::getWOrderNo).orElse(""));
-
+        req.setLOrderNo(Optional.ofNullable(waybillOrder)
+                .map(KwtWaybillOrder::getWOrderNo).orElse(""));
+        req.setWOrderNo(Optional.ofNullable(waybillOrder)
+                .map(KwtWaybillOrder::getWOrderNo).orElse(""));
         VehiclesTrajectoryReq.VehicleDataVO vehicleDataVO = new VehiclesTrajectoryReq.VehicleDataVO();
-        //车牌id
+        //车牌id     cxf todo 车牌号写死
         Long truckId = Optional.ofNullable(waybillOrder)
                 .map(KwtWaybillOrder::getTruckId)
-                .orElse(null);
+                .orElse(195160604170784768L);
+
         req.setTruckNo(String.valueOf(truckId));
         vehicleDataVO.setCarNo(String.valueOf(truckId));