Kaynağa Gözat

新增4.0提供车辆信息查询接口

donglang 3 ay önce
ebeveyn
işleme
e1dc958b2f

+ 3 - 2
iot-platform-common/src/main/java/com/platform/enums/ErrorCodeEnum.java

@@ -28,8 +28,9 @@ public enum ErrorCodeEnum {
     // ====================== 接口相关错误(30000~39999)======================
     INTERFACE_CALL_FAIL("300000", "第三方接口调用失败"),
     INTERFACE_PARAM_MISMATCH("300001", "接口参数不匹配"),
-    TOKEN_EXPIRED("300002", "令牌已过期"),
-    TOKEN_INVALID("300003", "令牌无效"),
+    ILLEGAL_PARAM("300002", "非法参数"),
+    TOKEN_EXPIRED("300003", "令牌已过期"),
+    TOKEN_INVALID("300004", "令牌无效"),
 
     // ====================== 数据存储错误(40000~49999)======================
     DATA_SAVE_FAIL("400000", "数据保存失败"),

+ 4 - 4
iot-platform-manager/src/main/java/com/platform/api/controller/TransferController.java

@@ -2,10 +2,11 @@ package com.platform.api.controller;
 
 
 import com.platform.api.manager.TransferVehicleManage;
+import com.platform.api.request.VehicleDataRequest;
 import com.platform.api.request.VehicleDataSaveRequest;
+import com.platform.api.response.VehicleDataResp;
 import com.platform.exception.BaseResult;
 import com.platform.exception.PageResult;
-import com.platform.response.device.IotDeviceResp;
 import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -38,13 +39,12 @@ public class TransferController {
         }
     }
 
-
     /**
      * 分页查询物联设备
      */
     @PostMapping("/pageVehicleDataList")
-    public PageResult<IotDeviceResp> pageVehicleDataList(@RequestBody VehicleDataSaveRequest request) {
-        return null;
+    public PageResult<VehicleDataResp> pageVehicleDataList(@RequestBody VehicleDataRequest request) {
+        return transferVehicleManage.pageVehicleDataList(request);
     }
 
 

+ 32 - 4
iot-platform-manager/src/main/java/com/platform/api/manager/TransferVehicleManage.java

@@ -2,12 +2,17 @@ package com.platform.api.manager;
 
 
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.platform.api.config.VehicleDataQueue;
+import com.platform.api.request.VehicleDataRequest;
 import com.platform.api.request.VehicleDataSaveRequest;
+import com.platform.api.response.VehicleDataResp;
 import com.platform.entity.VehicleData;
+import com.platform.entity.VehicleTimeSeriesData;
 import com.platform.enums.ErrorCodeEnum;
 import com.platform.exception.IotException;
+import com.platform.exception.PageResult;
 import com.platform.mapper.TaosMapper;
 import com.platform.service.VehicleDataService;
 import lombok.RequiredArgsConstructor;
@@ -59,7 +64,7 @@ public class TransferVehicleManage implements ApplicationContextAware {
         // 2. 检查是否达到批量阈值,若达到则批量保存
         List<VehicleDataSaveRequest> vehicleDataList = vehicleDataQueue.takeBatchIfReached();
         if (CollectionUtils.isEmpty(vehicleDataList)) {
-           return;
+            return;
         }
 
         TransferVehicleManage proxy = applicationContext.getBean(TransferVehicleManage.class);
@@ -81,7 +86,7 @@ public class TransferVehicleManage implements ApplicationContextAware {
             // 批量保存到时序数据库
             taosMapper.batchInsertVehicleData(vehicleDataList);
         } catch (Exception e) {
-           throw new IotException(ErrorCodeEnum.TD_SAVE_FAIL, "批量保存车辆数据到时序数据库失败");
+            throw new IotException(ErrorCodeEnum.TD_SAVE_FAIL, "批量保存车辆数据到时序数据库失败");
         }
     }
 
@@ -104,8 +109,8 @@ public class TransferVehicleManage implements ApplicationContextAware {
 
         // 3. 筛选出需要新增的车辆
         return vehicleDataList.stream()
-                .filter(req -> !existCarNos.contains(req.getVehicleDataVO().getCarNo()))
-                .map(req -> VehicleData.toVehicleData(req.getVehicleDataVO()))
+                .filter(ve -> !existCarNos.contains(ve.getVehicleDataVO().getCarNo()))
+                .map(ve -> VehicleData.toVehicleData(ve.getVehicleDataVO()))
                 .collect(Collectors.toList());
     }
 
@@ -122,5 +127,28 @@ public class TransferVehicleManage implements ApplicationContextAware {
     }
 
 
+    /**
+     * 接收单条数据,暂存到队列
+     */
+    public PageResult<VehicleDataResp> pageVehicleDataList(VehicleDataRequest request) {
+        if (request == null || (StringUtils.isEmpty(request.getCarNo())) && StringUtils.isEmpty(request.getWOrderNo())) {
+            throw new IotException(ErrorCodeEnum.ILLEGAL_PARAM, "接口参数为null!");
+        }
 
+        List<VehicleTimeSeriesData> timeSeriesData;
+        //通过运单号查询车辆信息
+        if (StringUtils.isNotEmpty(request.getWOrderNo())) {
+            timeSeriesData = taosMapper.selectByWOrderNo(request.getWOrderNo(),request.getStartTime(), request.getEndTime());
+        } else {
+            //通过车牌查询车辆信息
+            String subTableName = "vehicle_data_" + request.getCarNo().trim();
+            timeSeriesData = taosMapper.selectByCarNo(subTableName, request.getCarNo(),request.getStartTime(), request.getEndTime());
+        }
+
+        //参数转换
+        List<VehicleDataResp> vehicleDataRespList = timeSeriesData.stream().map(VehicleDataResp::toIotPageResp)
+                .collect(Collectors.toList());
+
+        return PageResult.of(vehicleDataRespList.size(), request.getPageNum(), request.getPageSize(), vehicleDataRespList);
+    }
 }

