Jelajahi Sumber

提交全图监控

chenxiaofei 1 bulan lalu
induk
melakukan
680ee1ed65

+ 68 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/response/BaseIotResult.java

@@ -0,0 +1,68 @@
+package com.sckw.core.web.response;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Author: donglang
+ * @CreateTime: 2025-10-09
+ * @Description: 返回模型
+ * @Version: 1.0
+ */
+
+@Data
+public class BaseIotResult<T> implements Serializable {
+
+
+    /**
+     * 处理是否成功
+     */
+    protected boolean success = true;
+
+    /**
+     * 错误码
+     */
+    protected String code;
+
+    /**
+     * 错误信息
+     */
+    protected String message;
+
+    /**
+     * 业务数据
+     */
+    protected T data;
+
+    /**
+     * 构建成功结果,包含具体信息
+     */
+    public static <T> BaseIotResult<T> success(T data) {
+        BaseIotResult<T> result = new BaseIotResult<>();
+        result.setSuccess(true);
+        result.setCode("0");
+        result.setData(data);
+        return result;
+    }
+
+    /**
+     * 构建成功结果,无返回具体信息
+     */
+    public static <T> BaseIotResult<T> success() {
+        return success(null);
+    }
+
+    /**
+     * 构建失败结果,返回错误信息
+     */
+    public static <T> BaseIotResult<T> error(String code, String message) {
+        BaseIotResult<T> result = new BaseIotResult<>();
+        result.setSuccess(false);
+        result.setCode(code);
+        result.setMessage(message);
+        return result;
+    }
+
+}

+ 4 - 3
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/feign/VehicleTraceClient.java

@@ -1,5 +1,6 @@
 package com.sckw.transport.api.feign;
 
+import com.sckw.core.web.response.BaseIotResult;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.transport.api.model.dto.VehicleDataDTO;
 import com.sckw.transport.api.model.dto.VehicleReturnData;
@@ -32,7 +33,7 @@ public interface VehicleTraceClient {
      * @return 车辆位置信息
      */
     @PostMapping("/queryRealTimeLocation")
-    BaseResult<VehicleReturnData> queryRealTimeLocation(@RequestBody VehicleDataDTO vehicleDataDTO);
+    BaseIotResult<VehicleReturnData> queryRealTimeLocation(@RequestBody VehicleDataDTO vehicleDataDTO);
 
     /**
      * 查询车辆轨迹列表
@@ -40,7 +41,7 @@ public interface VehicleTraceClient {
      * @return 车辆轨迹列表
      */
     @PostMapping("/queryVehicleDataList")
-    BaseResult<List<VehicleReturnData>> queryVehicleDataList(@RequestBody VehicleDataDTO vehicleDataDTO);
+    BaseIotResult<List<VehicleReturnData>> queryVehicleDataList(@RequestBody VehicleDataDTO vehicleDataDTO);
 
     /**
      * 上报车辆轨迹
@@ -48,5 +49,5 @@ public interface VehicleTraceClient {
      * @return 上报结果
      */
     @PostMapping("/saveVehicleData")
-    BaseResult<Void> saveVehicleData(@RequestBody Object request);
+    BaseIotResult<Void> saveVehicleData(@RequestBody Object request);
 }

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

@@ -1,12 +1,21 @@
 package com.sckw.transport.api.feign;
 
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import feign.Logger;
 import feign.Request;
 import feign.Retryer;
+import feign.codec.Decoder;
 import feign.codec.ErrorDecoder;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
+import org.springframework.cloud.openfeign.support.SpringDecoder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 
 import java.util.concurrent.TimeUnit;
 
@@ -61,4 +70,22 @@ public class VehicleTraceFeignConfig {
             return new RuntimeException("车辆轨迹服务调用失败: " + response.reason());
         };
     }
+
+    /**
+     * 自定义 Feign 解码器,支持 Java 8 时间类型(LocalDateTime 等)
+     */
+    @Bean
+    public Decoder feignDecoder() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        // 注册 Java 8 时间模块
+        objectMapper.registerModule(new JavaTimeModule());
+        // 忽略未知属性,避免外部服务返回多余字段导致解析失败
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        // 允许空对象
+        objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
+        
+        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(objectMapper);
+        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(converter);
+        return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.sckw.transport.api.model.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.io.Serial;
@@ -20,6 +21,7 @@ public class VehicleReturnData implements Serializable {
     /**
      * 时间戳
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime ts;
 
     /**

+ 5 - 4
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -26,6 +26,7 @@ import com.sckw.core.web.constant.HttpStatus;
 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.BaseIotResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
@@ -1630,9 +1631,9 @@ public class KwfTruckService {
         
         try {
             // 使用 Feign 调用查询实时位置
-            BaseResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+            BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
             
-            if (result == null || result.getCode() != 0 || result.getData() == null) {
+            if (result == null || result.getCode() != "0" || result.getData() == null) {
                 log.warn("查询实时轨迹返回空数据, 运单号: {}", odrderNo);
                 return null;
             }
@@ -1650,9 +1651,9 @@ public class KwfTruckService {
         
         try {
             // 使用 Feign 调用查询实时位置
-            BaseResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+            BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
             
-            if (result == null || result.getCode() != 0 || result.getData() == null) {
+            if (result == null || result.getCode() != "0" || result.getData() == null) {
                 log.warn("查询实时轨迹返回空数据, 车牌号: {}", truckId);
                 return null;
             }

+ 10 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -2241,7 +2241,9 @@ public class KwtLogisticsConsignmentService {
 
         //根据商品名称查询物流订单
         Set<Long> logOrderIds = getLogOrderIds(req, entList,allEnt);
-
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logOrderIds) && org.apache.commons.collections4.CollectionUtils.isNotEmpty(entList)){
+            return PageDataResult.empty(req.getPageNum(), req.getPageSize());
+        }
 
         //分页查询物流订单
        IPage<KwtLogisticsOrder> page = logisticsOrderRepository.queryByPage(logOrderIds,req.getTradeOrderId(), req.getOrderNo(),req.getOrderStatus(),
@@ -3055,6 +3057,13 @@ public class KwtLogisticsConsignmentService {
 
         //根据商品名称查询物流订单
         Set<Long> logOrderIds = getLogOrderIds(req, entList,allEnt);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logOrderIds) && org.apache.commons.collections4.CollectionUtils.isNotEmpty(entList)){
+            Map<Integer, List<KwtLogisticsOrder>> statusAndLogOrdersMap = Maps.newHashMap() ;
+            List<OrderStatusStatisticsResp.OrderStatusStatistics> statistics = orderV1Enums.stream()
+                    .map(o -> getOrderStatusStatistics(o, statusAndLogOrdersMap))
+                    .collect(Collectors.toList());
+            orderStatusStatisticsResp.setOrderStatusStatistics(statistics);
+         }
         List<KwtLogisticsOrder> logisticsOrders =logisticsOrderRepository.queryList(logOrderIds,req.getTradeOrderId(), req.getOrderNo(),req.getOrderStatus(),
                 req.getStartTime(), req.getEndTime());
 

+ 3 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -27,6 +27,7 @@ import com.sckw.core.utils.*;
 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.BaseIotResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
@@ -2206,9 +2207,9 @@ public class KwtWaybillOrderV1Service {
                     // 使用 Feign 调用查询车辆轨迹列表
                     com.sckw.transport.api.model.dto.VehicleDataDTO vehicleDataDTO1 = new com.sckw.transport.api.model.dto.VehicleDataDTO();
                     vehicleDataDTO.setWOrderNo(waybillOrder.getWOrderNo());
-                    BaseResult<List<com.sckw.transport.api.model.dto.VehicleReturnData>> result = vehicleTraceClient.queryVehicleDataList(vehicleDataDTO1);
+                    BaseIotResult<List<com.sckw.transport.api.model.dto.VehicleReturnData>> result = vehicleTraceClient.queryVehicleDataList(vehicleDataDTO1);
                     
-                    if (result != null && result.getCode()== 0 && result.getData() != null) {
+                    if (result != null && org.apache.commons.lang3.StringUtils.equals(result.getCode(), "0") && result.getData() != null) {
                         List<com.sckw.transport.api.model.dto.VehicleReturnData> vehicleReturn = result.getData();
                         List<VehicleRouteData> vehicleReturnData = vehicleReturn.stream().map(x->{
                             VehicleRouteData vehicleRouteData = new VehicleRouteData();

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

@@ -1,6 +1,7 @@
 package com.sckw.transport.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.sckw.core.web.response.BaseIotResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.transport.api.feign.VehicleTraceClient;
 import com.sckw.transport.api.model.dto.VehicleDataDTO;
@@ -14,6 +15,7 @@ import com.sckw.transport.repository.KwtVehicleExceptionRepository;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
@@ -140,11 +142,11 @@ public class VehicleExceptionService {
             try {
                 VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
                 vehicleDataDTO.setCarNo(truckNo);
-                BaseResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+                BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
                 // 默认离线
                 Integer locationStatus = 0;
                 
-                if (result != null && result.getCode() == 0 && result.getData() != null) {
+                if (result != null && StringUtils.equals(result.getCode(), "0") && result.getData() != null) {
                     VehicleReturnData vehicleData = result.getData();
                     
                     // 判断30分钟内有定位数据为在线

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

@@ -18,6 +18,7 @@ import com.sckw.core.utils.DateUtils;
 import com.sckw.core.utils.HttpUtil;
 import com.sckw.core.web.constant.CommonConstants;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.BaseIotResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.fleet.api.RemoteFleetService;
@@ -544,9 +545,9 @@ public class kwfTruckTraceService {
 
         try {
             // 使用 Feign 调用查询实时位置
-            BaseResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+            BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
 
-            if (result == null || result.getCode() != 0 || result.getData() == null) {
+            if (result == null || result.getCode() != "0" || result.getData() == null) {
                 log.warn("查询实时轨迹返回空数据, 车牌号: {}", truckId);
                 return null;
             }
@@ -619,9 +620,9 @@ public class kwfTruckTraceService {
         
         try {
             // 使用 Feign 调用上报车辆轨迹
-            BaseResult<Void> result = vehicleTraceClient.saveVehicleData(req);
+            BaseIotResult<Void> result = vehicleTraceClient.saveVehicleData(req);
             
-            if (result == null || result.getCode() != 0) {
+            if (result == null || result.getCode() != "0") {
                 log.error("app上报车辆轨迹失败, 响应: {}", result);
                 throw new BusinessException("app上报车辆轨迹异常");
             }
@@ -720,9 +721,9 @@ public class kwfTruckTraceService {
             try {
                 VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
                 vehicleDataDTO.setCarNo(truckNo);
-                BaseResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+                BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
 
-                if (result == null || result.getCode() != 0 || result.getData() == null) {
+                if (result == null || !Objects.equals(result.getCode(), "0") || result.getData() == null) {
                     // 无定位数据,设置为离线
                     truckLocationStatusMap.put(truckNo, 0);
                     return truckLocationStatusMap;
@@ -1034,11 +1035,11 @@ public class kwfTruckTraceService {
             try {
                 VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
                 vehicleDataDTO.setCarNo(truckNo);
-                BaseResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
-                
+                BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+                log.info("查询车辆数据中台响应定位信息:{}", JSON.toJSONString( result));
                 VehicleLocationInfo locationInfo = new VehicleLocationInfo();
                 
-                if (result != null && result.getCode() == 0 && result.getData() != null) {
+                if (result != null && StringUtils.equals(result.getCode(), "0") && result.getData() != null) {
                     VehicleReturnData vehicleData = result.getData();
                     
                     // 判断定位状态
@@ -1091,10 +1092,10 @@ public class kwfTruckTraceService {
                 vehicleDataDTO.setWOrderNo(wOrderNo);
                 
                 // 调用Feign接口查询轨迹列表
-                BaseResult<List<com.sckw.transport.api.model.dto.VehicleReturnData>> result = 
+                BaseIotResult<List<VehicleReturnData>> result =
                         vehicleTraceClient.queryVehicleDataList(vehicleDataDTO);
-                
-                if (result != null && result.getCode() == 0 && result.getData() != null) {
+                log.info("查询车辆数据中台响应轨迹数据:{}", JSON.toJSONString( result));
+                if (result != null && StringUtils.equals(result.getCode(), "0") && result.getData() != null) {
                     List<com.sckw.transport.api.model.dto.VehicleReturnData> traceDataList = result.getData();
                     
                     // 统计alarmCode不为null且不为0的记录数量(表示有异常报警)
@@ -1273,8 +1274,8 @@ public class kwfTruckTraceService {
 
         try {
             // 调用数据中台保存轨迹数据
-            BaseResult<Void> result = vehicleTraceClient.saveVehicleData(vehiclesTrajectoryReq);
-            if (result.getCode() != 0) {
+            BaseIotResult<Void> result = vehicleTraceClient.saveVehicleData(vehiclesTrajectoryReq);
+            if (!Objects.equals(result.getCode(), "0")) {
                 log.error("保存车辆轨迹数据失败:{}", result.getMessage());
                 throw new BusinessException("生成轨迹失败:" + result.getMessage());
             }