Browse Source

feat:增加删除监控设备时设备是否正在使用校验
feat:获取设备分页新增id转name操作

黄渊昊 9 months ago
parent
commit
d3ea8964b3

+ 63 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/bean/influxdb/SensorDataService.java

@@ -5,6 +5,8 @@ import com.github.jfcloud.influxdb.flux.QueryCondition;
 import com.github.jfcloud.influxdb.service.JfcloudInfluxDBService;
 import com.github.jfcloud.influxdb.service.JfcloudInfluxDBService;
 import com.influxdb.annotations.Column;
 import com.influxdb.annotations.Column;
 import com.influxdb.annotations.Measurement;
 import com.influxdb.annotations.Measurement;
+import com.influxdb.client.QueryApi;
+import com.influxdb.query.FluxTable;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 import vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants;
 import vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants;
@@ -80,6 +82,67 @@ public class SensorDataService {
         return fluxQuery.toString();
         return fluxQuery.toString();
     }
     }
 
 
+    /**
+     * 根据 deviceId 和 roads 查询最新的数据
+     *
+     * @param deviceId 设备 ID
+     * @param roads    路数
+     * @return 最新的传感器数据
+     */
+    public SensorData queryLatestDataByDeviceIdAndRoads(String deviceId, Integer roads) {
+        // 构建 Flux 查询,获取最新一条记录
+//        String fluxQuery = String.format(
+//                "from(bucket: \"%s\") " +
+//                        "|> range(start: -30d) " +  // 查询过去 30 天的数据
+//                        "|> filter(fn: (r) => r._measurement == \"%s\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\") " +
+//                        "|> sort(columns: [\"_time\"], desc: true) " +  // 按时间降序排序
+//                        "|> limit(n: 1)",  // 限制查询结果为 1 条
+//                getBucketName(),  // 动态获取桶名
+//                getMeasurement(SensorData.class),  // 动态获取 measurement 名称
+//                deviceId,  // 设备 ID
+//                roads  // 路数
+//        );
+        String fluxQuery = String.format(
+                "from(bucket: \"%s\") " +
+                        "|> range(start: -30d) " +
+                        "|> filter(fn: (r) => r._measurement == \"%s\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\") " +
+                        "|> sort(columns: [\"_time\"], desc: true) " +
+                        "|> limit(n: 1) " +
+                        "|> pivot(rowKey: [\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\") " +
+                        "|> keep(columns: [\"_time\", \"temperature\", \"humidity\", \"co2\", \"battery\", \"plugInStatus\", \"location\", \"longitude\", \"latitude\", \"device_id\", \"roads\", \"modelName\"])",
+                getBucketName(),
+                getMeasurement(SensorData.class),
+                deviceId,
+                roads
+        );
+        QueryApi queryApi = jfcloudInfluxDBService.getInfluxDBClient().getQueryApi();
+        List<FluxTable> tables = queryApi.query(fluxQuery);
+
+        // 将查询结果映射为 SensorData 实体
+        return tables.stream()
+                .flatMap(table -> table.getRecords().stream())  // 拉平所有记录
+                .map(SensorData::mapToSensorData)  // 将每个记录映射为 SensorData 实体
+                .findFirst()  // 只取第一条记录(即最新一条记录)
+                .orElse(null);  // 如果没有数据,返回 null
+    }
+
+    /**
+     * 根据 deviceId、roads 和时间范围查询数据
+     *
+     * @param deviceId  设备 ID
+     * @param roads     路数
+     * @param startTime 查询开始时间
+     * @param endTime   查询结束时间
+     * @return 查询到的传感器数据列表
+     */
+    public List<SensorData> queryDataByDeviceIdAndRoads(String deviceId, Integer roads, String startTime, String endTime) {
+        String query = String.format("SELECT * FROM \"%s\" WHERE \"device_id\" = '%s' AND \"roads\" = %d AND time >= '%s' AND time <= '%s' ORDER BY time DESC", getMeasurement(SensorData.class), deviceId, roads, startTime, endTime);
+        QueryApi queryApi = jfcloudInfluxDBService.getInfluxDBClient().getQueryApi();
+        List<FluxTable> results = queryApi.query(query);
+
+        // 将查询结果转换为 SensorData 实体
+        return results.stream().flatMap(table -> table.getRecords().stream()).map(SensorData::mapToSensorData).collect(Collectors.toList());
+    }
 
 
 
 
     /**
     /**

+ 23 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.jfcloud.influxdb.flux.QueryCondition;
 import com.github.jfcloud.influxdb.flux.QueryCondition;
+import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -29,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
 import rk.netDevice.sdk.p2.ParamData;
 import rk.netDevice.sdk.p2.ParamData;
 import rk.netDevice.sdk.p2.ParamIdsData;
 import rk.netDevice.sdk.p2.ParamIdsData;
 import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
 import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
+import vip.xiaonuo.coldchain.core.bean.influxdb.SensorDataService;
 import vip.xiaonuo.coldchain.core.cache.monitordevice.MonitorDeviceCache;
 import vip.xiaonuo.coldchain.core.cache.monitordevice.MonitorDeviceCache;
 import vip.xiaonuo.coldchain.core.renke.RenKeService;
 import vip.xiaonuo.coldchain.core.renke.RenKeService;
 import vip.xiaonuo.coldchain.core.service.JfcloudSensorDataService;
 import vip.xiaonuo.coldchain.core.service.JfcloudSensorDataService;
@@ -40,6 +42,9 @@ import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceEditParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceIdParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceIdParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDevicePageParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDevicePageParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
+import vip.xiaonuo.coldchain.modular.monitordevicetype.entity.MonitorDeviceType;
+import vip.xiaonuo.coldchain.modular.monitordevicetype.service.MonitorDeviceTypeService;
+import vip.xiaonuo.coldchain.modular.monitortargetregion.service.MonitorTargetRegionService;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.page.CommonPageRequest;
 import vip.xiaonuo.common.page.CommonPageRequest;
@@ -60,7 +65,12 @@ import java.util.List;
 public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, MonitorDevice> implements MonitorDeviceService {
 public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, MonitorDevice> implements MonitorDeviceService {
     private final RenKeService renKeService;
     private final RenKeService renKeService;
     private final MonitorDeviceCache monitorDeviceCache;
     private final MonitorDeviceCache monitorDeviceCache;
-    private final JfcloudSensorDataService sensorDataService;
+    private final SensorDataService sensorDataService;
+
+    @Resource
+    private MonitorDeviceTypeService monitorDeviceTypeService;
+    @Resource
+    private MonitorTargetRegionService monitorTargetRegionService;
 
 
     private String bucketName;
     private String bucketName;
 
 
@@ -79,7 +89,12 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
         } else {
         } else {
             queryWrapper.lambda().orderByAsc(MonitorDevice::getSortCode);
             queryWrapper.lambda().orderByAsc(MonitorDevice::getSortCode);
         }
         }
-        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+        Page<MonitorDevice> page = this.page(CommonPageRequest.defaultPage(), queryWrapper);
+        for (MonitorDevice record : page.getRecords()) {
+            MonitorDeviceType monitorDeviceType = monitorDeviceTypeService.getById(record.getModelName());
+            record.setTypeName(monitorDeviceType.getName());
+        }
+        return page;
     }
     }
 
 
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
@@ -127,6 +142,12 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     @Override
     @Override
     public void delete(List<MonitorDeviceIdParam> monitorDeviceIdParamList) {
     public void delete(List<MonitorDeviceIdParam> monitorDeviceIdParamList) {
+        for (MonitorDeviceIdParam monitorDeviceIdParam : monitorDeviceIdParamList) {
+            List<String> targetIdListByDeviceIdList = monitorTargetRegionService.getTargetIdListByDeviceId(monitorDeviceIdParam.getId());
+            if (!targetIdListByDeviceIdList.isEmpty()) {
+                throw new CommonException("该采集器已被使用,请先删除该采集器下的监测点");
+            }
+        }
         // 执行删除
         // 执行删除
         this.removeByIds(CollStreamUtil.toList(monitorDeviceIdParamList, MonitorDeviceIdParam::getId));
         this.removeByIds(CollStreamUtil.toList(monitorDeviceIdParamList, MonitorDeviceIdParam::getId));
     }
     }

+ 3 - 21
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/entity/MonitorDeviceType.java

@@ -16,6 +16,8 @@ import com.baomidou.mybatisplus.annotation.*;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.Date;
 
 
@@ -28,7 +30,7 @@ import java.util.Date;
 @Getter
 @Getter
 @Setter
 @Setter
 @TableName("monitor_device_type")
 @TableName("monitor_device_type")
-public class MonitorDeviceType {
+public class MonitorDeviceType extends CommonEntity {
 
 
     /** 设备唯一标识符,UUID */
     /** 设备唯一标识符,UUID */
     @TableId
     @TableId
@@ -63,26 +65,6 @@ public class MonitorDeviceType {
     @Schema(description = "设备参数集合")
     @Schema(description = "设备参数集合")
     private String parameters;
     private String parameters;
 
 
-    /** 删除标志 */
-    @Schema(description = "删除标志")
-    private String isDeleted;
-
-    /** 记录创建时间 */
-    @Schema(description = "记录创建时间")
-    private Date createdAt;
-
-    /** 记录创建用户 */
-    @Schema(description = "记录创建用户")
-    private String createdBy;
-
-    /** 记录修改时间 */
-    @Schema(description = "记录修改时间")
-    private Date updatedAt;
-
-    /** 记录修改用户 */
-    @Schema(description = "记录修改用户")
-    private String updatedBy;
-
     /** 报警上限 */
     /** 报警上限 */
     @Schema(description = "报警上限")
     @Schema(description = "报警上限")
     private Float temperatureUp;
     private Float temperatureUp;