Ver Fonte

代码优化

donglang há 2 meses atrás
pai
commit
093a04b4cd

+ 34 - 6
iot-platform-manager/src/main/java/com/platform/api/manager/TransferVehicleManage.java

@@ -19,11 +19,12 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
-import org.springframework.jdbc.UncategorizedSQLException;
 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.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -77,16 +78,43 @@ public class TransferVehicleManage implements ApplicationContextAware {
     /**
      * 插入车辆数据
      */
-//    @Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
     public void batchSaveVehicle(List<VehicleDataSaveRequest> vehicleDataList) {
+        //1. 校验,筛选出需要新增的车辆
         List<VehicleData> newVehicles = checkVehicle(vehicleDataList);
-        // 批量保存到关系库
+
+        // 2. 记录时序库插入的唯一标识(用于补偿)
+        List<String> taosUniqueKeys = Collections.emptyList();
+
+        try {
+            // 3. 先批量保存到时序数据库
+            taosUniqueKeys = taosService.batchInsertVehicleData(vehicleDataList);
+
+            // 4、再批量保存到关系库
+            saveBatchVehicle(newVehicles);
+        } catch (Exception e) {
+            // 5. 补偿删除时序库数据
+            try {
+                if (!taosUniqueKeys.isEmpty()) {
+                    taosService.batchDelete(taosUniqueKeys);
+                    log.error("已补偿删除时序库数据,唯一标识:{}", taosUniqueKeys);
+                }
+            } catch (Exception ex) {
+                log.error("补偿删除失败,需人工处理:", ex.getMessage());
+            }
+            throw new IotException(ErrorCodeEnum.DATA_SAVE_FAIL, "数据保存失败,已触发补偿", e);
+        }
+    }
+
+
+    /**
+     * 关系库插入
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveBatchVehicle(List<VehicleData> newVehicles) {
         if (CollectionUtils.isNotEmpty(newVehicles)) {
             vehicleDataService.saveBatch(newVehicles);
         }
-
-        // 批量保存到时序数据库
-        taosService.batchInsertVehicleData(vehicleDataList);
     }
 
     /**

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

@@ -35,6 +35,15 @@ public interface TaosMapper {
      */
     int batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList);
 
+
+    /**
+     * 批量删除时序库数据
+     * @param uniqueKeys 唯一标识列表(carNo_ts)
+     */
+    void batchDelete(@Param("uniqueKeys") List<String> uniqueKeys);
+
+
+
     /**
      * 通过运单号查询时序数据
 

+ 8 - 1
iot-platform-manager/src/main/java/com/platform/service/TaosService.java

@@ -20,7 +20,14 @@ public interface TaosService {
      * @param vehicleDataList
      * @return
      */
-    int batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList);
+    List<String> batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList);
+
+    /**
+     * 插入车辆数据到时序子表
+     * @param uniqueKeys
+     * @return
+     */
+    void batchDelete(List<String> uniqueKeys);
 
     /**
      * 通过运单号查询时序数据

+ 25 - 6
iot-platform-manager/src/main/java/com/platform/service/impl/TaosServiceImpl.java

@@ -1,18 +1,19 @@
 package com.platform.service.impl;
 
 
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.platform.api.request.VehicleDataRequest;
 import com.platform.api.request.VehicleDataSaveRequest;
 import com.platform.entity.VehicleTimeSeriesData;
 import com.platform.mapper.TaosMapper;
 import com.platform.service.TaosService;
-import com.zaxxer.hikari.HikariConfig;
 import jakarta.annotation.Resource;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.sql.Connection;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @Author: donglang
@@ -34,14 +35,32 @@ public class TaosServiceImpl implements TaosService {
      * @return
      */
     @Override
-    public int batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList) {
+    @Transactional(rollbackFor = Exception.class)
+    public List<String> batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList) {
          try {
              taosMapper.createVehicleDataTable();
-             return taosMapper.batchInsertVehicleData(vehicleDataList);
+             taosMapper.batchInsertVehicleData(vehicleDataList);
+
+             // 生成并返回唯一标识列表,(用于补偿删除)
+             return vehicleDataList.stream()
+                     .map(request -> request.getVehicleDataVO().getCarNo() + "_" + request.getTs())
+                     .collect(Collectors.toList());
          } catch (Exception e) {
              e.printStackTrace();
          }
-         return 0;
+         return new ArrayList<>();
+    }
+
+    /**
+     * 通过唯一标识批量删除
+     * @param uniqueKeys
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchDelete(List<String> uniqueKeys) {
+        if (CollectionUtils.isNotEmpty(uniqueKeys)) {
+            taosMapper.batchDelete(uniqueKeys);
+        }
     }
 
     /**

+ 14 - 0
iot-platform-manager/src/main/resources/mapper/TaosMapper.xml

@@ -57,6 +57,20 @@
         </foreach>
     </insert>
 
+
+    <!-- 批量删除时序库数据:根据唯一标识(carNo+ts) -->
+    <delete id="batchDelete">
+        <foreach collection="uniqueKeys" item="key" separator=";">
+            <bind name="carNo" value='key.split("_")[0]' />
+            <bind name="ts" value='key.split("_")[1]' />
+            DELETE FROM vehicle_data_${carNo}
+            WHERE ts = #{ts}
+        </foreach>
+    </delete>
+
+
+
+
     <!-- 通过运单号查询时序数据(聚合超级表下所有子表) -->
     <select id="selectByWOrderNo" resultType="com.platform.entity.VehicleTimeSeriesData">
         SELECT