From cb02d710e3a984b2e66fe3b2648dad555d832880 Mon Sep 17 00:00:00 2001
From: zhubaomin <zhubaomin>
Date: 星期四, 26 六月 2025 09:44:23 +0800
Subject: [PATCH] Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV

---
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmWeatherLastMapper.java                                     |   27 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmManureLastMapper.java                                      |   43 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilLastMapper.xml                                                       |  222 +++
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java                              |    7 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkRtuDealCommandResponse.java             |    2 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java                                                     |    2 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java                       |    1 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStWeatherMapper.xml                                                      |    9 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDay.java                                              |    2 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilLast.java                                             |  145 ++
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmWeatherLastMapper.xml                                                    |  186 ++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmWeatherLast.java                                          |  119 +
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmWeatherHistoryMapper.xml                                                 |  162 ++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDayLast.java                                          |    2 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkRtuDealCommandResponseV2.java           |    2 
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/pSdV1/upVos/SoilVo.java                                 |    2 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilDayMapper.xml                                                        |  355 +++++
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml                                                              |    2 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmWeatherHistory.java                                       |  110 +
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmManureHistoryMapper.xml                                                  |  273 +++
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4WeatherSdV1.java              |   59 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmManureLast.java                                           |  149 ++
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkFindComResponse.java                    |    2 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealWeatherSdV1.java                     |  105 +
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindComResponseSdV1.java                 |   37 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmManureHistory.java                                        |  142 ++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilDayMapper.java                                         |   28 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStManureMapper.xml                                                       |    8 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilHistoryMapper.java                                     |   22 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java                                    |    3 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4ManureSdV1.java               |   59 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4SoilSdV1.java                 |   59 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoManure.java                                                 |  120 +
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/dbSv/DbSv.java                                   |  230 +++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureCtrl.java                      |   66 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilHistory.java                                          |  137 +
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealSoilSdV1.java                        |  133 +
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttSubMsg.java                                         |    4 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealCommandResponseSdV1.java             |   58 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilLastMapper.java                                        |   28 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStManureMapper.java                                        |    2 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureSv.java                        |   70 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilDay.java                                              |  257 +++
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttTopic.java                                          |    4 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStSoilMapper.xml                                                         |    9 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStSoilMapper.java                                          |    4 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmManureHistoryMapper.java                                   |   41 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilHistoryMapper.xml                                                    |  198 ++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStWeatherMapper.java                                       |    4 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkRtuDealCommandResponseV202404.java |    2 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmWeatherHistoryMapper.java                                  |   22 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml                                                     |   20 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureQo.java                        |   57 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindPSdV1.java                           |    6 
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttPubMsg.java                                         |    2 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealManureSdV1.java                      |  127 +
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmManureLastMapper.xml                                                     |  300 ++++
 57 files changed, 4,227 insertions(+), 20 deletions(-)

diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttPubMsg.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttPubMsg.java
index 2c1c6f1..89e4058 100644
--- a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttPubMsg.java
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttPubMsg.java
@@ -14,7 +14,7 @@
 
     public String cd ;//鍔熻兘鐮�
 
-    public String deviceId ;//璁惧ID
+    public String deviceId ;//璁惧ID(FBox搴忓垪鍙�)
 
     public String mqttResultSendWebUrl ;//Mqtt杩斿洖鍛戒护缁撴灉 鍙戝悜鐩殑鍦皐eb URL
 
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttSubMsg.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttSubMsg.java
index 7577e67..82e6c0d 100644
--- a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttSubMsg.java
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttSubMsg.java
@@ -14,8 +14,8 @@
     public String commandId ;//鍛戒护ID
     public String mqttResultSendWebUrl ;//Mtt杩斿洖鍛戒护缁撴灉 鍙戝悜鐩殑鍦皐eb URL
 
-    public String deviceId ;//璁惧ID
-    public String protocol;//鍗忚
+    public String deviceId ;//璁惧ID(FBox搴忓垪鍙�)
+    public String protocol;//鍗忚(鍚嶇О+鐗堟湰)
 
     public MqttTopic topic ;//娑堟伅涓婚
     public String metaData;//MQTT鎺ㄩ�佹潵鐨勫厓鏁版嵁
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttTopic.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttTopic.java
index 5bc518e..697991e 100644
--- a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttTopic.java
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/MqttTopic.java
@@ -14,8 +14,8 @@
 @AllArgsConstructor
 public class MqttTopic {
     public String orgTag ;//缁勭粐鏍囪瘑
-    public String protocol ;//鍗忚鍚嶇О
-    public String devId ;//璁惧锛團Box锛塈D
+    public String protocol ;//鍗忚鍚嶇О(鍚嶇О+鐗堟湰)
+    public String devId ;//璁惧ID(FBox搴忓垪鍙�)
     public String type;//鏁版嵁锛堝懡浠わ級绫诲瀷
     public Integer no;//娴嬬珯缂栧彿
 
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/pSdV1/upVos/SoilVo.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/pSdV1/upVos/SoilVo.java
index 7a01088..088dc27 100644
--- a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/pSdV1/upVos/SoilVo.java
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol4Mqtt/pSdV1/upVos/SoilVo.java
@@ -32,7 +32,7 @@
     @JSONField(name = "鍦熷¥婀垮害5")
     public Float soilHumidity5 ;
 
-    @JSONField(name = "鍦熷¥婀垮害1")
+    @JSONField(name = "鍦熷¥娓╁害1")
     public Float soilTemperature1 ;
 
     @JSONField(name = "鍦熷¥娓╁害2")
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStManureMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStManureMapper.java
index a36c38c..bb8d2eb 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStManureMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStManureMapper.java
@@ -6,6 +6,7 @@
 import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
 import com.dy.pipIrrGlobal.voPr.VoSoil;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -50,6 +51,7 @@
      */
     List<VoManure> selectSome(Map<?, ?> params);
 
+    List<PrStManure> selectStPoByFBoxIdAndNo(@Param("fbox_id")String fboxId, @Param("no")Integer no) ;
 
     int updateByPrimaryKeySelective(PrStManure record);
 
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStSoilMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStSoilMapper.java
index 9e3dfcf..f83acbe 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStSoilMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStSoilMapper.java
@@ -1,10 +1,12 @@
 package com.dy.pipIrrGlobal.daoPr;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dy.pipIrrGlobal.pojoPr.PrStManure;
 import com.dy.pipIrrGlobal.pojoPr.PrStSoil;
 import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
 import com.dy.pipIrrGlobal.voPr.VoSoil;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -49,6 +51,8 @@
      */
     List<VoSoil> selectSome(Map<?, ?> params);
 
+    List<PrStSoil> selectStPoByFBoxIdAndNo(@Param("fbox_id")String fboxId, @Param("no")Integer no) ;
+
     int updateByPrimaryKeySelective(PrStSoil record);
 
     int updateByPrimaryKey(PrStSoil record);
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStWeatherMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStWeatherMapper.java
index 385526c..46f8cda 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStWeatherMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStWeatherMapper.java
@@ -1,10 +1,12 @@
 package com.dy.pipIrrGlobal.daoPr;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dy.pipIrrGlobal.pojoPr.PrStSoil;
 import com.dy.pipIrrGlobal.pojoPr.PrStWeather;
 import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
 import com.dy.pipIrrGlobal.voPr.VoWeather;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -47,6 +49,8 @@
      */
     List<VoWeather> selectSome(Map<?, ?> params);
 
+    List<PrStWeather> selectStPoByFBoxIdAndNo(@Param("fbox_id")String fboxId, @Param("no")Integer no) ;
+
     List<VoMqttSimple> selectAllSimple() ;
 
     int updateByPrimaryKeySelective(PrStWeather record);
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmManureHistoryMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmManureHistoryMapper.java
new file mode 100644
index 0000000..c4f3aa0
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmManureHistoryMapper.java
@@ -0,0 +1,41 @@
+package com.dy.pipIrrGlobal.daoRm;
+
+import com.dy.pipIrrGlobal.pojoRm.RmManureHistory;
+import com.dy.pipIrrGlobal.voRm.VoManure;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:03
+ * @Description
+ */
+public interface RmManureHistoryMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(RmManureHistory record);
+
+    int insertSelective(RmManureHistory record);
+
+    RmManureHistory selectByPrimaryKey(Long id);
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鏌ヨ璁板綍鏁伴噺
+     * @param params
+     * @return
+     */
+    Long selectCount(Map<?, ?> params);
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鏌ヨ璁板綍
+     * @param params
+     * @return
+     */
+    List<VoManure> selectSome(Map<?, ?> params);
+
+
+    int updateByPrimaryKeySelective(RmManureHistory record);
+
+    int updateByPrimaryKey(RmManureHistory record);
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmManureLastMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmManureLastMapper.java
new file mode 100644
index 0000000..7bfba0f
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmManureLastMapper.java
@@ -0,0 +1,43 @@
+package com.dy.pipIrrGlobal.daoRm;
+
+import com.dy.pipIrrGlobal.pojoRm.RmManureLast;
+import com.dy.pipIrrGlobal.voRm.VoManure;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:03
+ * @Description
+ */
+public interface RmManureLastMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(RmManureLast record);
+
+    int insertSelective(RmManureLast record);
+
+    RmManureLast selectByPrimaryKey(Long id);
+
+    List<RmManureLast> selectRmManureLast(@Param("stManureId") Long stManureId) ;
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鏌ヨ璁板綍鏁伴噺
+     * @param params
+     * @return
+     */
+    Long selectCount(Map<?, ?> params);
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鏌ヨ璁板綍
+     * @param params
+     * @return
+     */
+    List<VoManure> selectSome(Map<?, ?> params);
+
+    int updateByPrimaryKeySelective(RmManureLast record);
+
+    int updateByPrimaryKey(RmManureLast record);
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilDayMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilDayMapper.java
new file mode 100644
index 0000000..5211723
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilDayMapper.java
@@ -0,0 +1,28 @@
+package com.dy.pipIrrGlobal.daoRm;
+
+import com.dy.pipIrrGlobal.pojoRm.RmSoilDay;
+import com.dy.pipIrrGlobal.pojoRm.RmSoilLast;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:04
+ * @Description
+ */
+public interface RmSoilDayMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(RmSoilDay record);
+
+    int insertSelective(RmSoilDay record);
+
+    RmSoilDay selectByPrimaryKey(Long id);
+
+    List<RmSoilDay> selectRmSoilDay(@Param("stSoilId") Long stSoilId, @Param("ymd") Integer ymd) ;
+
+    int updateByPrimaryKeySelective(RmSoilDay record);
+
+    int updateByPrimaryKey(RmSoilDay record);
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilHistoryMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilHistoryMapper.java
new file mode 100644
index 0000000..c976c7b
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilHistoryMapper.java
@@ -0,0 +1,22 @@
+package com.dy.pipIrrGlobal.daoRm;
+
+import com.dy.pipIrrGlobal.pojoRm.RmSoilHistory;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:04
+ * @Description
+ */
+public interface RmSoilHistoryMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(RmSoilHistory record);
+
+    int insertSelective(RmSoilHistory record);
+
+    RmSoilHistory selectByPrimaryKey(Long id);
+
+    int updateByPrimaryKeySelective(RmSoilHistory record);
+
+    int updateByPrimaryKey(RmSoilHistory record);
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilLastMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilLastMapper.java
new file mode 100644
index 0000000..a81e20a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmSoilLastMapper.java
@@ -0,0 +1,28 @@
+package com.dy.pipIrrGlobal.daoRm;
+
+import com.dy.pipIrrGlobal.pojoRm.RmManureLast;
+import com.dy.pipIrrGlobal.pojoRm.RmSoilLast;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:04
+ * @Description
+ */
+public interface RmSoilLastMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(RmSoilLast record);
+
+    int insertSelective(RmSoilLast record);
+
+    RmSoilLast selectByPrimaryKey(Long id);
+
+    List<RmSoilLast> selectRmSoilLast(@Param("stSoilId") Long stSoilId) ;
+
+    int updateByPrimaryKeySelective(RmSoilLast record);
+
+    int updateByPrimaryKey(RmSoilLast record);
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmWeatherHistoryMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmWeatherHistoryMapper.java
new file mode 100644
index 0000000..5c0c8e9
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmWeatherHistoryMapper.java
@@ -0,0 +1,22 @@
+package com.dy.pipIrrGlobal.daoRm;
+
+import com.dy.pipIrrGlobal.pojoRm.RmWeatherHistory;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:39
+ * @Description
+ */
+public interface RmWeatherHistoryMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(RmWeatherHistory record);
+
+    int insertSelective(RmWeatherHistory record);
+
+    RmWeatherHistory selectByPrimaryKey(Long id);
+
+    int updateByPrimaryKeySelective(RmWeatherHistory record);
+
+    int updateByPrimaryKey(RmWeatherHistory record);
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmWeatherLastMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmWeatherLastMapper.java
new file mode 100644
index 0000000..60618b3
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmWeatherLastMapper.java
@@ -0,0 +1,27 @@
+package com.dy.pipIrrGlobal.daoRm;
+
+import com.dy.pipIrrGlobal.pojoRm.RmWeatherLast;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:39
+ * @Description
+ */
+public interface RmWeatherLastMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(RmWeatherLast record);
+
+    int insertSelective(RmWeatherLast record);
+
+    RmWeatherLast selectByPrimaryKey(Long id);
+
+    List<RmWeatherLast> selectRmWeatherLast(@Param("stWeatherId") Long stWeatherId) ;
+
+    int updateByPrimaryKeySelective(RmWeatherLast record);
+
+    int updateByPrimaryKey(RmWeatherLast record);
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDay.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDay.java
index 5181be6..457735a 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDay.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDay.java
@@ -22,7 +22,7 @@
  * @LastEditTime 2024/2/28 15:31
  * @Description 鎺у埗鍣ㄦ棩婕忔崯姘撮噺鍘嗗彶鏁版嵁
  */
-@TableName(value="rm_loss_history_history", autoResultMap = true)
+@TableName(value="rm_loss_history", autoResultMap = true)
 @Data
 @Builder
 @ToString
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDayLast.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDayLast.java
index 4cd2166..2dea69b 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDayLast.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmLossDayLast.java
@@ -22,7 +22,7 @@
  * @LastEditTime 2024/2/28 15:31
  * @Description 鎺у埗鍣ㄦ棩婕忔崯姘撮噺鏈�鏂版暟鎹�
  */
-@TableName(value="rm_loss_last_history", autoResultMap = true)
+@TableName(value="rm_loss_last", autoResultMap = true)
 @Data
 @Builder
 @ToString
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmManureHistory.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmManureHistory.java
new file mode 100644
index 0000000..3a5daef
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmManureHistory.java
@@ -0,0 +1,142 @@
+package com.dy.pipIrrGlobal.pojoRm;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.ManureVo;
+import com.dy.common.po.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:03
+ * @Description
+ */
+@TableName(value="rm_manure_history", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "姘磋偉鏈哄巻鍙叉暟鎹�")
+public class RmManureHistory  implements BaseEntity {
+
+    public static final long serialVersionUID = 202506251021001L;
+    /**
+     * 涓婚敭
+     */
+    @Schema(description = "涓婚敭", requiredMode = Schema.RequiredMode.REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    public Long id;
+
+    /**
+     * 姘磋偉鏈哄疄浣撳閿甶d
+     */
+    @Schema(description = "姘磋偉鏈哄疄浣撳閿甶d", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long manureId;
+
+    /**
+     * 鏁版嵁涓婃姤鏃堕棿锛堝勾鏈堟棩鏃跺垎绉掞級
+     */
+    @Schema(description = "鏁版嵁鎺ユ敹鏃ユ湡鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date dt;
+
+    /**
+     * 鎼呮媽1杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鎼呮媽1杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning1;
+
+    /**
+     * 鎼呮媽2杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鎼呮媽2杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning2;
+
+    /**
+     * 鎼呮媽3杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鎼呮媽3杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning3;
+
+    /**
+     * 鎼呮媽4杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鎼呮媽4杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning4;
+
+    /**
+     * 娉ㄨ偉杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "娉ㄨ偉杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte injectRunning;
+
+    /**
+     * 鐏屾簤杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鐏屾簤杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte irrRunning;
+
+    /**
+     * 鎶ヨ锛�1:娉ㄨ偉娉垫湁鏁呴殰锛�0:娉ㄨ偉娉垫病鏈夋晠闅滐級
+     */
+    @Schema(description = "鎶ヨ锛�1:娉ㄨ偉娉垫湁鏁呴殰锛�0:娉ㄨ偉娉垫病鏈夋晠闅滐級", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte alarm;
+
+    /**
+     * 鑲ユ枡娴侀噺锛堝崌锛�
+     */
+    @Schema(description = "鑲ユ枡娴侀噺锛堝崌锛�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double manureFlow;
+
+    /**
+     * 娉ㄨ偉缁忚繃鏃堕棿(绉�)
+     */
+    @Schema(description = "娉ㄨ偉缁忚繃鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer manureTime;
+
+    /**
+     * 鎼呮媽缁忚繃鏃堕棿(绉掞級
+     */
+    @Schema(description = "鎼呮媽缁忚繃鏃堕棿(绉掞級", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer stirTime;
+
+    /**
+     * 鎼呮媽璁惧畾鏃堕棿(绉�)
+     */
+    @Schema(description = "鎼呮媽璁惧畾鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer stirDuration;
+
+    /**
+     * 娉ㄨ偉璁惧畾鏃堕棿(绉�)
+     */
+    @Schema(description = "娉ㄨ偉璁惧畾鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer injectDuration;
+
+    public void valueFrom(MqttSubMsg msg, ManureVo cdData) throws Exception{
+        this.dt = new Date();
+        this.stirRunning1 = cdData.stirRunning1 ;
+        this.stirRunning2 = cdData.stirRunning2 ;
+        this.stirRunning3 = cdData.stirRunning3 ;
+        this.stirRunning4 = cdData.stirRunning4 ;
+        this.injectRunning = cdData.injectRunning ;
+        this.irrRunning = cdData.irrRunning ;
+        this.alarm = cdData.alarm ;
+        this.manureFlow = cdData.manureFlow==null?null:(0.0D + cdData.manureFlow) ;
+        this.manureTime = cdData.manureTime ;
+        this.stirTime = cdData.stirTime ;
+        this.stirDuration = cdData.stirDuration ;
+        this.injectDuration = cdData.injectDuration ;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmManureLast.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmManureLast.java
new file mode 100644
index 0000000..02ef15e
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmManureLast.java
@@ -0,0 +1,149 @@
+package com.dy.pipIrrGlobal.pojoRm;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.ManureVo;
+import com.dy.common.po.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:03
+ * @Description
+ */
+@TableName(value="rm_manure_last", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "姘磋偉鏈烘渶鏂版暟鎹�")
+public class RmManureLast implements BaseEntity {
+
+    public static final long serialVersionUID = 202506251021002L;
+    /**
+    * 涓婚敭
+    */
+    @Schema(description = "涓婚敭", requiredMode = Schema.RequiredMode.REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    public Long id;
+
+    /**
+    * 鍘嗗彶鏁版嵁琛ㄤ腑鏈�鏂拌褰曠殑澶栭敭id
+    */
+    @Schema(hidden=true)
+    @JSONField(serialize = false)
+    public Long lastHistoryId;
+
+    /**
+    * 姘磋偉鏈哄疄浣撳閿甶d
+    */
+    @Schema(description = "姘磋偉鏈哄疄浣撳閿甶d", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long manureId;
+
+    /**
+    * 鏁版嵁涓婃姤鏃堕棿锛堝勾鏈堟棩鏃跺垎绉掞級
+    */
+    @Schema(description = "鏁版嵁鎺ユ敹鏃ユ湡鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date dt;
+
+    /**
+    * 鎼呮媽1杩愯鐘舵��(1杩愯锛�0鍋滄)
+    */
+    @Schema(description = "鎼呮媽1杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning1;
+
+    /**
+    * 鎼呮媽2杩愯鐘舵��(1杩愯锛�0鍋滄)
+    */
+    @Schema(description = "鎼呮媽2杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning2;
+
+    /**
+    * 鎼呮媽3杩愯鐘舵��(1杩愯锛�0鍋滄)
+    */
+    @Schema(description = "鎼呮媽3杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning3;
+
+    /**
+    * 鎼呮媽4杩愯鐘舵��(1杩愯锛�0鍋滄)
+    */
+    @Schema(description = "鎼呮媽4杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning4;
+
+    /**
+    * 娉ㄨ偉杩愯鐘舵��(1杩愯锛�0鍋滄)
+    */
+    @Schema(description = "娉ㄨ偉杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte injectRunning;
+
+    /**
+    * 鐏屾簤杩愯鐘舵��(1杩愯锛�0鍋滄)
+    */
+    @Schema(description = "鐏屾簤杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte irrRunning;
+
+    /**
+    * 鎶ヨ锛�1:娉ㄨ偉娉垫湁鏁呴殰锛�0:娉ㄨ偉娉垫病鏈夋晠闅滐級
+    */
+    @Schema(description = "鎶ヨ锛�1:娉ㄨ偉娉垫湁鏁呴殰锛�0:娉ㄨ偉娉垫病鏈夋晠闅滐級", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte alarm;
+
+    /**
+    * 鑲ユ枡娴侀噺锛堝崌锛�
+    */
+    @Schema(description = "鑲ユ枡娴侀噺锛堝崌锛�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double manureFlow;
+
+    /**
+    * 娉ㄨ偉缁忚繃鏃堕棿(绉�)
+    */
+    @Schema(description = "娉ㄨ偉缁忚繃鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer manureTime;
+
+    /**
+    * 鎼呮媽缁忚繃鏃堕棿(绉掞級
+    */
+    @Schema(description = "鎼呮媽缁忚繃鏃堕棿(绉掞級", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer stirTime;
+
+    /**
+    * 鎼呮媽璁惧畾鏃堕棿(绉�)
+    */
+    @Schema(description = "鎼呮媽璁惧畾鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer stirDuration;
+
+    /**
+    * 娉ㄨ偉璁惧畾鏃堕棿(绉�)
+    */
+    @Schema(description = "娉ㄨ偉璁惧畾鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer injectDuration;
+
+    public void valueFrom(MqttSubMsg msg, ManureVo cdData) throws Exception{
+        this.dt = new Date();
+        this.stirRunning1 = cdData.stirRunning1 ;
+        this.stirRunning2 = cdData.stirRunning2 ;
+        this.stirRunning3 = cdData.stirRunning3 ;
+        this.stirRunning4 = cdData.stirRunning4 ;
+        this.injectRunning = cdData.injectRunning ;
+        this.irrRunning = cdData.irrRunning ;
+        this.alarm = cdData.alarm ;
+        this.manureFlow = cdData.manureFlow==null?null:(0.0D + cdData.manureFlow) ;
+        this.manureTime = cdData.manureTime ;
+        this.stirTime = cdData.stirTime ;
+        this.stirDuration = cdData.stirDuration ;
+        this.injectDuration = cdData.injectDuration ;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilDay.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilDay.java
new file mode 100644
index 0000000..2ab8f5a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilDay.java
@@ -0,0 +1,257 @@
+package com.dy.pipIrrGlobal.pojoRm;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.SoilVo;
+import com.dy.common.po.BaseEntity;
+import com.dy.common.util.DateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:04
+ * @Description
+ */
+@TableName(value="rm_soil_day", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "澧掓儏鏃ュ钩鍧囨暟鎹�")
+public class RmSoilDay implements BaseEntity {
+
+    public static final long serialVersionUID = 202506251022003L;
+    /**
+    * 涓婚敭
+    */
+    @Schema(description = "涓婚敭", requiredMode = Schema.RequiredMode.REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    public Long id;
+
+    /**
+    * 澧掓儏绔欏疄浣撳閿甶d
+    */
+    @Schema(description = "澧掓儏绔欏疄浣撳閿甶d", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long soilId;
+
+    /**
+    * 鏁版嵁鏃ユ湡锛堝勾鏈堟棩锛�
+    */
+    @Schema(description = "鏁版嵁鏃ユ湡", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    public Date dt;
+    /**
+     * 鏁版嵁鏃ユ湡锛堝勾鏈堟棩锛�
+     */
+    @Schema(hidden=true)
+    @JSONField(serialize = false)
+    public Integer ymd ;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ箍搴�1
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ箍搴�1", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity1;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ箍搴�2
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ箍搴�2", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity2;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ箍搴�3
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ箍搴�3", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity3;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ箍搴�4
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ箍搴�4", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity4;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ箍搴�5
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ箍搴�5", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity5;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ俯搴�1
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ俯搴�1", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature1;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ俯搴�2
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ俯搴�2", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature2;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ俯搴�3
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ俯搴�3", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature3;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ俯搴�4
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ俯搴�4", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature4;
+
+    /**
+    * 鏃ュ钩鍧囧湡澹ゆ俯搴�5
+    */
+    @Schema(description = "鏃ュ钩鍧囧湡澹ゆ俯搴�5", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature5;
+
+    /**
+    * 鏃ユ暟鎹鏁�
+    */
+    @Schema(description = "鏃ユ暟鎹鏁�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer times;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ箍搴�1
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ箍搴�1", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumHumidity1;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ箍搴�2
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ箍搴�2", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumHumidity2;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ箍搴�3
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ箍搴�3", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumHumidity3;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ箍搴�4
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ箍搴�4", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumHumidity4;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ箍搴�5
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ箍搴�5", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumHumidity5;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ俯搴�1
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ俯搴�1", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumTemperature1;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ俯搴�2
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ俯搴�2", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumTemperature2;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ俯搴�3
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ俯搴�3", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumTemperature3;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ俯搴�4
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ俯搴�4", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumTemperature4;
+
+    /**
+    * 鏃ョ疮璁″湡澹ゆ俯搴�5
+    */
+    @Schema(description = "鏃ョ疮璁″湡澹ゆ俯搴�5", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilSumTemperature5;
+
+    public void valueFrom(MqttSubMsg msg, SoilVo cdData) throws Exception{
+        this.dt = new Date();
+        this.ymd = Integer.parseInt(DateTime.yyyyMMdd()) ;
+        this.soilSumHumidity1 = cdData.soilHumidity1==null?0.0D:(0.0D + cdData.soilHumidity1) ;
+        this.soilSumHumidity2 = cdData.soilHumidity2==null?0.0D:(0.0D + cdData.soilHumidity2) ;
+        this.soilSumHumidity3 = cdData.soilHumidity3==null?0.0D:(0.0D + cdData.soilHumidity3) ;
+        this.soilSumHumidity4 = cdData.soilHumidity4==null?0.0D:(0.0D + cdData.soilHumidity4) ;
+        this.soilSumHumidity5 = cdData.soilHumidity5==null?0.0D:(0.0D + cdData.soilHumidity5) ;
+        this.soilSumTemperature1 = cdData.soilTemperature1==null?0.0D:(0.0D + cdData.soilTemperature1) ;
+        this.soilSumTemperature2 = cdData.soilTemperature2==null?0.0D:(0.0D + cdData.soilTemperature2) ;
+        this.soilSumTemperature3 = cdData.soilTemperature3==null?0.0D:(0.0D + cdData.soilTemperature3) ;
+        this.soilSumTemperature4 = cdData.soilTemperature4==null?0.0D:(0.0D + cdData.soilTemperature4) ;
+        this.soilSumTemperature5 = cdData.soilTemperature5==null?0.0D:(0.0D + cdData.soilTemperature5) ;
+        this.times = 1 ;
+        this.soilHumidity1 = this.soilSumHumidity1 ;
+        this.soilHumidity2 = this.soilSumHumidity2 ;
+        this.soilHumidity3 = this.soilSumHumidity3 ;
+        this.soilHumidity4 = this.soilSumHumidity4 ;
+        this.soilHumidity5 = this.soilSumHumidity5 ;
+        this.soilTemperature1 = this.soilSumTemperature1 ;
+        this.soilTemperature2 = this.soilSumTemperature2 ;
+        this.soilTemperature3 = this.soilSumTemperature3 ;
+        this.soilTemperature4 = this.soilSumTemperature4 ;
+        this.soilTemperature5 = this.soilSumTemperature5 ;
+    }
+
+    public void updateFrom(MqttSubMsg msg, SoilVo cdData) throws Exception{
+        this.soilSumHumidity1 += cdData.soilHumidity1==null?0.0D:(0.0D + cdData.soilHumidity1) ;
+        this.soilSumHumidity2 += cdData.soilHumidity2==null?0.0D:(0.0D + cdData.soilHumidity2) ;
+        this.soilSumHumidity3 += cdData.soilHumidity3==null?0.0D:(0.0D + cdData.soilHumidity3) ;
+        this.soilSumHumidity4 += cdData.soilHumidity4==null?0.0D:(0.0D + cdData.soilHumidity4) ;
+        this.soilSumHumidity5 += cdData.soilHumidity5==null?0.0D:(0.0D + cdData.soilHumidity5) ;
+        this.soilSumTemperature1 += cdData.soilTemperature1==null?0.0D:(0.0D + cdData.soilTemperature1) ;
+        this.soilSumTemperature2 += cdData.soilTemperature2==null?0.0D:(0.0D + cdData.soilTemperature2) ;
+        this.soilSumTemperature3 += cdData.soilTemperature3==null?0.0D:(0.0D + cdData.soilTemperature3) ;
+        this.soilSumTemperature4 += cdData.soilTemperature4==null?0.0D:(0.0D + cdData.soilTemperature4) ;
+        this.soilSumTemperature5 += cdData.soilTemperature5==null?0.0D:(0.0D + cdData.soilTemperature5) ;
+        this.times = this.times + 1 ;
+        this.soilHumidity1 = this.soilSumHumidity1 / this.times ;
+        this.soilHumidity2 = this.soilSumHumidity2 / this.times ;
+        this.soilHumidity3 = this.soilSumHumidity3 / this.times ;
+        this.soilHumidity4 = this.soilSumHumidity4 / this.times ;
+        this.soilHumidity5 = this.soilSumHumidity5 / this.times ;
+        this.soilTemperature1 = this.soilSumTemperature1 / this.times ;
+        this.soilTemperature2 = this.soilSumTemperature2 / this.times ;
+        this.soilTemperature3 = this.soilSumTemperature3 / this.times ;
+        this.soilTemperature4 = this.soilSumTemperature4 / this.times ;
+        this.soilTemperature5 = this.soilSumTemperature5 / this.times ;
+    }
+
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilHistory.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilHistory.java
new file mode 100644
index 0000000..4b8bb2e
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilHistory.java
@@ -0,0 +1,137 @@
+package com.dy.pipIrrGlobal.pojoRm;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.SoilVo;
+import com.dy.common.po.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:04
+ * @Description
+ */
+@TableName(value="rm_soil_history", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "澧掓儏鏈�鏂版暟鎹�")
+public class RmSoilHistory implements BaseEntity {
+
+    public static final long serialVersionUID = 202506251022002L;
+    /**
+    * 涓婚敭
+    */
+    @Schema(description = "涓婚敭", requiredMode = Schema.RequiredMode.REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    public Long id;
+
+    /**
+    * 澧掓儏绔欏疄浣撳閿甶d
+    */
+    @Schema(description = "澧掓儏绔欏疄浣撳閿甶d", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long soilId;
+
+    /**
+    * 鏁版嵁涓婃姤鏃堕棿锛堝勾鏈堟棩鏃跺垎绉掞級
+    */
+    @Schema(description = "鏁版嵁鎺ユ敹鏃ユ湡鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date dt;
+
+    /**
+     * 鍦熷¥婀垮害1
+     */
+    @Schema(description = "鍦熷¥婀垮害1", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity1;
+
+    /**
+     * 鍦熷¥婀垮害2
+     */
+    @Schema(description = "鍦熷¥婀垮害2", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity2;
+
+    /**
+     * 鍦熷¥婀垮害3
+     */
+    @Schema(description = "鍦熷¥婀垮害3", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity3;
+
+    /**
+     * 鍦熷¥婀垮害4
+     */
+    @Schema(description = "鍦熷¥婀垮害4", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity4;
+
+    /**
+     * 鍦熷¥婀垮害5
+     */
+    @Schema(description = "鍦熷¥婀垮害5", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity5;
+
+    /**
+     * 鍦熷¥娓╁害1
+     */
+    @Schema(description = "鍦熷¥娓╁害1", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature1;
+
+    /**
+     * 鍦熷¥娓╁害2
+     */
+    @Schema(description = "鍦熷¥娓╁害2", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature2;
+
+    /**
+     * 鍦熷¥娓╁害3
+     */
+    @Schema(description = "鍦熷¥娓╁害3", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature3;
+
+    /**
+     * 鍦熷¥娓╁害4
+     */
+    @Schema(description = "鍦熷¥娓╁害4", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature4;
+
+    /**
+     * 鍦熷¥娓╁害5
+     */
+    @Schema(description = "鍦熷¥娓╁害5", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature5;
+
+    public void valueFrom(MqttSubMsg msg, SoilVo cdData) throws Exception{
+        this.dt = new Date();
+        this.soilHumidity1 = cdData.soilHumidity1==null?null:(0.0D + cdData.soilHumidity1) ;
+        this.soilHumidity2 = cdData.soilHumidity2==null?null:(0.0D + cdData.soilHumidity2) ;
+        this.soilHumidity3 = cdData.soilHumidity3==null?null:(0.0D + cdData.soilHumidity3) ;
+        this.soilHumidity4 = cdData.soilHumidity4==null?null:(0.0D + cdData.soilHumidity4) ;
+        this.soilHumidity5 = cdData.soilHumidity5==null?null:(0.0D + cdData.soilHumidity5) ;
+        this.soilTemperature1 = cdData.soilTemperature1==null?null:(0.0D + cdData.soilTemperature1) ;
+        this.soilTemperature2 = cdData.soilTemperature2==null?null:(0.0D + cdData.soilTemperature2) ;
+        this.soilTemperature3 = cdData.soilTemperature3==null?null:(0.0D + cdData.soilTemperature3) ;
+        this.soilTemperature4 = cdData.soilTemperature4==null?null:(0.0D + cdData.soilTemperature4) ;
+        this.soilTemperature5 = cdData.soilTemperature5==null?null:(0.0D + cdData.soilTemperature5) ;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilLast.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilLast.java
new file mode 100644
index 0000000..105d58e
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmSoilLast.java
@@ -0,0 +1,145 @@
+package com.dy.pipIrrGlobal.pojoRm;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.ManureVo;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.SoilVo;
+import com.dy.common.po.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:04
+ * @Description
+ */
+@TableName(value="rm_soil_last", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "澧掓儏鏈�鏂版暟鎹�")
+public class RmSoilLast implements BaseEntity {
+
+    public static final long serialVersionUID = 202506251022001L;
+    /**
+     * 涓婚敭
+     */
+    @Schema(description = "涓婚敭", requiredMode = Schema.RequiredMode.REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    public Long id;
+
+    /**
+     * 鍘嗗彶鏁版嵁琛ㄤ腑鏈�鏂拌褰曠殑澶栭敭id
+     */
+    @Schema(hidden=true)
+    @JSONField(serialize = false)
+    public Long lastHistoryId;
+
+    /**
+    * 澧掓儏绔欏疄浣撳閿甶d
+    */
+    @Schema(description = "澧掓儏绔欏疄浣撳閿甶d", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long soilId;
+
+    /**
+    * 鏁版嵁涓婃姤鏃堕棿锛堝勾鏈堟棩鏃跺垎绉掞級
+    */
+    @Schema(description = "鏁版嵁鎺ユ敹鏃ユ湡鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date dt;
+
+    /**
+    * 鍦熷¥婀垮害1
+    */
+    @Schema(description = "鍦熷¥婀垮害1", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity1;
+
+    /**
+    * 鍦熷¥婀垮害2
+    */
+    @Schema(description = "鍦熷¥婀垮害2", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity2;
+
+    /**
+    * 鍦熷¥婀垮害3
+    */
+    @Schema(description = "鍦熷¥婀垮害3", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity3;
+
+    /**
+    * 鍦熷¥婀垮害4
+    */
+    @Schema(description = "鍦熷¥婀垮害4", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity4;
+
+    /**
+    * 鍦熷¥婀垮害5
+    */
+    @Schema(description = "鍦熷¥婀垮害5", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilHumidity5;
+
+    /**
+    * 鍦熷¥娓╁害1
+    */
+    @Schema(description = "鍦熷¥娓╁害1", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature1;
+
+    /**
+    * 鍦熷¥娓╁害2
+    */
+    @Schema(description = "鍦熷¥娓╁害2", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature2;
+
+    /**
+    * 鍦熷¥娓╁害3
+    */
+    @Schema(description = "鍦熷¥娓╁害3", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature3;
+
+    /**
+    * 鍦熷¥娓╁害4
+    */
+    @Schema(description = "鍦熷¥娓╁害4", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature4;
+
+    /**
+    * 鍦熷¥娓╁害5
+    */
+    @Schema(description = "鍦熷¥娓╁害5", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double soilTemperature5;
+
+    public void valueFrom(MqttSubMsg msg, SoilVo cdData) throws Exception{
+        this.dt = new Date();
+        this.soilHumidity1 = cdData.soilHumidity1==null?null:(0.0D + cdData.soilHumidity1) ;
+        this.soilHumidity2 = cdData.soilHumidity2==null?null:(0.0D + cdData.soilHumidity2) ;
+        this.soilHumidity3 = cdData.soilHumidity3==null?null:(0.0D + cdData.soilHumidity3) ;
+        this.soilHumidity4 = cdData.soilHumidity4==null?null:(0.0D + cdData.soilHumidity4) ;
+        this.soilHumidity5 = cdData.soilHumidity5==null?null:(0.0D + cdData.soilHumidity5) ;
+        this.soilTemperature1 = cdData.soilTemperature1==null?null:(0.0D + cdData.soilTemperature1) ;
+        this.soilTemperature2 = cdData.soilTemperature2==null?null:(0.0D + cdData.soilTemperature2) ;
+        this.soilTemperature3 = cdData.soilTemperature3==null?null:(0.0D + cdData.soilTemperature3) ;
+        this.soilTemperature4 = cdData.soilTemperature4==null?null:(0.0D + cdData.soilTemperature4) ;
+        this.soilTemperature5 = cdData.soilTemperature5==null?null:(0.0D + cdData.soilTemperature5) ;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmWeatherHistory.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmWeatherHistory.java
new file mode 100644
index 0000000..982489d
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmWeatherHistory.java
@@ -0,0 +1,110 @@
+package com.dy.pipIrrGlobal.pojoRm;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.WeatherVo;
+import com.dy.common.po.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:39
+ * @Description
+ */
+@TableName(value="rm_weather_history", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "姘旇薄鍘嗗彶鏁版嵁")
+public class RmWeatherHistory implements BaseEntity {
+
+    public static final long serialVersionUID = 202506251035002L;
+    /**
+     * 涓婚敭
+     */
+    @Schema(description = "涓婚敭", requiredMode = Schema.RequiredMode.REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    public Long id;
+
+    /**
+     * 姘旇薄绔欏疄浣撳閿甶d
+     */
+    @Schema(description = "姘旇薄绔欏疄浣撳閿甶d", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long weatherId;
+
+    /**
+     * 鏁版嵁涓婃姤鏃堕棿锛堝勾鏈堟棩鏃跺垎绉掞級
+     */
+    @Schema(description = "鏁版嵁鎺ユ敹鏃ユ湡鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date dt;
+
+    /**
+     * 绌烘皵娓╁害
+     */
+    @Schema(description = "绌烘皵娓╁害", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double airTemperature;
+
+    /**
+     * 绌烘皵婀垮害
+     */
+    @Schema(description = "绌烘皵婀垮害", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double airHumidity;
+
+    /**
+     * 绱绾�
+     */
+    @Schema(description = "绱绾�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer ultraviolet;
+
+    /**
+     * 鍏夌収寮哄害
+     */
+    @Schema(description = "鍏夌収寮哄害", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer lightIntensity;
+
+    /**
+     * 闆ㄩ噺
+     */
+    @Schema(description = "闆ㄩ噺", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double rainfall;
+
+    /**
+     * 椋庨��
+     */
+    @Schema(description = "椋庨��", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double windSpeed;
+
+    /**
+     * 椋庡悜
+     */
+    @Schema(description = "椋庡悜", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer windDirection;
+
+    public void valueFrom(MqttSubMsg msg, WeatherVo cdData) throws Exception{
+        this.dt = new Date();
+        this.airTemperature = cdData.airTemperature==null?null:(0.0D + cdData.airTemperature) ;
+        this.airHumidity = cdData.airHumidity==null?null:(0.0D + cdData.airHumidity) ;
+        this.ultraviolet = cdData.ultraviolet ;
+        this.lightIntensity = cdData.lightIntensity ;
+        this.rainfall = cdData.rainfall==null?null:(0.0D + cdData.rainfall) ;
+        this.windSpeed = cdData.windSpeed==null?null:(0.0D + cdData.windSpeed) ;
+        this.windDirection = cdData.windDirection ;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmWeatherLast.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmWeatherLast.java
new file mode 100644
index 0000000..bbe7eed
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmWeatherLast.java
@@ -0,0 +1,119 @@
+package com.dy.pipIrrGlobal.pojoRm;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.SoilVo;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.WeatherVo;
+import com.dy.common.po.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 10:04
+ * @Description
+ */
+@TableName(value="rm_weather_last", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "姘旇薄鏈�鏂版暟鎹�")
+public class RmWeatherLast implements BaseEntity {
+
+    public static final long serialVersionUID = 202506251035001L;
+    /**
+     * 涓婚敭
+     */
+    @Schema(description = "涓婚敭", requiredMode = Schema.RequiredMode.REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    public Long id;
+
+    /**
+     * 鍘嗗彶鏁版嵁琛ㄤ腑鏈�鏂拌褰曠殑澶栭敭id
+     */
+    @Schema(hidden=true)
+    @JSONField(serialize = false)
+    public Long lastHistoryId;
+
+    /**
+     * 姘旇薄绔欏疄浣撳閿甶d
+     */
+    @Schema(description = "姘旇薄绔欏疄浣撳閿甶d", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long weatherId;
+
+    /**
+     * 鏁版嵁涓婃姤鏃堕棿锛堝勾鏈堟棩鏃跺垎绉掞級
+     */
+    @Schema(description = "鏁版嵁鎺ユ敹鏃ユ湡鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date dt;
+
+    /**
+     * 绌烘皵娓╁害
+     */
+    @Schema(description = "绌烘皵娓╁害", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double airTemperature;
+
+    /**
+     * 绌烘皵婀垮害
+     */
+    @Schema(description = "绌烘皵婀垮害", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double airHumidity;
+
+    /**
+     * 绱绾�
+     */
+    @Schema(description = "绱绾�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer ultraviolet;
+
+    /**
+     * 鍏夌収寮哄害
+     */
+    @Schema(description = "鍏夌収寮哄害", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer lightIntensity;
+
+    /**
+     * 闆ㄩ噺
+     */
+    @Schema(description = "闆ㄩ噺", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double rainfall;
+
+    /**
+     * 椋庨��
+     */
+    @Schema(description = "椋庨��", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double windSpeed;
+
+    /**
+     * 椋庡悜
+     */
+    @Schema(description = "椋庡悜", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer windDirection;
+
+
+    public void valueFrom(MqttSubMsg msg, WeatherVo cdData) throws Exception{
+        this.dt = new Date();
+        this.airTemperature = cdData.airTemperature==null?null:(0.0D + cdData.airTemperature) ;
+        this.airHumidity = cdData.airHumidity==null?null:(0.0D + cdData.airHumidity) ;
+        this.ultraviolet = cdData.ultraviolet ;
+        this.lightIntensity = cdData.lightIntensity ;
+        this.rainfall = cdData.rainfall==null?null:(0.0D + cdData.rainfall) ;
+        this.windSpeed = cdData.windSpeed==null?null:(0.0D + cdData.windSpeed) ;
+        this.windDirection = cdData.windDirection ;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoManure.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoManure.java
new file mode 100644
index 0000000..ceaac69
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoManure.java
@@ -0,0 +1,120 @@
+package com.dy.pipIrrGlobal.voRm;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 16:34
+ * @Description
+ */
+@Data
+public class VoManure  {
+    public static final long serialVersionUID = 202506251634001L;
+
+    /**
+     * 璁板綍ID
+     */
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long id;
+
+    /**
+     * 姘磋偉鏈篒D
+     */
+    @Schema(description = "姘磋偉鏈篒D", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    public Long manureId;
+
+    /**
+     * 姘磋偉鏈哄悕绉�
+     */
+    @Schema(description = "姘磋偉鏈哄悕绉�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Long manureName;
+
+
+    /**
+     * 鏁版嵁涓婃姤鏃堕棿锛堝勾鏈堟棩鏃跺垎绉掞級
+     */
+    @Schema(description = "鏁版嵁鎺ユ敹鏃ユ湡鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date dt;
+
+    /**
+     * 鎼呮媽1杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鎼呮媽1杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning1;
+
+    /**
+     * 鎼呮媽2杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鎼呮媽2杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning2;
+
+    /**
+     * 鎼呮媽3杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鎼呮媽3杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning3;
+
+    /**
+     * 鎼呮媽4杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鎼呮媽4杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte stirRunning4;
+
+    /**
+     * 娉ㄨ偉杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "娉ㄨ偉杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte injectRunning;
+
+    /**
+     * 鐏屾簤杩愯鐘舵��(1杩愯锛�0鍋滄)
+     */
+    @Schema(description = "鐏屾簤杩愯鐘舵��(1杩愯锛�0鍋滄)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte irrRunning;
+
+    /**
+     * 鎶ヨ锛�1:娉ㄨ偉娉垫湁鏁呴殰锛�0:娉ㄨ偉娉垫病鏈夋晠闅滐級
+     */
+    @Schema(description = "鎶ヨ锛�1:娉ㄨ偉娉垫湁鏁呴殰锛�0:娉ㄨ偉娉垫病鏈夋晠闅滐級", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte alarm;
+
+    /**
+     * 鑲ユ枡娴侀噺锛堝崌锛�
+     */
+    @Schema(description = "鑲ユ枡娴侀噺锛堝崌锛�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern="0.00" )
+    public Double manureFlow;
+
+    /**
+     * 娉ㄨ偉缁忚繃鏃堕棿(绉�)
+     */
+    @Schema(description = "娉ㄨ偉缁忚繃鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer manureTime;
+
+    /**
+     * 鎼呮媽缁忚繃鏃堕棿(绉掞級
+     */
+    @Schema(description = "鎼呮媽缁忚繃鏃堕棿(绉掞級", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer stirTime;
+
+    /**
+     * 鎼呮媽璁惧畾鏃堕棿(绉�)
+     */
+    @Schema(description = "鎼呮媽璁惧畾鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer stirDuration;
+
+    /**
+     * 娉ㄨ偉璁惧畾鏃堕棿(绉�)
+     */
+    @Schema(description = "娉ㄨ偉璁惧畾鏃堕棿(绉�)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer injectDuration;
+
+}
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStManureMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStManureMapper.xml
index eed8ceb..210b2c3 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStManureMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStManureMapper.xml
@@ -88,6 +88,14 @@
     </trim>
   </select>
 
+  <!--鏍规嵁FBox搴忓垪鍙峰緱鍒板疄浣撳垪琛�-->
+  <select id="selectStPoByFBoxIdAndNo" resultMap="BaseResultMap">
+    select
+    <include refid="part_Column_List" />
+    FROM pr_st_manure
+    WHERE deleted = 0 AND fbox_id=#{fbox_id,jdbcType=VARCHAR} AND no=#{fbox_id,jdbcType=INTEGER}
+  </select>
+
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     <!--@mbg.generated-->
     delete from pr_st_manure
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStSoilMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStSoilMapper.xml
index f07307c..6d8fdd8 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStSoilMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStSoilMapper.xml
@@ -86,6 +86,15 @@
       </if>
     </trim>
   </select>
+
+  <!--鏍规嵁FBox搴忓垪鍙峰緱鍒板疄浣撳垪琛�-->
+  <select id="selectStPoByFBoxIdAndNo" resultMap="BaseResultMap">
+    select
+    <include refid="part_Column_List" />
+    FROM pr_st_soil
+    WHERE deleted = 0 AND fbox_id=#{fbox_id,jdbcType=VARCHAR} AND no=#{fbox_id,jdbcType=INTEGER}
+  </select>
+
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     <!--@mbg.generated-->
     delete from pr_st_soil
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStWeatherMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStWeatherMapper.xml
index 84f86e4..cbf0c66 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStWeatherMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStWeatherMapper.xml
@@ -80,6 +80,15 @@
       </if>
     </trim>
   </select>
+
+  <!--鏍规嵁FBox搴忓垪鍙峰緱鍒板疄浣撳垪琛�-->
+  <select id="selectStPoByFBoxIdAndNo" resultMap="BaseResultMap">
+    select
+    <include refid="part_Column_List" />
+    FROM pr_st_weather
+    WHERE deleted = 0 AND fbox_id=#{fbox_id,jdbcType=VARCHAR} AND no=#{fbox_id,jdbcType=INTEGER}
+  </select>
+
   <select id="selectAllSimple" resultType="com.dy.pipIrrGlobal.voPr.VoMqttSimple">
     <!--@mbg.generated-->
     select
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmManureHistoryMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmManureHistoryMapper.xml
new file mode 100644
index 0000000..20cc470
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmManureHistoryMapper.xml
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmManureHistoryMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmManureHistory">
+    <!--@mbg.generated-->
+    <!--@Table rm_manure_history-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="manure_id" jdbcType="BIGINT" property="manureId" />
+    <result column="dt" jdbcType="TIMESTAMP" property="dt" />
+    <result column="stir_running1" jdbcType="TINYINT" property="stirRunning1" />
+    <result column="stir_running2" jdbcType="TINYINT" property="stirRunning2" />
+    <result column="stir_running3" jdbcType="TINYINT" property="stirRunning3" />
+    <result column="stir_running4" jdbcType="TINYINT" property="stirRunning4" />
+    <result column="inject_running" jdbcType="TINYINT" property="injectRunning" />
+    <result column="irr_running" jdbcType="TINYINT" property="irrRunning" />
+    <result column="alarm" jdbcType="TINYINT" property="alarm" />
+    <result column="manure_flow" jdbcType="FLOAT" property="manureFlow" />
+    <result column="manure_time" jdbcType="INTEGER" property="manureTime" />
+    <result column="stir_time" jdbcType="INTEGER" property="stirTime" />
+    <result column="stir_duration" jdbcType="INTEGER" property="stirDuration" />
+    <result column="inject_duration" jdbcType="INTEGER" property="injectDuration" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, manure_id, dt, stir_running1, stir_running2, stir_running3, stir_running4, inject_running, 
+    irr_running, alarm, manure_flow, manure_time, stir_time, stir_duration, inject_duration
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from rm_manure_history
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <!--鏍规嵁鎸囧畾鏉′欢鏌ヨ鍘嗗彶璁板綍鏁伴噺-->
+  <select id="selectCount" resultType="java.lang.Long">
+    SELECT
+    COUNT(*) AS recordCount
+    FROM rm_manure_history htb
+    INNER JOIN pr_st_manure mtb ON mtb.id = htb.manure_id
+    <where>
+      <if test="manureId != null">
+        AND htb.manure_id = #{manureId}
+      </if>
+      <if test = "no != null">
+        AND mtb.no = #{no}
+      </if>
+      <if test = "name != null and name !=''">
+        AND mtb.name LIKE CONCAT('%',#{intakeNum},'%')
+      </if>
+      <if test = "timeStart != null and timeStop != null">
+        AND htb.dt BETWEEN #{timeStart} AND #{timeStop}
+      </if>
+    </where>
+  </select>
+
+  <!--鏍规嵁鎸囧畾鏉′欢鏌ヨ鍘嗗彶璁板綍-->
+  <select id="selectSome" resultType="com.dy.pipIrrGlobal.voRm.VoManure">
+    SELECT
+    <include refid="Base_Column_List" />,
+    mtb.`name` AS manureName
+    FROM rm_manure_history htb
+    INNER JOIN pr_st_manure mtb ON mtb.id = htb.manure_id
+    <where>
+      <if test="manureId != null">
+        AND htb.manure_id = #{manureId}
+      </if>
+      <if test = "no != null">
+        AND mtb.no = #{no}
+      </if>
+      <if test = "name != null and name !=''">
+        AND mtb.name LIKE CONCAT('%',#{intakeNum},'%')
+      </if>
+      <if test = "timeStart != null and timeStop != null">
+        AND htb.dt BETWEEN #{timeStart} AND #{timeStop}
+      </if>
+    </where>
+    ORDER BY htb.id DESC
+    <trim prefix="limit " >
+      <if test="start != null and count != null">
+        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
+      </if>
+    </trim>
+  </select>
+
+
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from rm_manure_history
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmManureHistory">
+    <!--@mbg.generated-->
+    insert into rm_manure_history (id, manure_id, dt, 
+      stir_running1, stir_running2, stir_running3, 
+      stir_running4, inject_running, irr_running, 
+      alarm, manure_flow, manure_time, 
+      stir_time, stir_duration, inject_duration
+      )
+    values (#{id,jdbcType=BIGINT}, #{manureId,jdbcType=BIGINT}, #{dt,jdbcType=TIMESTAMP}, 
+      #{stirRunning1,jdbcType=TINYINT}, #{stirRunning2,jdbcType=TINYINT}, #{stirRunning3,jdbcType=TINYINT}, 
+      #{stirRunning4,jdbcType=TINYINT}, #{injectRunning,jdbcType=TINYINT}, #{irrRunning,jdbcType=TINYINT}, 
+      #{alarm,jdbcType=TINYINT}, #{manureFlow,jdbcType=FLOAT}, #{manureTime,jdbcType=INTEGER}, 
+      #{stirTime,jdbcType=INTEGER}, #{stirDuration,jdbcType=INTEGER}, #{injectDuration,jdbcType=INTEGER}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmManureHistory">
+    <!--@mbg.generated-->
+    insert into rm_manure_history
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="manureId != null">
+        manure_id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="stirRunning1 != null">
+        stir_running1,
+      </if>
+      <if test="stirRunning2 != null">
+        stir_running2,
+      </if>
+      <if test="stirRunning3 != null">
+        stir_running3,
+      </if>
+      <if test="stirRunning4 != null">
+        stir_running4,
+      </if>
+      <if test="injectRunning != null">
+        inject_running,
+      </if>
+      <if test="irrRunning != null">
+        irr_running,
+      </if>
+      <if test="alarm != null">
+        alarm,
+      </if>
+      <if test="manureFlow != null">
+        manure_flow,
+      </if>
+      <if test="manureTime != null">
+        manure_time,
+      </if>
+      <if test="stirTime != null">
+        stir_time,
+      </if>
+      <if test="stirDuration != null">
+        stir_duration,
+      </if>
+      <if test="injectDuration != null">
+        inject_duration,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="manureId != null">
+        #{manureId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="stirRunning1 != null">
+        #{stirRunning1,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning2 != null">
+        #{stirRunning2,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning3 != null">
+        #{stirRunning3,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning4 != null">
+        #{stirRunning4,jdbcType=TINYINT},
+      </if>
+      <if test="injectRunning != null">
+        #{injectRunning,jdbcType=TINYINT},
+      </if>
+      <if test="irrRunning != null">
+        #{irrRunning,jdbcType=TINYINT},
+      </if>
+      <if test="alarm != null">
+        #{alarm,jdbcType=TINYINT},
+      </if>
+      <if test="manureFlow != null">
+        #{manureFlow,jdbcType=FLOAT},
+      </if>
+      <if test="manureTime != null">
+        #{manureTime,jdbcType=INTEGER},
+      </if>
+      <if test="stirTime != null">
+        #{stirTime,jdbcType=INTEGER},
+      </if>
+      <if test="stirDuration != null">
+        #{stirDuration,jdbcType=INTEGER},
+      </if>
+      <if test="injectDuration != null">
+        #{injectDuration,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmManureHistory">
+    <!--@mbg.generated-->
+    update rm_manure_history
+    <set>
+      <if test="manureId != null">
+        manure_id = #{manureId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="stirRunning1 != null">
+        stir_running1 = #{stirRunning1,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning2 != null">
+        stir_running2 = #{stirRunning2,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning3 != null">
+        stir_running3 = #{stirRunning3,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning4 != null">
+        stir_running4 = #{stirRunning4,jdbcType=TINYINT},
+      </if>
+      <if test="injectRunning != null">
+        inject_running = #{injectRunning,jdbcType=TINYINT},
+      </if>
+      <if test="irrRunning != null">
+        irr_running = #{irrRunning,jdbcType=TINYINT},
+      </if>
+      <if test="alarm != null">
+        alarm = #{alarm,jdbcType=TINYINT},
+      </if>
+      <if test="manureFlow != null">
+        manure_flow = #{manureFlow,jdbcType=FLOAT},
+      </if>
+      <if test="manureTime != null">
+        manure_time = #{manureTime,jdbcType=INTEGER},
+      </if>
+      <if test="stirTime != null">
+        stir_time = #{stirTime,jdbcType=INTEGER},
+      </if>
+      <if test="stirDuration != null">
+        stir_duration = #{stirDuration,jdbcType=INTEGER},
+      </if>
+      <if test="injectDuration != null">
+        inject_duration = #{injectDuration,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmManureHistory">
+    <!--@mbg.generated-->
+    update rm_manure_history
+    set manure_id = #{manureId,jdbcType=BIGINT},
+      dt = #{dt,jdbcType=TIMESTAMP},
+      stir_running1 = #{stirRunning1,jdbcType=TINYINT},
+      stir_running2 = #{stirRunning2,jdbcType=TINYINT},
+      stir_running3 = #{stirRunning3,jdbcType=TINYINT},
+      stir_running4 = #{stirRunning4,jdbcType=TINYINT},
+      inject_running = #{injectRunning,jdbcType=TINYINT},
+      irr_running = #{irrRunning,jdbcType=TINYINT},
+      alarm = #{alarm,jdbcType=TINYINT},
+      manure_flow = #{manureFlow,jdbcType=FLOAT},
+      manure_time = #{manureTime,jdbcType=INTEGER},
+      stir_time = #{stirTime,jdbcType=INTEGER},
+      stir_duration = #{stirDuration,jdbcType=INTEGER},
+      inject_duration = #{injectDuration,jdbcType=INTEGER}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmManureLastMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmManureLastMapper.xml
new file mode 100644
index 0000000..c1bbf6f
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmManureLastMapper.xml
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmManureLastMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmManureLast">
+    <!--@mbg.generated-->
+    <!--@Table rm_manure_last-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="last_history_id" jdbcType="BIGINT" property="lastHistoryId" />
+    <result column="manure_id" jdbcType="BIGINT" property="manureId" />
+    <result column="dt" jdbcType="TIMESTAMP" property="dt" />
+    <result column="stir_running1" jdbcType="TINYINT" property="stirRunning1" />
+    <result column="stir_running2" jdbcType="TINYINT" property="stirRunning2" />
+    <result column="stir_running3" jdbcType="TINYINT" property="stirRunning3" />
+    <result column="stir_running4" jdbcType="TINYINT" property="stirRunning4" />
+    <result column="inject_running" jdbcType="TINYINT" property="injectRunning" />
+    <result column="irr_running" jdbcType="TINYINT" property="irrRunning" />
+    <result column="alarm" jdbcType="TINYINT" property="alarm" />
+    <result column="manure_flow" jdbcType="FLOAT" property="manureFlow" />
+    <result column="manure_time" jdbcType="INTEGER" property="manureTime" />
+    <result column="stir_time" jdbcType="INTEGER" property="stirTime" />
+    <result column="stir_duration" jdbcType="INTEGER" property="stirDuration" />
+    <result column="inject_duration" jdbcType="INTEGER" property="injectDuration" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, last_history_id, manure_id, dt, stir_running1, stir_running2, stir_running3, 
+    stir_running4, inject_running, irr_running, alarm, manure_flow, manure_time, stir_time, 
+    stir_duration, inject_duration
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from rm_manure_last
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+
+  <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇璁板綍-->
+  <select id="selectRmManureLast" resultType="com.dy.pipIrrGlobal.pojoRm.RmManureLast">
+    select
+    <include refid="Base_Column_List" />
+    from rm_manure_last
+    <where>
+      <if test="stManureId != null and stManureId != ''">
+        and manure_id = #{stManureId}
+      </if>
+    </where>
+    limit 0,1
+  </select>
+
+
+  <!--鏍规嵁鎸囧畾鏉′欢鏌ヨ鍘嗗彶璁板綍鏁伴噺-->
+  <select id="selectCount" resultType="java.lang.Long">
+    SELECT
+    COUNT(*) AS recordCount
+    FROM rm_manure_last ltb
+    INNER JOIN pr_st_manure mtb ON mtb.id = ltb.manure_id
+    <where>
+      <if test="manureId != null">
+        AND ltb.manure_id = #{manureId}
+      </if>
+      <if test = "no != null">
+        AND mtb.no = #{no}
+      </if>
+      <if test = "name != null and name !=''">
+        AND mtb.name LIKE CONCAT('%',#{intakeNum},'%')
+      </if>
+      <if test = "timeStart != null and timeStop != null">
+        AND ltb.dt BETWEEN #{timeStart} AND #{timeStop}
+      </if>
+    </where>
+  </select>
+
+  <!--鏍规嵁鎸囧畾鏉′欢鏌ヨ鍘嗗彶璁板綍-->
+  <select id="selectSome" resultType="com.dy.pipIrrGlobal.voRm.VoManure">
+    SELECT
+    <include refid="Base_Column_List" />,
+    mtb.`name` AS manureName
+    FROM rm_manure_last ltb
+    INNER JOIN pr_st_manure mtb ON mtb.id = ltb.manure_id
+    <where>
+      <if test="manureId != null">
+        AND ltb.manure_id = #{manureId}
+      </if>
+      <if test = "no != null">
+        AND mtb.no = #{no}
+      </if>
+      <if test = "name != null and name !=''">
+        AND mtb.name LIKE CONCAT('%',#{intakeNum},'%')
+      </if>
+      <if test = "timeStart != null and timeStop != null">
+        AND ltb.dt BETWEEN #{timeStart} AND #{timeStop}
+      </if>
+    </where>
+    ORDER BY ltb.manure_id DESC
+    <trim prefix="limit " >
+      <if test="start != null and count != null">
+        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
+      </if>
+    </trim>
+  </select>
+
+
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from rm_manure_last
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmManureLast">
+    <!--@mbg.generated-->
+    insert into rm_manure_last (id, last_history_id, manure_id, 
+      dt, stir_running1, stir_running2, 
+      stir_running3, stir_running4, inject_running, 
+      irr_running, alarm, manure_flow, 
+      manure_time, stir_time, stir_duration, 
+      inject_duration)
+    values (#{id,jdbcType=BIGINT}, #{lastHistoryId,jdbcType=BIGINT}, #{manureId,jdbcType=BIGINT}, 
+      #{dt,jdbcType=TIMESTAMP}, #{stirRunning1,jdbcType=TINYINT}, #{stirRunning2,jdbcType=TINYINT}, 
+      #{stirRunning3,jdbcType=TINYINT}, #{stirRunning4,jdbcType=TINYINT}, #{injectRunning,jdbcType=TINYINT}, 
+      #{irrRunning,jdbcType=TINYINT}, #{alarm,jdbcType=TINYINT}, #{manureFlow,jdbcType=FLOAT}, 
+      #{manureTime,jdbcType=INTEGER}, #{stirTime,jdbcType=INTEGER}, #{stirDuration,jdbcType=INTEGER}, 
+      #{injectDuration,jdbcType=INTEGER})
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmManureLast">
+    <!--@mbg.generated-->
+    insert into rm_manure_last
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="lastHistoryId != null">
+        last_history_id,
+      </if>
+      <if test="manureId != null">
+        manure_id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="stirRunning1 != null">
+        stir_running1,
+      </if>
+      <if test="stirRunning2 != null">
+        stir_running2,
+      </if>
+      <if test="stirRunning3 != null">
+        stir_running3,
+      </if>
+      <if test="stirRunning4 != null">
+        stir_running4,
+      </if>
+      <if test="injectRunning != null">
+        inject_running,
+      </if>
+      <if test="irrRunning != null">
+        irr_running,
+      </if>
+      <if test="alarm != null">
+        alarm,
+      </if>
+      <if test="manureFlow != null">
+        manure_flow,
+      </if>
+      <if test="manureTime != null">
+        manure_time,
+      </if>
+      <if test="stirTime != null">
+        stir_time,
+      </if>
+      <if test="stirDuration != null">
+        stir_duration,
+      </if>
+      <if test="injectDuration != null">
+        inject_duration,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="lastHistoryId != null">
+        #{lastHistoryId,jdbcType=BIGINT},
+      </if>
+      <if test="manureId != null">
+        #{manureId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="stirRunning1 != null">
+        #{stirRunning1,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning2 != null">
+        #{stirRunning2,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning3 != null">
+        #{stirRunning3,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning4 != null">
+        #{stirRunning4,jdbcType=TINYINT},
+      </if>
+      <if test="injectRunning != null">
+        #{injectRunning,jdbcType=TINYINT},
+      </if>
+      <if test="irrRunning != null">
+        #{irrRunning,jdbcType=TINYINT},
+      </if>
+      <if test="alarm != null">
+        #{alarm,jdbcType=TINYINT},
+      </if>
+      <if test="manureFlow != null">
+        #{manureFlow,jdbcType=FLOAT},
+      </if>
+      <if test="manureTime != null">
+        #{manureTime,jdbcType=INTEGER},
+      </if>
+      <if test="stirTime != null">
+        #{stirTime,jdbcType=INTEGER},
+      </if>
+      <if test="stirDuration != null">
+        #{stirDuration,jdbcType=INTEGER},
+      </if>
+      <if test="injectDuration != null">
+        #{injectDuration,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmManureLast">
+    <!--@mbg.generated-->
+    update rm_manure_last
+    <set>
+      <if test="lastHistoryId != null">
+        last_history_id = #{lastHistoryId,jdbcType=BIGINT},
+      </if>
+      <if test="manureId != null">
+        manure_id = #{manureId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="stirRunning1 != null">
+        stir_running1 = #{stirRunning1,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning2 != null">
+        stir_running2 = #{stirRunning2,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning3 != null">
+        stir_running3 = #{stirRunning3,jdbcType=TINYINT},
+      </if>
+      <if test="stirRunning4 != null">
+        stir_running4 = #{stirRunning4,jdbcType=TINYINT},
+      </if>
+      <if test="injectRunning != null">
+        inject_running = #{injectRunning,jdbcType=TINYINT},
+      </if>
+      <if test="irrRunning != null">
+        irr_running = #{irrRunning,jdbcType=TINYINT},
+      </if>
+      <if test="alarm != null">
+        alarm = #{alarm,jdbcType=TINYINT},
+      </if>
+      <if test="manureFlow != null">
+        manure_flow = #{manureFlow,jdbcType=FLOAT},
+      </if>
+      <if test="manureTime != null">
+        manure_time = #{manureTime,jdbcType=INTEGER},
+      </if>
+      <if test="stirTime != null">
+        stir_time = #{stirTime,jdbcType=INTEGER},
+      </if>
+      <if test="stirDuration != null">
+        stir_duration = #{stirDuration,jdbcType=INTEGER},
+      </if>
+      <if test="injectDuration != null">
+        inject_duration = #{injectDuration,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmManureLast">
+    <!--@mbg.generated-->
+    update rm_manure_last
+    set last_history_id = #{lastHistoryId,jdbcType=BIGINT},
+      manure_id = #{manureId,jdbcType=BIGINT},
+      dt = #{dt,jdbcType=TIMESTAMP},
+      stir_running1 = #{stirRunning1,jdbcType=TINYINT},
+      stir_running2 = #{stirRunning2,jdbcType=TINYINT},
+      stir_running3 = #{stirRunning3,jdbcType=TINYINT},
+      stir_running4 = #{stirRunning4,jdbcType=TINYINT},
+      inject_running = #{injectRunning,jdbcType=TINYINT},
+      irr_running = #{irrRunning,jdbcType=TINYINT},
+      alarm = #{alarm,jdbcType=TINYINT},
+      manure_flow = #{manureFlow,jdbcType=FLOAT},
+      manure_time = #{manureTime,jdbcType=INTEGER},
+      stir_time = #{stirTime,jdbcType=INTEGER},
+      stir_duration = #{stirDuration,jdbcType=INTEGER},
+      inject_duration = #{injectDuration,jdbcType=INTEGER}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilDayMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilDayMapper.xml
new file mode 100644
index 0000000..89a332f
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilDayMapper.xml
@@ -0,0 +1,355 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmSoilDayMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmSoilDay">
+    <!--@mbg.generated-->
+    <!--@Table rm_soil_day-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="soil_id" jdbcType="BIGINT" property="soilId" />
+    <result column="dt" jdbcType="DATE" property="dt" />
+    <result column="ymd" jdbcType="INTEGER" property="ymd" />
+    <result column="soil_humidity1" jdbcType="FLOAT" property="soilHumidity1" />
+    <result column="soil_humidity2" jdbcType="FLOAT" property="soilHumidity2" />
+    <result column="soil_humidity3" jdbcType="FLOAT" property="soilHumidity3" />
+    <result column="soil_humidity4" jdbcType="FLOAT" property="soilHumidity4" />
+    <result column="soil_humidity5" jdbcType="FLOAT" property="soilHumidity5" />
+    <result column="soil_temperature1" jdbcType="FLOAT" property="soilTemperature1" />
+    <result column="soil_temperature2" jdbcType="FLOAT" property="soilTemperature2" />
+    <result column="soil_temperature3" jdbcType="FLOAT" property="soilTemperature3" />
+    <result column="soil_temperature4" jdbcType="FLOAT" property="soilTemperature4" />
+    <result column="soil_temperature5" jdbcType="FLOAT" property="soilTemperature5" />
+    <result column="times" jdbcType="INTEGER" property="times" />
+    <result column="soil_sum_humidity1" jdbcType="FLOAT" property="soilSumHumidity1" />
+    <result column="soil_sum_humidity2" jdbcType="FLOAT" property="soilSumHumidity2" />
+    <result column="soil_sum_humidity3" jdbcType="FLOAT" property="soilSumHumidity3" />
+    <result column="soil_sum_humidity4" jdbcType="FLOAT" property="soilSumHumidity4" />
+    <result column="soil_sum_humidity5" jdbcType="FLOAT" property="soilSumHumidity5" />
+    <result column="soil_sum_temperature1" jdbcType="FLOAT" property="soilSumTemperature1" />
+    <result column="soil_sum_temperature2" jdbcType="FLOAT" property="soilSumTemperature2" />
+    <result column="soil_sum_temperature3" jdbcType="FLOAT" property="soilSumTemperature3" />
+    <result column="soil_sum_temperature4" jdbcType="FLOAT" property="soilSumTemperature4" />
+    <result column="soil_sum_temperature5" jdbcType="FLOAT" property="soilSumTemperature5" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, soil_id, dt, ymd, soil_humidity1, soil_humidity2, soil_humidity3, soil_humidity4,
+    soil_humidity5, soil_temperature1, soil_temperature2, soil_temperature3, soil_temperature4, 
+    soil_temperature5, times, soil_sum_humidity1, soil_sum_humidity2, soil_sum_humidity3, 
+    soil_sum_humidity4, soil_sum_humidity5, soil_sum_temperature1, soil_sum_temperature2, 
+    soil_sum_temperature3, soil_sum_temperature4, soil_sum_temperature5
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from rm_soil_day
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+
+  <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇璁板綍-->
+  <select id="selectRmSoilDay" resultType="com.dy.pipIrrGlobal.pojoRm.RmSoilDay">
+    select
+    <include refid="Base_Column_List" />
+    from rm_soil_day
+    <where>
+      <if test="stSoilId != null and stSoilId != ''">
+        and soil_id = #{stSoilId}
+      </if>
+      <if test="ymd != null and ymd != ''">
+        and ymd = #{ymd}
+      </if>
+    </where>
+    limit 0,1
+  </select>
+
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from rm_soil_day
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilDay">
+    <!--@mbg.generated-->
+    insert into rm_soil_day (id, soil_id, dt, ymd, soil_humidity1,
+      soil_humidity2, soil_humidity3, soil_humidity4, 
+      soil_humidity5, soil_temperature1, soil_temperature2, 
+      soil_temperature3, soil_temperature4, soil_temperature5, 
+      times, soil_sum_humidity1, soil_sum_humidity2, 
+      soil_sum_humidity3, soil_sum_humidity4, soil_sum_humidity5, 
+      soil_sum_temperature1, soil_sum_temperature2, soil_sum_temperature3, 
+      soil_sum_temperature4, soil_sum_temperature5)
+    values (#{id,jdbcType=BIGINT}, #{soilId,jdbcType=BIGINT}, #{dt,jdbcType=DATE}, #{ymd,jdbcType=INTEGER}, #{soilHumidity1,jdbcType=FLOAT},
+      #{soilHumidity2,jdbcType=FLOAT}, #{soilHumidity3,jdbcType=FLOAT}, #{soilHumidity4,jdbcType=FLOAT}, 
+      #{soilHumidity5,jdbcType=FLOAT}, #{soilTemperature1,jdbcType=FLOAT}, #{soilTemperature2,jdbcType=FLOAT}, 
+      #{soilTemperature3,jdbcType=FLOAT}, #{soilTemperature4,jdbcType=FLOAT}, #{soilTemperature5,jdbcType=FLOAT}, 
+      #{times,jdbcType=INTEGER}, #{soilSumHumidity1,jdbcType=FLOAT}, #{soilSumHumidity2,jdbcType=FLOAT}, 
+      #{soilSumHumidity3,jdbcType=FLOAT}, #{soilSumHumidity4,jdbcType=FLOAT}, #{soilSumHumidity5,jdbcType=FLOAT}, 
+      #{soilSumTemperature1,jdbcType=FLOAT}, #{soilSumTemperature2,jdbcType=FLOAT}, #{soilSumTemperature3,jdbcType=FLOAT}, 
+      #{soilSumTemperature4,jdbcType=FLOAT}, #{soilSumTemperature5,jdbcType=FLOAT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilDay">
+    <!--@mbg.generated-->
+    insert into rm_soil_day
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="soilId != null">
+        soil_id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="ymd != null">
+        ymd,
+      </if>
+      <if test="soilHumidity1 != null">
+        soil_humidity1,
+      </if>
+      <if test="soilHumidity2 != null">
+        soil_humidity2,
+      </if>
+      <if test="soilHumidity3 != null">
+        soil_humidity3,
+      </if>
+      <if test="soilHumidity4 != null">
+        soil_humidity4,
+      </if>
+      <if test="soilHumidity5 != null">
+        soil_humidity5,
+      </if>
+      <if test="soilTemperature1 != null">
+        soil_temperature1,
+      </if>
+      <if test="soilTemperature2 != null">
+        soil_temperature2,
+      </if>
+      <if test="soilTemperature3 != null">
+        soil_temperature3,
+      </if>
+      <if test="soilTemperature4 != null">
+        soil_temperature4,
+      </if>
+      <if test="soilTemperature5 != null">
+        soil_temperature5,
+      </if>
+      <if test="times != null">
+        times,
+      </if>
+      <if test="soilSumHumidity1 != null">
+        soil_sum_humidity1,
+      </if>
+      <if test="soilSumHumidity2 != null">
+        soil_sum_humidity2,
+      </if>
+      <if test="soilSumHumidity3 != null">
+        soil_sum_humidity3,
+      </if>
+      <if test="soilSumHumidity4 != null">
+        soil_sum_humidity4,
+      </if>
+      <if test="soilSumHumidity5 != null">
+        soil_sum_humidity5,
+      </if>
+      <if test="soilSumTemperature1 != null">
+        soil_sum_temperature1,
+      </if>
+      <if test="soilSumTemperature2 != null">
+        soil_sum_temperature2,
+      </if>
+      <if test="soilSumTemperature3 != null">
+        soil_sum_temperature3,
+      </if>
+      <if test="soilSumTemperature4 != null">
+        soil_sum_temperature4,
+      </if>
+      <if test="soilSumTemperature5 != null">
+        soil_sum_temperature5,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="soilId != null">
+        #{soilId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=DATE},
+      </if>
+      <if test="ymd != null">
+        #{ymd,jdbcType=INTEGER},
+      </if>
+      <if test="soilHumidity1 != null">
+        #{soilHumidity1,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity2 != null">
+        #{soilHumidity2,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity3 != null">
+        #{soilHumidity3,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity4 != null">
+        #{soilHumidity4,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity5 != null">
+        #{soilHumidity5,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature1 != null">
+        #{soilTemperature1,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature2 != null">
+        #{soilTemperature2,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature3 != null">
+        #{soilTemperature3,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature4 != null">
+        #{soilTemperature4,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature5 != null">
+        #{soilTemperature5,jdbcType=FLOAT},
+      </if>
+      <if test="times != null">
+        #{times,jdbcType=INTEGER},
+      </if>
+      <if test="soilSumHumidity1 != null">
+        #{soilSumHumidity1,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumHumidity2 != null">
+        #{soilSumHumidity2,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumHumidity3 != null">
+        #{soilSumHumidity3,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumHumidity4 != null">
+        #{soilSumHumidity4,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumHumidity5 != null">
+        #{soilSumHumidity5,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature1 != null">
+        #{soilSumTemperature1,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature2 != null">
+        #{soilSumTemperature2,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature3 != null">
+        #{soilSumTemperature3,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature4 != null">
+        #{soilSumTemperature4,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature5 != null">
+        #{soilSumTemperature5,jdbcType=FLOAT},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilDay">
+    <!--@mbg.generated-->
+    update rm_soil_day
+    <set>
+      <if test="soilId != null">
+        soil_id = #{soilId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=DATE},
+      </if>
+      <if test="ymd != null">
+        ymd = #{ymd,jdbcType=INTEGER},
+      </if>
+      <if test="soilHumidity1 != null">
+        soil_humidity1 = #{soilHumidity1,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity2 != null">
+        soil_humidity2 = #{soilHumidity2,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity3 != null">
+        soil_humidity3 = #{soilHumidity3,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity4 != null">
+        soil_humidity4 = #{soilHumidity4,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity5 != null">
+        soil_humidity5 = #{soilHumidity5,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature1 != null">
+        soil_temperature1 = #{soilTemperature1,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature2 != null">
+        soil_temperature2 = #{soilTemperature2,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature3 != null">
+        soil_temperature3 = #{soilTemperature3,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature4 != null">
+        soil_temperature4 = #{soilTemperature4,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature5 != null">
+        soil_temperature5 = #{soilTemperature5,jdbcType=FLOAT},
+      </if>
+      <if test="times != null">
+        times = #{times,jdbcType=INTEGER},
+      </if>
+      <if test="soilSumHumidity1 != null">
+        soil_sum_humidity1 = #{soilSumHumidity1,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumHumidity2 != null">
+        soil_sum_humidity2 = #{soilSumHumidity2,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumHumidity3 != null">
+        soil_sum_humidity3 = #{soilSumHumidity3,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumHumidity4 != null">
+        soil_sum_humidity4 = #{soilSumHumidity4,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumHumidity5 != null">
+        soil_sum_humidity5 = #{soilSumHumidity5,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature1 != null">
+        soil_sum_temperature1 = #{soilSumTemperature1,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature2 != null">
+        soil_sum_temperature2 = #{soilSumTemperature2,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature3 != null">
+        soil_sum_temperature3 = #{soilSumTemperature3,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature4 != null">
+        soil_sum_temperature4 = #{soilSumTemperature4,jdbcType=FLOAT},
+      </if>
+      <if test="soilSumTemperature5 != null">
+        soil_sum_temperature5 = #{soilSumTemperature5,jdbcType=FLOAT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilDay">
+    <!--@mbg.generated-->
+    update rm_soil_day
+    set soil_id = #{soilId,jdbcType=BIGINT},
+      dt = #{dt,jdbcType=DATE},
+      ymd = #{ymd,jdbcType=INTEGER},
+      soil_humidity1 = #{soilHumidity1,jdbcType=FLOAT},
+      soil_humidity2 = #{soilHumidity2,jdbcType=FLOAT},
+      soil_humidity3 = #{soilHumidity3,jdbcType=FLOAT},
+      soil_humidity4 = #{soilHumidity4,jdbcType=FLOAT},
+      soil_humidity5 = #{soilHumidity5,jdbcType=FLOAT},
+      soil_temperature1 = #{soilTemperature1,jdbcType=FLOAT},
+      soil_temperature2 = #{soilTemperature2,jdbcType=FLOAT},
+      soil_temperature3 = #{soilTemperature3,jdbcType=FLOAT},
+      soil_temperature4 = #{soilTemperature4,jdbcType=FLOAT},
+      soil_temperature5 = #{soilTemperature5,jdbcType=FLOAT},
+      times = #{times,jdbcType=INTEGER},
+      soil_sum_humidity1 = #{soilSumHumidity1,jdbcType=FLOAT},
+      soil_sum_humidity2 = #{soilSumHumidity2,jdbcType=FLOAT},
+      soil_sum_humidity3 = #{soilSumHumidity3,jdbcType=FLOAT},
+      soil_sum_humidity4 = #{soilSumHumidity4,jdbcType=FLOAT},
+      soil_sum_humidity5 = #{soilSumHumidity5,jdbcType=FLOAT},
+      soil_sum_temperature1 = #{soilSumTemperature1,jdbcType=FLOAT},
+      soil_sum_temperature2 = #{soilSumTemperature2,jdbcType=FLOAT},
+      soil_sum_temperature3 = #{soilSumTemperature3,jdbcType=FLOAT},
+      soil_sum_temperature4 = #{soilSumTemperature4,jdbcType=FLOAT},
+      soil_sum_temperature5 = #{soilSumTemperature5,jdbcType=FLOAT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilHistoryMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilHistoryMapper.xml
new file mode 100644
index 0000000..4a66ef7
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilHistoryMapper.xml
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmSoilHistoryMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmSoilHistory">
+    <!--@mbg.generated-->
+    <!--@Table rm_soil_history-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="soil_id" jdbcType="BIGINT" property="soilId" />
+    <result column="dt" jdbcType="TIMESTAMP" property="dt" />
+    <result column="soil_humidity1" jdbcType="FLOAT" property="soilHumidity1" />
+    <result column="soil_humidity2" jdbcType="FLOAT" property="soilHumidity2" />
+    <result column="soil_humidity3" jdbcType="FLOAT" property="soilHumidity3" />
+    <result column="soil_humidity4" jdbcType="FLOAT" property="soilHumidity4" />
+    <result column="soil_humidity5" jdbcType="FLOAT" property="soilHumidity5" />
+    <result column="soil_temperature1" jdbcType="FLOAT" property="soilTemperature1" />
+    <result column="soil_temperature2" jdbcType="FLOAT" property="soilTemperature2" />
+    <result column="soil_temperature3" jdbcType="FLOAT" property="soilTemperature3" />
+    <result column="soil_temperature4" jdbcType="FLOAT" property="soilTemperature4" />
+    <result column="soil_temperature5" jdbcType="FLOAT" property="soilTemperature5" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, soil_id, dt, soil_humidity1, soil_humidity2, soil_humidity3, soil_humidity4, 
+    soil_humidity5, soil_temperature1, soil_temperature2, soil_temperature3, soil_temperature4, 
+    soil_temperature5
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from rm_soil_history
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from rm_soil_history
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilHistory">
+    <!--@mbg.generated-->
+    insert into rm_soil_history (id, soil_id, dt, 
+      soil_humidity1, soil_humidity2, soil_humidity3, 
+      soil_humidity4, soil_humidity5, soil_temperature1, 
+      soil_temperature2, soil_temperature3, soil_temperature4, 
+      soil_temperature5)
+    values (#{id,jdbcType=BIGINT}, #{soilId,jdbcType=BIGINT}, #{dt,jdbcType=TIMESTAMP}, 
+      #{soilHumidity1,jdbcType=FLOAT}, #{soilHumidity2,jdbcType=FLOAT}, #{soilHumidity3,jdbcType=FLOAT}, 
+      #{soilHumidity4,jdbcType=FLOAT}, #{soilHumidity5,jdbcType=FLOAT}, #{soilTemperature1,jdbcType=FLOAT}, 
+      #{soilTemperature2,jdbcType=FLOAT}, #{soilTemperature3,jdbcType=FLOAT}, #{soilTemperature4,jdbcType=FLOAT}, 
+      #{soilTemperature5,jdbcType=FLOAT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilHistory">
+    <!--@mbg.generated-->
+    insert into rm_soil_history
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="soilId != null">
+        soil_id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="soilHumidity1 != null">
+        soil_humidity1,
+      </if>
+      <if test="soilHumidity2 != null">
+        soil_humidity2,
+      </if>
+      <if test="soilHumidity3 != null">
+        soil_humidity3,
+      </if>
+      <if test="soilHumidity4 != null">
+        soil_humidity4,
+      </if>
+      <if test="soilHumidity5 != null">
+        soil_humidity5,
+      </if>
+      <if test="soilTemperature1 != null">
+        soil_temperature1,
+      </if>
+      <if test="soilTemperature2 != null">
+        soil_temperature2,
+      </if>
+      <if test="soilTemperature3 != null">
+        soil_temperature3,
+      </if>
+      <if test="soilTemperature4 != null">
+        soil_temperature4,
+      </if>
+      <if test="soilTemperature5 != null">
+        soil_temperature5,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="soilId != null">
+        #{soilId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="soilHumidity1 != null">
+        #{soilHumidity1,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity2 != null">
+        #{soilHumidity2,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity3 != null">
+        #{soilHumidity3,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity4 != null">
+        #{soilHumidity4,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity5 != null">
+        #{soilHumidity5,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature1 != null">
+        #{soilTemperature1,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature2 != null">
+        #{soilTemperature2,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature3 != null">
+        #{soilTemperature3,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature4 != null">
+        #{soilTemperature4,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature5 != null">
+        #{soilTemperature5,jdbcType=FLOAT},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilHistory">
+    <!--@mbg.generated-->
+    update rm_soil_history
+    <set>
+      <if test="soilId != null">
+        soil_id = #{soilId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="soilHumidity1 != null">
+        soil_humidity1 = #{soilHumidity1,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity2 != null">
+        soil_humidity2 = #{soilHumidity2,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity3 != null">
+        soil_humidity3 = #{soilHumidity3,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity4 != null">
+        soil_humidity4 = #{soilHumidity4,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity5 != null">
+        soil_humidity5 = #{soilHumidity5,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature1 != null">
+        soil_temperature1 = #{soilTemperature1,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature2 != null">
+        soil_temperature2 = #{soilTemperature2,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature3 != null">
+        soil_temperature3 = #{soilTemperature3,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature4 != null">
+        soil_temperature4 = #{soilTemperature4,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature5 != null">
+        soil_temperature5 = #{soilTemperature5,jdbcType=FLOAT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilHistory">
+    <!--@mbg.generated-->
+    update rm_soil_history
+    set soil_id = #{soilId,jdbcType=BIGINT},
+      dt = #{dt,jdbcType=TIMESTAMP},
+      soil_humidity1 = #{soilHumidity1,jdbcType=FLOAT},
+      soil_humidity2 = #{soilHumidity2,jdbcType=FLOAT},
+      soil_humidity3 = #{soilHumidity3,jdbcType=FLOAT},
+      soil_humidity4 = #{soilHumidity4,jdbcType=FLOAT},
+      soil_humidity5 = #{soilHumidity5,jdbcType=FLOAT},
+      soil_temperature1 = #{soilTemperature1,jdbcType=FLOAT},
+      soil_temperature2 = #{soilTemperature2,jdbcType=FLOAT},
+      soil_temperature3 = #{soilTemperature3,jdbcType=FLOAT},
+      soil_temperature4 = #{soilTemperature4,jdbcType=FLOAT},
+      soil_temperature5 = #{soilTemperature5,jdbcType=FLOAT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilLastMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilLastMapper.xml
new file mode 100644
index 0000000..2e10b41
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmSoilLastMapper.xml
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmSoilLastMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmSoilLast">
+    <!--@mbg.generated-->
+    <!--@Table rm_soil_last-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="last_history_id" jdbcType="BIGINT" property="lastHistoryId" />
+    <result column="soil_id" jdbcType="BIGINT" property="soilId" />
+    <result column="dt" jdbcType="TIMESTAMP" property="dt" />
+    <result column="soil_humidity1" jdbcType="FLOAT" property="soilHumidity1" />
+    <result column="soil_humidity2" jdbcType="FLOAT" property="soilHumidity2" />
+    <result column="soil_humidity3" jdbcType="FLOAT" property="soilHumidity3" />
+    <result column="soil_humidity4" jdbcType="FLOAT" property="soilHumidity4" />
+    <result column="soil_humidity5" jdbcType="FLOAT" property="soilHumidity5" />
+    <result column="soil_temperature1" jdbcType="FLOAT" property="soilTemperature1" />
+    <result column="soil_temperature2" jdbcType="FLOAT" property="soilTemperature2" />
+    <result column="soil_temperature3" jdbcType="FLOAT" property="soilTemperature3" />
+    <result column="soil_temperature4" jdbcType="FLOAT" property="soilTemperature4" />
+    <result column="soil_temperature5" jdbcType="FLOAT" property="soilTemperature5" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, last_history_id, soil_id, dt, soil_humidity1, soil_humidity2, soil_humidity3, 
+    soil_humidity4, soil_humidity5, soil_temperature1, soil_temperature2, soil_temperature3, 
+    soil_temperature4, soil_temperature5
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from rm_soil_last
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+
+  <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇璁板綍-->
+  <select id="selectRmSoilLast" resultType="com.dy.pipIrrGlobal.pojoRm.RmSoilLast">
+    select
+    <include refid="Base_Column_List" />
+    from rm_soil_last
+    <where>
+      <if test="stSoilId != null and stSoilId != ''">
+        and soil_id = #{stSoilId}
+      </if>
+    </where>
+    limit 0,1
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from rm_soil_last
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilLast">
+    <!--@mbg.generated-->
+    insert into rm_soil_last (id, last_history_id, soil_id, 
+      dt, soil_humidity1, soil_humidity2, 
+      soil_humidity3, soil_humidity4, soil_humidity5, 
+      soil_temperature1, soil_temperature2, soil_temperature3, 
+      soil_temperature4, soil_temperature5)
+    values (#{id,jdbcType=BIGINT}, #{lastHistoryId,jdbcType=BIGINT}, #{soilId,jdbcType=BIGINT}, 
+      #{dt,jdbcType=TIMESTAMP}, #{soilHumidity1,jdbcType=FLOAT}, #{soilHumidity2,jdbcType=FLOAT}, 
+      #{soilHumidity3,jdbcType=FLOAT}, #{soilHumidity4,jdbcType=FLOAT}, #{soilHumidity5,jdbcType=FLOAT}, 
+      #{soilTemperature1,jdbcType=FLOAT}, #{soilTemperature2,jdbcType=FLOAT}, #{soilTemperature3,jdbcType=FLOAT}, 
+      #{soilTemperature4,jdbcType=FLOAT}, #{soilTemperature5,jdbcType=FLOAT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilLast">
+    <!--@mbg.generated-->
+    insert into rm_soil_last
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="lastHistoryId != null">
+        last_history_id,
+      </if>
+      <if test="soilId != null">
+        soil_id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="soilHumidity1 != null">
+        soil_humidity1,
+      </if>
+      <if test="soilHumidity2 != null">
+        soil_humidity2,
+      </if>
+      <if test="soilHumidity3 != null">
+        soil_humidity3,
+      </if>
+      <if test="soilHumidity4 != null">
+        soil_humidity4,
+      </if>
+      <if test="soilHumidity5 != null">
+        soil_humidity5,
+      </if>
+      <if test="soilTemperature1 != null">
+        soil_temperature1,
+      </if>
+      <if test="soilTemperature2 != null">
+        soil_temperature2,
+      </if>
+      <if test="soilTemperature3 != null">
+        soil_temperature3,
+      </if>
+      <if test="soilTemperature4 != null">
+        soil_temperature4,
+      </if>
+      <if test="soilTemperature5 != null">
+        soil_temperature5,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="lastHistoryId != null">
+        #{lastHistoryId,jdbcType=BIGINT},
+      </if>
+      <if test="soilId != null">
+        #{soilId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="soilHumidity1 != null">
+        #{soilHumidity1,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity2 != null">
+        #{soilHumidity2,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity3 != null">
+        #{soilHumidity3,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity4 != null">
+        #{soilHumidity4,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity5 != null">
+        #{soilHumidity5,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature1 != null">
+        #{soilTemperature1,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature2 != null">
+        #{soilTemperature2,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature3 != null">
+        #{soilTemperature3,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature4 != null">
+        #{soilTemperature4,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature5 != null">
+        #{soilTemperature5,jdbcType=FLOAT},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilLast">
+    <!--@mbg.generated-->
+    update rm_soil_last
+    <set>
+      <if test="lastHistoryId != null">
+        last_history_id = #{lastHistoryId,jdbcType=BIGINT},
+      </if>
+      <if test="soilId != null">
+        soil_id = #{soilId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="soilHumidity1 != null">
+        soil_humidity1 = #{soilHumidity1,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity2 != null">
+        soil_humidity2 = #{soilHumidity2,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity3 != null">
+        soil_humidity3 = #{soilHumidity3,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity4 != null">
+        soil_humidity4 = #{soilHumidity4,jdbcType=FLOAT},
+      </if>
+      <if test="soilHumidity5 != null">
+        soil_humidity5 = #{soilHumidity5,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature1 != null">
+        soil_temperature1 = #{soilTemperature1,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature2 != null">
+        soil_temperature2 = #{soilTemperature2,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature3 != null">
+        soil_temperature3 = #{soilTemperature3,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature4 != null">
+        soil_temperature4 = #{soilTemperature4,jdbcType=FLOAT},
+      </if>
+      <if test="soilTemperature5 != null">
+        soil_temperature5 = #{soilTemperature5,jdbcType=FLOAT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmSoilLast">
+    <!--@mbg.generated-->
+    update rm_soil_last
+    set last_history_id = #{lastHistoryId,jdbcType=BIGINT},
+      soil_id = #{soilId,jdbcType=BIGINT},
+      dt = #{dt,jdbcType=TIMESTAMP},
+      soil_humidity1 = #{soilHumidity1,jdbcType=FLOAT},
+      soil_humidity2 = #{soilHumidity2,jdbcType=FLOAT},
+      soil_humidity3 = #{soilHumidity3,jdbcType=FLOAT},
+      soil_humidity4 = #{soilHumidity4,jdbcType=FLOAT},
+      soil_humidity5 = #{soilHumidity5,jdbcType=FLOAT},
+      soil_temperature1 = #{soilTemperature1,jdbcType=FLOAT},
+      soil_temperature2 = #{soilTemperature2,jdbcType=FLOAT},
+      soil_temperature3 = #{soilTemperature3,jdbcType=FLOAT},
+      soil_temperature4 = #{soilTemperature4,jdbcType=FLOAT},
+      soil_temperature5 = #{soilTemperature5,jdbcType=FLOAT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmWeatherHistoryMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmWeatherHistoryMapper.xml
new file mode 100644
index 0000000..c241300
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmWeatherHistoryMapper.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmWeatherHistoryMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmWeatherHistory">
+    <!--@mbg.generated-->
+    <!--@Table rm_weather_history-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="weather_id" jdbcType="BIGINT" property="weatherId" />
+    <result column="dt" jdbcType="TIMESTAMP" property="dt" />
+    <result column="air_temperature" jdbcType="FLOAT" property="airTemperature" />
+    <result column="air_humidity" jdbcType="FLOAT" property="airHumidity" />
+    <result column="ultraviolet" jdbcType="INTEGER" property="ultraviolet" />
+    <result column="light_intensity" jdbcType="INTEGER" property="lightIntensity" />
+    <result column="rainfall" jdbcType="FLOAT" property="rainfall" />
+    <result column="wind_speed" jdbcType="FLOAT" property="windSpeed" />
+    <result column="wind_direction" jdbcType="INTEGER" property="windDirection" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, weather_id, dt, air_temperature, air_humidity, ultraviolet, light_intensity, 
+    rainfall, wind_speed, wind_direction
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from rm_weather_history
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from rm_weather_history
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmWeatherHistory">
+    <!--@mbg.generated-->
+    insert into rm_weather_history (id, weather_id, dt, 
+      air_temperature, air_humidity, ultraviolet, 
+      light_intensity, rainfall, wind_speed, 
+      wind_direction)
+    values (#{id,jdbcType=BIGINT}, #{weatherId,jdbcType=BIGINT}, #{dt,jdbcType=TIMESTAMP}, 
+      #{airTemperature,jdbcType=FLOAT}, #{airHumidity,jdbcType=FLOAT}, #{ultraviolet,jdbcType=INTEGER}, 
+      #{lightIntensity,jdbcType=INTEGER}, #{rainfall,jdbcType=FLOAT}, #{windSpeed,jdbcType=FLOAT}, 
+      #{windDirection,jdbcType=INTEGER})
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmWeatherHistory">
+    <!--@mbg.generated-->
+    insert into rm_weather_history
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="weatherId != null">
+        weather_id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="airTemperature != null">
+        air_temperature,
+      </if>
+      <if test="airHumidity != null">
+        air_humidity,
+      </if>
+      <if test="ultraviolet != null">
+        ultraviolet,
+      </if>
+      <if test="lightIntensity != null">
+        light_intensity,
+      </if>
+      <if test="rainfall != null">
+        rainfall,
+      </if>
+      <if test="windSpeed != null">
+        wind_speed,
+      </if>
+      <if test="windDirection != null">
+        wind_direction,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="weatherId != null">
+        #{weatherId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="airTemperature != null">
+        #{airTemperature,jdbcType=FLOAT},
+      </if>
+      <if test="airHumidity != null">
+        #{airHumidity,jdbcType=FLOAT},
+      </if>
+      <if test="ultraviolet != null">
+        #{ultraviolet,jdbcType=INTEGER},
+      </if>
+      <if test="lightIntensity != null">
+        #{lightIntensity,jdbcType=INTEGER},
+      </if>
+      <if test="rainfall != null">
+        #{rainfall,jdbcType=FLOAT},
+      </if>
+      <if test="windSpeed != null">
+        #{windSpeed,jdbcType=FLOAT},
+      </if>
+      <if test="windDirection != null">
+        #{windDirection,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmWeatherHistory">
+    <!--@mbg.generated-->
+    update rm_weather_history
+    <set>
+      <if test="weatherId != null">
+        weather_id = #{weatherId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="airTemperature != null">
+        air_temperature = #{airTemperature,jdbcType=FLOAT},
+      </if>
+      <if test="airHumidity != null">
+        air_humidity = #{airHumidity,jdbcType=FLOAT},
+      </if>
+      <if test="ultraviolet != null">
+        ultraviolet = #{ultraviolet,jdbcType=INTEGER},
+      </if>
+      <if test="lightIntensity != null">
+        light_intensity = #{lightIntensity,jdbcType=INTEGER},
+      </if>
+      <if test="rainfall != null">
+        rainfall = #{rainfall,jdbcType=FLOAT},
+      </if>
+      <if test="windSpeed != null">
+        wind_speed = #{windSpeed,jdbcType=FLOAT},
+      </if>
+      <if test="windDirection != null">
+        wind_direction = #{windDirection,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmWeatherHistory">
+    <!--@mbg.generated-->
+    update rm_weather_history
+    set weather_id = #{weatherId,jdbcType=BIGINT},
+      dt = #{dt,jdbcType=TIMESTAMP},
+      air_temperature = #{airTemperature,jdbcType=FLOAT},
+      air_humidity = #{airHumidity,jdbcType=FLOAT},
+      ultraviolet = #{ultraviolet,jdbcType=INTEGER},
+      light_intensity = #{lightIntensity,jdbcType=INTEGER},
+      rainfall = #{rainfall,jdbcType=FLOAT},
+      wind_speed = #{windSpeed,jdbcType=FLOAT},
+      wind_direction = #{windDirection,jdbcType=INTEGER}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmWeatherLastMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmWeatherLastMapper.xml
new file mode 100644
index 0000000..4014fc3
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmWeatherLastMapper.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmWeatherLastMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmWeatherLast">
+    <!--@mbg.generated-->
+    <!--@Table rm_weather_last-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="last_history_id" jdbcType="BIGINT" property="lastHistoryId" />
+    <result column="weather_id" jdbcType="BIGINT" property="weatherId" />
+    <result column="dt" jdbcType="TIMESTAMP" property="dt" />
+    <result column="air_temperature" jdbcType="FLOAT" property="airTemperature" />
+    <result column="air_humidity" jdbcType="FLOAT" property="airHumidity" />
+    <result column="ultraviolet" jdbcType="INTEGER" property="ultraviolet" />
+    <result column="light_intensity" jdbcType="INTEGER" property="lightIntensity" />
+    <result column="rainfall" jdbcType="FLOAT" property="rainfall" />
+    <result column="wind_speed" jdbcType="FLOAT" property="windSpeed" />
+    <result column="wind_direction" jdbcType="INTEGER" property="windDirection" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, last_history_id, weather_id, dt, air_temperature, air_humidity, ultraviolet, 
+    light_intensity, rainfall, wind_speed, wind_direction
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from rm_weather_last
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+
+  <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇璁板綍-->
+  <select id="selectRmWeatherLast" resultType="com.dy.pipIrrGlobal.pojoRm.RmWeatherLast">
+    select
+    <include refid="Base_Column_List" />
+    from rm_weather_last
+    <where>
+      <if test="stWeatherId != null and stWeatherId != ''">
+        and weather_id = #{stWeatherId}
+      </if>
+    </where>
+    limit 0,1
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from rm_weather_last
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmWeatherLast">
+    <!--@mbg.generated-->
+    insert into rm_weather_last (id, last_history_id, weather_id, 
+      dt, air_temperature, air_humidity, 
+      ultraviolet, light_intensity, rainfall, 
+      wind_speed, wind_direction)
+    values (#{id,jdbcType=BIGINT}, #{lastHistoryId,jdbcType=BIGINT}, #{weatherId,jdbcType=BIGINT}, 
+      #{dt,jdbcType=TIMESTAMP}, #{airTemperature,jdbcType=FLOAT}, #{airHumidity,jdbcType=FLOAT}, 
+      #{ultraviolet,jdbcType=INTEGER}, #{lightIntensity,jdbcType=INTEGER}, #{rainfall,jdbcType=FLOAT}, 
+      #{windSpeed,jdbcType=FLOAT}, #{windDirection,jdbcType=INTEGER})
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmWeatherLast">
+    <!--@mbg.generated-->
+    insert into rm_weather_last
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="lastHistoryId != null">
+        last_history_id,
+      </if>
+      <if test="weatherId != null">
+        weather_id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="airTemperature != null">
+        air_temperature,
+      </if>
+      <if test="airHumidity != null">
+        air_humidity,
+      </if>
+      <if test="ultraviolet != null">
+        ultraviolet,
+      </if>
+      <if test="lightIntensity != null">
+        light_intensity,
+      </if>
+      <if test="rainfall != null">
+        rainfall,
+      </if>
+      <if test="windSpeed != null">
+        wind_speed,
+      </if>
+      <if test="windDirection != null">
+        wind_direction,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="lastHistoryId != null">
+        #{lastHistoryId,jdbcType=BIGINT},
+      </if>
+      <if test="weatherId != null">
+        #{weatherId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="airTemperature != null">
+        #{airTemperature,jdbcType=FLOAT},
+      </if>
+      <if test="airHumidity != null">
+        #{airHumidity,jdbcType=FLOAT},
+      </if>
+      <if test="ultraviolet != null">
+        #{ultraviolet,jdbcType=INTEGER},
+      </if>
+      <if test="lightIntensity != null">
+        #{lightIntensity,jdbcType=INTEGER},
+      </if>
+      <if test="rainfall != null">
+        #{rainfall,jdbcType=FLOAT},
+      </if>
+      <if test="windSpeed != null">
+        #{windSpeed,jdbcType=FLOAT},
+      </if>
+      <if test="windDirection != null">
+        #{windDirection,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmWeatherLast">
+    <!--@mbg.generated-->
+    update rm_weather_last
+    <set>
+      <if test="lastHistoryId != null">
+        last_history_id = #{lastHistoryId,jdbcType=BIGINT},
+      </if>
+      <if test="weatherId != null">
+        weather_id = #{weatherId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="airTemperature != null">
+        air_temperature = #{airTemperature,jdbcType=FLOAT},
+      </if>
+      <if test="airHumidity != null">
+        air_humidity = #{airHumidity,jdbcType=FLOAT},
+      </if>
+      <if test="ultraviolet != null">
+        ultraviolet = #{ultraviolet,jdbcType=INTEGER},
+      </if>
+      <if test="lightIntensity != null">
+        light_intensity = #{lightIntensity,jdbcType=INTEGER},
+      </if>
+      <if test="rainfall != null">
+        rainfall = #{rainfall,jdbcType=FLOAT},
+      </if>
+      <if test="windSpeed != null">
+        wind_speed = #{windSpeed,jdbcType=FLOAT},
+      </if>
+      <if test="windDirection != null">
+        wind_direction = #{windDirection,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmWeatherLast">
+    <!--@mbg.generated-->
+    update rm_weather_last
+    set last_history_id = #{lastHistoryId,jdbcType=BIGINT},
+      weather_id = #{weatherId,jdbcType=BIGINT},
+      dt = #{dt,jdbcType=TIMESTAMP},
+      air_temperature = #{airTemperature,jdbcType=FLOAT},
+      air_humidity = #{airHumidity,jdbcType=FLOAT},
+      ultraviolet = #{ultraviolet,jdbcType=INTEGER},
+      light_intensity = #{lightIntensity,jdbcType=INTEGER},
+      rainfall = #{rainfall,jdbcType=FLOAT},
+      wind_speed = #{windSpeed,jdbcType=FLOAT},
+      wind_direction = #{windDirection,jdbcType=INTEGER}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
index 13c0ca2..49d25ec 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
@@ -478,6 +478,8 @@
 
 				mqVo.comCacheTimeout = conf.getSetAttrPlusInt(doc, "config.mqtt", "comCacheTimeout", null, 1, 3600, null) * 1000L ;
 
+				ServerProperties.mqttAcceptDataMinInterval = conf.getSetAttrPlusInt(doc, "config.mqtt", "acceptDataMinInterval", null, 1, 720, null) * 60 * 1000L ;
+
 				mqVo.useMemoryPersistence = conf.getSetAttrBoolean(doc, "config.mqtt", "useMemoryPersistence", null, null) ;
 				String proAndDevIds = conf.getSetAttrTxt(doc, "config.mqtt", "protocolAndDeviceIds", null, false, null) ;
 				if(proAndDevIds == null || proAndDevIds.trim().equals("")){
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java
index ef5a0da..ed9df08 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java
@@ -56,5 +56,8 @@
 
 	//Mqtt妯″潡鏄惁鍚姩
 	public static Boolean mqttUnitEnable = false ;
+	public static Long mqttAcceptDataMinInterval = 60 * 60 * 1000L ;//榛樿60鍒嗛挓
+
+
 
 }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/dbSv/DbSv.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/dbSv/DbSv.java
index b2a6a43..a07d3ea 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/dbSv/DbSv.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/dbSv/DbSv.java
@@ -1,13 +1,11 @@
 package com.dy.rtuMw.server.rtuData.dbSv;
 
 import com.dy.common.util.NumUtil;
-import com.dy.pipIrrGlobal.daoPr.PrControllerMapper;
-import com.dy.pipIrrGlobal.daoPr.PrControllerTrampMapper;
+import com.dy.pipIrrGlobal.daoPr.*;
 import com.dy.pipIrrGlobal.daoRm.*;
 import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
 import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
-import com.dy.pipIrrGlobal.pojoPr.PrController;
-import com.dy.pipIrrGlobal.pojoPr.PrControllerTramp;
+import com.dy.pipIrrGlobal.pojoPr.*;
 import com.dy.pipIrrGlobal.pojoRm.*;
 import com.dy.pipIrrGlobal.pojoSe.SeClient;
 import com.dy.pipIrrGlobal.voSe.VoCardInfo1;
@@ -71,6 +69,27 @@
     private RmOnHourReportHistoryMapper rmOnHourReportHistoryDao; // 瀹氱偣涓婃姤鍘嗗彶鏁版嵁DAO
     @Autowired
     private RmOnHourReportLastMapper rmOnHourReportLastDao; // 瀹氱偣涓婃姤鏈�鏂版暟鎹瓺AO
+
+    @Autowired
+    private PrStManureMapper prStManureDao; //姘磋偉鏈篋AO
+    @Autowired
+    private PrStSoilMapper prStSoilDao; //澧掓儏绔橠AO
+    @Autowired
+    private PrStWeatherMapper prStWeatherDao; //姘旇薄绔橠AO
+    @Autowired
+    private RmManureLastMapper rmManureLastDao; //姘磋偉DAO
+    @Autowired
+    private RmManureHistoryMapper rmManureHistoryDao; //姘磋偉DAO
+    @Autowired
+    private RmSoilLastMapper rmSoilLastDao; //澧掓儏DAO
+    @Autowired
+    private RmSoilHistoryMapper rmSoilHistoryDao; //澧掓儏DAO
+    @Autowired
+    private RmSoilDayMapper rmSoilDayDao; //澧掓儏DAO
+    @Autowired
+    private RmWeatherLastMapper rmWeatherLastDao; //姘旇薄DAO
+    @Autowired
+    private RmWeatherHistoryMapper rmWeatherHistoryDao; //姘旇薄DAO
 
 
     //@Autowired
@@ -694,6 +713,209 @@
         seVirtualCardDao.updateMoney(id,remainMoney);
     }
 
+
+    //////////////////////////////////////////////////////
+    //
+    // 姘磋偉鏁版嵁鐩稿叧
+    //
+    //////////////////////////////////////////////////////
+    /**
+     * 閫氳繃FBox搴忓垪鍙峰緱鍒版按鑲ユ満瀹炰綋
+     * @param fboxId FBox搴忓垪鍙�
+     * @param no 缂栧彿
+     * @return 姘磋偉鏈哄疄浣�
+     */
+    public PrStManure getStManureByFBoxIdAndNo(String fboxId, Integer no){
+        List<PrStManure> list = this.prStManureDao.selectStPoByFBoxIdAndNo(fboxId, no) ;
+        if(list != null && list.size() > 0){
+            return list.get(0) ;
+        }
+        return null ;
+    }
+    /**
+     * 鏌ヨ涓婃姤鏈�鏂版暟鎹�
+     * @param stManureId
+     * @return
+     */
+    public RmManureLast getRmManureLast(Long stManureId) {
+        List<RmManureLast> list = this.rmManureLastDao.selectRmManureLast(stManureId) ;
+        if(list != null && list.size() > 0){
+            return list.get(0) ;
+        }
+        return null ;
+    }
+    /**
+     * 淇濆瓨鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveRmManureHistory(RmManureHistory po) {
+        this.rmManureHistoryDao.insert(po);
+    }
+
+    /**
+     * 淇濆瓨鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveRmManureLast(RmManureLast po) {
+        this.rmManureLastDao.insert(po);
+    }
+    /**
+     * 鏇存柊鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRmManureLast(RmManureLast po){
+        this.rmManureLastDao.updateByPrimaryKey(po) ;
+    }
+
+
+    //////////////////////////////////////////////////////
+    //
+    // 澧掓儏鏁版嵁鐩稿叧
+    //
+    //////////////////////////////////////////////////////
+    /**
+     * 閫氳繃FBox搴忓垪鍙峰緱鍒板鎯呯珯瀹炰綋
+     * @param fboxId FBox搴忓垪鍙�
+     * @param no 缂栧彿
+     * @return 姘磋偉鏈哄疄浣�
+     */
+    public PrStSoil getStSoilByFBoxIdAndNo(String fboxId, Integer no){
+        List<PrStSoil> list = this.prStSoilDao.selectStPoByFBoxIdAndNo(fboxId, no) ;
+        if(list != null && list.size() > 0){
+            return list.get(0) ;
+        }
+        return null ;
+    }
+    /**
+     * 鏌ヨ涓婃姤鏈�鏂版暟鎹�
+     * @param stSoilId
+     * @return
+     */
+    public RmSoilLast getRmSoilLast(Long stSoilId) {
+        List<RmSoilLast> list = this.rmSoilLastDao.selectRmSoilLast(stSoilId) ;
+        if(list != null && list.size() > 0){
+            return list.get(0) ;
+        }
+        return null ;
+    }
+    /**
+     * 淇濆瓨鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveRmSoilHistory(RmSoilHistory po) {
+        this.rmSoilHistoryDao.insert(po);
+    }
+
+    /**
+     * 淇濆瓨鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveRmSoilLast(RmSoilLast po) {
+        this.rmSoilLastDao.insert(po);
+    }
+    /**
+     * 鏇存柊鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRmSoilLast(RmSoilLast po){
+        this.rmSoilLastDao.updateByPrimaryKey(po) ;
+    }
+
+    /**
+     * 鏌ヨ涓婃姤鏃ユ暟鎹�
+     * @param stSoilId
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public RmSoilDay getRmSoilDay(Long stSoilId, Integer nowYmd) {
+        List<RmSoilDay> list = this.rmSoilDayDao.selectRmSoilDay(stSoilId, nowYmd) ;
+        if(list != null && list.size() > 0){
+            return list.get(0) ;
+        }
+        return null ;
+    }
+    /**
+     * 淇濆瓨鏃ヨ褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveRmSoilDay(RmSoilDay po) {
+        this.rmSoilDayDao.insert(po);
+    }
+    /**
+     * 鏇存柊鏃ヨ褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRmSoilDay(RmSoilDay po){
+        this.rmSoilDayDao.updateByPrimaryKey(po) ;
+    }
+
+
+
+    //////////////////////////////////////////////////////
+    //
+    // 姘旇薄鏁版嵁鐩稿叧
+    //
+    //////////////////////////////////////////////////////
+    /**
+     * 閫氳繃FBox搴忓垪鍙峰緱鍒版皵璞$珯瀹炰綋
+     * @param fboxId FBox搴忓垪鍙�
+     * @param no 缂栧彿
+     * @return 姘磋偉鏈哄疄浣�
+     */
+    public PrStWeather getStWeatherByFBoxIdAndNo(String fboxId, Integer no){
+        List<PrStWeather> list = this.prStWeatherDao.selectStPoByFBoxIdAndNo(fboxId, no) ;
+        if(list != null && list.size() > 0){
+            return list.get(0) ;
+        }
+        return null ;
+    }
+
+    /**
+     * 鏌ヨ涓婃姤鏈�鏂版暟鎹�
+     * @param stWeatherId
+     * @return
+     */
+    public RmWeatherLast getRmWeatherLast(Long stWeatherId) {
+        List<RmWeatherLast> list = this.rmWeatherLastDao.selectRmWeatherLast(stWeatherId) ;
+        if(list != null && list.size() > 0){
+            return list.get(0) ;
+        }
+        return null ;
+    }
+    /**
+     * 淇濆瓨鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveRmWeatherHistory(RmWeatherHistory po) {
+        this.rmWeatherHistoryDao.insert(po);
+    }
+
+    /**
+     * 淇濆瓨鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveRmWeatherLast(RmWeatherLast po) {
+        this.rmWeatherLastDao.insert(po);
+    }
+    /**
+     * 鏇存柊鏈�鏂拌褰�
+     * @param po
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRmWeatherLast(RmWeatherLast po){
+        this.rmWeatherLastDao.updateByPrimaryKey(po) ;
+    }
+
     //////////////////////////////////////////////////////
     //
     // 鍛戒护鏃ュ織鐩稿叧
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkFindComResponse.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkFindComResponse.java
index 0f2fac7..e1c9f70 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkFindComResponse.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkFindComResponse.java
@@ -26,7 +26,7 @@
     public void execute(Object data) {
         Data d = (Data)data ;
         if(d.getCommandId() != null && !d.getCommandId().trim().equals("")){
-            //鏃犲懡浠D
+            //鏈夊懡浠D
             this.toNextTasks(data);
         }
     }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkRtuDealCommandResponse.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkRtuDealCommandResponse.java
index c5036e5..852009e 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkRtuDealCommandResponse.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkRtuDealCommandResponse.java
@@ -47,7 +47,7 @@
                         log.error("鏈緱鍒板懡浠ゆ棩蹇楋紙" + d.getCommandId() + ")");
                     }
                 }catch (Exception e){
-                    log.error("淇濆瓨鎺у埗鍣ㄨ嚜鎶ユ暟鎹椂鍙戠敓寮傚父", e);
+                    log.error("淇濆瓨鎺у埗鍣ㄥ懡浠ょ粨鏋滄椂鍙戠敓寮傚父", e);
                 }
             }
         }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkRtuDealCommandResponseV2.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkRtuDealCommandResponseV2.java
index 3c8a033..7a5abf1 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkRtuDealCommandResponseV2.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkRtuDealCommandResponseV2.java
@@ -50,7 +50,7 @@
                         log.error("鏈緱鍒板懡浠ゆ棩蹇楋紙" + d.getCommandId() + ")");
                     }
                 }catch (Exception e){
-                    log.error("淇濆瓨鎺у埗鍣ㄨ嚜鎶ユ暟鎹椂鍙戠敓寮傚父", e);
+                    log.error("淇濆瓨鎺у埗鍣ㄥ懡浠ょ粨鏋滄椂鍙戠敓寮傚父", e);
                 }
             }
         }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkRtuDealCommandResponseV202404.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkRtuDealCommandResponseV202404.java
index f517210..63e259b 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkRtuDealCommandResponseV202404.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkRtuDealCommandResponseV202404.java
@@ -45,7 +45,7 @@
                         log.error("鏈緱鍒板懡浠ゆ棩蹇楋紙" + d.getCommandId() + ")");
                     }
                 }catch (Exception e){
-                    log.error("淇濆瓨鎺у埗鍣ㄨ嚜鎶ユ暟鎹椂鍙戠敓寮傚父", e);
+                    log.error("淇濆瓨鎺у埗鍣ㄥ懡浠ょ粨鏋滄椂鍙戠敓寮傚父", e);
                 }
             }
         }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealCommandResponseSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealCommandResponseSdV1.java
new file mode 100644
index 0000000..471143c
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealCommandResponseSdV1.java
@@ -0,0 +1,58 @@
+package com.dy.rtuMw.server.rtuData.pSdV1;
+
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.ManureVo;
+import com.dy.pipIrrGlobal.pojoPr.PrStManure;
+import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
+import com.dy.rtuMw.server.rtuData.TaskSurpport;
+import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 15:52
+ * @Description
+ */
+public class TkDealCommandResponseSdV1 extends TaskSurpport {
+
+    private static final Logger log = LogManager.getLogger(TkDealCommandResponseSdV1.class.getName()) ;
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkDealCommandResponseSdV1" ;
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟锛氬鐞嗗懡浠ゅ搷搴斾笂鎶�
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌轰笖涓烘按鑲ユ暟鎹�
+        MqttSubMsg msg = (MqttSubMsg) data;
+        ManureVo stVo = (ManureVo) msg.vo4Up;
+        Object[] objs = this.getTaskResults(TkPreGenObjs4ManureSdV1.taskId);
+        DbSv sv = (DbSv) objs[0];
+        PrStManure stPo = (PrStManure) objs[1];
+        try{
+            RmCommandHistory po = sv.getCommandLog(msg.commandId) ;
+            if(po != null){
+                po = this.updateCommandLogPo(po, msg) ;
+                sv.updateCommandLog(po);
+            }else{
+                log.error("鏈緱鍒癕QTT鍛戒护鏃ュ織锛�" + msg.getCommandId() + ")");
+            }
+        }catch (Exception e){
+            log.error("淇濆瓨MQTT鍛戒护缁撴灉鍙戠敓寮傚父", e);
+        }
+    }
+
+    public RmCommandHistory updateCommandLogPo(RmCommandHistory po, MqttSubMsg msg) throws Exception{
+        po.setResultTime(new Date());
+        po.setResult((byte)1);
+        po.setResultText(msg.metaData);
+        return po ;
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealManureSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealManureSdV1.java
new file mode 100644
index 0000000..2c23cd4
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealManureSdV1.java
@@ -0,0 +1,127 @@
+package com.dy.rtuMw.server.rtuData.pSdV1;
+
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.ManureVo;
+import com.dy.pipIrrGlobal.pojoPr.PrStManure;
+import com.dy.pipIrrGlobal.pojoRm.RmManureHistory;
+import com.dy.pipIrrGlobal.pojoRm.RmManureLast;
+import com.dy.rtuMw.server.forMs.SendMsCache;
+import com.dy.rtuMw.server.rtuData.TaskSurpport;
+import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 11:37
+ * @Description
+ */
+public class TkDealManureSdV1 extends TaskSurpport {
+
+    private static Logger log = LogManager.getLogger(TkDealManureSdV1.class.getName());
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkDealManureSdV1";
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟
+     *
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌轰笖涓烘按鑲ユ暟鎹�
+        MqttSubMsg msg = (MqttSubMsg) data;
+        ManureVo stVo = (ManureVo) msg.vo4Up;
+        Object[] objs = this.getTaskResults(TkPreGenObjs4ManureSdV1.taskId);
+        DbSv sv = (DbSv) objs[0];
+        PrStManure stPo = (PrStManure) objs[1];
+        try{
+            this.doDeal(sv, stPo, msg, stVo);
+        }catch (Exception e){
+            log.error("淇濆瓨姘磋偉鏁版嵁鏃跺彂鐢熷紓甯�", e);
+        }
+    }
+
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     */
+    private void doDeal(DbSv sv,
+                        PrStManure stPo,
+                        MqttSubMsg msg,
+                        ManureVo stVo) throws Exception {
+        RmManureHistory hpo = this.saveHistory(sv, stPo, msg, stVo);
+        this.saveOrUpdateLast(sv, stPo, msg, stVo, hpo);
+    }
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     * @param hpo 鍘嗗彶璁板綍鏈�鏂版暟鎹�
+     */
+    private void saveOrUpdateLast(DbSv sv,
+                                  PrStManure stPo,
+                                  MqttSubMsg msg,
+                                  ManureVo stVo,
+                                  RmManureHistory hpo) throws Exception {
+        RmManureLast po = sv.getRmManureLast(stPo.id) ;
+        if(po == null){
+            po = new RmManureLast();
+            po.valueFrom(msg, stVo);
+            po.manureId = stPo.id ;
+            po.lastHistoryId = hpo==null?null:hpo.id ;
+            sv.saveRmManureLast(po) ;
+            if(stVo.alarm != null && stVo.alarm == 1){
+                this.sendMessage(stPo, msg, stVo);
+            }
+        }else{
+            po.valueFrom(msg, stVo);
+            po.manureId = stPo.id ;
+            po.lastHistoryId = hpo==null?null:hpo.id ;
+            sv.updateRmManureLast(po);
+            if(stVo.alarm != null && stVo.alarm == 1){
+                this.sendMessage(stPo, msg, stVo);
+            }
+        }
+    }
+
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     */
+    private RmManureHistory saveHistory(DbSv sv,
+                             PrStManure stPo,
+                             MqttSubMsg msg,
+                             ManureVo stVo) throws Exception {
+        RmManureHistory po = new RmManureHistory();
+        po.valueFrom(msg, stVo);
+        po.manureId = stPo.id ;
+        sv.saveRmManureHistory(po);
+        return po ;
+    }
+
+    /**
+     * 鍚戦拤閽夊彂閫佹秷鎭�
+     * @param stPo
+     * @param msg
+     * @param stVo
+     */
+    private void sendMessage(PrStManure stPo, MqttSubMsg msg, ManureVo stVo){
+        String ms = "姘磋偉鏈衡��" + stPo.name + "鈥濇敞鑲ユ车鎶ヨ";
+        try{
+            SendMsCache.cacheMs(ms);
+        }catch (Exception e){
+            log.error("缂撳瓨閽夐拤娑堟伅寮傚父锛�", e);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealSoilSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealSoilSdV1.java
new file mode 100644
index 0000000..d36c18e
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealSoilSdV1.java
@@ -0,0 +1,133 @@
+package com.dy.rtuMw.server.rtuData.pSdV1;
+
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.SoilVo;
+import com.dy.common.util.DateTime;
+import com.dy.pipIrrGlobal.pojoPr.PrStSoil;
+import com.dy.pipIrrGlobal.pojoRm.RmSoilDay;
+import com.dy.pipIrrGlobal.pojoRm.RmSoilHistory;
+import com.dy.pipIrrGlobal.pojoRm.RmSoilLast;
+import com.dy.rtuMw.server.rtuData.TaskSurpport;
+import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 11:38
+ * @Description
+ */
+public class TkDealSoilSdV1 extends TaskSurpport {
+
+    private static Logger log = LogManager.getLogger(TkDealSoilSdV1.class.getName());
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkDealSoilSdV1";
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟
+     *
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌轰笖涓哄鎯呮暟鎹�
+        MqttSubMsg msg = (MqttSubMsg) data;
+        SoilVo stVo = (SoilVo) msg.vo4Up;
+        Object[] objs = this.getTaskResults(TkPreGenObjs4SoilSdV1.taskId);
+        DbSv sv = (DbSv) objs[0];
+        PrStSoil stPo = (PrStSoil) objs[1];
+        try{
+            this.doDeal(sv, stPo, msg, stVo);
+        }catch (Exception e){
+            log.error("淇濆瓨澧掓儏鏁版嵁鏃跺彂鐢熷紓甯�", e);
+        }
+    }
+
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     */
+    private void doDeal(DbSv sv,
+                        PrStSoil stPo,
+                        MqttSubMsg msg,
+                        SoilVo stVo) throws Exception {
+        RmSoilHistory hpo = this.saveHistory(sv, stPo, msg, stVo);
+        this.saveOrUpdateLast(sv, stPo, msg, stVo, hpo);
+        this.saveOrUpdateDay(sv, stPo, msg, stVo, hpo);
+    }
+
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     * @param hpo 鍘嗗彶璁板綍鏈�鏂版暟鎹�
+     */
+    private void saveOrUpdateLast(DbSv sv,
+                                  PrStSoil stPo,
+                                  MqttSubMsg msg,
+                                  SoilVo stVo,
+                                  RmSoilHistory hpo) throws Exception {
+        RmSoilLast po = sv.getRmSoilLast(stPo.id) ;
+        if(po == null){
+            po = new RmSoilLast();
+            po.valueFrom(msg, stVo);
+            po.soilId = stPo.id ;
+            po.lastHistoryId = hpo==null?null:hpo.id ;
+            sv.saveRmSoilLast(po) ;
+        }else{
+            po.valueFrom(msg, stVo);
+            po.soilId = stPo.id ;
+            po.lastHistoryId = hpo==null?null:hpo.id ;
+            sv.updateRmSoilLast(po);
+        }
+    }
+
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     */
+    private RmSoilHistory saveHistory(DbSv sv,
+                                        PrStSoil stPo,
+                                        MqttSubMsg msg,
+                                        SoilVo stVo) throws Exception {
+        RmSoilHistory po = new RmSoilHistory();
+        po.valueFrom(msg, stVo);
+        po.soilId = stPo.id ;
+        sv.saveRmSoilHistory(po);
+        return po ;
+    }
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     * @param hpo 鍘嗗彶璁板綍鏈�鏂版暟鎹�
+     */
+    private void saveOrUpdateDay(DbSv sv,
+                                  PrStSoil stPo,
+                                  MqttSubMsg msg,
+                                  SoilVo stVo,
+                                  RmSoilHistory hpo) throws Exception {
+        RmSoilDay po = sv.getRmSoilDay(stPo.id, Integer.parseInt(DateTime.yyyyMMdd())) ;
+        if(po == null){
+            po = new RmSoilDay();
+            po.valueFrom(msg, stVo);
+            po.soilId = stPo.id ;
+            sv.saveRmSoilDay(po) ;
+        }else{
+            po.updateFrom(msg, stVo);
+            po.soilId = stPo.id ;
+            sv.updateRmSoilDay(po);
+        }
+    }
+}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealWeatherSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealWeatherSdV1.java
new file mode 100644
index 0000000..ce5f281
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkDealWeatherSdV1.java
@@ -0,0 +1,105 @@
+package com.dy.rtuMw.server.rtuData.pSdV1;
+
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.WeatherVo;
+import com.dy.pipIrrGlobal.pojoPr.PrStWeather;
+import com.dy.pipIrrGlobal.pojoRm.RmWeatherHistory;
+import com.dy.pipIrrGlobal.pojoRm.RmWeatherLast;
+import com.dy.rtuMw.server.rtuData.TaskSurpport;
+import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 11:37
+ * @Description
+ */
+public class TkDealWeatherSdV1 extends TaskSurpport {
+
+    private static Logger log = LogManager.getLogger(TkDealWeatherSdV1.class.getName());
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkDealWeatherSdV1";
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟
+     *
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌轰笖涓烘皵璞℃暟鎹�
+        MqttSubMsg msg = (MqttSubMsg) data;
+        WeatherVo stVo = (WeatherVo) msg.vo4Up;
+        Object[] objs = this.getTaskResults(TkPreGenObjs4WeatherSdV1.taskId);
+        DbSv sv = (DbSv) objs[0];
+        PrStWeather stPo = (PrStWeather) objs[1];
+        try{
+            this.doDeal(sv, stPo, msg, stVo);
+        }catch (Exception e){
+            log.error("淇濆瓨姘旇薄鏁版嵁鏃跺彂鐢熷紓甯�", e);
+        }
+    }
+
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     */
+    private void doDeal(DbSv sv,
+                        PrStWeather stPo,
+                        MqttSubMsg msg,
+                        WeatherVo stVo) throws Exception {
+        RmWeatherHistory hpo = this.saveHistory(sv, stPo, msg, stVo);
+        this.saveOrUpdateLast(sv, stPo, msg, stVo, hpo);
+    }
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     * @param hpo 鍘嗗彶璁板綍鏈�鏂版暟鎹�
+     */
+    private void saveOrUpdateLast(DbSv sv,
+                                  PrStWeather stPo,
+                                  MqttSubMsg msg,
+                                  WeatherVo stVo,
+                                  RmWeatherHistory hpo) throws Exception {
+        RmWeatherLast po = sv.getRmWeatherLast(stPo.id) ;
+        if(po == null){
+            po = new RmWeatherLast();
+            po.valueFrom(msg, stVo);
+            po.weatherId = stPo.id ;
+            po.lastHistoryId = hpo==null?null:hpo.id ;
+            sv.saveRmWeatherLast(po) ;
+        }else{
+            po.valueFrom(msg, stVo);
+            po.weatherId = stPo.id ;
+            po.lastHistoryId = hpo==null?null:hpo.id ;
+            sv.updateRmWeatherLast(po);
+        }
+    }
+
+    /**
+     * 澶勭悊涓婅娑堟伅鏁版嵁
+     * @param sv 鏈嶅姟
+     * @param stPo 瀹炰綋瀵硅薄
+     * @param msg 涓婅鐨勮闃呮秷鎭�
+     * @param stVo 涓婅鐨勮澶囨暟鎹�
+     */
+    private RmWeatherHistory saveHistory(DbSv sv,
+                                      PrStWeather stPo,
+                                      MqttSubMsg msg,
+                                      WeatherVo stVo) throws Exception {
+        RmWeatherHistory po = new RmWeatherHistory();
+        po.valueFrom(msg, stVo);
+        po.weatherId = stPo.id ;
+        sv.saveRmWeatherHistory(po);
+        return po ;
+    }
+
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindComResponseSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindComResponseSdV1.java
new file mode 100644
index 0000000..a5ed233
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindComResponseSdV1.java
@@ -0,0 +1,37 @@
+package com.dy.rtuMw.server.rtuData.pSdV1;
+
+import com.dy.common.mw.protocol.Data;
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.ManureVo;
+import com.dy.pipIrrGlobal.pojoPr.PrStManure;
+import com.dy.rtuMw.server.rtuData.TaskSurpport;
+import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 15:52
+ * @Description
+ */
+public class TkFindComResponseSdV1 extends TaskSurpport {
+
+    private static final Logger log = LogManager.getLogger(TkFindComResponseSdV1.class.getName()) ;
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkFindComResponseSdV1" ;
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌轰笖涓烘按鑲ユ暟鎹�
+        MqttSubMsg msg = (MqttSubMsg) data;
+        if(msg.getCommandId() != null && !msg.getCommandId().trim().equals("")){
+            //鏈夊懡浠D
+            this.toNextTasks(data);
+        }
+    }
+}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindPSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindPSdV1.java
index ce5def5..3ae2995 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindPSdV1.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkFindPSdV1.java
@@ -1,6 +1,7 @@
 package com.dy.rtuMw.server.rtuData.pSdV1;
 
 import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.ProtocolConstantSdV1;
 import com.dy.rtuMw.server.rtuData.TaskSurpport;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -25,7 +26,10 @@
     public void execute(Object data) {
         //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌�
         MqttSubMsg msg = (MqttSubMsg)data ;
-        log.info(msg.toString());
+        if(msg.protocol.equals(ProtocolConstantSdV1.protocolName + ProtocolConstantSdV1.protocolVer)){
+            //灞变笢sd1鍗忚
+            this.toNextTasks(data);
+        }
     }
 
 }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4ManureSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4ManureSdV1.java
new file mode 100644
index 0000000..0890f30
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4ManureSdV1.java
@@ -0,0 +1,59 @@
+package com.dy.rtuMw.server.rtuData.pSdV1;
+
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.ManureVo;
+import com.dy.common.springUtil.SpringContextUtil;
+import com.dy.pipIrrGlobal.pojoPr.PrStManure;
+import com.dy.rtuMw.server.ServerProperties;
+import com.dy.rtuMw.server.rtuData.TaskSurpport;
+import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 8:56
+ * @Description
+ */
+public class TkPreGenObjs4ManureSdV1 extends TaskSurpport {
+
+    private static Logger log = LogManager.getLogger(TkPreGenObjs4ManureSdV1.class.getName()) ;
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkPreGenObjs4ManureSdV1" ;
+
+    //澶勭悊涓婃潯鏁版嵁鐨勬椂鍒�
+    private static final Map<String, Long> dealDataAtDateTime = new HashMap<>();
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌�
+        MqttSubMsg msg = (MqttSubMsg)data ;
+        if(msg.vo4Up != null && msg.vo4Up instanceof ManureVo){
+            //姘磋偉鏁版嵁
+            ManureVo stVo = (ManureVo)msg.vo4Up ;
+            Long lastAt = dealDataAtDateTime.get(msg.deviceId + stVo.no);
+            Long now = System.currentTimeMillis() ;
+            if(lastAt == null || ((now - lastAt) >= ServerProperties.mqttAcceptDataMinInterval)){
+                dealDataAtDateTime.put(msg.deviceId + stVo.no, now);
+                DbSv sv = SpringContextUtil.getBean(DbSv.class) ;
+                if(sv != null){
+                    PrStManure stPo = sv.getStManureByFBoxIdAndNo(msg.deviceId, stVo.no) ;
+                    if(stPo != null){
+                        this.taskResult = new Object[]{sv, stPo} ;
+                        this.toNextTasks(data);
+                    }
+                }else{
+                    log.error("涓ラ噸閿欒锛屾湭鑳藉緱鍒癉bSv瀵硅薄");
+                }
+            }
+        }
+    }
+}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4SoilSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4SoilSdV1.java
new file mode 100644
index 0000000..b978c59
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4SoilSdV1.java
@@ -0,0 +1,59 @@
+package com.dy.rtuMw.server.rtuData.pSdV1;
+
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.SoilVo;
+import com.dy.common.springUtil.SpringContextUtil;
+import com.dy.pipIrrGlobal.pojoPr.PrStSoil;
+import com.dy.rtuMw.server.ServerProperties;
+import com.dy.rtuMw.server.rtuData.TaskSurpport;
+import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 11:25
+ * @Description
+ */
+public class TkPreGenObjs4SoilSdV1 extends TaskSurpport {
+
+    private static Logger log = LogManager.getLogger(TkPreGenObjs4SoilSdV1.class.getName()) ;
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkPreGenObjs4SoilSdV1" ;
+
+    //澶勭悊涓婃潯鏁版嵁鐨勬椂鍒�
+    private static final Map<String, Long> dealDataAtDateTime = new HashMap<>();
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌�
+        MqttSubMsg msg = (MqttSubMsg)data ;
+        if(msg.vo4Up != null && msg.vo4Up instanceof SoilVo){
+            //澧掓儏鏁版嵁
+            SoilVo stVo = (SoilVo)msg.vo4Up ;
+            Long lastAt = dealDataAtDateTime.get(msg.deviceId + stVo.no);
+            Long now = System.currentTimeMillis() ;
+            if(lastAt == null || ((now - lastAt) >= ServerProperties.mqttAcceptDataMinInterval)) {
+                dealDataAtDateTime.put(msg.deviceId + stVo.no, now);
+                DbSv sv = SpringContextUtil.getBean(DbSv.class);
+                if (sv != null) {
+                    PrStSoil stPo = sv.getStSoilByFBoxIdAndNo(msg.deviceId, stVo.no);
+                    if (stPo != null) {
+                        this.taskResult = new Object[]{sv, stPo};
+                        this.toNextTasks(data);
+                    }
+                } else {
+                    log.error("涓ラ噸閿欒锛屾湭鑳藉緱鍒癉bSv瀵硅薄");
+                }
+            }
+        }
+    }
+}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4WeatherSdV1.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4WeatherSdV1.java
new file mode 100644
index 0000000..e799ea1
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/pSdV1/TkPreGenObjs4WeatherSdV1.java
@@ -0,0 +1,59 @@
+package com.dy.rtuMw.server.rtuData.pSdV1;
+
+import com.dy.common.mw.protocol4Mqtt.MqttSubMsg;
+import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.WeatherVo;
+import com.dy.common.springUtil.SpringContextUtil;
+import com.dy.pipIrrGlobal.pojoPr.PrStWeather;
+import com.dy.rtuMw.server.ServerProperties;
+import com.dy.rtuMw.server.rtuData.TaskSurpport;
+import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 11:25
+ * @Description
+ */
+public class TkPreGenObjs4WeatherSdV1 extends TaskSurpport {
+
+    private static Logger log = LogManager.getLogger(TkPreGenObjs4WeatherSdV1.class.getName()) ;
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkPreGenObjs4WeatherSdV1" ;
+
+    //澶勭悊涓婃潯鏁版嵁鐨勬椂鍒�
+    private static final Map<String, Long> dealDataAtDateTime = new HashMap<>();
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        //鍓嶉潰鐨勪换鍔″凡缁忓垽鏂簡data涓嶄负绌�
+        MqttSubMsg msg = (MqttSubMsg)data ;
+        if(msg.vo4Up != null && msg.vo4Up instanceof WeatherVo){
+            //姘旇薄鏁版嵁
+            WeatherVo stVo = (WeatherVo)msg.vo4Up ;
+            Long lastAt = dealDataAtDateTime.get(msg.deviceId + stVo.no);
+            Long now = System.currentTimeMillis() ;
+            if(lastAt == null || ((now - lastAt) >= ServerProperties.mqttAcceptDataMinInterval)) {
+                dealDataAtDateTime.put(msg.deviceId + stVo.no, now);
+                DbSv sv = SpringContextUtil.getBean(DbSv.class);
+                if (sv != null) {
+                    PrStWeather stPo = sv.getStWeatherByFBoxIdAndNo(msg.deviceId, stVo.no);
+                    if (stPo != null) {
+                        this.taskResult = new Object[]{sv, stPo};
+                        this.toNextTasks(data);
+                    }
+                } else {
+                    log.error("涓ラ噸閿欒锛屾湭鑳藉緱鍒癉bSv瀵硅薄");
+                }
+            }
+        }
+    }
+}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
index 26623b5..b9bd804 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
@@ -94,7 +94,25 @@
 		</task>
 		<!-- Mqtt娑堟伅涓棿浠惰闃呯殑娑堟伅 -->
 		<task id="TkMqttData" name="鎺ユ敹Mqtt娑堟伅" enable="true" class="com.dy.rtuMw.server.rtuData.TkMqttData">
-			<task id="TkFindPSdV1" name="璇嗗埆灞变笢V1鏁版嵁" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkFindPSdV1"></task>
+			<task id="TkFindPSdV1" name="璇嗗埆灞变笢V1鏁版嵁" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkFindPSdV1">
+				<task id="TkPreGenObjs4ManureSdV1" name="涓哄鐞嗘按鑲ユ満鏁版嵁棰勫厛鍑嗗鍚勫璞�" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkPreGenObjs4ManureSdV1">
+					<task id="TkDealManureSdV1" name="澶勭悊姘磋偉鏁版嵁" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkDealManureSdV1">
+					</task>
+					<!-- 鍙湁姘磋偉鏈烘湁杩滅▼鍛戒护 -->
+					<task id="TkFindComResponseSdV1" name="璇嗗埆鍝嶅簲鍛戒护鏁版嵁" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkFindComResponseSdV1">
+						<task id="TkDealCommandResponseSdV1" name="姘磋偉鏈哄搷搴斿懡浠ゆ暟鎹�" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkDealCommandResponseSdV1" >
+						</task>
+					</task>
+				</task>
+				<task id="TkPreGenObjs4WeatherSdV1" name="涓哄鐞嗘皵璞℃暟鎹鍏堝噯澶囧悇瀵硅薄" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkPreGenObjs4WeatherSdV1">
+					<task id="TkDealWeatherSdV1" name="澶勭悊姘旇薄鏁版嵁" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkDealWeatherSdV1">
+					</task>
+				</task>
+				<task id="TkPreGenObjs4SoilSdV1" name="涓哄鐞嗗鎯呮暟鎹鍏堝噯澶囧悇瀵硅薄" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkPreGenObjs4SoilSdV1">
+					<task id="TkDealSoilSdV1" name="澶勭悊澧掓儏鏁版嵁" enable="true" class="com.dy.rtuMw.server.rtuData.pSdV1.TkDealSoilSdV1">
+					</task>
+				</task>
+			</task>
 		</task>
 	</task>
 </project>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
index a9a11ed..74792d9 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
@@ -174,6 +174,7 @@
 	sendInterval 鍛戒护鍙戦�侀棿闅旓紙鍗曚綅绉掞級锛屽彇鍊艰寖鍥存槸1~3600
 	reSendTimesByNoResult 鏈敹鍒板懡浠ょ粨鏋滄椂锛屾渶澶ч噸澶嶅彂閫佹鏁帮紝鍙栧�艰寖鍥存槸0~100, 0鏃惰〃绀轰笉閲嶅鍙戦��
 	comCacheTimeout: 鍛戒护鏈�澶х紦瀛樻椂闀�(绉�)锛屽彇鍊艰寖鍥存槸1~3600
+	acceptDataMinInterval:鍥犱负涓婅鏁版嵁瀵嗗害杈冨ぇ锛堝10绉掍笂琛屼竴鏉℃暟鎹級锛屾暟鎹鐞嗕笌瀛樺偍鍘嬪姏澶э紝鎵�浠ユ渶灏忛棿闅斾竴瀹氭椂闂达紙鍒嗛挓锛夌湡姝f帴鏀跺鐞嗕竴鏉′笂琛屾暟鎹�
 	useMemoryPersistence 浣跨敤鍐呭瓨鎸佷箙鍖栬�岄潪榛樿鐨勬枃浠舵寔涔呭寲(true鏄� false鍚�)
 	protocolAndDeviceIds 鍦ㄥ瓙绯荤粺锛坥rgTag锛変腑鎺ュ叆鐨勮澶�(FBox)鎵�鐢ㄥ崗璁強璁惧id闆嗗悎,澶氫釜鐢ㄩ�楀彿闅斿紑锛屽崗璁笌ID鐢ㄦ鏂滄潬闅斿紑锛屼緥濡傦細sd1/338220031439,sd1/338220031440
 	subTopicAndQos: 璁㈤槄涓婚涓嶲os锛屼富棰樺悕涓庡叾Qos鐢ㄩ�楀彿闅斿紑锛屽涓富棰樺強Qos鐢ㄥ垎鍙烽殧寮�锛屼緥濡傦細ym/topic1,1;ym/topic2,1;ym/topic3,1锛屽鏋滄湁澶氫釜OrgTag锛屼富棰樺墠缂�鐢ㄥ叾OrgTag
@@ -192,6 +193,7 @@
 		  sendInterval="60"
 		  reSendTimesByNoResult="0"
 		  comCacheTimeout="30"
+		  acceptDataMinInterval="60"
 		  useMemoryPersistence="true"
 		  protocolAndDeviceIds="${mqtt.protocolAndDeviceIds}"
 		  subTopicAndQos="${mqtt.subTopicAndQos}"
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureCtrl.java
new file mode 100644
index 0000000..1b6f71b
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureCtrl.java
@@ -0,0 +1,66 @@
+package com.dy.pipIrrRemote.mqttSd1.manure;
+
+import com.dy.common.aop.SsoAop;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.common.webUtil.QueryResultVo;
+import com.dy.pipIrrGlobal.voRm.VoManure;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 16:17
+ * @Description
+ */
+@Slf4j
+@Tag(name = "姘磋偉鏁版嵁鏌ヨ", description = "姘磋偉鏁版嵁鏌ヨ")
+@RestController("rmManureCtrl")
+@RequestMapping(path = "manure")
+@RequiredArgsConstructor
+public class ManureCtrl {
+
+    private ManureSv sv;
+
+    @Autowired
+    public void setSv(ManureSv sv){
+        this.sv = sv ;
+    }
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鏌ヨ鍘嗗彶璁板綍
+     * @param qo
+     * @return
+     */
+    @GetMapping(path = "history")
+    @SsoAop()
+    public BaseResponse<QueryResultVo<List<VoManure>>> selectHistory(ManureQo qo){
+        try {
+            return BaseResponseUtils.buildSuccess(sv.selectHistory(qo));
+        } catch (Exception e) {
+            return BaseResponseUtils.buildException(e.getMessage()) ;
+        }
+    }
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鏌ヨ鏈�鏂拌褰�
+     * @param qo
+     * @return
+     */
+    @GetMapping(path = "last")
+    @SsoAop()
+    public BaseResponse<QueryResultVo<List<VoManure>>> selectLast(ManureQo qo){
+        try {
+            return BaseResponseUtils.buildSuccess(sv.selectLast(qo));
+        } catch (Exception e) {
+            return BaseResponseUtils.buildException(e.getMessage()) ;
+        }
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureQo.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureQo.java
new file mode 100644
index 0000000..05076fb
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureQo.java
@@ -0,0 +1,57 @@
+package com.dy.pipIrrRemote.mqttSd1.manure;
+
+import com.dy.common.webUtil.QueryConditionVo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 16:18
+ * @Description
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ToString(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ManureQo extends QueryConditionVo {
+    /**
+     * 姘磋偉鏈篒D
+     */
+    @Schema(description = "姘磋偉鏈篒D", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private Long manureId;
+
+    /**
+     * 姘磋偉绔欑紪鍙�
+     */
+    @Schema(description = "姘磋偉绔欑紪鍙�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer no ;
+
+    /**
+     * 姘磋偉绔欏悕绉�
+     */
+    @Schema(description = "姘磋偉绔欏悕绉�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public String name;
+    /**
+     * 鏌ヨ寮�濮嬫棩鏈�
+     */
+    @Schema(description = "鏌ヨ寮�濮嬫棩鏈�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public String timeStart;
+
+    /**
+     * 鏌ヨ缁撴潫鏃ユ湡
+     */
+    @Schema(description = "鏌ヨ缁撴潫鏃ユ湡", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public String timeStop;
+
+
+    public void completionTime(){
+        if(timeStart != null && !timeStart.trim().equals("")) {
+            timeStart = timeStart + " 00:00:00";
+        }
+        if(timeStop != null && !timeStop.trim().equals("")) {
+            timeStop = timeStop + " 23:59:59";
+        }
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureSv.java
new file mode 100644
index 0000000..609c9fd
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/mqttSd1/manure/ManureSv.java
@@ -0,0 +1,70 @@
+package com.dy.pipIrrRemote.mqttSd1.manure;
+
+import com.dy.common.webUtil.QueryResultVo;
+import com.dy.pipIrrGlobal.daoRm.RmManureHistoryMapper;
+import com.dy.pipIrrGlobal.daoRm.RmManureLastMapper;
+import com.dy.pipIrrGlobal.voRm.VoManure;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.common.utils.PojoUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/6/25 16:18
+ * @Description
+ */
+@Slf4j
+@Service("rmManureSv")
+@RequiredArgsConstructor
+public class ManureSv {
+
+    @Autowired
+    private RmManureHistoryMapper rmManureHistoryDao ;
+    @Autowired
+    private RmManureLastMapper rmManureLastDao ;
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鏌ヨ鍘嗗彶璁板綍
+     * @param qo
+     * @return
+     */
+    public QueryResultVo<List<VoManure>> selectHistory(ManureQo qo) {
+        qo.completionTime();
+
+        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(qo);
+        Long itemTotal = rmManureHistoryDao.selectCount(params);
+
+        QueryResultVo<List<VoManure>> rsVo = new QueryResultVo<>() ;
+        rsVo.pageSize = qo.pageSize ;
+        rsVo.pageCurr = qo.pageCurr ;
+
+        rsVo.calculateAndSet(itemTotal, params);
+        rsVo.obj = rmManureHistoryDao.selectSome(params);
+        return rsVo ;
+    }
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鏌ヨ鏈�鏂拌褰�
+     * @param qo
+     * @return
+     */
+    public QueryResultVo<List<VoManure>> selectLast(ManureQo qo) {
+        qo.completionTime();
+
+        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(qo);
+        Long itemTotal = rmManureLastDao.selectCount(params);
+
+        QueryResultVo<List<VoManure>> rsVo = new QueryResultVo<>() ;
+        rsVo.pageSize = qo.pageSize ;
+        rsVo.pageCurr = qo.pageCurr ;
+
+        rsVo.calculateAndSet(itemTotal, params);
+        rsVo.obj = rmManureLastDao.selectSome(params);
+        return rsVo ;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
index ea8f0f8..8a4e1b4 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
@@ -54,7 +54,10 @@
             return BaseResponseUtils
                     .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
-
+        // 妫�鏌ュ崱鐗囧湴鍧�鏄惁宸插瓨鍦�
+        if (cardSv.isCardAddrExists(po.getCardAddr())) {
+            return BaseResponseUtils.buildErrorMsg("璇ュ崱鐗囧湴鍧�宸插瓨鍦紝璇蜂娇鐢ㄥ叾浠栧崱");
+        }
         Map map_result = cardSv.activeOrReissueTermCard(po);
         if (map_result.get("success").equals(false)) {
             return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString());
@@ -379,7 +382,7 @@
 
         // 妫�鏌ュ崱鐗囧湴鍧�鏄惁宸插瓨鍦�
         if (cardSv.isCardAddrExists(dto.getCardAddr())) {
-            return BaseResponseUtils.buildErrorMsg("璇ュ崱鐗囧湴鍧�宸插瓨鍦紝璇蜂娇鐢ㄥ叾浠栧湴鍧�");
+            return BaseResponseUtils.buildErrorMsg("璇ュ崱鐗囧湴鍧�宸插瓨鍦紝璇蜂娇鐢ㄥ叾浠栧崱");
         }
 
         Map<String, Object> result = cardSv.createManagementCard(dto);
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java
index 1ff7254..02d6922 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java
@@ -52,6 +52,7 @@
     /**
      * 浠樻鏂瑰紡缂栧彿
      */
+    @NotNull(message = "浠樻鏂瑰紡涓嶈兘涓虹┖")
     private Long paymentId;
 
     /**

--
Gitblit v1.8.0