Przeglądaj źródła

字典模块开发

chenxiaofei 6 miesięcy temu
rodzic
commit
d50b9cc8e4

+ 4 - 0
sckw-modules-api/sckw-transport-api/pom.xml

@@ -38,5 +38,9 @@
             <version>2.2.22</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-core</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 47 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/feign/VehicleTraceClient.java

@@ -0,0 +1,47 @@
+package com.sckw.transport.api.feign;
+
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.transport.api.model.dto.VehicleDataDTO;
+import com.sckw.transport.api.model.vo.VehicleTraceResponse;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * 车辆轨迹服务 Feign 客户端
+ * 调用数据中台的车辆轨迹接口
+ * @author system
+ * @date 2024
+ */
+@FeignClient(
+    name = "iot-platform",
+    url = "${vehicle.trace.api.base-url}",
+    path = "/api/transfer",
+    configuration = VehicleTraceFeignConfig.class
+)
+public interface VehicleTraceClient {
+
+    /**
+     * 查询实时位置
+     * @param vehicleDataDTO 车辆数据
+     * @return 车辆位置信息
+     */
+    @PostMapping("/queryRealTimeLocation")
+    BaseResult<VehicleTraceResponse> queryRealTimeLocation(@RequestBody VehicleDataDTO vehicleDataDTO);
+
+    /**
+     * 查询车辆轨迹列表
+     * @param vehicleDataDTO 车辆数据
+     * @return 车辆轨迹列表
+     */
+    @PostMapping("/queryVehicleDataList")
+    BaseResult<VehicleTraceResponse> queryVehicleDataList(@RequestBody VehicleDataDTO vehicleDataDTO);
+
+    /**
+     * 上报车辆轨迹
+     * @param request 车辆轨迹数据
+     * @return 上报结果
+     */
+    @PostMapping("/saveVehicleData")
+    BaseResult<Void> saveVehicleData(@RequestBody Object request);
+}

+ 64 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/feign/VehicleTraceFeignConfig.java

@@ -0,0 +1,64 @@
+package com.sckw.transport.api.feign;
+
+import feign.Logger;
+import feign.Request;
+import feign.Retryer;
+import feign.codec.ErrorDecoder;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 车辆轨迹服务 Feign 配置
+ * @author system
+ * @date 2024
+ */
+@Slf4j
+@Configuration
+public class VehicleTraceFeignConfig {
+
+    /**
+     * 配置日志级别
+     */
+    @Bean
+    public Logger.Level feignLoggerLevel() {
+        return Logger.Level.FULL;
+    }
+
+    /**
+     * 配置请求超时时间
+     * 连接超时:5秒
+     * 读取超时:10秒
+     */
+    @Bean
+    public Request.Options options() {
+        return new Request.Options(
+            5000, TimeUnit.MILLISECONDS,  // 连接超时
+            10000, TimeUnit.MILLISECONDS, // 读取超时
+            true  // 跟随重定向
+        );
+    }
+
+    /**
+     * 配置重试策略
+     * 最多重试2次,初始间隔100ms,最大间隔1000ms
+     */
+    @Bean
+    public Retryer retryer() {
+        return new Retryer.Default(100, 1000, 2);
+    }
+
+    /**
+     * 自定义错误解码器
+     */
+    @Bean
+    public ErrorDecoder errorDecoder() {
+        return (methodKey, response) -> {
+            log.error("车辆轨迹服务调用失败, 方法: {}, 状态码: {}", 
+                methodKey, response.status());
+            return new RuntimeException("车辆轨迹服务调用失败: " + response.reason());
+        };
+    }
+}

+ 37 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/VehicleDataDTO.java

@@ -0,0 +1,37 @@
+package com.sckw.transport.api.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 车辆数据请求 DTO
+ * @author system
+ * @date 2024
+ */
+@Data
+public class VehicleDataDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 运单号
+     */
+    private String wOrderNo;
+
+    /**
+     * 车牌号
+     */
+    private String carNo;
+
+    /**
+     * 开始时间
+     */
+    private LocalDateTime startTime;
+
+    /**
+     * 结束时间
+     */
+    private LocalDateTime endTime;
+}

+ 82 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/VehicleReturnData.java

