Просмотр исходного кода

Merge branch 'develop' of com_yunfei_saas/agmp_iot_common into master

yf_zn 1 год назад
Родитель
Сommit
fef4d09fe4
25 измененных файлов с 1188 добавлено и 157 удалено
  1. 15 0
      src/main/java/com/yunfeiyun/agmp/iot/common/constant/cmd/CmdDef.java
  2. 2 2
      src/main/java/com/yunfeiyun/agmp/iot/common/constant/device/ElementFormatUtil.java
  3. 15 2
      src/main/java/com/yunfeiyun/agmp/iot/common/constant/devicetype/IotDeviceDictConst.java
  4. 5 1
      src/main/java/com/yunfeiyun/agmp/iot/common/constant/devicetype/IotDeviceDictEnum.java
  5. 6 0
      src/main/java/com/yunfeiyun/agmp/iot/common/constant/devicetype/ServiceNameConst.java
  6. 41 4
      src/main/java/com/yunfeiyun/agmp/iot/common/constant/mqtt/IotMqttConstant.java
  7. 14 0
      src/main/java/com/yunfeiyun/agmp/iot/common/constant/warn/MsgChannelConsts.java
  8. 134 39
      src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotDevice.java
  9. 28 0
      src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotRunHaoSfdata.java
  10. 62 0
      src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotSfElementfactor.java
  11. 17 0
      src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotSfIrrigationOprecord.java
  12. 55 0
      src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotSfIrrigationRecord.java
  13. 93 34
      src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotWarnindicator.java
  14. 89 32
      src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotWarnlog.java
  15. 4 1
      src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotWarnreceiver.java
  16. 41 0
      src/main/java/com/yunfeiyun/agmp/iot/common/enums/EnumIrrigationRecord.java
  17. 85 0
      src/main/java/com/yunfeiyun/agmp/iot/common/enums/EnumSfElementType.java
  18. 2 1
      src/main/java/com/yunfeiyun/agmp/iot/common/enums/EnumYfQxzElement.java
  19. 0 37
      src/main/java/com/yunfeiyun/agmp/iot/common/enums/warn/IotWarnPolicyChannel.java
  20. 1 0
      src/main/java/com/yunfeiyun/agmp/iot/common/model/device/IotDeviceStatusResVo.java
  21. 9 3
      src/main/java/com/yunfeiyun/agmp/iot/common/service/MongoService.java
  22. 53 0
      src/main/java/com/yunfeiyun/agmp/iot/common/util/dev/DevOperateUtil.java
  23. 63 1
      src/main/java/com/yunfeiyun/agmp/iot/common/util/dev/QxzTypeUtil.java
  24. 30 0
      src/main/java/com/yunfeiyun/agmp/iot/common/util/dev/QxElementTypeUtil.java
  25. 324 0
      src/main/java/com/yunfeiyun/agmp/iot/common/util/dev/RunHaoSfElementUtil.java

+ 15 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/constant/cmd/CmdDef.java

@@ -204,5 +204,20 @@ public class CmdDef {
 
     }
 
+    /**
+     * 润浩水肥指令定义
+     */
+    public class RunHaoSfCmdDef {
+        /**
+         * 修改配置
+         */
+        public final static String CMD_CONFIG = "config";
+
+        public final static String CMD_REFRESH = "refresh";
+
+        public final static String CMD_GROUP_CONFIG = "groupConfig";
+
+    }
+
 
 }

+ 2 - 2
src/main/java/com/yunfeiyun/agmp/iot/common/constant/device/ElementFormatUtil.java

@@ -11,7 +11,7 @@ import com.yunfeiyun.agmp.iot.common.domain.QxzDataDto;
 import com.yunfeiyun.agmp.iot.common.domain.dto.IotElementDto;
 import com.yunfeiyun.agmp.iot.common.enums.EnumAdznGssqElement;
 import com.yunfeiyun.agmp.iot.common.enums.EnumYfQxzElement;
-import com.yunfeiyun.agmp.iot.common.util.dev.QxzTypeUtil;
+import com.yunfeiyun.agmp.iot.common.util.dev.DevTypeUtil;
 import com.yunfeiyun.agmp.iot.common.util.dev.RainfallUtil;
 import com.yunfeiyun.agmp.iot.common.util.dev.WindUtil;
 
@@ -160,7 +160,7 @@ public class ElementFormatUtil {
     private static IotElementDto getElement(IotDevice iotDevice, QxzDataDto dataitem, Map<String, List<Integer>> elementMap){
         IotElementDto iotElementDto = null;
         String devtypeBid = iotDevice.getDevtypeBid();
-        boolean isQxz = QxzTypeUtil.isYfCommQxz(devtypeBid);
+        boolean isQxz = DevTypeUtil.isYfCommQxz(devtypeBid);
         if(isQxz){
             iotElementDto = getYfQxzElement(dataitem, elementMap);
         }else if(IotDeviceDictConst.TYPE_ADZN_GSSQ.equals(devtypeBid)){

+ 15 - 2
src/main/java/com/yunfeiyun/agmp/iot/common/constant/devicetype/IotDeviceDictConst.java

@@ -113,8 +113,7 @@ public class IotDeviceDictConst {
      * 海康安防管理平台监控设备
      * */
     public static final String TYPE_HIK_OPEN_DEVICE = "1103";
-    /**大华云睿平台监控设备*/
-    public static final String TYPE_DAHUA_YUNRUI_DEVICE = "JK00002";
+
     /**
      * 欧标农田水位计
      */
@@ -294,6 +293,8 @@ public class IotDeviceDictConst {
      */
     public static final String TYPE_EZVIZ_JKSB = "JK00001";
 
+    /**大华云睿平台监控设备*/
+    public static final String TYPE_DAHUA_YUNRUI_DEVICE = "JK00002";
 
     /*
      ***********************************************************
@@ -367,4 +368,16 @@ public class IotDeviceDictConst {
      * 带图片 不带控制
      */
     public static final String TYPE_ZJSF_XYCB = "XYCB00005";
+
+
+    /*
+     ***********************************************************
+                               水肥设备
+     ***********************************************************
+     */
+
+    /**
+     * 润浩水肥机
+     */
+    public static final String TYPE_RUNHAO_SF = "SF00001";
 }

+ 5 - 1
src/main/java/com/yunfeiyun/agmp/iot/common/constant/devicetype/IotDeviceDictEnum.java

@@ -106,7 +106,11 @@ public enum IotDeviceDictEnum {
     TYPE_YF_XYCB_III(IotDeviceDictConst.TYPE_YF_XYCB_III, "云飞-性诱测报灯III", ServiceNameConst.SERVICE_YF_XYCB_III, IotDeviceTypeLv1Enum.XYCB),
     TYPE_ZJSF_XYCB(IotDeviceDictConst.TYPE_ZJSF_XYCB, "中捷四方性诱", ServiceNameConst.SERVICE_ZJSF_XYCB, IotDeviceTypeLv1Enum.XYCB),
     /**  宁录性诱测报灯 */
-    TYPE_YF_XYCB_2(IotDeviceDictConst.TYPE_YF_XYCB_2, "云飞-性诱测报灯2.0", ServiceNameConst.SERVICE_YF_XYCB_2, IotDeviceTypeLv1Enum.XYCB);
+    TYPE_YF_XYCB_2(IotDeviceDictConst.TYPE_YF_XYCB_2, "云飞-性诱测报灯2.0", ServiceNameConst.SERVICE_YF_XYCB_2, IotDeviceTypeLv1Enum.XYCB),
+
+
+    /**  润浩水肥机 */
+    TYPE_RUNHAO_SF(IotDeviceDictConst.TYPE_RUNHAO_SF, "润浩水肥机", ServiceNameConst.SERVICE_RUNHAO_SF, IotDeviceTypeLv1Enum.SFJ);
 
     private String code;
     private String name;

+ 6 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/constant/devicetype/ServiceNameConst.java

@@ -194,4 +194,10 @@ public class ServiceNameConst {
      * 云飞吸虫塔设备
      * */
     public static final String SERVICE_YF_XCT = "YF_XCT_SERVICE";
+
+
+    /**
+     * 润浩水肥机
+     */
+    public static final String SERVICE_RUNHAO_SF = "RUNHAO-SF-SERVICE";
 }

+ 41 - 4
src/main/java/com/yunfeiyun/agmp/iot/common/constant/mqtt/IotMqttConstant.java

@@ -2,7 +2,7 @@ package com.yunfeiyun.agmp.iot.common.constant.mqtt;
 
 import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
 import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictEnum;
-import com.yunfeiyun.agmp.iot.common.util.dev.QxzTypeUtil;
+import com.yunfeiyun.agmp.iot.common.util.dev.DevTypeUtil;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -239,11 +239,43 @@ public class IotMqttConstant {
 
     }
 
+
+    /**
+     * 润浩水肥机
+     */
+    public class RunHaoSfTopic {
+
+//        /**
+//         * 系统->设备
+//         */
+//        public final static String TOPIC_YR_SF_CMD_PREFIX = "device/kunluntongtaishuifeiji/set/";
+//
+//        /**
+//         * 设备->系统
+//         */
+//        public final static String TOPIC_RUNHAO_SF_REPORT_PREFIX = "device/kunluntongtaishuifeiji/get/";
+
+        /**
+         * 系统->设备
+         */
+        public final static String TOPIC_RUNHAO_SF_CMD_PREFIX = "device/kunluntongtaishuifeiji/local/set/test/";
+
+        /**
+         * 设备->系统
+         */
+        public final static String TOPIC_RUNHAO_SF_REPORT_PREFIX = "device/kunluntongtaishuifeiji/local/get/test/";
+
+//        /**
+//         * 变化上报
+//         */
+//        public final static String TOPIC_YR_SF_CHANGE_PREFIX =  "/hbyr/sf/change/";
+    }
+
     public static String getReportTopicByDevtype(String devtypeBid){
         String topic = null;
-        if (QxzTypeUtil.isXphYfQxSq(devtypeBid)) {
+        if (DevTypeUtil.isXphYfQxSq(devtypeBid)) {
             topic = XphDeviceTopic.TOPIC_XPH_REPORT_PREFIX;
-        } else if (QxzTypeUtil.isYfQxSq(devtypeBid)) {
+        } else if (DevTypeUtil.isYfQxSq(devtypeBid)) {
             topic = YFQxzTopic.TOPIC_QXZ_REPORT_PREFIX;
         } else{
             switch (devtypeBid){
@@ -262,9 +294,11 @@ public class IotMqttConstant {
                     topic = YFScdTopic.TOPIC_SCD_REPORT_PREFIX;
                     break;
                 case IotDeviceDictConst.TYPE_YF_BZY:
-                case IotDeviceDictConst.TYPE_YF_L_BZY:
                     topic = YFBzyTopic.TOPIC_BZY_REPORT_PREFIX;
                     break;
+                case IotDeviceDictConst.TYPE_YF_L_BZY:
+                    topic = YFBzyTopic.TOPIC_BZY_L_REPORT_PREFIX;
+                    break;
                 case IotDeviceDictConst.TYPE_YF_XYCB_2:
                     topic = YFXycb2Topic.TOPIC_XYCB_2_REPORT_PREFIX;
                     break;
@@ -277,6 +311,9 @@ public class IotMqttConstant {
                 case IotDeviceDictConst.TYPE_YF_XYCB_III:
                     topic = YFXycbIIITopic.TOPIC_XYCB_III_REPORT_PREFIX;
                     break;
+                case IotDeviceDictConst.TYPE_RUNHAO_SF:
+                    topic = RunHaoSfTopic.TOPIC_RUNHAO_SF_REPORT_PREFIX;
+                    break;
             }
         }
         return topic;

+ 14 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/constant/warn/MsgChannelConsts.java

@@ -0,0 +1,14 @@
+package com.yunfeiyun.agmp.iot.common.constant.warn;
+
+/**
+ * 消息通道常量类
+ * APP /短信 SMS /微信 WX /钉钉DD/站内 Web
+ */
+public class MsgChannelConsts {
+
+    public static final String APP = "APP";
+    public static final String SMS = "SMS";
+    public static final String WX = "WX";
+    public static final String DD = "DD";
+    public static final String WEB = "WEB";
+}

+ 134 - 39
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotDevice.java

@@ -1,6 +1,8 @@
 package com.yunfeiyun.agmp.iot.common.domain;
 
 import com.yunfeiyun.agmp.common.annotation.Excel;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.iot.common.enums.EnumCbdRecogType;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -13,154 +15,227 @@ import java.util.List;
  * @date 2024-11-06
  */
 @Data
-public class IotDevice extends IotBaseEntity
-{
+public class IotDevice extends IotBaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 自增主键 */
+    /**
+     * 自增主键
+     */
     private Long id;
 
-    /** 设备业务标识 */
+    /**
+     * 设备业务标识
+     */
     @Excel(name = "设备业务标识")
     private String devBid;
 
-    /** 租户id */
+    /**
+     * 租户id
+     */
     @Excel(name = "租户id")
     private String tid;
 
-    /** 设备类型标识 */
+    /**
+     * 设备类型标识
+     */
     @Excel(name = "设备型号标识")
     private String devtypeBid;
 
-    /** 厂商信息标识 */
+    /**
+     * 厂商信息标识
+     */
     @Excel(name = "厂商信息标识")
     private String firmBid;
 
-    /** 设备大类标识 */
+    /**
+     * 设备大类标识
+     */
     @Excel(name = "设备类型标识")
     private String devclassBid;
 
-    /** 连接配置标识 */
+    /**
+     * 连接配置标识
+     */
     @Excel(name = "连接配置标识")
     private String devconnBid;
 
-    /** 设备编号 */
+    /**
+     * 设备编号
+     */
     @Excel(name = "设备型号名称")
     private String devtypeName;
 
-    /** 设备名称 */
+    /**
+     * 设备名称
+     */
     @Excel(name = "设备类型名称")
     private String devclassName;
 
-    /** 设备编号 */
+    /**
+     * 设备编号
+     */
     @Excel(name = "设备编号")
     private String devCode;
 
-    /** 设备名称 */
+    /**
+     * 设备名称
+     */
     @Excel(name = "设备名称")
     private String devName;
 
-    /** 设备版本 */
+    /**
+     * 设备版本
+     */
     @Excel(name = "设备版本")
     private String devVersion;
 
-    /** 设备状态 */
+    /**
+     * 设备状态
+     */
     @Excel(name = "设备状态")
     private String devStatus;
 
-    /** 省 根据经纬度获取  */
+    /**
+     * 省 根据经纬度获取
+     */
     @Excel(name = "省 根据经纬度获取 ")
     private String devProvince;
 
-    /** 市 */
+    /**
+     * 市
+     */
     @Excel(name = "市")
     private String devCity;
 
-    /** 县 */
+    /**
+     * 县
+     */
     @Excel(name = "县")
     private String devDistrict;
 
-    /** 经度 设备上报 */
+    /**
+     * 经度 设备上报
+     */
     @Excel(name = "经度 设备上报")
     private BigDecimal devLng;
 
-    /** 纬度 */
+    /**
+     * 纬度
+     */
     @Excel(name = "纬度")
     private BigDecimal devLat;
 
-    /** 定位状态 */
+    /**
+     * 定位状态
+     */
     @Excel(name = "定位状态")
     private String devPositionstatus;
 
-    /** 定位类型 */
+    /**
+     * 定位类型
+     */
     @Excel(name = "定位类型")
     private String devPositiontype;
 
-    /** 设备标记 */
+    /**
+     * 设备标记
+     */
     @Excel(name = "设备标记")
     private String devTag;
 
-    /** 识别类型 */
+    /**
+     * 识别类型
+     */
     @Excel(name = "识别类型")
     private String devRecogtype;
 
-    /** 联网方式 */
+    /**
+     * 联网方式
+     */
     @Excel(name = "联网方式")
     private String devNetworktype;
 
-    /** 离线时间 */
+    /**
+     * 离线时间
+     */
     @Excel(name = "离线时间")
     private String devOfflinedate;
 
-    /** 省 手动校准 */
+    /**
+     * 省 手动校准
+     */
     @Excel(name = "省 手动校准")
     private String devProvincealign;
 
-    /** 市(校准) */
+    /**
+     * 市(校准)
+     */
     @Excel(name = "市", readConverterExp = "校=准")
     private String devCityalign;
 
-    /** 县(校准) */
+    /**
+     * 县(校准)
+     */
     @Excel(name = "县", readConverterExp = "校=准")
     private String devDistrictalign;
 
-    /** 经度 手动校准 */
+    /**
+     * 经度 手动校准
+     */
     @Excel(name = "经度 手动校准")
     private BigDecimal devLngalign;
 
-    /** 纬度(校准) */
+    /**
+     * 纬度(校准)
+     */
     @Excel(name = "纬度", readConverterExp = "校=准")
     private BigDecimal devLatalign;
 
-    /** 联系人 */
+    /**
+     * 联系人
+     */
     @Excel(name = "联系人")
     private String devContacts;
 
-    /** 联系方式 */
+    /**
+     * 联系方式
+     */
     @Excel(name = "联系方式")
     private String devTel;
 
-    /** 创建人 */
+    /**
+     * 创建人
+     */
     @Excel(name = "创建人")
     private String devCreator;
 
-    /** 修改人 */
+    /**
+     * 修改人
+     */
     @Excel(name = "修改人")
     private String devModifier;
 
-    /** 更新时间 设备上报数据的时间 */
+    /**
+     * 更新时间 设备上报数据的时间
+     */
     @Excel(name = "更新时间 设备上报数据的时间")
     private String devUpdateddate;
 
-    /** 修改时间 修改设备信息的时间 */
+    /**
+     * 修改时间 修改设备信息的时间
+     */
     @Excel(name = "修改时间 修改设备信息的时间")
     private String devModifieddate;
 
-    /** 创建时间 */
+    /**
+     * 创建时间
+     */
     @Excel(name = "创建时间")
     private String devCreateddate;
 
-    /** 删除状态 */
+    /**
+     * 删除状态
+     */
     @Excel(name = "删除状态")
     private String devDelstatus;
     private String devOnlinedate;
@@ -170,4 +245,24 @@ public class IotDevice extends IotBaseEntity
     private String devHostingstatus;
 
     private List<String> devtypeBidList;
+    /**
+     * 没改设备状态前,设备的状态
+     */
+    private String devOriginalStatus;
+
+
+    /**
+     * 测报灯模型识别类型
+     * 1是A模型,2是B模型
+     */
+    private String devCbdrecogtype;
+
+    public String getDevCbdrecogtype() {
+        if (StringUtils.isEmpty(devCbdrecogtype)) {
+            return EnumCbdRecogType.B.getCode();
+        }
+        return devCbdrecogtype;
+    }
+
+    private List<String> devCodeList;
 }

+ 28 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotRunHaoSfdata.java

@@ -0,0 +1,28 @@
+package com.yunfeiyun.agmp.iot.common.domain;
+
+
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * mongo
+ * 润浩水肥机上报数据
+ */
+@Data
+@TableName("IotRunHaoSfdata")
+public class IotRunHaoSfdata extends IotBaseEntity{
+
+    private String id;
+
+    private String cId;
+
+    private String sfdataBid;
+
+    private String devBid;
+
+    private JSONObject sfdataContent;
+
+    private String sfdataCreatedDate;
+
+}

+ 62 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotSfElementfactor.java

@@ -0,0 +1,62 @@
+package com.yunfeiyun.agmp.iot.common.domain;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 水肥机要素
+ */
+@Data
+public class IotSfElementfactor extends IotBaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 自增主键 */
+    private Long id;
+
+    /** 业务标识 */
+    private String sfBid;
+
+    /** 设备编号 */
+    private String devBid;
+
+    /** 水肥要素类型 */
+    private String sfType;
+
+    /** 原始名称 */
+    private String sfName;
+
+    /** 显示名称 */
+    private String sfDisplayname;
+
+    /** 要素编码 */
+    private String sfCode;
+
+    /** 父类id */
+    private String sfParentBid;
+
+    /** 排序字段 默认0 */
+    private Integer sfSequence;
+
+    /** 租户ID */
+    private String tid;
+
+    /** 创建时间 */
+    private String sfCreatedDate;
+
+    /** 创建人 */
+    private String sfCreator;
+
+    /** 修改时间 */
+    private String sfModifieddate;
+    /** 修改人 */
+    private String sfModifier;
+
+    /** 纬度 */
+    private BigDecimal sfLat;
+    /** 经度 */
+    private BigDecimal sfLng;
+
+    /** 地址 */
+    private String sfAddress;
+}

+ 17 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotSfIrrigationOprecord.java

@@ -0,0 +1,17 @@
+package com.yunfeiyun.agmp.iot.common.domain;
+
+import lombok.Data;
+
+@Data
+public class IotSfIrrigationOprecord extends IotBaseEntity {
+
+    private Integer id; // 自增id
+    private String oprcdBid; // 唯一标识
+    private String devBid; // 设备标识
+    private String oprecdName; // 操作名称
+    private String oprecdContent; // 操作内容
+    private String oprecdStatus; // 操作状态 0 关闭 1 打开
+    private String oprcdCreatorName; // 操作用户名称
+    private String oprcdCreateddate; // 创建时间
+    private String tid;
+}

+ 55 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotSfIrrigationRecord.java

@@ -0,0 +1,55 @@
+package com.yunfeiyun.agmp.iot.common.domain;
+
+import lombok.Data;
+@Data
+public class IotSfIrrigationRecord extends IotBaseEntity {
+    // 唯一标识
+    private String rcdBid;
+
+    // 设备标识
+    private String devBid;
+
+    // 灌溉详情
+    private String rcdContent;
+
+    // 灌区标识
+    private String rcdGroupbid;
+
+    // 灌区名称
+    private String rcdGroupName;
+
+    // 灌溉状态 0 进行中 1 已完成
+    private String rcdStatus;
+
+    // 灌溉模式 0 手动 1 自动
+    private String rcdMode;
+
+    // 灌溉数据标识
+    private String sfdataBid;
+
+    // 灌溉流量
+    private Double rcdFlow;
+
+    // 创建人
+    private String rcdCreator;
+
+    // 开始时间
+    private String rcdStartdate;
+
+    // 结束时间
+    private String rcdEnddate;
+
+    // 创建人名称
+    private String rcdCreatorName;
+
+    // 创建时间
+    private String rcdCreateddate;
+
+    private String tid;
+    // 灌溉时长(分)
+    private int rcdTime;
+
+    // 灌溉肥料详情
+    private String rcdFertilizer;
+
+}

+ 93 - 34
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotWarnindicator.java

@@ -1,13 +1,13 @@
 package com.yunfeiyun.agmp.iot.common.domain;
 
-import com.yunfeiyun.agmp.common.core.domain.BaseEntity;
-import org.hibernate.validator.constraints.Length;
 import lombok.Data;
-import com.yunfeiyun.agmp.common.annotation.Excel;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.List;
 
 /**
  * 告警指标,存储所有与告警相关的指标信息对象 IotWarnindicator
- * 
+ *
  * @author 杨晓辉
  * @date 2025-03-07
  */
@@ -15,65 +15,124 @@ import com.yunfeiyun.agmp.common.annotation.Excel;
 public class IotWarnindicator extends IotBaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 自增主键 */
+    /**
+     * 自增主键
+     */
     private Long id;
 
-    /** 告警指标业务标识 */
-    @Length(max = 36 , message = "告警指标业务标识最大长度为36")
+    /**
+     * 告警指标业务标识
+     */
+    @Length(max = 36, message = "告警指标业务标识最大长度为36")
     private String wiBid;
 
-    /** 告警标识 */
-    @Length(max = 36 , message = "告警标识最大长度为36")
+    /**
+     * 告警标识
+     */
+    @Length(max = 36, message = "告警标识最大长度为36")
     private String wcBid;
 
-    /** 告警要素 */
-    @Length(max = 36 , message = "告警要素最大长度为36")
+    /**
+     * 告警要素
+     */
+    @Length(max = 36, message = "告警要素最大长度为36")
     private String wdBid;
 
-    /** 通道地址 */
-    @Length(max = 45 , message = "通道地址最大长度为36")
+    /**
+     * 通道地址
+     */
+    @Length(max = 45, message = "通道地址最大长度为36")
     private String wiAddress;
-    /** 要素编码 */
-    @Length(max = 45 , message = "要素编码最大长度为36")
+    /**
+     * 要素编码
+     */
+    @Length(max = 45, message = "要素编码最大长度为36")
     private String wiCode;
 
-    /** 要素名称 */
-    @Length(max = 45 , message = "要素名称最大长度为36")
+    /**
+     * 要素名称
+     */
+    @Length(max = 45, message = "要素名称最大长度为36")
     private String wiName;
 
-    /** 要素单位 */
-    @Length(max = 10 , message = "要素单位最大长度为10")
+    /**
+     * 要素单位
+     */
+    @Length(max = 10, message = "要素单位最大长度为10")
     private String wiUnit;
 
-    /** 指标表达式,例如:大于/大于等于/小于/小于等于/范围/等于/不在范围 */
-    @Length(max = 50 , message = "指标表达式,例如:大于/大于等于/小于/小于等于/范围/等于/不在范围最大长度为50")
+    /**
+     * 指标表达式,例如:大于/大于等于/小于/小于等于/范围/等于/不在范围
+     */
+    @Length(max = 50, message = "指标表达式,例如:大于/大于等于/小于/小于等于/范围/等于/不在范围最大长度为50")
     private String wiExpression;
 
-    /** 指标值,例如:10/10-100 */
-    @Length(max = 100 , message = "指标值,例如:10/10-100最大长度为100")
+    /**
+     * 指标值,例如:10/10-100
+     */
+    @Length(max = 100, message = "指标值,例如:10/10-100最大长度为100")
     private String wiValue;
 
-    @Length(max = 1,message = "指标状态最大长度为1")
+    @Length(max = 1, message = "指标状态最大长度为1")
     private String wiStatus;
 
-    /** 创建人 */
-    @Length(max = 36 , message = "创建人最大长度为36")
+    /**
+     * 创建人
+     */
+    @Length(max = 36, message = "创建人最大长度为36")
     private String wiCreator;
 
-    /** 创建时间 */
-    @Length(max = 19 , message = "创建时间最大长度为19")
+    /**
+     * 创建时间
+     */
+    @Length(max = 19, message = "创建时间最大长度为19")
     private String wiCreateddate;
 
-    /** 更新时间 */
-    @Length(max = 19 , message = "更新时间最大长度为19")
+    /**
+     * 更新时间
+     */
+    @Length(max = 19, message = "更新时间最大长度为19")
     private String wiModifieddate;
 
-    /** 更新人 */
-    @Length(max = 36 , message = "更新人最大长度为36")
+    /**
+     * 更新人
+     */
+    @Length(max = 36, message = "更新人最大长度为36")
     private String wiModifier;
 
-    /** 租户标识 */
-    @Length(max = 36 , message = "租户标识最大长度为36")
+    /**
+     * 租户标识
+     */
+    @Length(max = 36, message = "租户标识最大长度为36")
     private String tid;
 
+    /**
+     * 数据项选项类型
+     * 0 默认 没有子要素
+     * 1 有子要素
+     */
+    private String wiOptiontype;
+
+    /**
+     * 关联的指标父类的 bid
+     */
+    private String wiParentbid;
+
+    /**
+     * 子指标列表
+     */
+    private List<IotWarnindicator> childrenList;
+
+    private String typeName;
+
+    private String devCode;
+
+    private String devtypeBid;
+    private String devBid;
+
+    /**
+     * 关联的指标父类的 bid
+     */
+    private List<String> wiParentbidList;
+
 }

+ 89 - 32
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotWarnlog.java

@@ -6,75 +6,132 @@ import com.yunfeiyun.agmp.common.annotation.Excel;
 
 /**
  * 告警记录对象 IotWarnrecord
- * 
+ *
  * @author 杨晓辉
  * @date 2025-03-07
  */
 @Data
-public class IotWarnlog extends IotBaseEntity{
+public class IotWarnlog extends IotBaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 自增主键 */
+    /**
+     * 自增主键
+     */
     private Long id;
 
-    /** 告警记录标识 */
-    @Length(max = 36 , message = "告警记录标识最大长度为36")
+    /**
+     * 告警记录标识
+     */
+    @Length(max = 36, message = "告警记录标识最大长度为36")
     private String wlBid;
 
-    /** 告警名称 */
-    @Length(max = 100 , message = "告警名称最大长度为100")
+    /**
+     * 告警名称
+     */
+    @Length(max = 100, message = "告警名称最大长度为100")
     private String wlName;
 
-    /** 告警名称 */
-    @Length(max = 100 , message = "告警名称最大长度为100")
+    /**
+     * 告警名称
+     */
+    @Length(max = 100, message = "告警名称最大长度为100")
     private String wcBid;
 
-    /** 告警类型 */
-    @Length(max = 50 , message = "告警类型最大长度为50")
+    /**
+     * 告警类型
+     */
+    @Length(max = 50, message = "告警类型最大长度为50")
     private String wlType;
 
-    /** 告警内容 */
-    @Length(max = 50 , message = "告警内容最大长度为50")
+    /**
+     * 告警内容
+     */
+    @Length(max = 50, message = "告警内容最大长度为50")
     private String wlContent;
 
-    /** 告警等级《普通/重要/紧急》 */
-    @Length(max = 1 , message = "告警等级《普通/重要/紧急》最大长度为1")
+    /**
+     * 告警等级《普通/重要/紧急》
+     */
+    @Length(max = 1, message = "告警等级《普通/重要/紧急》最大长度为1")
     private String wlLevel;
 
-    /** 设备型号 */
-    @Length(max = 50 , message = "设备型号最大长度为50")
+    /**
+     * 设备型号
+     */
+    @Length(max = 50, message = "设备型号最大长度为50")
     private String devtypeBid;
 
-    /** 设备ID */
-    @Length(max = 36 , message = "设备ID最大长度为36")
+    /**
+     * 设备ID
+     */
+    @Length(max = 36, message = "设备ID最大长度为36")
     private String devBid;
 
-    /** 处理状态,表示当前告警的状态(如未处理、已处理等) */
+    /**
+     * 处理状态,表示当前告警的状态(如未处理、已处理等)
+     */
     @Excel(name = "处理状态,表示当前告警的状态", readConverterExp = "如=未处理、已处理等")
     private String status;
 
-    /** 处理人 */
-    @Length(max = 36 , message = "处理人最大长度为36")
+    /**
+     * 处理人
+     */
+    @Length(max = 36, message = "处理人最大长度为36")
     private String wlDealuserid;
 
-    /** 处理结果 */
-    @Length(max = 200 , message = "处理结果最大长度为200")
+    /**
+     * 处理结果
+     */
+    @Length(max = 200, message = "处理结果最大长度为200")
     private String wlDealresult;
 
-    /** 处理时间 */
-    @Length(max = 19 , message = "处理时间最大长度为19")
+    /**
+     * 处理时间
+     */
+    @Length(max = 19, message = "处理时间最大长度为19")
     private String wlDealtime;
 
-    /** 创建时间 */
-    @Length(max = 19 , message = "创建时间最大长度为19")
+    /**
+     * 创建时间
+     */
+    @Length(max = 19, message = "创建时间最大长度为19")
     private String wlCreateddate;
 
-    /** 上报数据冗余存储 */
-    @Length(max = 65535 , message = "上报数据冗余存储最大长度为65535")
+    /**
+     * 上报数据冗余存储
+     */
+    @Length(max = 65535, message = "上报数据冗余存储最大长度为65535")
     private String wlData;
 
-    /** 租户标识 */
-    @Length(max = 36 , message = "租户标识最大长度为36")
+    /**
+     * 租户标识
+     */
+    @Length(max = 36, message = "租户标识最大长度为36")
     private String tid;
 
+
+    /**
+     * 发送时间
+     */
+
+    private String wlSendmsgtime;
+    /**
+     * 发送状态
+     * 未发送0:比如因为不到发送时间端,导致未发送
+     * 已发送(默认)1:消息已经通过mq发送至门户
+     * 发送失败2:消息在发送至门户过程出现问题,失败
+     * 处理成功3:任务已经处理成功(预留状态,与批次表对照)
+     * 处理失败4:任务处理失败(预留状态,与批次表对照)
+     */
+    private String wlSendmsgstatus;
+
+    /**
+     * 补发状态,WarnLogReSendStatus Enum枚举类型,0:未补发;1:已补发
+     */
+
+    private String wlReSendStatus;
+    /**
+     * 补发信息,预留字段,存储补发的时间
+     */
+    private String wlSendinfo;
 }

+ 4 - 1
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotWarnreceiver.java

@@ -7,7 +7,7 @@ import com.yunfeiyun.agmp.common.annotation.Excel;
 
 /**
  * 告警接收者对象 IotWarnreceiver
- * 
+ *
  * @author 杨晓辉
  * @date 2025-03-07
  */
@@ -33,5 +33,8 @@ public class IotWarnreceiver extends IotBaseEntity {
     /** 租户标识 */
     @Length(max = 36 , message = "租户标识最大长度为36")
     private String tid;
+    /** 接收者名称 */
+    private String userName;
+    private String userMobile;
 
 }

+ 41 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/enums/EnumIrrigationRecord.java

@@ -0,0 +1,41 @@
+package com.yunfeiyun.agmp.iot.common.enums;
+
+public enum EnumIrrigationRecord {
+
+    STATUS_RUNNING("0", "灌溉进行中"),
+    STATUS_FINISHED("1", "灌溉已完成"),
+    MODE_MANUAL("0", "手动"),
+    MODE_AUTO("1", "自动");
+
+    private final String code;
+    private final String name;
+
+    EnumIrrigationRecord(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * 根据code查找
+     * @param code 枚举code
+     * @return 枚举对象
+     */
+    public static EnumIrrigationRecord findEnumByCode(String code) {
+        for (EnumIrrigationRecord item : EnumIrrigationRecord.values()) {
+            if (item.getCode().equals(code)) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 85 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/enums/EnumSfElementType.java

@@ -0,0 +1,85 @@
+package com.yunfeiyun.agmp.iot.common.enums;
+
+/**
+ * 水肥机要素类型
+ */
+public enum EnumSfElementType {
+
+    /**
+     * 逻辑区域,电磁阀的分组
+     */
+    GROUP("7", "灌区", "group"),
+
+    /**
+     * 水肥机上的 温度,压力,流速,PH EC等监测类要素
+     */
+    SENSOR("6", "传感器", "sensor"),
+
+    /**
+     * 管道最末端每个田地里控制出水的阀门
+     */
+    SOLENOID_VALVE("5", "电磁阀", "solenoid_valve"),
+
+    /**
+     * 肥料桶,每个施肥机有多个或者没有,不一定真实存在,只是逻辑上的概念
+     */
+    FERTILIZER_BUCKET("4", "肥料桶", "fertilizer_bucket"),
+
+    /**
+     * 肥料桶的搅拌电机或者泵 每个肥料桶一个
+     */
+    MIXING("3", "搅拌", "mixing"),
+
+    /**
+     * 控制肥料桶出肥的阀或者泵,每个肥料桶一个
+     */
+    SUCTION("2", "吸肥", "suction"),
+
+    /**
+     * 负责肥料进入管道的总阀或者泵
+     */
+    FERTILIZER("1", "肥料", "fertilizer"),
+
+    /**
+     * 负责水源进入管道的总泵或者阀
+     */
+    WATER_SOURCE("0", "水源", "water_source");
+
+    private final String code;
+    private final String name;
+    private final String type;
+
+    EnumSfElementType(String code, String name, String type) {
+        this.code = code;
+        this.name = name;
+        this.type = type;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * 根据code查找
+     * @param code 枚举code
+     * @return 枚举对象
+     */
+    public static EnumSfElementType findEnumByCode(String code) {
+        for (EnumSfElementType item : EnumSfElementType.values()) {
+            if (item.getCode().equals(code)) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 2 - 1
src/main/java/com/yunfeiyun/agmp/iot/common/enums/EnumYfQxzElement.java

@@ -82,7 +82,8 @@ public enum EnumYfQxzElement {
     TYPE73("211","电导率","mS/cm"),
     TYPE74("220","土壤电导率","mS/cm")/*新浦会-土壤水势*/,
     TYPE75("277","土壤水势","KPa")/*新浦会-土壤水势,  跟201重复了,废弃201 */,
-    TYPE223("223","溶解氧","mg/L");
+    TYPE223("223","溶解氧","mg/L"),
+    TYPE178("178","电导率","mS/cm");
 
     private String eNum;
     private String cName;

+ 0 - 37
src/main/java/com/yunfeiyun/agmp/iot/common/enums/warn/IotWarnPolicyChannel.java

@@ -1,37 +0,0 @@
-package com.yunfeiyun.agmp.iot.common.enums.warn;
-
-import com.yunfeiyun.agmp.common.utils.StringUtils;
-
-public enum IotWarnPolicyChannel {
-    APP("0","APP"),
-    SMS("1","短信"),
-    WECHAT("2","微信"),
-    DING_TALK("3","钉钉"),
-    STATION_MSG("4","站内信");
-
-    private String code;
-    private String content;
-
-    IotWarnPolicyChannel(String code,String content){
-        this.code = code;
-        this.content = content;
-    }
-    public String getContent(){
-        return this.content;
-    }
-    public String getCode(){
-        return this.code;
-    }
-
-    public static IotWarnPolicyChannel findByCode(String code){
-        if(StringUtils.isEmpty(code)){
-            return null;
-        }
-        for(IotWarnPolicyChannel iotWarnPolicyChannel : IotWarnPolicyChannel.values()){
-            if(iotWarnPolicyChannel.code.equals(code)){
-                return iotWarnPolicyChannel;
-            }
-        }
-        return null;
-    }
-}

+ 1 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/model/device/IotDeviceStatusResVo.java

@@ -115,5 +115,6 @@ public class IotDeviceStatusResVo {
     private String devCreateddate;
 
     private String devconnBid;
+    private String tid;
 
 }

+ 9 - 3
src/main/java/com/yunfeiyun/agmp/iot/common/service/MongoService.java

@@ -250,8 +250,7 @@ public class  MongoService<T>{
     private Query processOrderby(Query query, String orderBy){
         if(!TextUtils.isEmpty(orderBy)){
             String[] orderbyList = orderBy.split(",");
-            for (String orderbyItem:orderbyList
-            ) {
+            for (String orderbyItem:orderbyList) {
                 if(!TextUtils.isEmpty(orderbyItem)){
                     if(orderbyItem.contains(" ")){
 
@@ -365,7 +364,11 @@ public class  MongoService<T>{
         // 排序
         String field = queryRequest.getOrderByColumn();
         if (!StringUtils.isEmpty(field)) {
-            query.with(Sort.by(getOrder(queryRequest)));
+            if(field.split(",").length>1){
+                query = processOrderby(query,field);
+            }else{
+                query.with(Sort.by(getOrder(queryRequest)));
+            }
         }
 
         //设置总数
@@ -480,6 +483,9 @@ public class  MongoService<T>{
                 criteria.and(key.split("_")[1]).lte(value);
             } else if (key.startsWith("array")) {
                 criteria.and(key.split("_")[1]).in(value);
+            } else if (key.startsWith("timeStr")) {//字段类型是int或string的
+                String[] split = value.toString().split(",");//时间戳(秒)
+                criteria.and(key.split("_")[1]).gte(split[0]).lte(split[1]);
             } else if (key.startsWith("time")) {//字段类型是int或string的
                 String[] split = value.toString().split(",");//时间戳(秒)
                 if (split[0].matches("^-?\\d+$") && split[1].matches("^-?\\d+$")) {

+ 53 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/util/dev/DevOperateUtil.java

@@ -0,0 +1,53 @@
+package com.yunfeiyun.agmp.iot.common.util.dev;
+
+import com.yunfeiyun.agmp.common.constant.ErrorCode;
+import com.yunfeiyun.agmp.iot.common.constant.IotErrorCode;
+import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
+import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import com.yunfeiyun.agmp.iot.common.enums.IotDeviceStatusTypeEnum;
+import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
+
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+public class DevOperateUtil {
+    /**
+     * 在线检测
+     * @param iotDevice
+     * @return
+     */
+    public static void sendConfigCmdCheck(IotDevice iotDevice) {
+        if(iotDevice == null){
+            throw new IotBizException(ErrorCode.INVALID_PARAMETER.getCode(),"设备不存在");
+        }
+        String devtypeBid = iotDevice.getDevtypeBid();
+        Set<String> devtypeBidSet = new HashSet<>();
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_SQZ);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_QXZ);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_CBD);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_SDCBD);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_GKCBD);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_XCT);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_SCD);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_FXSSCD);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_JGFXSSCD);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_BZY);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_L_BZY);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_YF_XYCB_III);
+        devtypeBidSet.add(IotDeviceDictConst.TYPE_RUNHAO_SF);
+
+        if(!devtypeBidSet.contains(devtypeBid)){
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "暂不支持该此操作");
+        }
+
+        String devStatus = iotDevice.getDevStatus();
+        IotDeviceStatusTypeEnum iotDeviceStatusTypeEnum = IotDeviceStatusTypeEnum.findEnumByCode(devStatus);
+        if(iotDeviceStatusTypeEnum == null){
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "设备状态异常");
+        }
+        if(!Objects.equals(devStatus, IotDeviceStatusTypeEnum.ONLINE.getCode())){
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "设备" + iotDeviceStatusTypeEnum.getName() + "无法操作");
+        }
+    }
+}

+ 63 - 1
src/main/java/com/yunfeiyun/agmp/iot/common/util/dev/QxzTypeUtil.java

@@ -2,7 +2,7 @@ package com.yunfeiyun.agmp.iot.common.util.dev;
 
 import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
 
-public class QxzTypeUtil {
+public class DevTypeUtil {
     public static boolean isXphYfQxSq(String devtypeBid){
         boolean isQxz = false;
         switch (devtypeBid){
@@ -29,6 +29,21 @@ public class QxzTypeUtil {
         return isQxz;
     }
 
+    public static boolean isQxSq(String devtypeBid){
+        boolean isQxz = false;
+        switch (devtypeBid){
+            case IotDeviceDictConst.TYPE_YF_QXZ:
+            case IotDeviceDictConst.TYPE_YF_SQZ:
+            case IotDeviceDictConst.TYPE_XPH_YF_QXZ:
+            case IotDeviceDictConst.TYPE_XPH_YF_SQZ:
+            case IotDeviceDictConst.TYPE_XPH_YF_GSSQ:
+            case IotDeviceDictConst.TYPE_ADZN_GSSQ:
+                isQxz = true;
+                break;
+        }
+        return isQxz;
+    }
+
     public static boolean isYfQxSq(String devtypeBid){
         boolean isQxz = false;
         switch (devtypeBid){
@@ -40,6 +55,53 @@ public class QxzTypeUtil {
         return isQxz;
     }
 
+    public static boolean isYfCbd(String devtypeBid){
+        boolean isCbd = false;
+        switch (devtypeBid){
+            case IotDeviceDictConst.TYPE_YF_CBD:
+            case IotDeviceDictConst.TYPE_YF_SDCBD:
+            case IotDeviceDictConst.TYPE_YF_GKCBD:
+            case IotDeviceDictConst.TYPE_YF_XCT:
+                isCbd = true;
+                break;
+        }
+        return isCbd;
+    }
+
+    /**
+     * 是否是云飞带识别的虫情测报灯
+     * @param devtypeBid
+     * @return
+     */
+    public static boolean isYfRecogCbd(String devtypeBid){
+        boolean isCbd = false;
+        switch (devtypeBid){
+            case IotDeviceDictConst.TYPE_YF_CBD:
+            case IotDeviceDictConst.TYPE_YF_SDCBD:
+            case IotDeviceDictConst.TYPE_YF_XCT:
+                isCbd = true;
+                break;
+        }
+        return isCbd;
+    }
+    /**
+     * 是否是云飞带识别的虫情测报灯
+     * @param devtypeBid
+     * @return
+     */
+    public static boolean isYbd(String devtypeBid){
+        boolean isYbd = false;
+        switch (devtypeBid){
+            case IotDeviceDictConst.TYPE_HS_YBQ_BFB:
+            case IotDeviceDictConst.TYPE_HS_YBQ_CMB:
+            case IotDeviceDictConst.TYPE_HS_YBQ_DBB:
+            case IotDeviceDictConst.TYPE_HS_YBQ_DWB:
+            case IotDeviceDictConst.TYPE_HS_YBQ_TXB:
+                isYbd = true;
+                break;
+        }
+        return isYbd;
+    }
     public static String[] getAllQxzTypes(){
         return new String[]{IotDeviceDictConst.TYPE_YF_QXZ, IotDeviceDictConst.TYPE_XPH_YF_QXZ};
     }

+ 30 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/util/dev/QxElementTypeUtil.java

@@ -0,0 +1,30 @@
+package com.yunfeiyun.agmp.iot.common.util.dev;
+
+import com.yunfeiyun.agmp.iot.common.enums.EnumYfQxzElement;
+
+public class QxElementTypeUtil {
+    public static String getTypeName(String eNum){
+        String typeName = null;
+        EnumYfQxzElement element = EnumYfQxzElement.findEnumByeNum(eNum);
+        if(element == null){
+            return null;
+        }
+        switch (element){
+            case TYPE7:
+            case TYPE32:
+            case TYPE33:
+            case TYPE45:
+                typeName = "WindSpeed";
+                break;
+            case TYPE8:
+                typeName = "WindDirection";
+                break;
+            case TYPE4:
+            case TYPE14:
+                typeName = "Rainfall";
+                break;
+
+        }
+        return typeName;
+    }
+}

+ 324 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/util/dev/RunHaoSfElementUtil.java

@@ -0,0 +1,324 @@
+package com.yunfeiyun.agmp.iot.common.util.dev;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.yunfeiyun.agmp.iot.common.domain.IotSfElementfactor;
+import com.yunfeiyun.agmp.iot.common.enums.EnumSfElementType;
+
+import java.util.*;
+
+public class RunHaoSfElementUtil {
+
+    /**
+     * 获取泵类型映射表
+     *
+     * @return 泵类型映射表,键为泵类型的标识,值为泵类型对应的枚举值
+     */
+    public static Map<String, EnumSfElementType> getPumpTypeMap() {
+        Map<String, EnumSfElementType> sfElementMap = new HashMap<>();
+        sfElementMap.put("Btn-ggbs", EnumSfElementType.WATER_SOURCE);
+        sfElementMap.put("Btn-sfbs", EnumSfElementType.FERTILIZER);
+        sfElementMap.put("Btn-fs", EnumSfElementType.SUCTION);
+        sfElementMap.put("Btn-js", EnumSfElementType.MIXING);
+
+        return sfElementMap;
+    }
+
+    /**
+     * 获取灌区类型映射表
+     *
+     * @return
+     */
+    public static Map<String, EnumSfElementType> getGroupTypeMap() {
+        Map<String, EnumSfElementType> sfElementMap = new HashMap<>();
+        sfElementMap.put("Btn-qx", EnumSfElementType.GROUP);
+
+        return sfElementMap;
+    }
+
+
+    /**
+     * 获取电磁阀类型映射表
+     *
+     * @return
+     */
+    public static Map<String, EnumSfElementType> getValveTypeMap() {
+        Map<String, EnumSfElementType> sfElementMap = new HashMap<>();
+        sfElementMap.put("Btn-fa", EnumSfElementType.SOLENOID_VALVE);
+
+        return sfElementMap;
+    }
+
+    /**
+     * 获取传感器类型映射表
+     *
+     * @return
+     */
+    public static Map<String, EnumSfElementType> getSensorTypeMap() {
+        Map<String, EnumSfElementType> sfElementMap = new HashMap<>();
+        sfElementMap.put("Num-ph", EnumSfElementType.SENSOR);
+        sfElementMap.put("Num-ec", EnumSfElementType.SENSOR);
+        sfElementMap.put("Num-sw", EnumSfElementType.SENSOR);
+        sfElementMap.put("Num-gdyl", EnumSfElementType.SENSOR);
+
+        return sfElementMap;
+    }
+
+    /**
+     * 获取水泵名称映射表
+     *
+     * @return 水泵名称映射表,Map<String, String>类型,键为水泵的简写,值为对应的水泵名称
+     */
+    public static Map<String, String> getPumpNameMap() {
+        Map<String, String> sfElementMap = new HashMap<>();
+        sfElementMap.put("Btn-ggbs", "灌溉泵");
+        sfElementMap.put("Btn-sfbs", "施肥泵");
+        sfElementMap.put("Btn-fs", "肥阀");
+        sfElementMap.put("Btn-js", "搅拌电机");
+
+        return sfElementMap;
+    }
+
+    /**
+     * 获取灌区名称映射表
+     *
+     * @return
+     */
+    public static Map<String, String> getGroupNameMap() {
+        Map<String, String> sfElementMap = new HashMap<>();
+        sfElementMap.put("Btn-qx", "区");
+        return sfElementMap;
+    }
+
+
+    /**
+     * 获取电磁阀名称映射表
+     *
+     * @return
+     */
+    public static Map<String, String> getValveNameMap() {
+        Map<String, String> sfElementMap = new HashMap<>();
+        sfElementMap.put("Btn-fa", "井阀");
+
+        return sfElementMap;
+    }
+
+    /**
+     * 获取传感器名称映射表
+     *
+     * @return
+     */
+    public static Map<String, String> getSensorNameMap() {
+        Map<String, String> sfElementMap = new HashMap<>();
+        sfElementMap.put("Num-ph", "PH");
+        sfElementMap.put("Num-ec", "EC");
+        sfElementMap.put("Num-sw", "水温");
+        sfElementMap.put("Num-gdyl", "管道压力");
+        return sfElementMap;
+    }
+
+    /**
+     * 根据键名获取泵类设备IotSfElementfactor对象
+     *
+     * @param key 设备元素因子的键名
+     * @return 设备元素因子对象,如果无法解析则返回null
+     */
+    public static IotSfElementfactor getPumpElementFactor(String key) {
+
+        IotSfElementfactor sfElementfactor = new IotSfElementfactor();
+        String sfName = null;
+        EnumSfElementType elementType = null;
+        Map<String, String> sfNameMap = getPumpNameMap();
+        Map<String, EnumSfElementType> sfTypeMap = getPumpTypeMap();
+
+        for(Map.Entry<String, String> entry : sfNameMap.entrySet()){
+            String sfKey = entry.getKey();
+            if(key.startsWith(sfKey)){
+                sfName = entry.getValue() + key.replace(sfKey, "");
+                elementType = sfTypeMap.get(sfKey);
+            }
+        }
+        if(elementType == null){
+            return null;
+        }
+
+        sfElementfactor.setSfType(elementType.getCode());
+        sfElementfactor.setSfName(sfName);
+        sfElementfactor.setSfDisplayname(sfName);
+        sfElementfactor.setSfCode(key);
+
+        return sfElementfactor;
+    }
+
+    /**
+     * 根据键名获取电磁阀类设备IotSfElementfactor对象
+     *
+     * @param key 设备元素因子的键名
+     * @return 设备元素因子对象,如果无法解析则返回null
+     */
+    public static IotSfElementfactor getValveElementFactor(String key) {
+
+        IotSfElementfactor sfElementfactor = new IotSfElementfactor();
+        String sfName = null;
+        EnumSfElementType elementType = null;
+        Map<String, String> sfNameMap = getValveNameMap();
+        Map<String, EnumSfElementType> sfTypeMap = getValveTypeMap();
+
+        for(Map.Entry<String, String> entry : sfNameMap.entrySet()){
+            String sfKey = entry.getKey();
+            if(key.startsWith(sfKey)){
+                sfName = entry.getValue() + key.replace(sfKey, "");
+                elementType = sfTypeMap.get(sfKey);
+            }
+        }
+        if(elementType == null){
+            return null;
+        }
+
+        sfElementfactor.setSfType(elementType.getCode());
+        sfElementfactor.setSfName(sfName);
+        sfElementfactor.setSfDisplayname(sfName);
+        sfElementfactor.setSfCode(key);
+
+        return sfElementfactor;
+    }
+
+    /**
+     * 根据键名获取泵类设备IotSfElementfactor对象
+     *
+     * @param key 设备元素因子的键名
+     * @return 设备元素因子对象,如果无法解析则返回null
+     */
+    public static IotSfElementfactor getGroupElementFactor(String key) {
+
+        IotSfElementfactor sfElementfactor = new IotSfElementfactor();
+        String sfName = null;
+        EnumSfElementType elementType = null;
+        Map<String, String> sfNameMap = getGroupNameMap();
+        Map<String, EnumSfElementType> sfTypeMap = getGroupTypeMap();
+
+        for(Map.Entry<String, String> entry : sfNameMap.entrySet()){
+            String sfKey = entry.getKey();
+            if(key.startsWith(sfKey)){
+                sfName = key.replace(sfKey, "") + entry.getValue();
+                elementType = sfTypeMap.get(sfKey);
+            }
+        }
+        if(elementType == null){
+            return null;
+        }
+
+        sfElementfactor.setSfType(elementType.getCode());
+        sfElementfactor.setSfName(sfName);
+        sfElementfactor.setSfDisplayname(sfName);
+        sfElementfactor.setSfCode(key);
+
+        return sfElementfactor;
+    }
+
+    /**
+     * 根据键名获取传感器设备IotSfElementfactor对象
+     *
+     * @param key 设备元素因子的键名
+     * @return 设备元素因子对象,如果无法解析则返回null
+     */
+    public static IotSfElementfactor getSensorElementFactor(String key) {
+
+        IotSfElementfactor sfElementfactor = new IotSfElementfactor();
+        String sfName = null;
+        EnumSfElementType elementType = null;
+        Map<String, String> sfNameMap = getSensorNameMap();
+        Map<String, EnumSfElementType> sfTypeMap = getSensorTypeMap();
+
+        for(Map.Entry<String, String> entry : sfNameMap.entrySet()){
+            String sfKey = entry.getKey();
+            if(key.startsWith(sfKey)){
+                sfName = entry.getValue() + key.replace(sfKey, "");
+                elementType = sfTypeMap.get(sfKey);
+            }
+        }
+        if(elementType == null){
+            return null;
+        }
+
+        sfElementfactor.setSfType(elementType.getCode());
+        sfElementfactor.setSfName(sfName);
+        sfElementfactor.setSfDisplayname(sfName);
+        sfElementfactor.setSfCode(key);
+
+        return sfElementfactor;
+    }
+
+
+    /**
+     * 获取流速流量IotSfElementfactor对象
+     *
+     * @param key 设备元素因子的键名
+     * @return 设备元素因子对象,如果无法解析则返回null
+     */
+    public static List<IotSfElementfactor>  getLsLlFactor(String key) {
+        Map<String, String> sfNameMap = new HashMap<>();
+        sfNameMap.put("Num-ls", "流量");
+        sfNameMap.put("Num-LL", "流速");
+        String s = key.replace("Btn-fs", "");
+        List<IotSfElementfactor> factorList = new ArrayList<>();
+        for(Map.Entry<String, String> entry : sfNameMap.entrySet()){
+            String sfKey = entry.getKey();
+            String sfCode = sfKey + s;
+            String sfName = entry.getValue() + s;
+
+            IotSfElementfactor sfElementfactor = new IotSfElementfactor();
+            sfElementfactor.setSfType(EnumSfElementType.SENSOR.getCode());
+            sfElementfactor.setSfName(sfName);
+            sfElementfactor.setSfDisplayname(sfName);
+            sfElementfactor.setSfCode(sfCode);
+
+            factorList.add(sfElementfactor);
+        }
+
+        return factorList;
+    }
+
+    public static IotSfElementfactor getElementFactor(String sfType, String sfCode) {
+        EnumSfElementType enumSfElementType = EnumSfElementType.findEnumByCode(sfType);
+        if(enumSfElementType == null){
+            return null;
+        }
+        Map<String, EnumSfElementType> sfPumpTypeMap = getPumpTypeMap();
+        Map<String, EnumSfElementType> sfValveTypeMap = getValveTypeMap();
+        Map<String, EnumSfElementType> sfSensorTypeMap = getSensorTypeMap();
+        Map<String, EnumSfElementType> sfGroupTypeMap = getGroupTypeMap();
+
+        Set<EnumSfElementType> pumpTypeSet = new HashSet<>(sfPumpTypeMap.values());
+        Set<EnumSfElementType> valveTypeSet = new HashSet<>(sfValveTypeMap.values());
+        Set<EnumSfElementType> sensorTypeSet = new HashSet<>(sfSensorTypeMap.values());
+        Set<EnumSfElementType> groupTypeSet = new HashSet<>(sfGroupTypeMap.values());
+
+        IotSfElementfactor iotSfElementfactor = null;
+        if(pumpTypeSet.contains(enumSfElementType)){
+            iotSfElementfactor = getPumpElementFactor(sfCode);
+        }else if(valveTypeSet.contains(enumSfElementType)){
+            iotSfElementfactor = getValveElementFactor(sfCode);
+        }else if(sensorTypeSet.contains(enumSfElementType)){
+            iotSfElementfactor = getSensorElementFactor(sfCode);
+        }else if(groupTypeSet.contains(enumSfElementType)){
+            iotSfElementfactor = getGroupElementFactor(sfCode);
+        }
+        return iotSfElementfactor;
+    }
+
+    public static String getDataValue(String sfCode, JSONObject data) {
+        String value = data.getString(sfCode);
+        if(Objects.equals(value, "true")){
+            value = "1";
+        }else if(Objects.equals(value, "false")){
+            value = "0";
+        }else{
+            try{
+                value = String.valueOf((int)Math.floor(Double.parseDouble(value)));
+            }catch (Exception e){
+                value = "0";
+            }
+        }
+        return value;
+    }
+}