hwt 11 bulan lalu
induk
melakukan
64a64c7d0b

+ 92 - 4
ruoyi-modules/ruoyi-qxsb/src/main/java/com/ruoyi/hhzx/qxsb/rk/domain/WeatherRealtimeData.java

@@ -12,13 +12,13 @@ import com.ruoyi.common.core.web.domain.BaseEntity;
  * 气象站实时数据对象 weather_realtime_data
  * 气象站实时数据对象 weather_realtime_data
  * 
  * 
  * @author ruoyi
  * @author ruoyi
- * @date 2025-06-12
+ * @date 2025-06-16
  */
  */
 public class WeatherRealtimeData extends BaseEntity
 public class WeatherRealtimeData extends BaseEntity
 {
 {
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
-    /** $column.columnComment */
+    /**  */
     private Long id;
     private Long id;
 
 
     /** 设备编号 */
     /** 设备编号 */
@@ -37,6 +37,10 @@ public class WeatherRealtimeData extends BaseEntity
     @Excel(name = "降雨量(mm)")
     @Excel(name = "降雨量(mm)")
     private BigDecimal rainfall;
     private BigDecimal rainfall;
 
 
+    /** 降雨量(mm) */
+    @Excel(name = "累积降雨量(mm)")
+    private BigDecimal rainfallA;
+
     /** 风向 */
     /** 风向 */
     @Excel(name = "风向")
     @Excel(name = "风向")
     private String windDirection;
     private String windDirection;
@@ -54,10 +58,30 @@ public class WeatherRealtimeData extends BaseEntity
     private BigDecimal lightIntensity;
     private BigDecimal lightIntensity;
 
 
     /** 采集时间 */
     /** 采集时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "采集时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "采集时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date collectTime;
     private Date collectTime;
 
 
+    /** 土壤温度 */
+    @Excel(name = "土壤温度")
+    private BigDecimal soilTemperature;
+
+    /** 土壤水分 */
+    @Excel(name = "土壤水分")
+    private BigDecimal soilHumidity;
+
+    /** 土壤氮 */
+    @Excel(name = "土壤氮")
+    private BigDecimal soilN;
+
+    /** 土壤磷 */
+    @Excel(name = "土壤磷")
+    private BigDecimal soilP;
+
+    /** 土壤钾 */
+    @Excel(name = "土壤钾")
+    private BigDecimal soilK;
+
     public void setId(Long id) 
     public void setId(Long id) 
     {
     {
         this.id = id;
         this.id = id;
@@ -158,6 +182,64 @@ public class WeatherRealtimeData extends BaseEntity
         return collectTime;
         return collectTime;
     }
     }
 
 
+    public void setSoilTemperature(BigDecimal soilTemperature) 
+    {
+        this.soilTemperature = soilTemperature;
+    }
+
+    public BigDecimal getSoilTemperature() 
+    {
+        return soilTemperature;
+    }
+
+    public void setSoilHumidity(BigDecimal soilHumidity) 
+    {
+        this.soilHumidity = soilHumidity;
+    }
+
+    public BigDecimal getSoilHumidity() 
+    {
+        return soilHumidity;
+    }
+
+    public void setSoilN(BigDecimal soilN) 
+    {
+        this.soilN = soilN;
+    }
+
+    public BigDecimal getSoilN() 
+    {
+        return soilN;
+    }
+
+    public void setSoilP(BigDecimal soilP) 
+    {
+        this.soilP = soilP;
+    }
+
+    public BigDecimal getSoilP() 
+    {
+        return soilP;
+    }
+
+    public void setSoilK(BigDecimal soilK) 
+    {
+        this.soilK = soilK;
+    }
+
+    public BigDecimal getSoilK() 
+    {
+        return soilK;
+    }
+
+    public BigDecimal getRainfallA() {
+        return rainfallA;
+    }
+
+    public void setRainfallA(BigDecimal rainfallA) {
+        this.rainfallA = rainfallA;
+    }
+
     @Override
     @Override
     public String toString() {
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -175,6 +257,12 @@ public class WeatherRealtimeData extends BaseEntity
             .append("updateTime", getUpdateTime())
             .append("updateTime", getUpdateTime())
             .append("createBy", getCreateBy())
             .append("createBy", getCreateBy())
             .append("updateBy", getUpdateBy())
             .append("updateBy", getUpdateBy())
+            .append("soilTemperature", getSoilTemperature())
+            .append("soilHumidity", getSoilHumidity())
+            .append("soilN", getSoilN())
+            .append("soilP", getSoilP())
+            .append("soilK", getSoilK())
+            .append("rainfallA", getRainfallA())
             .toString();
             .toString();
     }
     }
 }
 }