+ 38 - 0
iot-platform-manager/src/main/java/com/platform/api/request/VehicleDataRequest.java

@@ -0,0 +1,38 @@
+package com.platform.api.request;
+
+import com.platform.request.PageRequest;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Author: donglang
+ * @CreateTime: 2025-10-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class VehicleDataRequest extends PageRequest {
+
+    /**
+     * 运单号
+     */
+    private String wOrderNo;
+
+    /**
+     * 车牌
+     */
+    private String carNo;
+
+    /**
+     * 开始时
+     */
+    private LocalDateTime startTime;
+
+    /**
+     * 结束时间
+     */
+    private LocalDateTime endTime;
+
+}

+ 5 - 5
iot-platform-manager/src/main/java/com/platform/api/request/VehicleDataSaveRequest.java

@@ -8,7 +8,7 @@ import lombok.Data;
 import java.time.LocalDateTime;
 
 /**
- * @Author: 马超伟
+ * @Author: donglang
  * @CreateTime: 2025-10-09
  * @Description:
  * @Version: 1.0
@@ -51,7 +51,7 @@ public class VehicleDataSaveRequest extends PageRequest {
     /**
      * 燃油液位(%)
      */
-    private Float fuel_level;
+    private Float fuelLevel;
 
     /**
      * 里程数(km)
@@ -61,12 +61,12 @@ public class VehicleDataSaveRequest extends PageRequest {
     /**
      * 发动机温度(℃)
      */
-    private Float engine_temp;
+    private Float engineTemp;
 
     /**
      * 电池电压(V)
      */
-    private Float battery_voltage;
+    private Float batteryVoltage;
 
     /**
      * 车辆状态
@@ -83,7 +83,7 @@ public class VehicleDataSaveRequest extends PageRequest {
     /**
      * 报警代码
      */
-    private Integer alarm_code;
+    private Integer alarmCode;
 
 
     /**

+ 40 - 36
iot-platform-manager/src/main/java/com/platform/api/response/VehicleDataResp.java

@@ -1,8 +1,10 @@
 package com.platform.api.response;
 
-import com.platform.entity.IotDevice;
+import com.platform.entity.VehicleTimeSeriesData;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+
 /**
  * @Author: 马超伟
  * @CreateTime: 2025-10-09
@@ -15,82 +17,84 @@ import lombok.Data;
 public class VehicleDataResp {
 
     /**
-     * 设备主键id
+     * 时间戳
      */
-    private Long id;
+    private LocalDateTime ts;
 
     /**
-     * 设备编号
+     * 经度
      */
-    private String deviceCode;
+    private String longitude;
 
     /**
-     * 设备名称[旧系统的title]
+     * 纬度
      */
-    private String deviceName;
+    private String latitude;
 
     /**
-     * 设备分组码值
+     * 车速(km/h)
      */
-    private String deviceGroupCode;
+    private Float speed;
 
     /**
-     * 设备分组名称
+     * 行驶方向(角度)
      */