@@ -0,0 +1,82 @@
+package com.sckw.transport.api.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 车辆返回数据
+ * @author system
+ * @date 2024
+ */
+@Data
+public class VehicleReturnData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 时间戳
+     */
+    private LocalDateTime ts;
+
+    /**
+     * 车牌号
+     */
+    private String carNo;
+
+    /**
+     * 经度
+     */
+    private String longitude;
+
+    /**
+     * 纬度
+     */
+    private String latitude;
+
+    /**
+     * 车速(km/h)
+     */
+    private Float speed;
+
+    /**
+     * 行驶方向(角度)
+     */
+    private Integer direction;
+
+    /**
+     * 燃油液位(%)
+     */
+    private Float fuelLevel;
+
+    /**
+     * 里程数(km)
+     */
+    private Double mileage;
+
+    /**
+     * 发动机温度(℃)
+     */
+    private Float engineTemp;
+
+    /**
+     * 电池电压(V)
+     */
+    private Float batteryVoltage;
+
+    /**
+     * 车辆状态
+     */
+    private String status;
+
+    /**
+     * 运单号
+     */
+    private String wOrderNo;
+
+    /**
+     * 报警代码
+     */
+    private Integer alarmCode;
+}

+ 42 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/VehicleTraceResponse.java

@@ -0,0 +1,42 @@
+package com.sckw.transport.api.model.vo;
+
+import com.sckw.transport.api.model.dto.VehicleReturnData;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 车辆轨迹响应对象
+ * @author system
+ * @date 2024
+ */
+@Data
+public class VehicleTraceResponse implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 单个车辆位置数据
+     */
+    private VehicleReturnData data;
+
+    /**
+     * 车辆轨迹列表数据
+     */
+    private List<VehicleReturnData> dataList;
+    
+    /**
+     * 兼容方法:获取列表数据
+     * 如果 dataList 不为空则返回 dataList,否则返回包含 data 的列表
+     */
+    public List<VehicleReturnData> getDataList() {
+        if (dataList != null) {
+            return dataList;
+        }
+        if (data != null) {
+            return List.of(data);
+        }
+        return List.of();
+    }
+}

+ 2 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/FleetApplication.java

@@ -3,6 +3,7 @@ package com.sckw.fleet;
 import com.sckw.remote.annotation.SckwRemoteApplication;
 import com.sckw.startup.annotation.SckwCloudApplication;
 import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * desc 车队
@@ -11,6 +12,7 @@ import org.springframework.boot.SpringApplication;
  */
 @SckwRemoteApplication
 @SckwCloudApplication