+ 112 - 18
ruoyi-modules/ruoyi-qxsb/src/main/java/com/ruoyi/hhzx/qxsb/rk/listener/dataListener.java

@@ -1,46 +1,140 @@
 package com.ruoyi.hhzx.qxsb.rk.listener;
 package com.ruoyi.hhzx.qxsb.rk.listener;
 
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.hhzx.qxsb.rk.domain.WeatherRealtimeData;
+import com.ruoyi.hhzx.qxsb.rk.service.IWeatherRealtimeDataService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 import rk.netDevice.sdk.p2.*;
 import rk.netDevice.sdk.p2.*;
 
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 @Component
 @Component
 @Slf4j
 @Slf4j
 public class dataListener implements IDataListener {
 public class dataListener implements IDataListener {
+
+    @Autowired
+    protected IWeatherRealtimeDataService iws;
+
+
     @Override
     @Override
     public void receiveRealtimeData(RealTimeData realTimeData) {
     public void receiveRealtimeData(RealTimeData realTimeData) {
+
+        log.info("收到实时数据");
+        WeatherRealtimeData wrd = new WeatherRealtimeData();
+
+        WeatherRealtimeData wrdlast = new WeatherRealtimeData();
+
         StringBuilder sb = new StringBuilder();
         StringBuilder sb = new StringBuilder();
         sb.append("==== DeviceInfo ====\n");
         sb.append("==== DeviceInfo ====\n");
-        sb.append("deviceId = ").append(realTimeData.getDeviceId()).append("\n");
-        sb.append("lng = ").append(realTimeData.getLng()).append("\n");
-        sb.append("lat = ").append(realTimeData.getLat()).append("\n");
-        sb.append("coordinateType = ").append(realTimeData.getCoordinateType()).append("\n");
-        sb.append("relayStatus = ").append(realTimeData.getRelayStatus()).append("\n");
 
 
+        JSONObject json = new JSONObject();
+
+        // 添加设备基本信息
+        json.put("deviceId", realTimeData.getDeviceId());
+
+        wrd.setDeviceId(String.valueOf(realTimeData.getDeviceId()));
+        wrdlast.setDeviceId(String.valueOf(realTimeData.getDeviceId()));
+
+        if (iws == null){
+            log.info("iws 为空");
+        }
+
+        wrdlast = iws.selectWeatherRealtimeDataLast(wrdlast);
+
+
+        json.put("lng", realTimeData.getLng());
+        json.put("lat", realTimeData.getLat());
+        json.put("coordinateType", realTimeData.getCoordinateType());
+        json.put("relayStatus", realTimeData.getRelayStatus());
+
+
+
+        // 处理节点列表
         if (realTimeData.getNodeList() != null && !realTimeData.getNodeList().isEmpty()) {
         if (realTimeData.getNodeList() != null && !realTimeData.getNodeList().isEmpty()) {
+            JSONArray nodeArray = new JSONArray();
             for (int i = 0; i < realTimeData.getNodeList().size(); i++) {
             for (int i = 0; i < realTimeData.getNodeList().size(); i++) {
                 NodeData node = realTimeData.getNodeList().get(i);
                 NodeData node = realTimeData.getNodeList().get(i);
-                sb.append("---- NodeData [").append(i).append("] ----\n");
-                sb.append("nodeId = ").append(node.getNodeId()).append("\n");
-                sb.append("tem = ").append(node.getTem()).append("\n");
-                sb.append("hum = ").append(node.getHum()).append("\n");
-                sb.append("recordTime = ").append(node.getRecordTime()).append("\n");
-                sb.append("coordinateType = ").append(node.getCoordinateType()).append("\n");
-                sb.append("lng = ").append(node.getLng()).append("\n");
-                sb.append("lat = ").append(node.getLat()).append("\n");
+                JSONObject nodeJson = new JSONObject();
+
+                nodeJson.put("nodeId", node.getNodeId());
+                nodeJson.put("tem", node.getTem());
+                nodeJson.put("hum", node.getHum());
+                nodeJson.put("recordTime", node.getRecordTime());
+                nodeJson.put("coordinateType", node.getCoordinateType());
+                nodeJson.put("lng", node.getLng());
+                nodeJson.put("lat", node.getLat());
+
+                nodeArray.add(nodeJson);
+
+
+                switch (node.getNodeId()){
+                    case 1:
+                        wrd.setWindSpeed(BigDecimal.valueOf(node.getHum()));
+                        break;
+                    case 2:
+                        wrd.setWindDirection(String.valueOf((int)Math.round(node.getHum()*10)));
+                        break;
+                    case 3:
+                        wrd.setSoilTemperature(BigDecimal.valueOf(node.getTem()));
+                        wrd.setSoilHumidity(BigDecimal.valueOf(node.getHum()));
+                        break;
+                    case 11:
+                        wrd.setTemperature(BigDecimal.valueOf(node.getHum()));
+                        wrd.setHumidity(BigDecimal.valueOf(node.getHum()));
+                        break;
+                    case 14:
+                        wrd.setAirPressure(BigDecimal.valueOf(node.getHum()*10));
+                        break;
+                    case 15:
+                        wrd.setLightIntensity(BigDecimal.valueOf(node.getTem()));
+                        break;
+                    case 20:
+                        BigDecimal rainnow = BigDecimal.valueOf(node.getTem()*2);
+                        if (wrdlast != null){
+                            BigDecimal lastrain = wrdlast.getRainfallA();
+                            if (rainnow.compareTo(lastrain) >=0) {
+                                BigDecimal raincharge = rainnow.subtract(lastrain);
+                                wrd.setRainfall(raincharge);
+                                wrd.setRainfallA(rainnow);
+                            }else{
+                                wrd.setRainfall(lastrain);
+                                wrd.setRainfallA(rainnow);
+                            }
+                        }else{
+                            wrd.setRainfall(rainnow);
+                            wrd.setRainfallA(rainnow);
+                        }
+
+                        break;
+                    case 28:
+                        wrd.setSoilN(BigDecimal.valueOf(node.getTem()*10));
+                        wrd.setSoilP(BigDecimal.valueOf(node.getTem()*10));
+
+                        break;
+                    case 29:
+                        wrd.setSoilK(BigDecimal.valueOf(node.getTem()*10));
+
+                        break;
+                }
             }
             }
-        } else {
-            sb.append("nodeList is empty or null\n");
+            json.put("nodeList", nodeArray);
         }
         }
-
+        sb.append(json.toJSONString()).append("\n");
         sb.append("====================");
         sb.append("====================");
-
         log.info(sb.toString());
         log.info(sb.toString());
+        wrd.setCollectTime(new Date());
+        wrd.setCreateBy("qxsb");
+        log.info("realData:{}", wrd.toString());
+        iws.insertWeatherRealtimeData(wrd);
     }
     }
 
 
     @Override
     @Override
     public void receiveLoginData(LoginData loginData) {
     public void receiveLoginData(LoginData loginData) {
-        log.info("loginData:{}", loginData);
+        log.info("loginData:{}", loginData.getDeviceId());
     }
     }
 
 
     @Override
     @Override

+ 10 - 1
ruoyi-modules/ruoyi-qxsb/src/main/java/com/ruoyi/hhzx/qxsb/rk/mapper/WeatherRealtimeDataMapper.java

@@ -9,7 +9,7 @@ import java.util.List;
  * 气象站实时数据Mapper接口
  * 气象站实时数据Mapper接口
  * 
  * 
  * @author ruoyi
  * @author ruoyi
- * @date 2025-06-12
+ * @date 2025-06-16
  */
  */
 public interface WeatherRealtimeDataMapper 
 public interface WeatherRealtimeDataMapper 
 {
 {
@@ -29,6 +29,15 @@ public interface WeatherRealtimeDataMapper
      */
      */
     public List<WeatherRealtimeData> selectWeatherRealtimeDataList(WeatherRealtimeData weatherRealtimeData);
     public List<WeatherRealtimeData> selectWeatherRealtimeDataList(WeatherRealtimeData weatherRealtimeData);
 
 
+    /**
+     * 查询气象站实时数据最后一条
+     *
+     * @param weatherRealtimeData 气象站实时数据
+     * @return 气象站实时数据集合
+     */
+    public WeatherRealtimeData selectWeatherRealtimeDataLast(WeatherRealtimeData weatherRealtimeData);
+
+
     /**
     /**
      * 新增气象站实时数据
      * 新增气象站实时数据
      * 
      * 

+ 10 - 1
ruoyi-modules/ruoyi-qxsb/src/main/java/com/ruoyi/hhzx/qxsb/rk/service/IWeatherRealtimeDataService.java

@@ -9,7 +9,7 @@ import java.util.List;
  * 气象站实时数据Service接口
  * 气象站实时数据Service接口
  * 
  * 
  * @author ruoyi
  * @author ruoyi
- * @date 2025-06-12
+ * @date 2025-06-16
  */
  */
 public interface IWeatherRealtimeDataService 
 public interface IWeatherRealtimeDataService 
 {
 {
@@ -29,6 +29,15 @@ public interface IWeatherRealtimeDataService
      */
      */
     public List<WeatherRealtimeData> selectWeatherRealtimeDataList(WeatherRealtimeData weatherRealtimeData);
     public List<WeatherRealtimeData> selectWeatherRealtimeDataList(WeatherRealtimeData weatherRealtimeData);
 
 
+    /**
+     * 查询气象站实时数据最后一条
+     *
+     * @param weatherRealtimeData 气象站实时数据
+     * @return 气象站实时数据集合
+     */
+    public WeatherRealtimeData selectWeatherRealtimeDataLast(WeatherRealtimeData weatherRealtimeData);
+
+
     /**
     /**
      * 新增气象站实时数据
      * 新增气象站实时数据
      * 
      * 

+ 15 - 1
ruoyi-modules/ruoyi-qxsb/src/main/java/com/ruoyi/hhzx/qxsb/rk/service/impl/WeatherRealtimeDataServiceImpl.java

@@ -13,7 +13,7 @@ import org.springframework.stereotype.Service;
  * 气象站实时数据Service业务层处理
  * 气象站实时数据Service业务层处理
  * 
  * 
  * @author ruoyi
  * @author ruoyi
- * @date 2025-06-12
+ * @date 2025-06-16
  */
  */
 @Service
 @Service
 public class WeatherRealtimeDataServiceImpl implements IWeatherRealtimeDataService
 public class WeatherRealtimeDataServiceImpl implements IWeatherRealtimeDataService
@@ -45,6 +45,20 @@ public class WeatherRealtimeDataServiceImpl implements IWeatherRealtimeDataServi
         return weatherRealtimeDataMapper.selectWeatherRealtimeDataList(weatherRealtimeData);
         return weatherRealtimeDataMapper.selectWeatherRealtimeDataList(weatherRealtimeData);
     }
     }
 
 
+    /**
+     * 查询气象站实时数据列表
+     *
+     * @param weatherRealtimeData 气象站实时数据
+     * @return 气象站实时数据
+     */
+    @Override
+    public WeatherRealtimeData selectWeatherRealtimeDataLast(WeatherRealtimeData weatherRealtimeData)
+    {
+        return weatherRealtimeDataMapper.selectWeatherRealtimeDataLast(weatherRealtimeData);
+    }
+
+
+
     /**
     /**
      * 新增气象站实时数据
      * 新增气象站实时数据
      * 
      * 

+ 13 - 1
ruoyi-modules/ruoyi-qxsb/src/main/resources/bootstrap.yml

@@ -33,4 +33,16 @@ com:
   hhzx:
   hhzx:
     qxsb:
     qxsb:
       rk:
       rk:
-        port: 24025
+        port: 24025
+
+#日志
+logging:
+  level:
+    root: info
+    com.ruoyi: info
+    org.mybatis: debug
+
+
+mybatis:
+  mapper-locations: classpath*:mapper/*.xml
+

+ 2 - 2
ruoyi-modules/ruoyi-qxsb/src/main/resources/logback.xml → ruoyi-modules/ruoyi-qxsb/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="60 seconds" debug="false">
 <configuration scan="true" scanPeriod="60 seconds" debug="false">
     <!-- 日志存放路径 -->
     <!-- 日志存放路径 -->
-	<property name="log.path" value="logs/ruoyi-qxsb" />
+	<property name="log.path" value="/vdb/logs/ruoyi-qxsb" />
    <!-- 日志输出格式 -->
    <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 
 
@@ -58,7 +58,7 @@
     </appender>
     </appender>
 
 
     <!-- 系统模块日志级别控制  -->
     <!-- 系统模块日志级别控制  -->
-	<logger name="com.ruoyi" level="info" />
+	<logger name="com.ruoyi" level="INFO" />
 	<!-- Spring日志级别控制  -->
 	<!-- Spring日志级别控制  -->
 	<logger name="org.springframework" level="warn" />
 	<logger name="org.springframework" level="warn" />
 
 

+ 58 - 5
ruoyi-modules/ruoyi-qxsb/src/main/resources/mapper/WeatherRealtimeDataMapper.xml

@@ -4,12 +4,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.hhzx.qxsb.rk.mapper.WeatherRealtimeDataMapper">
 <mapper namespace="com.ruoyi.hhzx.qxsb.rk.mapper.WeatherRealtimeDataMapper">
     
     
-    <resultMap type="WeatherRealtimeData" id="WeatherRealtimeDataResult">
+    <resultMap type="com.ruoyi.hhzx.qxsb.rk.domain.WeatherRealtimeData" id="WeatherRealtimeDataResult">
         <result property="id"    column="id"    />
         <result property="id"    column="id"    />
         <result property="deviceId"    column="device_id"    />
         <result property="deviceId"    column="device_id"    />
         <result property="temperature"    column="temperature"    />
         <result property="temperature"    column="temperature"    />
         <result property="humidity"    column="humidity"    />
         <result property="humidity"    column="humidity"    />
         <result property="rainfall"    column="rainfall"    />
         <result property="rainfall"    column="rainfall"    />
+        <result property="rainfallA"    column="rainfall_a"    />
         <result property="windDirection"    column="wind_direction"    />
         <result property="windDirection"    column="wind_direction"    />
         <result property="windSpeed"    column="wind_speed"    />
         <result property="windSpeed"    column="wind_speed"    />
         <result property="airPressure"    column="air_pressure"    />
         <result property="airPressure"    column="air_pressure"    />
@@ -19,24 +20,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateTime"    column="update_time"    />
         <result property="updateTime"    column="update_time"    />
         <result property="createBy"    column="create_by"    />
         <result property="createBy"    column="create_by"    />
         <result property="updateBy"    column="update_by"    />
         <result property="updateBy"    column="update_by"    />
+        <result property="soilTemperature"    column="soil_temperature"    />
+        <result property="soilHumidity"    column="soil_humidity"    />
+        <result property="soilN"    column="soil_n"    />
+        <result property="soilP"    column="soil_p"    />
+        <result property="soilK"    column="soil_k"    />
+
     </resultMap>
     </resultMap>
 
 
     <sql id="selectWeatherRealtimeDataVo">
     <sql id="selectWeatherRealtimeDataVo">
-        select id, device_id, temperature, humidity, rainfall, wind_direction, wind_speed, air_pressure, light_intensity, collect_time, create_time, update_time, create_by, update_by from weather_realtime_data
+        select id, device_id, temperature, humidity, rainfall, rainfall_a , wind_direction, wind_speed, air_pressure, light_intensity, collect_time, create_time, update_time, create_by, update_by, soil_temperature, soil_humidity, soil_n, soil_p, soil_k from weather_realtime_data
     </sql>
     </sql>
 
 
-    <select id="selectWeatherRealtimeDataList" parameterType="WeatherRealtimeData" resultMap="WeatherRealtimeDataResult">
+    <select id="selectWeatherRealtimeDataList" parameterType="com.ruoyi.hhzx.qxsb.rk.domain.WeatherRealtimeData" resultMap="WeatherRealtimeDataResult">
         <include refid="selectWeatherRealtimeDataVo"/>
         <include refid="selectWeatherRealtimeDataVo"/>
         <where>  
         <where>  
             <if test="deviceId != null  and deviceId != ''"> and device_id = #{deviceId}</if>
             <if test="deviceId != null  and deviceId != ''"> and device_id = #{deviceId}</if>
             <if test="temperature != null "> and temperature = #{temperature}</if>
             <if test="temperature != null "> and temperature = #{temperature}</if>
             <if test="humidity != null "> and humidity = #{humidity}</if>
             <if test="humidity != null "> and humidity = #{humidity}</if>
             <if test="rainfall != null "> and rainfall = #{rainfall}</if>
             <if test="rainfall != null "> and rainfall = #{rainfall}</if>
+            <if test="rainfallA != null "> and rainfall_a = #{rainfall}</if>
             <if test="windDirection != null  and windDirection != ''"> and wind_direction = #{windDirection}</if>
             <if test="windDirection != null  and windDirection != ''"> and wind_direction = #{windDirection}</if>
             <if test="windSpeed != null "> and wind_speed = #{windSpeed}</if>
             <if test="windSpeed != null "> and wind_speed = #{windSpeed}</if>
             <if test="airPressure != null "> and air_pressure = #{airPressure}</if>
             <if test="airPressure != null "> and air_pressure = #{airPressure}</if>
             <if test="lightIntensity != null "> and light_intensity = #{lightIntensity}</if>
             <if test="lightIntensity != null "> and light_intensity = #{lightIntensity}</if>
             <if test="collectTime != null "> and collect_time = #{collectTime}</if>
             <if test="collectTime != null "> and collect_time = #{collectTime}</if>
+            <if test="soilTemperature != null "> and soil_temperature = #{soilTemperature}</if>
+            <if test="soilHumidity != null "> and soil_humidity = #{soilHumidity}</if>
+            <if test="soilN != null "> and soil_n = #{soilN}</if>
+            <if test="soilP != null "> and soil_p = #{soilP}</if>
+            <if test="soilK != null "> and soil_k = #{soilK}</if>
         </where>
         </where>
     </select>
     </select>
     
     
@@ -45,13 +58,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
         where id = #{id}
     </select>
     </select>
 
 
-    <insert id="insertWeatherRealtimeData" parameterType="WeatherRealtimeData" useGeneratedKeys="true" keyProperty="id">
+    <select id="selectWeatherRealtimeDataLast" parameterType="Long" resultMap="WeatherRealtimeDataResult">
+        <include refid="selectWeatherRealtimeDataVo"/>
+        <where>
+            <if test="deviceId != null  and deviceId != ''"> and device_id = #{deviceId}</if>
+            <if test="temperature != null "> and temperature = #{temperature}</if>
+            <if test="humidity != null "> and humidity = #{humidity}</if>
+            <if test="rainfall != null "> and rainfall = #{rainfall}</if>
+            <if test="rainfallA != null "> and rainfall_a = #{rainfall}</if>
+            <if test="windDirection != null  and windDirection != ''"> and wind_direction = #{windDirection}</if>
+            <if test="windSpeed != null "> and wind_speed = #{windSpeed}</if>
+            <if test="airPressure != null "> and air_pressure = #{airPressure}</if>
+            <if test="lightIntensity != null "> and light_intensity = #{lightIntensity}</if>
+            <if test="collectTime != null "> and collect_time = #{collectTime}</if>
+            <if test="soilTemperature != null "> and soil_temperature = #{soilTemperature}</if>
+            <if test="soilHumidity != null "> and soil_humidity = #{soilHumidity}</if>
+            <if test="soilN != null "> and soil_n = #{soilN}</if>
+            <if test="soilP != null "> and soil_p = #{soilP}</if>
+            <if test="soilK != null "> and soil_k = #{soilK}</if>
+        </where>
+        order by collect_time desc LIMIT 1;
+    </select>
+
+    <insert id="insertWeatherRealtimeData" parameterType="com.ruoyi.hhzx.qxsb.rk.domain.WeatherRealtimeData" useGeneratedKeys="true" keyProperty="id">
         insert into weather_realtime_data
         insert into weather_realtime_data
         <trim prefix="(" suffix=")" suffixOverrides=",">
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="deviceId != null and deviceId != ''">device_id,</if>
             <if test="deviceId != null and deviceId != ''">device_id,</if>
             <if test="temperature != null">temperature,</if>
             <if test="temperature != null">temperature,</if>
             <if test="humidity != null">humidity,</if>
             <if test="humidity != null">humidity,</if>
             <if test="rainfall != null">rainfall,</if>
             <if test="rainfall != null">rainfall,</if>
+            <if test="rainfallA != null ">rainfall_a,</if>
             <if test="windDirection != null">wind_direction,</if>
             <if test="windDirection != null">wind_direction,</if>
             <if test="windSpeed != null">wind_speed,</if>
             <if test="windSpeed != null">wind_speed,</if>
             <if test="airPressure != null">air_pressure,</if>
             <if test="airPressure != null">air_pressure,</if>
@@ -61,12 +97,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">update_time,</if>
             <if test="updateTime != null">update_time,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="updateBy != null">update_by,</if>
             <if test="updateBy != null">update_by,</if>
+            <if test="soilTemperature != null">soil_temperature,</if>
+            <if test="soilHumidity != null">soil_humidity,</if>
+            <if test="soilN != null">soil_n,</if>
+            <if test="soilP != null">soil_p,</if>
+            <if test="soilK != null">soil_k,</if>
          </trim>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="deviceId != null and deviceId != ''">#{deviceId},</if>
             <if test="deviceId != null and deviceId != ''">#{deviceId},</if>
             <if test="temperature != null">#{temperature},</if>
             <if test="temperature != null">#{temperature},</if>
             <if test="humidity != null">#{humidity},</if>
             <if test="humidity != null">#{humidity},</if>
             <if test="rainfall != null">#{rainfall},</if>
             <if test="rainfall != null">#{rainfall},</if>
+            <if test="rainfallA != null">#{rainfallA},</if>
             <if test="windDirection != null">#{windDirection},</if>
             <if test="windDirection != null">#{windDirection},</if>
             <if test="windSpeed != null">#{windSpeed},</if>
             <if test="windSpeed != null">#{windSpeed},</if>
             <if test="airPressure != null">#{airPressure},</if>
             <if test="airPressure != null">#{airPressure},</if>
@@ -76,16 +118,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">#{updateTime},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="updateBy != null">#{updateBy},</if>
             <if test="updateBy != null">#{updateBy},</if>
+            <if test="soilTemperature != null">#{soilTemperature},</if>
+            <if test="soilHumidity != null">#{soilHumidity},</if>
+            <if test="soilN != null">#{soilN},</if>
+            <if test="soilP != null">#{soilP},</if>
+            <if test="soilK != null">#{soilK},</if>
          </trim>
          </trim>
     </insert>
     </insert>
 
 
-    <update id="updateWeatherRealtimeData" parameterType="WeatherRealtimeData">
+    <update id="updateWeatherRealtimeData" parameterType="com.ruoyi.hhzx.qxsb.rk.domain.WeatherRealtimeData">
         update weather_realtime_data
         update weather_realtime_data
         <trim prefix="SET" suffixOverrides=",">
         <trim prefix="SET" suffixOverrides=",">
             <if test="deviceId != null and deviceId != ''">device_id = #{deviceId},</if>
             <if test="deviceId != null and deviceId != ''">device_id = #{deviceId},</if>
             <if test="temperature != null">temperature = #{temperature},</if>
             <if test="temperature != null">temperature = #{temperature},</if>
             <if test="humidity != null">humidity = #{humidity},</if>
             <if test="humidity != null">humidity = #{humidity},</if>
             <if test="rainfall != null">rainfall = #{rainfall},</if>
             <if test="rainfall != null">rainfall = #{rainfall},</if>
+            <if test="rainfallA != null">rainfall_a = #{rainfall},</if>
             <if test="windDirection != null">wind_direction = #{windDirection},</if>
             <if test="windDirection != null">wind_direction = #{windDirection},</if>
             <if test="windSpeed != null">wind_speed = #{windSpeed},</if>
             <if test="windSpeed != null">wind_speed = #{windSpeed},</if>
             <if test="airPressure != null">air_pressure = #{airPressure},</if>
             <if test="airPressure != null">air_pressure = #{airPressure},</if>
@@ -95,6 +143,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
             <if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="soilTemperature != null">soil_temperature = #{soilTemperature},</if>
+            <if test="soilHumidity != null">soil_humidity = #{soilHumidity},</if>
+            <if test="soilN != null">soil_n = #{soilN},</if>
+            <if test="soilP != null">soil_p = #{soilP},</if>
+            <if test="soilK != null">soil_k = #{soilK},</if>
         </trim>
         </trim>
         where id = #{id}
         where id = #{id}
     </update>
     </update>