-    private String deviceGroupName;
+    private Integer direction;
 
     /**
-     * 物联网模型码值
+     * 燃油液位(%)
      */
-    private String modCode;
+    private Float fuelLevel;
 
     /**
-     * 物联网模型名称
+     * 里程数(km)
      */
-    private String modName;
+    private Double mileage;
 
     /**
-     * 设备品牌名称
+     * 发动机温度(℃)
      */
-    private String brand;
+    private Float engineTemp;
 
     /**
-     * 型号
+     * 电池电压(V)
      */
-    private String modelCode;
+    private Float batteryVoltage;
 
     /**
-     * sn通常是:IMEI
+     * 车辆状态
      */
-    private String sn;
+    private String status;
 
     /**
-     * 备注
+     * 运单号
      */
-    private String remarks;
+    private String wOrderNo;
 
     /**
-     * 设备类别
+     * 报警代码
      */
-    private Long egId;
+    private Integer alarmCode;
 
 
     private static VehicleDataResp getInstance(){
         return new VehicleDataResp();
     }
 
-    public static VehicleDataResp toIotPageResp(IotDevice iotDevice){
+    public static VehicleDataResp toIotPageResp(VehicleTimeSeriesData seriesData){
         VehicleDataResp devicePageResp = VehicleDataResp.getInstance();
-        devicePageResp.setId(iotDevice.getId());
-        devicePageResp.setDeviceCode(iotDevice.getDeviceCode());
-        devicePageResp.setDeviceName(iotDevice.getDeviceName());
-        devicePageResp.setDeviceGroupCode(iotDevice.getDeviceGroupCode());
-        devicePageResp.setModCode(iotDevice.getModCode());
-        devicePageResp.setBrand(iotDevice.getBrand());
-        devicePageResp.setModelCode(iotDevice.getModelCode());
-        devicePageResp.setSn(iotDevice.getSn());
-        devicePageResp.setRemarks(iotDevice.getRemarks());
-
+        devicePageResp.setTs(seriesData.getTs());
+        devicePageResp.setLongitude(seriesData.getLongitude());
+        devicePageResp.setLatitude(seriesData.getLatitude());
+        devicePageResp.setSpeed(seriesData.getSpeed());
+        devicePageResp.setDirection(seriesData.getDirection());
+        devicePageResp.setFuelLevel(seriesData.getFuelLevel());
+        devicePageResp.setMileage(seriesData.getMileage());
+        devicePageResp.setEngineTemp(seriesData.getEngineTemp());
+        devicePageResp.setBatteryVoltage(getInstance().getBatteryVoltage());
+        devicePageResp.setStatus(getInstance().getStatus());
+        devicePageResp.setWOrderNo(getInstance().getWOrderNo());
+        devicePageResp.setAlarmCode(getInstance().getAlarmCode());
         return devicePageResp;
     }
 }

+ 99 - 0
iot-platform-manager/src/main/java/com/platform/entity/VehicleTimeSeriesData.java

@@ -0,0 +1,99 @@
+package com.platform.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.platform.api.request.VehicleDataVO;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * Author: donglang
+ * Time: 2025-10-13
+ * Des: 车辆时序数据实体
+ * Version: 1.0
+ */
+@Data
+@TableName("vehicle_data")
+public class VehicleTimeSeriesData {
+
+    /**
+     * 车牌
+     */
+    private String carNo;
+
+    /**
+     * 时间戳
+     */
+    private LocalDateTime ts;
+
+    /**
+     * 经度
+     */
+    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;
+
+
+
+    private static VehicleTimeSeriesData getInstance(){
+        return new VehicleTimeSeriesData();
+    }
+
+
+    public static VehicleTimeSeriesData toVehicleData(VehicleDataVO vo){
+        VehicleTimeSeriesData vehicleData = VehicleTimeSeriesData.getInstance();
+        vehicleData.setCarNo(vo.getCarNo());
+
+
+        return vehicleData;
+    }
+}

+ 24 - 0
iot-platform-manager/src/main/java/com/platform/mapper/TaosMapper.java

@@ -2,9 +2,11 @@ package com.platform.mapper;
 
 
 import com.platform.api.request.VehicleDataSaveRequest;
+import com.platform.entity.VehicleTimeSeriesData;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -25,6 +27,28 @@ public interface TaosMapper {
      */
     int batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList);
 