+@EnableFeignClients(basePackages = "com.sckw.transport.api.feign")
 public class FleetApplication {
 
     public static void main(String[] args) {

+ 28 - 18
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -27,6 +27,7 @@ import com.sckw.core.web.context.LoginEntHolder;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.request.HttpClientUtil;
 import com.sckw.core.web.response.HttpResult;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.easyexcel.ExcelImportListener;
 import com.sckw.excel.utils.ExcelUtil;
@@ -44,9 +45,13 @@ import com.sckw.system.api.model.dto.res.KwsEnterpriseResDto;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.feign.VehicleTraceClient;
 import com.sckw.transport.api.model.dto.RWaybillOrderDto;
+import com.sckw.transport.api.model.dto.VehicleDataDTO;
+import com.sckw.transport.api.model.dto.VehicleReturnData;
 import com.sckw.transport.api.model.vo.RTruckMonitorVo;
 import com.sckw.transport.api.model.vo.RWaybillOrderVo;
+import com.sckw.transport.api.model.vo.VehicleTraceResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -95,6 +100,7 @@ public class KwfTruckService {
     private final KwfTruckAxleNumRepository truckAxleNumRepository;
 
     private final KwfFleetTruckRepository kwfFleetTruckRepository;
+    private final VehicleTraceClient vehicleTraceClient;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private RemoteSystemService remoteSystemService;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
@@ -1620,37 +1626,41 @@ public class KwfTruckService {
     private VehicleReturnData getVehicleReturnDataByOrderNo(String odrderNo) {
         VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
         vehicleDataDTO.setWOrderNo(odrderNo);
-        String res = null;
+        
         try {
-            res = HttpUtil.postJson(urlConfigProperties.getApiBaseUrl()+ UrlConstants.QUERY_REAL_TIME_TRACE_URL, JSON.toJSONString(vehicleDataDTO), null);
+            // 使用 Feign 调用查询实时位置
+            BaseResult<VehicleTraceResponse> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+            
+            if (result == null || result.getCode() != HttpStatus.SUCCESS_CODE || result.getData() == null) {
+                log.warn("查询实时轨迹返回空数据, 运单号: {}", odrderNo);
+                return null;
+            }
+            
+            return result.getData().getData();
         } catch (Exception e) {
-            log.error("查询任务轨迹异常",e);
-            return null;
-            // throw new BusinessException("查询任务轨迹异常");
-        }
-        if (org.apache.commons.lang3.StringUtils.isBlank(res)){
+            log.error("查询任务轨迹异常, 运单号: {}", odrderNo, e);
             return null;
         }
-        JSONObject jsonObject  = JSON.parseObject(res);
-        return JSON.parseObject(JSON.toJSONString(jsonObject.get("data")), VehicleReturnData.class);
     }
 
     public VehicleReturnData getVehicleReturnData(String truckId) {
         VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
         vehicleDataDTO.setCarNo(truckId);
-        String res = null;
+        
         try {
-            res = HttpUtil.postJson(urlConfigProperties.getApiBaseUrl()+ UrlConstants.QUERY_REAL_TIME_TRACE_URL, JSON.toJSONString(vehicleDataDTO), null);
+            // 使用 Feign 调用查询实时位置
+            BaseResult<VehicleTraceResponse> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+            
+            if (result == null || result.getCode() != HttpStatus.SUCCESS_CODE || result.getData() == null) {
+                log.warn("查询实时轨迹返回空数据, 车牌号: {}", truckId);
+                return null;
+            }
+            
+            return result.getData().getData();
         } catch (Exception e) {
-            log.error("查询任务轨迹异常",e);
-            return null;
-           // throw new BusinessException("查询任务轨迹异常");
-        }
-        if (org.apache.commons.lang3.StringUtils.isBlank(res)){
+            log.error("查询任务轨迹异常, 车牌号: {}", truckId, e);
             return null;
         }
-        JSONObject jsonObject  = JSON.parseObject(res);
-        return JSON.parseObject(JSON.toJSONString(jsonObject.get("data")), VehicleReturnData.class);
     }
 
     public PageDataResult<AppTruckInfoVo> pageAppTruckInfo(TruckInfoReq req) {

+ 23 - 0
sckw-modules/sckw-fleet/src/main/resources/bootstrap.yml

@@ -10,6 +10,29 @@ spring:
   main:
     allow-bean-definition-overriding: true
     allow-circular-references: true
+
+# 车辆轨迹服务配置
+vehicle:
+  trace:
+    api:
+      base-url: ${VEHICLE_TRACE_API_URL:http://localhost:8080}
+
+# Feign 配置
+feign:
+  client:
+    config:
+      default:
+        connect-timeout: 5000
+        read-timeout: 10000
+      vehicle-trace-service:
+        connect-timeout: 5000
+        read-timeout: 10000
+        logger-level: full
+  httpclient:
+    enabled: true
+    max-connections: 200
+    max-connections-per-route: 50
+
   cloud:
     nacos:
       discovery:

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

@@ -5,6 +5,7 @@ import com.sckw.startup.annotation.SckwCloudApplication;
 import io.seata.spring.annotation.datasource.EnableAutoDataSourceProxy;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * @author lfdc
@@ -15,6 +16,7 @@ import org.springframework.boot.SpringApplication;
 @SckwRemoteApplication
 @SckwCloudApplication
 @MapperScan("com.sckw.transport.dao")
+@EnableFeignClients(basePackages = "com.sckw.transport.api.feign")
 public class TransPortApplication {
     public static void main(String[] args) {
         SpringApplication.run(TransPortApplication.class, args);

+ 26 - 8
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -26,6 +26,7 @@ import com.sckw.core.web.constant.CommonConstants;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.HttpResult;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.utils.DateUtil;
 import com.sckw.fleet.api.RemoteFleetService;
@@ -41,6 +42,8 @@ import com.sckw.stream.model.UserInfo;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.RemoteUserService;
 import com.sckw.system.api.model.dto.res.*;
+import com.sckw.transport.api.feign.VehicleTraceClient;
+import com.sckw.transport.api.model.vo.VehicleTraceResponse;
 import com.sckw.transport.common.config.UrlConfigProperties;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
@@ -132,6 +135,7 @@ public class KwtWaybillOrderV1Service {
     private final KwtLogisticsOrderRepository kwtLogisticsOrderRepository;
     private final KwtWaybillOrderTicketRepository  kwtWaybillOrderTicketRepository;
     private final KwtWaybillOrderNodeRepository kwtWaybillOrderNodeRepository;
+    private final VehicleTraceClient vehicleTraceClient;
     @Resource
     private StreamBridge streamBridge;
     @DubboReference(version = "1.0.0", group = "design", check = false)
@@ -2195,16 +2199,30 @@ public class KwtWaybillOrderV1Service {
                 //从中台查询轨迹信息
                 VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
                 vehicleDataDTO.setWOrderNo(waybillOrder.getWOrderNo());
-                String s = "";
+                
                 try {
-                    s = HttpUtil.postJson(urlConfigProperties.getApiBaseUrl()+ UrlConstants.QUERY_TRACE_URL, com.alibaba.fastjson.JSON.toJSONString(vehicleDataDTO), null);
+                    // 使用 Feign 调用查询车辆轨迹列表
+                    com.sckw.transport.api.model.dto.VehicleDataDTO vehicleDataDTO1 = new com.sckw.transport.api.model.dto.VehicleDataDTO();
+                    vehicleDataDTO.setWOrderNo(waybillOrder.getWOrderNo());
+                    BaseResult<VehicleTraceResponse> result = vehicleTraceClient.queryVehicleDataList(vehicleDataDTO1);
+                    
+                    if (result != null && result.getCode()!= HttpStatus.SUCCESS_CODE && result.getData() != null) {
+                        List<com.sckw.transport.api.model.dto.VehicleReturnData> vehicleReturn = result.getData().getDataList();
+                        List<VehicleRouteData> vehicleReturnData = vehicleReturn.stream().map(x->{
+                            VehicleRouteData vehicleRouteData = new VehicleRouteData();
+                            vehicleRouteData.setTs(x.getTs());
+                            vehicleRouteData.setLongitude(x.getLongitude());
+                            vehicleRouteData.setLatitude(x.getLatitude());
+                            return vehicleRouteData;
+                        }).collect(Collectors.toList());
+                        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(vehicleReturnData)) {
+                            rTruckRouteVo.setPointInfo(com.alibaba.fastjson.JSON.toJSONString(vehicleReturnData));
+                        }
+                    } else {
+                        log.warn("查询车辆轨迹返回空数据, 运单号: {}", waybillOrder.getWOrderNo());
+                    }
                 } catch (Exception e) {
-                    log.error("查询任务轨迹异常",e);
-
-                }
-                if (org.apache.commons.lang3.StringUtils.isNotBlank(s)){
-                    List<VehicleRouteData> vehicleReturnData = com.alibaba.fastjson.JSON.parseArray(s, VehicleRouteData.class);
-                    rTruckRouteVo.setPointInfo(com.alibaba.fastjson.JSON.toJSONString(vehicleReturnData));
+                    log.error("查询任务轨迹异常, 运单号: {}", waybillOrder.getWOrderNo(), e);
                 }
 
                 remoteFleetService.saveOrUpdate(rTruckRouteVo);

+ 29 - 14
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

@@ -12,8 +12,10 @@ import com.sckw.core.model.enums.CarWaybillEnum;
 import com.sckw.core.utils.DateUtils;
 import com.sckw.core.utils.HttpUtil;
 import com.sckw.core.web.constant.CommonConstants;
+import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.result.PageDataResult;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RDriverVo;
 import com.sckw.fleet.api.model.vo.RFleetDriverVo;
@@ -33,8 +35,10 @@ import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderAddress;
 import com.sckw.transport.model.KwtWaybillOrderSubtask;
 import com.sckw.transport.model.dto.TruckDto;
-import com.sckw.transport.model.dto.VehicleDataDTO;
-import com.sckw.transport.model.dto.VehicleReturnData;
+import com.sckw.transport.api.feign.VehicleTraceClient;
+import com.sckw.transport.api.model.dto.VehicleDataDTO;
+import com.sckw.transport.api.model.dto.VehicleReturnData;
+import com.sckw.transport.api.model.vo.VehicleTraceResponse;
 import com.sckw.transport.model.param.CurrentTaskTraceReq;
 import com.sckw.transport.model.param.KwfTruckTraceReplayReq;
 import com.sckw.transport.model.param.TruckInfoReq;
@@ -79,6 +83,7 @@ public class kwfTruckTraceService {
     private final KwtWaybillOrderSubtaskRepository kwtWaybillOrderSubtaskRepository;
     private final VehicleCollectService vehicleCollectService;
     private final KwtLogisticsOrderUnitRepository kwtLogisticsOrderUnitRepository;
+    private final VehicleTraceClient vehicleTraceClient;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     RemoteSystemService remoteSystemService;
 
@@ -528,19 +533,21 @@ public class kwfTruckTraceService {
     public VehicleReturnData getVehicleReturnData(String truckId) {
         VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
         vehicleDataDTO.setCarNo(truckId);
-        String s = null;
+
         try {
-            s = HttpUtil.postJson(urlConfigProperties.getApiBaseUrl()+ UrlConstants.QUERY_REAL_TIME_TRACE_URL, JSON.toJSONString(vehicleDataDTO), null);
-        } catch (Exception e) {
-            log.error("查询任务轨迹异常",e);
+            // 使用 Feign 调用查询实时位置
+            BaseResult<VehicleTraceResponse> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
 
-        }
-        if (StringUtils.isBlank(s)){
+            if (result == null || result.getCode() != HttpStatus.SUCCESS_CODE || result.getData() == null) {
+                log.warn("查询实时轨迹返回空数据, 车牌号: {}", truckId);
+                return null;
+            }
+
+            return result.getData().getData();
+        } catch (Exception e) {
+            log.error("查询任务轨迹异常, 车牌号: {}", truckId, e);
             return null;
         }
-        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
-        String data = JSON.toJSONString(jsonObject.get("data"));
-        return JSON.parseObject(data, VehicleReturnData.class);
     }
 
     private static CurrentTaskTraceReqVo.CurrentTaskTrace getCurrentTaskTrace(VehicleReturnData e) {
@@ -601,11 +608,19 @@ public class kwfTruckTraceService {
                 .orElse(null)));
         req.setVehicleDataVO(vehicleDataVO);
         req.setStatus("1");
+        
         try {
-            String url = urlConfigProperties.getApiBaseUrl();
-            HttpUtil.postJson(url+ UrlConstants.VEHICLE_TRAJECTORY, JSON.toJSONString(req), null);
+            // 使用 Feign 调用上报车辆轨迹
+            BaseResult<Void> result = vehicleTraceClient.saveVehicleData(req);
+            
+            if (result == null || result.getCode() != HttpStatus.SUCCESS_CODE) {
+                log.error("app上报车辆轨迹失败, 响应: {}", result);
+                throw new BusinessException("app上报车辆轨迹异常");
+            }
+        } catch (BusinessException e) {
+            throw e;
         } catch (Exception e) {
-            log.error("app上报车辆轨迹异常",e);
+            log.error("app上报车辆轨迹异常", e);
             throw new BusinessException("app上报车辆轨迹异常");
         }
         String key = CommonConstants.TRUCK_LOCATION + truckId+CommonConstants.UNDERSCORE;

+ 23 - 0
sckw-modules/sckw-transport/src/main/resources/bootstrap.yml

@@ -10,6 +10,29 @@ spring:
   main:
     allow-bean-definition-overriding: true
     allow-circular-references: true
+
+# 车辆轨迹服务配置
+vehicle:
+  trace:
+    api:
+      base-url: ${VEHICLE_TRACE_API_URL:http://localhost:8080}
+
+# Feign 配置
+feign:
+  client:
+    config:
+      default:
+        connect-timeout: 5000
+        read-timeout: 10000
+      vehicle-trace-service:
+        connect-timeout: 5000
+        read-timeout: 10000
+        logger-level: full
+  httpclient:
+    enabled: true
+    max-connections: 200
+    max-connections-per-route: 50
+
 mybatis-plus:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl