Browse Source

新增4.0提供车辆保存接口

donglang 3 months ago
parent
commit
bdf2efd1d1
18 changed files with 815 additions and 21 deletions
  1. 7 1
      iot-platform-common/src/main/java/com/platform/enums/ErrorCodeEnum.java
  2. 1 0
      iot-platform-common/src/main/java/com/platform/exception/BaseResult.java
  3. 2 0
      iot-platform-manager/src/main/java/com/platform/UpgradeApplication.java
  4. 67 0
      iot-platform-manager/src/main/java/com/platform/api/config/VehicleDataQueue.java
  5. 51 0
      iot-platform-manager/src/main/java/com/platform/api/controller/TransferController.java
  6. 126 0
      iot-platform-manager/src/main/java/com/platform/api/manager/TransferVehicleManage.java
  7. 94 0
      iot-platform-manager/src/main/java/com/platform/api/request/VehicleDataSaveRequest.java
  8. 88 0
      iot-platform-manager/src/main/java/com/platform/api/request/VehicleDataVO.java
  9. 96 0
      iot-platform-manager/src/main/java/com/platform/api/response/VehicleDataResp.java
  10. 2 2
      iot-platform-manager/src/main/java/com/platform/controller/IotDeviceGroupController.java
  11. 2 1
      iot-platform-manager/src/main/java/com/platform/entity/IotDevice.java
  12. 153 0
      iot-platform-manager/src/main/java/com/platform/entity/VehicleData.java
  13. 11 0
      iot-platform-manager/src/main/java/com/platform/mapper/TaosMapper.java
  14. 22 0
      iot-platform-manager/src/main/java/com/platform/mapper/VehicleDataMapper.java
  15. 17 0
      iot-platform-manager/src/main/java/com/platform/service/VehicleDataService.java
  16. 24 0
      iot-platform-manager/src/main/java/com/platform/service/impl/VehicleDataServiceImpl.java
  17. 26 17
      iot-platform-manager/src/main/resources/mapper/TaosMapper.xml
  18. 26 0
      sql/2025/11/create_cxf.sql

+ 7 - 1
iot-platform-common/src/main/java/com/platform/enums/ErrorCodeEnum.java