+    /**
+     * 通过运单号查询时序数据
+
+     * @param wOrderNo 车辆数据实体
+     * @return 返回的车辆数据
+     */
+    List<VehicleTimeSeriesData> selectByWOrderNo(@Param("wOrderNo") String wOrderNo,
+                                                 @Param("startTime") LocalDateTime startTime,
+                                                 @Param("endTime") LocalDateTime endTime);
+
+    /**
+     * 通过车牌查询时序数据
+
+     * @param carNo 车辆数据实体
+     * @return 返回的车辆数据
+     */
+    List<VehicleTimeSeriesData> selectByCarNo(@Param("subTableName") String subTableName,
+                                              @Param("carNo") String carNo,
+                                              @Param("startTime") LocalDateTime startTime,
+                                              @Param("endTime") LocalDateTime endTime);
+
+
     /**
      * 创建水表子表
      * @param code 产品编码

+ 92 - 15
iot-platform-manager/src/main/resources/mapper/TaosMapper.xml

@@ -11,25 +11,102 @@
             TAGS (#{car_no})
     </update>
 
-    <!-- 插入车辆数据子表数据-->
+<!--    &lt;!&ndash; 插入车辆数据子表数据&ndash;&gt;-->
+<!--    <insert id="batchInsertVehicleData">-->
+<!--        INSERT INTO vehicle_data_${carNo}} USING vehicle_data-->
+<!--        VALUES (-->
+<!--            #{data.ts},-->
+<!--            #{data.longitude},-->
+<!--            #{data.latitude},-->
+<!--            #{data.speed},-->
+<!--            #{data.direction},-->
+<!--            #{data.fuelLevel},-->
+<!--            #{data.mileage},-->
+<!--            #{data.engineTemp},-->
+<!--            #{data.batteryVoltage},-->
+<!--            #{data.status},-->
+<!--            #{data.wOrderNo},-->
+<!--            #{data.alarmCode}-->
+<!--            )-->
+<!--    </insert>-->
+
+    <!-- 批量插入车辆数据时序数据库子表 -->
     <insert id="batchInsertVehicleData">
-        INSERT INTO vehicle_data_${carNo}} USING vehicle_data
-        VALUES (
-            #{data.ts},
-            #{data.longitude},
-            #{data.latitude},
-            #{data.speed},
-            #{data.direction},
-            #{data.fuelLevel},
-            #{data.mileage},
-            #{data.engineTemp},
-            #{data.batteryVoltage},
-            #{data.status},
-            #{data.wOrderNo},
-            #{data.alarmCode}
+        INSERT INTO
+        <foreach collection="list" item="request" separator=";">
+            vehicle_data_${request.carNo}
+            USING vehicle_data
+            VALUES (
+            #{request.data.ts},
+            #{request.data.longitude},
+            #{request.data.latitude},
+            #{request.data.speed},
+            #{request.data.direction},
+            #{request.data.fuelLevel},
+            #{request.data.mileage},
+            #{request.data.engineTemp},
+            #{request.data.batteryVoltage},
+            #{request.data.status},
+            #{request.data.wOrderNo},
+            #{request.data.alarmCode}
             )
+        </foreach>
     </insert>
 
+    <!-- 通过运单号查询时序数据(聚合超级表下所有子表) -->
+    <select id="selectByWOrderNo" resultType="com.platform.entity.VehicleTimeSeriesData">
+        SELECT
+        ts,
+        longitude,
+        latitude,
+        speed,
+        direction,
+        fuel_level,
+        mileage,
+        status,
+        alarm_code,
+        w_order_no,
+        car_no
+        FROM vehicle_data
+        WHERE
+            w_order_no = #{wOrderNo}
+            <if test="startTime != null">
+                AND ts >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND ts <= #{endTime}
+            </if>
+        ORDER BY ts DESC
+    </select>
+
+
+    <!-- 通过车牌查询时序数据(聚合超级表下所有子表) -->
+    <select id="selectByCarNo" resultType="com.platform.entity.VehicleTimeSeriesData">
+        SELECT
+            ts,
+            longitude,
+            latitude,
+            speed,
+            direction,
+            fuel_level,
+            mileage,
+            status,
+            alarm_code,
+            w_order_no,
+            #{carNo} AS carNo
+        FROM  ${subTableName}
+        WHERE 1=1
+            <if test="startTime != null">
+                AND ts >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND ts <= #{endTime}
+            </if>
+        ORDER BY ts DESC
+    </select>
+
+
+
     <!-- 创建水表子表-->
     <update id="createWaterMeterSubTable">
         CREATE TABLE IF NOT EXISTS water_meter_${code}_${deviceId} USING water_meter