@@ -35,7 +35,13 @@ public enum ErrorCodeEnum {
     DATA_SAVE_FAIL("400000", "数据保存失败"),
     DATA_SAVE_FAIL("400000", "数据保存失败"),
     DATA_UPDATE_FAIL("400001", "数据更新失败"),
     DATA_UPDATE_FAIL("400001", "数据更新失败"),
     DATA_DELETE_FAIL("400002", "数据删除失败"),
     DATA_DELETE_FAIL("400002", "数据删除失败"),
-    DB_CONNECTION_ERROR("400003", "数据库连接异常");
+    DB_CONNECTION_ERROR("400003", "数据库连接异常"),
+
+    // ====================== 时序数据存储错误(50000~59999)======================
+    TD_SAVE_FAIL("500000", "时序数据保存失败"),
+    TD_UPDATE_FAIL("500001", "时序数据更新失败"),
+    TD_DELETE_FAIL("500002", "时序数据删除失败"),
+    TD_CONNECTION_ERROR("500003", "时序数据库连接异常");
 
 
 
 
     /** 错误编码 */
     /** 错误编码 */

+ 1 - 0
iot-platform-common/src/main/java/com/platform/exception/BaseResult.java

@@ -42,6 +42,7 @@ public class BaseResult<T> implements Serializable {
     public static <T> BaseResult<T> success(T data) {
     public static <T> BaseResult<T> success(T data) {
         BaseResult<T> result = new BaseResult<>();
         BaseResult<T> result = new BaseResult<>();
         result.setSuccess(true);
         result.setSuccess(true);
+        result.setCode(0);
         result.setData(data);
         result.setData(data);
         return result;
         return result;
     }
     }

+ 2 - 0
iot-platform-manager/src/main/java/com/platform/UpgradeApplication.java

@@ -3,6 +3,7 @@ package com.platform;
 import org.mybatis.spring.annotation.MapperScan;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 
 /**
 /**
  * @Author: 马超伟
  * @Author: 马超伟
@@ -13,6 +14,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 
 @SpringBootApplication
 @SpringBootApplication
 @MapperScan("com.platform.mapper")
 @MapperScan("com.platform.mapper")
+@EnableScheduling
 public class UpgradeApplication {
 public class UpgradeApplication {
     public static void main(String[] args) {
     public static void main(String[] args) {
         SpringApplication.run(UpgradeApplication.class, args);
         SpringApplication.run(UpgradeApplication.class, args);

+ 67 - 0
iot-platform-manager/src/main/java/com/platform/api/config/VehicleDataQueue.java

@@ -0,0 +1,67 @@
+package com.platform.api.config;
+
+
+/**
+ * Author: donglang
+ * Time: 2025-10-13
+ * Des:
+ * Version: 1.0
+ */
+
+import com.platform.api.request.VehicleDataSaveRequest;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+/**
+ * 车辆数据缓存队列(线程安全,用于暂存待批量保存的数据)
+ */
+@Component
+public class VehicleDataQueue {
+
+    // 暂存单条数据队列
+    private final Queue<VehicleDataSaveRequest> dataQueue = new ConcurrentLinkedQueue<>();
+
+    // 批量阈值(达到10条触发保存)
+    private static final int BATCH_SIZE = 10;
+
+    /**
+     * 添加单条数据到队列
+     */
+    public void add(VehicleDataSaveRequest request) {
+        dataQueue.add(request);
+    }
+
+    /**
+     * 检查是否达到批量阈值,若达到则取出所有数据
+     * @return 待批量保存的数据列表(可能为空)
+     */
+    public List<VehicleDataSaveRequest> takeBatchIfReached() {
+        List<VehicleDataSaveRequest> batchList = new ArrayList<>();
+        // 若队列数据量 >= 10,取出10条(或全部,根据需求)
+        if (dataQueue.size() >= BATCH_SIZE) {
+            for (int i = 0; i < BATCH_SIZE; i++) {
+                VehicleDataSaveRequest request = dataQueue.poll();
+                if (request != null) {
+                    batchList.add(request);
+                }
+            }
+        }
+        return batchList;
+    }
+
+    /**
+     * 取出队列中所有数据
+     */
+    public List<VehicleDataSaveRequest> takeAll() {
+        List<VehicleDataSaveRequest> allData = new ArrayList<>();
+        VehicleDataSaveRequest request;
+        while ((request = dataQueue.poll()) != null) {
+            allData.add(request);
+        }
+        return allData;
+    }
+}

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

@@ -0,0 +1,51 @@
+package com.platform.api.controller;
+
+
+import com.platform.api.manager.TransferVehicleManage;
+import com.platform.api.request.VehicleDataSaveRequest;
+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;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Author: donglang
+ * Time: 2025-10-13
+ * Des: 开物云4.0对外接口
+ * Version: 1.0
+ */
+
+@RestController("api/transfer")
+@RequiredArgsConstructor
+public class TransferController {
+
+    private final TransferVehicleManage transferVehicleManage;
+
+    /**
+     * 保存车辆数据
+     */
+    @PostMapping("/saveVehicleData")
+    public BaseResult<Boolean> saveVehicleData(@RequestBody @Validated VehicleDataSaveRequest request) {
+        try {
+            transferVehicleManage.saveVehicleData(request);
+            return BaseResult.success(true);
+        } catch (Exception e) {
+            return BaseResult.error(-1, e.getMessage());
+        }
+    }
+
+
+    /**
+     * 分页查询物联设备
+     */
+    @PostMapping("/pageVehicleDataList")
+    public PageResult<IotDeviceResp> pageVehicleDataList(@RequestBody VehicleDataSaveRequest request) {
+        return null;
+    }
+
+
+}

+ 126 - 0
iot-platform-manager/src/main/java/com/platform/api/manager/TransferVehicleManage.java

@@ -0,0 +1,126 @@
+package com.platform.api.manager;
+
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.platform.api.config.VehicleDataQueue;
+import com.platform.api.request.VehicleDataSaveRequest;
+import com.platform.entity.VehicleData;
+import com.platform.enums.ErrorCodeEnum;
+import com.platform.exception.IotException;
+import com.platform.mapper.TaosMapper;
+import com.platform.service.VehicleDataService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.lang.Nullable;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Author: donglang
+ * Time: 2025-10-13
+ * Des:
+ * Version: 1.0
+ */
+
+@Service
+@RequiredArgsConstructor
+public class TransferVehicleManage implements ApplicationContextAware {
+
+    private final TaosMapper taosMapper;
+
+    private final VehicleDataService vehicleDataService;
+
+    /**
+     * 队列
+     */
+    private final VehicleDataQueue vehicleDataQueue;
+
+    private ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(@Nullable ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    /**
+     * 接收单条数据,暂存到队列
+     */
+    public void saveVehicleData(VehicleDataSaveRequest request) {
+        // 1. 暂存数据到队列
+        vehicleDataQueue.add(request);
+
+        // 2. 检查是否达到批量阈值,若达到则批量保存
+        List<VehicleDataSaveRequest> vehicleDataList = vehicleDataQueue.takeBatchIfReached();
+        if (CollectionUtils.isEmpty(vehicleDataList)) {
+           return;
+        }
+
+        TransferVehicleManage proxy = applicationContext.getBean(TransferVehicleManage.class);
+        proxy.batchSaveVehicle(vehicleDataList);
+    }
+
+    /**
+     * 插入车辆数据
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void batchSaveVehicle(List<VehicleDataSaveRequest> vehicleDataList) {
+        try {
+            List<VehicleData> newVehicles = checkVehicle(vehicleDataList);
+            // 批量保存到关系库
+            if (CollectionUtils.isNotEmpty(newVehicles)) {
+                vehicleDataService.saveBatch(newVehicles);
+            }
+
+            // 批量保存到时序数据库
+            taosMapper.batchInsertVehicleData(vehicleDataList);
+        } catch (Exception e) {
+           throw new IotException(ErrorCodeEnum.TD_SAVE_FAIL, "批量保存车辆数据到时序数据库失败");
+        }
+    }
+
+    /**
+     * 校验关系数据库中是否存在车辆
+     */
+    private List<VehicleData> checkVehicle(List<VehicleDataSaveRequest> vehicleDataList) {
+        //提取所有车牌
+        List<String> carNoList = vehicleDataList.stream()
+                .map(ve -> ve.getVehicleDataVO().getCarNo())
+                .distinct()
+                .collect(Collectors.toList());
+
+        // 2. 批量查询已存在的车牌
+        List<String> existCarNos = vehicleDataService.list(Wrappers.<VehicleData>lambdaQuery()
+                        .in(VehicleData::getCarNo, carNoList))
+                .stream()
+                .map(VehicleData::getCarNo)
+                .collect(Collectors.toList());
+
+        // 3. 筛选出需要新增的车辆
+        return vehicleDataList.stream()
+                .filter(req -> !existCarNos.contains(req.getVehicleDataVO().getCarNo()))
+                .map(req -> VehicleData.toVehicleData(req.getVehicleDataVO()))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 定时兜底任务:每10分钟执行一次,防止数据长期凑不满10条
+     */
+    @Scheduled(fixedRate = 600 * 1000)
+    @Transactional(rollbackFor = Exception.class)
+    public void scheduledBatchSave() {
+        List<VehicleDataSaveRequest> remainingData = vehicleDataQueue.takeAll();
+        if (!remainingData.isEmpty()) {
+            batchSaveVehicle(remainingData);
+        }
+    }
+
+
+
+}

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

@@ -0,0 +1,94 @@
+package com.platform.api.request;
+
+import com.platform.request.PageRequest;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Author: 马超伟
+ * @CreateTime: 2025-10-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+
+@Data
+public class VehicleDataSaveRequest extends PageRequest {
+
+    // 超级表MEASUREMENTS字段
+    /**
+     * 时间戳
+     */
+    @NotNull(message = "数据时间戳ts不能为空")
+    private LocalDateTime ts;
+
+    /**
+     * 经度
+     */
+    @NotBlank(message = "经度longitude不能为空")
+    private String longitude;
+
+    /**
+     * 纬度
+     */
+    @NotBlank(message = "纬度latitude不能为空")
+    private String latitude;
+
+    /**
+     * 车速(km/h)
+     */
+    @NotNull
+    private Float speed;
+
+    /**
+     * 行驶方向(角度)
+     */
+    private Integer direction;
+
+    /**
+     * 燃油液位(%)
+     */
+    private Float fuel_level;
+
+    /**
+     * 里程数(km)
+     */
+    private Double mileage;
+
+    /**
+     * 发动机温度(℃)
+     */
+    private Float engine_temp;
+
+    /**
+     * 电池电压(V)
+     */
+    private Float battery_voltage;
+
+    /**
+     * 车辆状态
+     */
+    @NotBlank
+    private String status;
+
+    /**
+     * 运单号
+     */
+    @NotBlank
+    private String wOrderNo;
+
+    /**
+     * 报警代码
+     */
+    private Integer alarm_code;
+
+
+    /**
+     * 车辆信息
+     */
+    private VehicleDataVO vehicleDataVO;
+
+}

+ 88 - 0
iot-platform-manager/src/main/java/com/platform/api/request/VehicleDataVO.java

@@ -0,0 +1,88 @@
+package com.platform.api.request;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * Author: donglang
+ * Time: 2025-10-13
+ * Des: 车辆实体表
+ * Version: 1.0
+ */
+@Data
+public class VehicleDataVO {
+
+    /**
+     * 车牌
+     */
+    @NotBlank(message = "车牌car_no不能为空")
+    private String carNo;
+
+    /**
+     * 车队id
+     */
+    @TableField("fleet_id")
+    private String fleetId;
+
+    /**
+     * 车队名称
+     */
+    @TableField("fleet_name")
+    private String fleetName;
+
+    /**
+     * 设备唯一id
+     */
+    @TableField("device_id")
+    private String deviceId;
+
+    /**
+     * 设备名称
+     */
+    @TableField("device_name")
+    private String deviceName;
+
+    /**
+     * 区域ID
+     */
+    @TableField("group_id")
+    private String groupId;
+
+    /**
+     * 区域名称
+     */
+    @TableField("group_name")
+    private String groupName;
+
+    /**
+     * 业务ID
+     */
+    @TableField("biz_id")
+    private String bizId;
+
+    /**
+     * 业务名称
+     */
+    @TableField("biz_name")
+    private String bizName;
+
+    /**
+     * 项目ID
+     */
+    @TableField("project_id")
+    private String projectId;
+
+    /**
+     * 项目名称
+     */
+    @TableField("project_name")
+    private String projectName;
+
+    /**
+     * 租户id
+     */
+    @TableField("tenant_id")
+    private String tenantId;
+}

+ 96 - 0
iot-platform-manager/src/main/java/com/platform/api/response/VehicleDataResp.java

@@ -0,0 +1,96 @@
+package com.platform.api.response;
+
+import com.platform.entity.IotDevice;
+import lombok.Data;
+
+/**
+ * @Author: 马超伟
+ * @CreateTime: 2025-10-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+
+@Data
+public class VehicleDataResp {
+
+    /**
+     * 设备主键id
+     */
+    private Long id;
+
+    /**
+     * 设备编号
+     */
+    private String deviceCode;
+
+    /**
+     * 设备名称[旧系统的title]
+     */
+    private String deviceName;
+
+    /**
+     * 设备分组码值
+     */
+    private String deviceGroupCode;
+
+    /**
+     * 设备分组名称
+     */
+    private String deviceGroupName;
+
+    /**
+     * 物联网模型码值
+     */
+    private String modCode;
+
+    /**
+     * 物联网模型名称
+     */
+    private String modName;
+
+    /**
+     * 设备品牌名称
+     */
+    private String brand;
+
+    /**
+     * 型号
+     */
+    private String modelCode;
+
+    /**
+     * sn通常是:IMEI
+     */
+    private String sn;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 设备类别
+     */
+    private Long egId;
+
+
+    private static VehicleDataResp getInstance(){
+        return new VehicleDataResp();
+    }
+
+    public static VehicleDataResp toIotPageResp(IotDevice iotDevice){
+        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());
+
+        return devicePageResp;
+    }
+}

+ 2 - 2
iot-platform-manager/src/main/java/com/platform/controller/IotDeviceGroupController.java

@@ -32,7 +32,7 @@ public class IotDeviceGroupController {
     }
     }
 
 
     /**
     /**
-     * 添加物联设备
+     * 添加物联设备
      */
      */
     @PostMapping("/addDeviceGroup")
     @PostMapping("/addDeviceGroup")
     public BaseResult<Boolean> addDeviceGroup(@RequestBody @Validated IotDeviceGroupSaveRequest request) {
     public BaseResult<Boolean> addDeviceGroup(@RequestBody @Validated IotDeviceGroupSaveRequest request) {
@@ -40,7 +40,7 @@ public class IotDeviceGroupController {
     }
     }
 
 
     /**
     /**
-     * 删除物联设备
+     * 删除物联设备
      */
      */
     @GetMapping("/delDeviceGroup")
     @GetMapping("/delDeviceGroup")
     public BaseResult<Boolean> delDeviceGroup(Long id) {
     public BaseResult<Boolean> delDeviceGroup(Long id) {

+ 2 - 1
iot-platform-manager/src/main/java/com/platform/entity/IotDevice.java

@@ -156,9 +156,10 @@ public class IotDevice {
     @TableField("eg_id")
     @TableField("eg_id")
     private Long egId;
     private Long egId;
 
 
-    public static IotDevice getInstance(){
+    public static IotDevice getInstance() {
         return new IotDevice();
         return new IotDevice();
     }
     }
+
     public static IotDevice toIotDevice(IotDeviceSaveRequest request) {
     public static IotDevice toIotDevice(IotDeviceSaveRequest request) {
         IotDevice iotDevice = IotDevice.getInstance();
         IotDevice iotDevice = IotDevice.getInstance();
         iotDevice.setTenantId(null);
         iotDevice.setTenantId(null);

+ 153 - 0
iot-platform-manager/src/main/java/com/platform/entity/VehicleData.java

@@ -0,0 +1,153 @@
+package com.platform.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+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 VehicleData {
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 车牌
+     */
+    @TableField("car_no")
+    private String carNo;
+
+    /**
+     * 车队id
+     */
+    @TableField("fleet_id")
+    private String fleetId;
+
+    /**
+     * 车队名称
+     */
+    @TableField("fleet_name")
+    private String fleetName;
+
+    /**
+     * 设备唯一id
+     */
+    @TableField("device_id")
+    private String deviceId;
+
+    /**
+     * 设备名称
+     */
+    @TableField("device_name")
+    private String deviceName;
+
+    /**
+     * 区域ID
+     */
+    @TableField("group_id")
+    private String groupId;
+
+    /**
+     * 区域名称
+     */
+    @TableField("group_name")
+    private String groupName;
+
+    /**
+     * 业务ID
+     */
+    @TableField("biz_id")
+    private String bizId;
+
+    /**
+     * 业务名称
+     */
+    @TableField("biz_name")
+    private String bizName;
+
+    /**
+     * 项目ID
+     */
+    @TableField("project_id")
+    private String projectId;
+
+    /**
+     * 项目名称
+     */
+    @TableField("project_name")
+    private String projectName;
+
+    /**
+     * 删除标识(0-未删除,1-删除)
+     */
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(value = "update_time")
+    private LocalDateTime updateTime;
+
+    /**
+     * 创建人
+     */
+    @TableField(value = "create_user")
+    private String createUser;
+
+    /**
+     * 更新人
+     */
+    @TableField(value = "update_user")
+    private String updateUser;
+
+    /**
+     * 租户id
+     */
+    @TableField("tenant_id")
+    private String tenantId;
+
+    private static VehicleData getInstance(){
+        return new VehicleData();
+    }
+
+
+    public static VehicleData toVehicleData(VehicleDataVO vo){
+        VehicleData vehicleData = VehicleData.getInstance();
+        vehicleData.setCarNo(vo.getCarNo());
+        vehicleData.setFleetId(vo.getFleetId());
+        vehicleData.setFleetName(vo.getFleetName());
+        vehicleData.setDeviceId(vo.getDeviceId());
+        vehicleData.setDeviceName(vo.getDeviceName());
+        vehicleData.setGroupId(vo.getGroupId());
+        vehicleData.setGroupName(vo.getGroupName());
+        vehicleData.setBizId(vo.getBizId());
+        vehicleData.setBizName(vo.getBizName());
+        vehicleData.setProjectId(vo.getProjectId());
+        vehicleData.setProjectName(vo.getProjectName());
+        vehicleData.setTenantId(null);
+
+        return vehicleData;
+    }
+}

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

@@ -1,9 +1,12 @@
 package com.platform.mapper;
 package com.platform.mapper;
 
 
 
 
+import com.platform.api.request.VehicleDataSaveRequest;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 
 
+import java.util.List;
+
 /**
 /**
  * @Author: donglang
  * @Author: donglang
  * @CreateTime: 2025-10-09
  * @CreateTime: 2025-10-09
@@ -14,6 +17,14 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 @Mapper
 public interface TaosMapper {
 public interface TaosMapper {
 
 
+    /**
+     * 插入车辆数据到时序子表
+     * 子表名规则:vehicle_${tenantId}_${deviceId}(基于租户ID+设备ID,确保唯一)
+     * @param vehicleDataList 车辆数据实体
+     * @return 插入成功的行数
+     */
+    int batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList);
+
     /**
     /**
      * 创建水表子表
      * 创建水表子表
      * @param code 产品编码
      * @param code 产品编码

+ 22 - 0
iot-platform-manager/src/main/java/com/platform/mapper/VehicleDataMapper.java

@@ -0,0 +1,22 @@
+package com.platform.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.platform.entity.VehicleData;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * Author: donglang
+ * Time: 2025-10-13
+ * Des: 车辆mapper
+ * Version: 1.0
+ */
+
+@Mapper
+public interface VehicleDataMapper extends BaseMapper<VehicleData> {
+
+
+
+
+
+}

+ 17 - 0
iot-platform-manager/src/main/java/com/platform/service/VehicleDataService.java

@@ -0,0 +1,17 @@
+package com.platform.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.platform.entity.VehicleData;
+
+/**
+ * Author: donglang
+ * Time: 2025-10-13
+ * Des: 车辆业务service
+ * Version: 1.0
+ */
+
+public interface VehicleDataService extends IService<VehicleData> {
+
+
+}

+ 24 - 0
iot-platform-manager/src/main/java/com/platform/service/impl/VehicleDataServiceImpl.java

@@ -0,0 +1,24 @@
+package com.platform.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.platform.entity.VehicleData;
+import com.platform.mapper.VehicleDataMapper;
+import com.platform.service.VehicleDataService;
+import org.springframework.stereotype.Service;
+
+/**
+ * Author: donglang
+ * Time: 2025-10-13
+ * Des: 车辆业务实现类
+ * Version: 1.0
+ */
+
+@Service
+public class VehicleDataServiceImpl extends ServiceImpl<VehicleDataMapper, VehicleData> implements VehicleDataService {
+
+
+
+
+
+}

+ 26 - 17
iot-platform-manager/src/main/resources/mapper/TaosMapper.xml

@@ -4,6 +4,32 @@
 
 
 <mapper namespace="com.platform.mapper.TaosMapper">
 <mapper namespace="com.platform.mapper.TaosMapper">
 
 
+
+    <!-- 创建车辆数据子表-->
+    <update id="createVehicleDataSubTable">
+        CREATE TABLE IF NOT EXISTS vehicle_data_${carNo} USING vehicle_data
+            TAGS (#{car_no})
+    </update>
+
+    <!-- 插入车辆数据子表数据-->
+    <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>
+
     <!-- 创建水表子表-->
     <!-- 创建水表子表-->
     <update id="createWaterMeterSubTable">
     <update id="createWaterMeterSubTable">
         CREATE TABLE IF NOT EXISTS water_meter_${code}_${deviceId} USING water_meter
         CREATE TABLE IF NOT EXISTS water_meter_${code}_${deviceId} USING water_meter
@@ -183,23 +209,6 @@
         )
         )
     </update>
     </update>
 
 
-    <!-- 创建车辆数据子表-->
-    <update id="createVehicleDataSubTable">
-        CREATE TABLE IF NOT EXISTS vehicle_data_${code}_${deviceId} USING vehicle_data
-            TAGS (
-                     #{fleet_id},
-                     #{deviceId},
-                     #{deviceName},
-                     #{groupId},
-                     #{groupName},
-                     #{bizId},
-                     #{bizName},
-                     #{projectId},
-                     #{projectName},
-                     #{tenantId}
-        )
-    </update>
-
 
 
     <!-- 创建装载机械数据子表-->
     <!-- 创建装载机械数据子表-->
     <update id="createLoadingEquipmentDataSubTable">
     <update id="createLoadingEquipmentDataSubTable">

+ 26 - 0
sql/2025/11/create_cxf.sql

@@ -129,6 +129,32 @@ create table saas_equipment_manage
 
 
 )comment '设备基础管理表(关联物联网ID)';
 )comment '设备基础管理表(关联物联网ID)';
 
 
+
+create table vehicle_data
+(
+    id          bigint unsigned auto_increment  primary key,
+    car_no      varchar(10)                not null default '' comment '车牌',
+    fleet_id    varchar(50)                not null default '' comment '车队id',
+    fleet_name  varchar(50)                not null default '' comment '车队名称',
+    device_id   varchar(50)                not null default '' comment '设备唯一id',
+    device_name varchar(50)                not null default '' comment '设备名称',
+    group_id    varchar(50)                not null default '' comment '区域ID',
+    group_name  varchar(50)                not null default '' comment '区域名称',
+    biz_id      varchar(50)                not null default '' comment '业务ID',
+    biz_name    varchar(50)                not null default '' comment '业务名称',
+    project_id  varchar(50)                not null default '' comment '项目ID',
+    project_name varchar(50)                not null default '' comment '项目名称',
+    del_flag    tinyint                      not null default 0  comment '0-未删除,1-删除',
+    create_time datetime                     not null default CURRENT_TIMESTAMP comment '创建时间',
+    update_time datetime                     not null default current_timestamp on update CURRENT_TIMESTAMP comment '更新时间',
+    create_user varchar(255)                 not null default '' comment '创建人',
+    update_user varchar(255)                 not null default '' comment '更新人',
+    tenant_id    varchar(255)                 not null default '' comment '租户id'
+) comment '车辆表';
+
+
+
+
 create index energy_type
 create index energy_type
     on saas_equipment_manage (energy_type);
     on saas_equipment_manage (energy_type);