Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

chen.cheng 4 ay önce
ebeveyn
işleme
d93f0f4193
22 değiştirilmiş dosya ile 475 ekleme ve 339 silme
  1. 0 0
      ems/ems-cloud/docker/Dockerfile
  2. 8 0
      ems/ems-cloud/docker/docker-run.sh
  3. 0 0
      ems/ems-cloud/docker/start-all.sh
  4. 120 55
      ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/GeekOpenCbHandler.java
  5. 0 68
      ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/util/DataSourceUtils.java
  6. 1 1
      ems/ems-cloud/ems-dev-adapter/src/main/resources/logback.xml
  7. 22 54
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/EmsObjAttrController.java
  8. 0 81
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/EmsObjAttrEnumController.java
  9. 2 2
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/FacTask.java
  10. 2 2
      ems/ems-core/src/main/java/com/ruoyi/ems/core/BaseCache.java
  11. 1 1
      ems/ems-core/src/main/java/com/ruoyi/ems/core/BaseTask.java
  12. 6 6
      ems/ems-core/src/main/java/com/ruoyi/ems/domain/EmsObjAttr.java
  13. 91 0
      ems/ems-core/src/main/java/com/ruoyi/ems/domain/EmsObjAttrDto.java
  14. 7 6
      ems/ems-core/src/main/java/com/ruoyi/ems/enums/AttrGroup.java
  15. 12 0
      ems/ems-core/src/main/java/com/ruoyi/ems/mapper/EmsObjAttrMapper.java
  16. 5 7
      ems/ems-core/src/main/java/com/ruoyi/ems/service/EmsCommonCache.java
  17. 9 0
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IEmsObjAttrService.java
  18. 4 2
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/BoundaryObjServiceImpl.java
  19. 72 11
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EmsObjAttrServiceImpl.java
  20. 35 8
      ems/ems-core/src/main/resources/mapper/ems/EmsObjAttrMapper.xml
  21. 59 16
      ems/sql/ems_init_data.sql
  22. 19 19
      ems/sql/ems_server.sql

+ 0 - 0
ems/ems-cloud/Dockerfile → ems/ems-cloud/docker/Dockerfile


+ 8 - 0
ems/ems-cloud/docker/docker-run.sh

@@ -0,0 +1,8 @@
+# /bin/bash
+docker run -itd --name ems-server --privileged=true \
+  -p 0.0.0.0:9100:9100 \
+  -p 0.0.0.0:9200:9200 \
+  -p 0.0.0.0:9201:9201 \
+  -p 0.0.0.0:9202:9202 \
+  -p 0.0.0.0:9203:9203 \
+  ems-server:1.0

+ 0 - 0
ems/ems-cloud/start-all.sh → ems/ems-cloud/docker/start-all.sh


+ 120 - 55
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/GeekOpenCbHandler.java

@@ -19,12 +19,15 @@ import com.ruoyi.ems.core.MqttTemplate;
 import com.ruoyi.ems.domain.EmsDevice;
 import com.ruoyi.ems.domain.EmsObjAbilityCallLog;
 import com.ruoyi.ems.domain.EmsObjAttrValue;
+import com.ruoyi.ems.enums.DevObjType;
 import com.ruoyi.ems.model.AbilityPayload;
 import com.ruoyi.ems.model.MqttCacheMsg;
 import com.ruoyi.ems.service.IEmsDeviceService;
 import com.ruoyi.ems.service.IEmsObjAbilityCallLogService;
+import com.ruoyi.ems.service.IEmsObjAttrService;
 import com.ruoyi.ems.service.IEmsObjAttrValueService;
 import com.ruoyi.ems.util.IdUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,6 +38,10 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
  * GeekOpen 断路器服务层
@@ -60,13 +67,23 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
     private IEmsDeviceService deviceService;
 
     @Autowired
+    private IEmsObjAttrService objAttrService;
+
+    @Autowired
     private IEmsObjAttrValueService objAttrValueService;
 
     @Autowired
     private IEmsObjAbilityCallLogService objAbilityCallLogService;
 
+    /**
+     * 缓存设备属性
+     */
+    private static final Map<String, Map<String, String>> attrCache = new ConcurrentHashMap<>();
+
     private static final String TOPIC_PREFIX = "/device/dlq/";
 
+    private static final Integer DEVICE_OBJ_TYPE = DevObjType.DEVC.getCode();
+
     /**
      * 能力执行
      *
@@ -75,7 +92,7 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
      */
     @Override
     public String call(AbilityPayload abilityParam) {
-        String retStr = null;
+        String retStr = "执行成功!";
 
         String messageId = IdUtils.generateMessageId();
         String deviceCode = abilityParam.getObjCode();
@@ -89,26 +106,34 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
         // 写入日志
         EmsObjAbilityCallLog logItem = saveLog(abilityParam, sendTime, 1);
 
-        while (true) {
-            MqttCacheMsg cacheMsg = messageCache.getAndRemoveMqttMessage(messageId);
-
-            if (null != cacheMsg) {
-                if (checkResult(abilityParam, cacheMsg)) {
-                    retStr = "执行成功!";
-                    updateLog(logItem, cacheMsg, 1);
-                }
-                else {
-                    retStr = "执行失败!";
-                    updateLog(logItem, cacheMsg, 2);
+        JSONObject sendObject = JSONObject.parseObject(abilityParam.getAbilityParam());
+        String type = sendObject.getString("type");
+
+        if (StringUtils.equals(type, "event") || StringUtils.equals(type, "setting")) {
+            while (true) {
+                MqttCacheMsg cacheMsg = messageCache.getAndRemoveMqttMessage(messageId);
+
+                if (null != cacheMsg) {
+                    String receiveParam = cacheMsg.getPayload();
+                    JSONObject receiveObject = JSONObject.parseObject(receiveParam);
+
+                    if (checkResult(sendObject, receiveObject)) {
+                        retStr = "执行成功!";
+                        updateLog(logItem, cacheMsg, 1);
+                    }
+                    else {
+                        retStr = "执行失败!";
+                        updateLog(logItem, cacheMsg, 2);
+                    }
+                    break;
                 }
-                break;
-            }
 
-            ThreadUtils.sleep(100);
+                ThreadUtils.sleep(100);
 
-            if (System.currentTimeMillis() - sendTime > 60000) {
-                retStr = "响应超时!";
-                break;
+                if (System.currentTimeMillis() - sendTime > 60000) {
+                    retStr = "响应超时!";
+                    break;
+                }
             }
         }
 
@@ -128,12 +153,15 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
                 String messageId = msgBody.getString("messageId");
 
                 if (StringUtils.equals("auto", messageId)) {
-                    updateAutoAttr(device, 2, msgBody);
+                    updateAutoAttr(device, msgBody);
                 }
                 else if (StringUtils.isNotEmpty(messageId)) {
                     MqttCacheMsg mqttCacheMsg = new MqttCacheMsg(messageId, deviceCode, new Date(), payload);
                     messageCache.addMqttMessage(messageId, mqttCacheMsg);
-                    updateBaseAttr(device, 2, msgBody);
+                    updateBaseAttr(device, msgBody);
+                }
+                else {
+                    updateBaseAttr(device, msgBody);
                 }
             }
             else {
@@ -147,6 +175,7 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
 
     /**
      * 刷新设备状态
+     *
      * @param device 设备信息
      */
     private void refreshStatus(EmsDevice device) {
@@ -155,57 +184,93 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
     }
 
     /**
+     * 更新基础属性值
+     *
+     * @param device   设备信息
+     * @param jsonBody jsonBody 消息体
+     */
+    private void updateBaseAttr(EmsDevice device, JSONObject jsonBody) {
+        checkForUpdate(device, jsonBody, "key");
+        checkForUpdate(device, jsonBody, "iccid");
+        checkForUpdate(device, jsonBody, "imei");
+        checkForUpdate(device, jsonBody, "signal");
+        checkForUpdate(device, jsonBody, "version");
+        checkForUpdate(device, jsonBody, "timerEnable");
+        checkForUpdate(device, jsonBody, "timerInterval");
+        checkForUpdate(device, jsonBody, "keyLock");
+        checkForUpdate(device, jsonBody, "onState");
+        checkForUpdate(device, jsonBody, "resetLock");
+
+        // 协议信息
+        checkForUpdate(device, jsonBody, "protocol");
+        checkForUpdate(device, jsonBody, "clientId");
+        checkForUpdate(device, jsonBody, "server");
+        checkForUpdate(device, jsonBody, "port");
+        checkForUpdate(device, jsonBody, "username");
+        checkForUpdate(device, jsonBody, "publish");
+        checkForUpdate(device, jsonBody, "subcribe");
+    }
+
+    /**
      * 更新自动上报属性值
-     * @param device 设备信息
-     * @param objType 对象类型
+     *
+     * @param device   设备信息
      * @param jsonBody jsonBody 消息体
      */
-    private void updateAutoAttr(EmsDevice device, Integer objType, JSONObject jsonBody) {
-        if (jsonBody.containsKey("voltage")) {
-            EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), objType, device.getDeviceModel(),
-                "voltage", jsonBody.getString("voltage"));
-            objAttrValueService.mergeObjAttrValue(attrValue);
-        }
+    private void updateAutoAttr(EmsDevice device, JSONObject jsonBody) {
+        checkForUpdate(device, jsonBody, "voltage");
+        checkForUpdate(device, jsonBody, "current");
+        checkForUpdate(device, jsonBody, "power");
+        checkForUpdate(device, jsonBody, "energy");
+    }
 
-        if (jsonBody.containsKey("current")) {
-            EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), objType, device.getDeviceModel(),
-                "current", jsonBody.getString("current"));
-            objAttrValueService.mergeObjAttrValue(attrValue);
+    /**
+     * 校验是否需要更新属性值
+     *
+     * @param jsonBody jsonBody 消息体
+     * @param attrKey  属性key
+     * @return true 更新,false 不更新
+     */
+    private void checkForUpdate(EmsDevice device, JSONObject jsonBody, String attrKey) {
+        if (!jsonBody.containsKey(attrKey)) {
+            return;
         }
+        String currentValue = jsonBody.getString(attrKey);
+
+        // Atomically initialize the cache entry if absent
+        Map<String, String> attrMap = attrCache.computeIfAbsent(device.getDeviceCode(), k -> {
+            List<EmsObjAttrValue> attrList = objAttrValueService.selectByObjCode(DEVICE_OBJ_TYPE, k);
+            if (CollectionUtils.isNotEmpty(attrList)) {
+                return attrList.stream().collect(
+                    Collectors.toMap(EmsObjAttrValue::getAttrKey, EmsObjAttrValue::getAttrValue, (v1, v2) -> v1,
+                        ConcurrentHashMap::new));
+            }
+            else {
+                return new ConcurrentHashMap<>();
+            }
+        });
 
-        if (jsonBody.containsKey("power")) {
-            EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), objType, device.getDeviceModel(),
-                "power", jsonBody.getString("power"));
-            objAttrValueService.mergeObjAttrValue(attrValue);
-        }
+        String cachedValue = attrMap.get(attrKey);
 
-        if (jsonBody.containsKey("energy")) {
-            EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), objType, device.getDeviceModel(),
-                "energy", jsonBody.getString("energy"));
+        if (!StringUtils.equals(currentValue, cachedValue)) {
+            EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), DEVICE_OBJ_TYPE,
+                device.getDeviceModel(), attrKey, currentValue);
             objAttrValueService.mergeObjAttrValue(attrValue);
+            updateCacheAfterSuccess(device, attrKey, currentValue);
         }
     }
 
-    /**
-     * 更新基础属性值
-     * @param device 设备信息
-     * @param objType 对象类型
-     * @param jsonBody jsonBody 消息体
-     */
-    private void updateBaseAttr(EmsDevice device, Integer objType, JSONObject jsonBody) {
-
+    public void updateCacheAfterSuccess(EmsDevice device, String attrKey, String newValue) {
+        attrCache.computeIfPresent(device.getDeviceCode(), (k, attrMap) -> {
+            attrMap.put(attrKey, newValue);
+            return attrMap;
+        });
     }
 
-    private boolean checkResult(AbilityPayload abilityParam, MqttCacheMsg cacheMsg) {
+    private boolean checkResult(JSONObject sendObject, JSONObject receiveObject) {
         boolean flag = true;
 
         try {
-            String sendParam = abilityParam.getAbilityParam();
-            String receiveParam = cacheMsg.getPayload();
-
-            JSONObject sendObject = JSONObject.parseObject(sendParam);
-            JSONObject receiveObject = JSONObject.parseObject(receiveParam);
-
             String type = sendObject.getString("type");
 
             if (StringUtils.equals(type, "event")) {

+ 0 - 68
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/util/DataSourceUtils.java

@@ -1,68 +0,0 @@
-/*
- * 文 件 名:  DataSourceUtils
- * 版    权:  浩鲸云计算科技股份有限公司
- * 描    述:  <描述>
- * 修 改 人:  learshaw
- * 修改时间:  2019/7/16
- * 跟踪单号:  <跟踪单号>
- * 修改单号:  <修改单号>
- * 修改内容:  <修改内容>
- */
-package com.ruoyi.ems.util;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionFactoryBean;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-
-import javax.sql.DataSource;
-
-/**
- * DataSource工具类 <功能详细描述>
- *
- * @author learshaw
- * @version [版本号, 2019/7/16]
- * @see [相关类/方法]
- * @since [产品/模块版本]
- */
-public abstract class DataSourceUtils {
-    private static final Logger log = LoggerFactory.getLogger(DataSourceUtils.class);
-
-    /**
-     * 数据源配置
-     *
-     * @param driverClass 驱动
-     * @param url         地址
-     * @param user        用户名
-     * @param password    密码
-     * @return 数据源
-     */
-    public static DruidDataSource buildDataSource(String driverClass, String url, String user, String password) {
-        DruidDataSource dataSource = new DruidDataSource();
-        dataSource.setDriverClassName(driverClass);
-        dataSource.setUrl(url);
-        dataSource.setUsername(user);
-        dataSource.setPassword(password);
-
-        return dataSource;
-    }
-
-    public static SqlSessionFactory buildSqlSessionFactory(DataSource dataSource, String mapperLocation,
-        String mybatisConfig) {
-        SqlSessionFactory factory = null;
-        try {
-            SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
-            sessionFactory.setDataSource(dataSource);
-            sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocation));
-            sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource(mybatisConfig));
-            factory = sessionFactory.getObject();
-        }
-        catch (Exception e) {
-            log.error("buildSqlSessionFactory fail!", e);
-        }
-
-        return factory;
-    }
-}

+ 1 - 1
ems/ems-cloud/ems-dev-adapter/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="60 seconds" debug="false">
     <!-- 日志存放路径 -->
-	<property name="log.path" value="logs/ems-server" />
+	<property name="log.path" value="logs/ems-dev-adapter" />
    <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 

+ 22 - 54
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/EmsObjAttrController.java

@@ -7,20 +7,12 @@ import com.ruoyi.common.core.web.controller.BaseController;
 import com.ruoyi.common.core.web.page.TableDataInfo;
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.ems.domain.EmsDevice;
-import com.ruoyi.ems.domain.EmsDeviceComponent;
-import com.ruoyi.ems.domain.EmsFacs;
 import com.ruoyi.ems.domain.EmsObjAttr;
-import com.ruoyi.ems.domain.EmsObjAttrValue;
-import com.ruoyi.ems.enums.DevObjType;
-import com.ruoyi.ems.service.IEmsDeviceComponentService;
-import com.ruoyi.ems.service.IEmsDeviceService;
-import com.ruoyi.ems.service.IEmsFacsService;
+import com.ruoyi.ems.domain.EmsObjAttrDto;
+import com.ruoyi.ems.domain.MeterBoundaryRel;
 import com.ruoyi.ems.service.IEmsObjAttrService;
-import com.ruoyi.ems.service.IEmsObjAttrValueService;
 import io.swagger.annotations.Api;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -32,8 +24,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 能源对象属性Controller
@@ -48,18 +43,6 @@ public class EmsObjAttrController extends BaseController {
     @Autowired
     private IEmsObjAttrService attrService;
 
-    @Autowired
-    private IEmsObjAttrValueService objAttrValueService;
-
-    @Autowired
-    private IEmsDeviceService deviceService;
-
-    @Autowired
-    private IEmsFacsService facsService;
-
-    @Autowired
-    private IEmsDeviceComponentService componentService;
-
     /**
      * 查询能源对象属性列表
      */
@@ -91,19 +74,22 @@ public class EmsObjAttrController extends BaseController {
             json.put("objType", objType);
             json.put("objCode", objCode);
 
-            // 获取对象模型代码
-            String modeCode = getModeCode(objType, objCode);
-
-            if (StringUtils.isNotEmpty(modeCode)) {
-                List<EmsObjAttr> modelAttrs = attrService.selectByModelCode(modeCode);
-                json.put("attrs", CollectionUtils.isNotEmpty(modelAttrs) ? modelAttrs : new ArrayList<>());
-
-                List<EmsObjAttrValue> attrValues = objAttrValueService.selectByObjCode(objType, objCode);
-                json.put("attrValues", attrValues);
-            }
-            else {
-                json.put("attrs", new JSONArray(0));
-                json.put("attrValues", new JSONArray(0));
+            // 获取属性列表
+            List<EmsObjAttrDto> attrDtos = attrService.selectObjAttrItem(objType, objCode);
+
+            if (CollectionUtils.isNotEmpty(attrDtos)) {
+                Map<String, List<EmsObjAttrDto>> attrMap = attrDtos.stream()
+                    .collect(Collectors.groupingBy(EmsObjAttrDto::getAttrGroup, Collectors.toList()));
+
+                json.put("Base", attrMap.get("Base"));
+                json.put("Protocol", attrMap.get("Protocol"));
+                json.put("State", attrMap.get("State"));
+                json.put("Measure", attrMap.get("Measure"));
+            } else {
+                json.put("Base", new JSONArray());
+                json.put("Protocol",  new JSONArray());
+                json.put("State",  new JSONArray());
+                json.put("Measure",  new JSONArray());
             }
 
             result = success(json);
@@ -115,24 +101,6 @@ public class EmsObjAttrController extends BaseController {
         return result;
     }
 
-    private String getModeCode(Integer objType, String objCode) {
-        String modeCode = null;
-
-        if (objType == DevObjType.FACS.getCode()) {
-            EmsFacs facs = facsService.selectEmsFacsByCode(objCode);
-            modeCode = null != facs ? facs.getFacsModel() : null;
-        }
-        else if (objType == DevObjType.DEVC.getCode()) {
-            EmsDevice device = deviceService.selectByCode(objCode);
-            modeCode = null != device ? device.getDeviceModel() : null;
-        }
-        else if (objType == DevObjType.COMPONENT.getCode()) {
-            EmsDeviceComponent devCompo = componentService.selectByCode(objCode);
-            modeCode = null != devCompo ? devCompo.getCompoModel() : null;
-        }
-        return modeCode;
-    }
-
     /**
      * 新增能源对象属性
      */

+ 0 - 81
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/EmsObjAttrEnumController.java

@@ -1,81 +0,0 @@
-package com.ruoyi.ems.controller;
-
-import com.huashe.common.domain.AjaxResult;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.ems.domain.EmsObjAttrEnum;
-import com.ruoyi.ems.service.IEmsObjAttrEnumService;
-import io.swagger.annotations.Api;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-/**
- * 能源对象属性枚举Controller
- *
- * @author ruoyi
- * @date 2025-02-26
- */
-@RestController
-@RequestMapping("/object/attr/emum")
-@Api(value = "EmsObjAttrEnumController", description = "能源对象属性枚举管理")
-public class EmsObjAttrEnumController extends BaseController {
-    @Autowired
-    private IEmsObjAttrEnumService objAttrEnumService;
-
-    /**
-     * 查询能源对象属性枚举列表
-     */
-    @GetMapping("/list")
-    public AjaxResult list(@RequestParam(name = "modelCode") String modelCode,
-        @RequestParam(name = "attrKey", required = false) String attrKey) {
-        List<EmsObjAttrEnum> list = objAttrEnumService.getObjAttrEnumList(modelCode, attrKey);
-        return success(list);
-    }
-
-    /**
-     * 获取能源对象属性枚举详细信息
-     */
-    @GetMapping
-    public AjaxResult getInfo(@RequestParam(name = "modelCode") String modelCode,
-        @RequestParam(name = "attrKey") String attrKey, @RequestParam(name = "attrValue") String attrValue) {
-        EmsObjAttrEnum ret = objAttrEnumService.getObjAttrEnum(modelCode, attrKey, attrValue);
-        return success(ret);
-    }
-
-    /**
-     * 新增能源对象属性枚举
-     */
-    @PostMapping
-    public AjaxResult add(@RequestBody EmsObjAttrEnum objAttrEnum) {
-        return success(objAttrEnumService.addObjAttrEnum(objAttrEnum));
-    }
-
-    @PostMapping("/batch")
-    public AjaxResult addBatch(@RequestBody List<EmsObjAttrEnum> objAttrEnums) {
-        return success(objAttrEnumService.addObjAttrEnumBatch(objAttrEnums));
-    }
-
-    /**
-     * 删除能源对象属性枚举
-     */
-    @DeleteMapping("/deleteByModelCode")
-    public AjaxResult deleteByModelCode(@RequestParam(name = "modelCode") String modelCode) {
-        return success(objAttrEnumService.deleteByModelCode(modelCode));
-    }
-
-    /**
-     * 删除能源对象属性枚举
-     */
-    @DeleteMapping("/{id}")
-    public AjaxResult deleteById(@PathVariable Long id) {
-        return success(objAttrEnumService.deleteById(id));
-    }
-}

+ 2 - 2
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/taskiml/FacTask.java → ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/FacTask.java

@@ -1,11 +1,11 @@
-package com.ruoyi.ems.task.taskiml;
+package com.ruoyi.ems.task;
 
 import com.huashe.common.utils.DateUtils;
+import com.ruoyi.ems.core.BaseTask;
 import com.ruoyi.ems.domain.AdmOpInspectionReport;
 import com.ruoyi.ems.enums.ResultStatus;
 import com.ruoyi.ems.service.impl.AdmOpInspectionReportServiceImpl;
 import com.ruoyi.ems.service.impl.EmsFacsServiceImpl;
-import com.ruoyi.ems.task.BaseTask;
 import com.ruoyi.quartz.domain.SysJob;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;

+ 2 - 2
ems/ems-core/src/main/java/com/ruoyi/ems/service/IEmsCommonCache.java → ems/ems-core/src/main/java/com/ruoyi/ems/core/BaseCache.java

@@ -8,7 +8,7 @@
  * 修改单号:  <修改单号>
  * 修改内容:  <修改内容>
  */
-package com.ruoyi.ems.service;
+package com.ruoyi.ems.core;
 
 import com.ruoyi.ems.domain.FacsCategory;
 import com.ruoyi.ems.domain.FacsSubCategory;
@@ -22,7 +22,7 @@ import com.ruoyi.ems.domain.FacsSubCategory;
  * @see [相关类/方法]
  * @since [产品/模块版本]
  */
-public interface IEmsCommonCache {
+public interface BaseCache {
     /**
      * 根据编码获取子分类信息
      *

+ 1 - 1
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/BaseTask.java → ems/ems-core/src/main/java/com/ruoyi/ems/core/BaseTask.java

@@ -1,4 +1,4 @@
-package com.ruoyi.ems.task;
+package com.ruoyi.ems.core;
 
 import cn.hutool.core.map.MapUtil;
 import com.ruoyi.quartz.domain.SysJob;

+ 6 - 6
ems/ems-core/src/main/java/com/ruoyi/ems/domain/EmsObjAttr.java

@@ -20,7 +20,7 @@ public class EmsObjAttr
     private String modelCode;
 
     /** 属性类型 */
-    private Integer attrType;
+    private String attrGroup;
 
     /** 属性标识 */
     private String attrKey;
@@ -55,12 +55,12 @@ public class EmsObjAttr
         return modelCode;
     }
 
-    public Integer getAttrType() {
-        return attrType;
+    public String getAttrGroup() {
+        return attrGroup;
     }
 
-    public void setAttrType(Integer attrType) {
-        this.attrType = attrType;
+    public void setAttrGroup(String attrGroup) {
+        this.attrGroup = attrGroup;
     }
 
     public void setAttrKey(String attrKey)
@@ -113,7 +113,7 @@ public class EmsObjAttr
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
             .append("id", getId())
             .append("modelCode", getModelCode())
-            .append("attrType", getAttrType())
+            .append("attrGroup", getAttrGroup())
             .append("attrKey", getAttrKey())
             .append("attrName", getAttrName())
             .append("attrUnit", getAttrUnit())

+ 91 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/domain/EmsObjAttrDto.java

@@ -0,0 +1,91 @@
+/*
+ * 文 件 名:  ObjAttrItem
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/3/4
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * 对象能力属性记录
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/3/4]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+public class EmsObjAttrDto {
+    private String attrGroup;
+
+    /** 属性标识 */
+    private String attrKey;
+
+    /** 属性名称 */
+    private String attrName;
+
+    /** 属性值 */
+    private String attrValue;
+
+    /** 属性值名称 */
+    private String attrValueName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public String getAttrGroup() {
+        return attrGroup;
+    }
+
+    public void setAttrGroup(String attrGroup) {
+        this.attrGroup = attrGroup;
+    }
+
+    public String getAttrKey() {
+        return attrKey;
+    }
+
+    public void setAttrKey(String attrKey) {
+        this.attrKey = attrKey;
+    }
+
+    public String getAttrName() {
+        return attrName;
+    }
+
+    public void setAttrName(String attrName) {
+        this.attrName = attrName;
+    }
+
+    public String getAttrValue() {
+        return attrValue;
+    }
+
+    public void setAttrValue(String attrValue) {
+        this.attrValue = attrValue;
+    }
+
+    public String getAttrValueName() {
+        return attrValueName;
+    }
+
+    public void setAttrValueName(String attrValueName) {
+        this.attrValueName = attrValueName;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 7 - 6
ems/ems-core/src/main/java/com/ruoyi/ems/model/ObjAttrItem.java → ems/ems-core/src/main/java/com/ruoyi/ems/enums/AttrGroup.java

@@ -1,23 +1,24 @@
 /*
- * 文 件 名:  ObjAttrItem
+ * 文 件 名:  AttrGroup
  * 版    权:  华设设计集团股份有限公司
  * 描    述:  <描述>
  * 修 改 人:  lvwenbin
- * 修改时间:  2025/3/4
+ * 修改时间:  2025/3/5
  * 跟踪单号:  <跟踪单号>
  * 修改单号:  <修改单号>
  * 修改内容:  <修改内容>
  */
-package com.ruoyi.ems.model;
+package com.ruoyi.ems.enums;
 
 /**
- * 对象能力属性记录
+ * <一句话功能简述>
  * <功能详细描述>
  *
  * @author lvwenbin
- * @version [版本号, 2025/3/4]
+ * @version [版本号, 2025/3/5]
  * @see [相关类/方法]
  * @since [产品/模块版本]
  */
-public class ObjAttrItem {
+public enum AttrGroup {
+
 }

+ 12 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/EmsObjAttrMapper.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.mapper;
 
 import com.ruoyi.ems.domain.EmsObjAttr;
+import com.ruoyi.ems.domain.EmsObjAttrDto;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -37,6 +38,17 @@ public interface EmsObjAttrMapper {
     List<EmsObjAttr> selectByModelCode(@Param("modelCode") String modelCode);
 
     /**
+     * 查询能源对象属性列表
+     *
+     * @param modelCode 设备模型代码
+     * @param objType   设备类型
+     * @param objCode   设备编码
+     * @return 能源对象属性集合
+     */
+    List<EmsObjAttrDto> selectObjAttrDto(@Param("modelCode") String modelCode, @Param("objType") Integer objType,
+        @Param("objCode") String objCode);
+
+    /**
      * 新增能源对象属性
      *
      * @param objAttr 能源对象属性

+ 5 - 7
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EmsCommonCacheImpl.java → ems/ems-core/src/main/java/com/ruoyi/ems/service/EmsCommonCache.java

@@ -8,13 +8,11 @@
  * 修改单号:  <修改单号>
  * 修改内容:  <修改内容>
  */
-package com.ruoyi.ems.service.impl;
+package com.ruoyi.ems.service;
 
+import com.ruoyi.ems.core.BaseCache;
 import com.ruoyi.ems.domain.FacsCategory;
 import com.ruoyi.ems.domain.FacsSubCategory;
-import com.ruoyi.ems.service.IEmsCommonCache;
-import com.ruoyi.ems.service.IFacsCategoryService;
-import com.ruoyi.ems.service.IFacsSubCategoryService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,9 +36,9 @@ import java.util.stream.Collectors;
  * @see [相关类/方法]
  * @since [产品/模块版本]
  */
-@Service
-public class EmsCommonCacheImpl implements IEmsCommonCache, ApplicationRunner {
-    private static final Logger log = LoggerFactory.getLogger(EmsCommonCacheImpl.class);
+@Service("emsCommonCache")
+public class EmsCommonCache implements BaseCache, ApplicationRunner {
+    private static final Logger log = LoggerFactory.getLogger(EmsCommonCache.class);
 
     @Autowired
     private IFacsCategoryService facsCategoryService;

+ 9 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/IEmsObjAttrService.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.service;
 
 import com.ruoyi.ems.domain.EmsObjAttr;
+import com.ruoyi.ems.domain.EmsObjAttrDto;
 
 import java.util.List;
 
@@ -36,6 +37,14 @@ public interface IEmsObjAttrService {
     List<EmsObjAttr> selectByModelCode(String modelCode);
 
     /**
+     * 查询能源对象属性
+     * @param objType 对象类型
+     * @param objCode 对象编号
+     * @return 能源对象属性集合
+     */
+    List<EmsObjAttrDto> selectObjAttrItem(Integer objType, String objCode);
+
+    /**
      * 新增能源对象属性
      *
      * @param objAttr 能源对象属性

+ 4 - 2
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/BoundaryObjServiceImpl.java

@@ -12,6 +12,7 @@ package com.ruoyi.ems.service.impl;
 
 import com.huashe.common.exception.Assert;
 import com.huashe.common.exception.BusinessException;
+import com.ruoyi.ems.core.BaseCache;
 import com.ruoyi.ems.domain.Area;
 import com.ruoyi.ems.domain.ElecMeter;
 import com.ruoyi.ems.domain.ElecMeterH;
@@ -24,7 +25,6 @@ import com.ruoyi.ems.model.QueryMeter;
 import com.ruoyi.ems.service.IAreaService;
 import com.ruoyi.ems.service.IBoundaryObjService;
 import com.ruoyi.ems.service.IElecMeterHService;
-import com.ruoyi.ems.service.IEmsCommonCache;
 import com.ruoyi.ems.service.IEmsFacsService;
 import com.ruoyi.ems.service.IMeterBoundaryRelService;
 import org.apache.commons.collections4.CollectionUtils;
@@ -32,6 +32,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -55,8 +56,9 @@ import java.util.stream.Collectors;
 public class BoundaryObjServiceImpl implements IBoundaryObjService {
     private static final Logger log = LoggerFactory.getLogger(BoundaryObjServiceImpl.class);
 
+    @Qualifier("emsCommonCache")
     @Autowired
-    private IEmsCommonCache emsCommonCache;
+    private BaseCache emsCommonCache;
 
     // 注入区域服务
     @Autowired

+ 72 - 11
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EmsObjAttrServiceImpl.java

@@ -1,8 +1,16 @@
 package com.ruoyi.ems.service.impl;
 
+import com.ruoyi.ems.domain.EmsDevice;
+import com.ruoyi.ems.domain.EmsDeviceComponent;
+import com.ruoyi.ems.domain.EmsFacs;
 import com.ruoyi.ems.domain.EmsObjAttr;
+import com.ruoyi.ems.domain.EmsObjAttrDto;
 import com.ruoyi.ems.domain.EmsObjAttrEnum;
+import com.ruoyi.ems.enums.DevObjType;
 import com.ruoyi.ems.mapper.EmsObjAttrMapper;
+import com.ruoyi.ems.service.IEmsDeviceComponentService;
+import com.ruoyi.ems.service.IEmsDeviceService;
+import com.ruoyi.ems.service.IEmsFacsService;
 import com.ruoyi.ems.service.IEmsObjAttrEnumService;
 import com.ruoyi.ems.service.IEmsObjAttrService;
 import org.apache.commons.collections4.CollectionUtils;
@@ -27,7 +35,13 @@ public class EmsObjAttrServiceImpl implements IEmsObjAttrService {
     private IEmsObjAttrEnumService enumService;
 
     @Autowired
-    private IEmsObjAttrEnumService valueEnumService;
+    private IEmsDeviceService deviceService;
+
+    @Autowired
+    private IEmsFacsService facsService;
+
+    @Autowired
+    private IEmsDeviceComponentService componentService;
 
     /**
      * 查询能源对象属性
@@ -81,6 +95,20 @@ public class EmsObjAttrServiceImpl implements IEmsObjAttrService {
         return list;
     }
 
+    @Override
+    public List<EmsObjAttrDto> selectObjAttrItem(Integer objType, String objCode) {
+        List<EmsObjAttrDto> ret = null;
+
+        // 获取对象模型代码
+        String modeCode = getModeCode(objType, objCode);
+
+        if (StringUtils.isNotEmpty(modeCode)) {
+            ret = objAttrMapper.selectObjAttrDto(modeCode, objType, objCode);
+        }
+
+        return ret;
+    }
+
     /**
      * 新增能源对象属性
      *
@@ -90,21 +118,24 @@ public class EmsObjAttrServiceImpl implements IEmsObjAttrService {
     @Override
     public int insertObjAttr(EmsObjAttr objAttr) {
         int cnt = objAttrMapper.insertObjAttr(objAttr);
-
-        if (StringUtils.equals(objAttr.getAttrValueType(), "Enum")) {
-            valueEnumService.deleteByModelCode(objAttr.getModelCode());
-
-            if (CollectionUtils.isNotEmpty(objAttr.getValueEnums())) {
-                valueEnumService.addObjAttrEnumBatch(objAttr.getValueEnums());
-            }
-        }
+        mergeAttrEnum(objAttr);
 
         return cnt;
     }
 
     @Override
     public int insertBatch(List<EmsObjAttr> list) {
-        return objAttrMapper.insertBatch(list);
+        int cnt = 0;
+
+        if (CollectionUtils.isNotEmpty(list)) {
+            cnt = objAttrMapper.insertBatch(list);
+
+            for (EmsObjAttr objAttr : list) {
+                mergeAttrEnum(objAttr);
+            }
+        }
+
+        return cnt;
     }
 
     /**
@@ -115,7 +146,9 @@ public class EmsObjAttrServiceImpl implements IEmsObjAttrService {
      */
     @Override
     public int updateObjAttr(EmsObjAttr objAttr) {
-        return objAttrMapper.updateObjAttr(objAttr);
+        int cnt = objAttrMapper.updateObjAttr(objAttr);
+        mergeAttrEnum(objAttr);
+        return cnt;
     }
 
     /**
@@ -162,4 +195,32 @@ public class EmsObjAttrServiceImpl implements IEmsObjAttrService {
         enumService.deleteByModelCode(modelCode);
         return cnt;
     }
+
+    private void mergeAttrEnum(EmsObjAttr objAttr) {
+        if (StringUtils.equals(objAttr.getAttrValueType(), "Enum")) {
+            enumService.deleteByModelCode(objAttr.getModelCode());
+
+            if (CollectionUtils.isNotEmpty(objAttr.getValueEnums())) {
+                enumService.addObjAttrEnumBatch(objAttr.getValueEnums());
+            }
+        }
+    }
+
+    private String getModeCode(Integer objType, String objCode) {
+        String modeCode = null;
+
+        if (objType == DevObjType.FACS.getCode()) {
+            EmsFacs facs = facsService.selectEmsFacsByCode(objCode);
+            modeCode = null != facs ? facs.getFacsModel() : null;
+        }
+        else if (objType == DevObjType.DEVC.getCode()) {
+            EmsDevice device = deviceService.selectByCode(objCode);
+            modeCode = null != device ? device.getDeviceModel() : null;
+        }
+        else if (objType == DevObjType.COMPONENT.getCode()) {
+            EmsDeviceComponent devCompo = componentService.selectByCode(objCode);
+            modeCode = null != devCompo ? devCompo.getCompoModel() : null;
+        }
+        return modeCode;
+    }
 }

+ 35 - 8
ems/ems-core/src/main/resources/mapper/ems/EmsObjAttrMapper.xml

@@ -7,22 +7,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="com.ruoyi.ems.domain.EmsObjAttr" id="ObjAttrResult">
         <result property="id"    column="id"    />
         <result property="modelCode"    column="model_code"    />
-        <result property="attrType"    column="attr_type"    />
+        <result property="attrGroup"    column="attr_group"    />
         <result property="attrKey"    column="attr_key"    />
         <result property="attrName"    column="attr_name"    />
         <result property="attrUnit"    column="attr_unit"    />
         <result property="attrValueType"    column="attr_value_type"    />
     </resultMap>
 
+    <resultMap type="com.ruoyi.ems.domain.EmsObjAttrDto" id="ObjAttrDtoResult">
+        <result property="attrGroup"    column="attr_group"    />
+        <result property="attrKey"    column="attr_key"    />
+        <result property="attrName"    column="attr_name"    />
+        <result property="attrValue"    column="attr_value"    />
+        <result property="attrValueName"    column="attr_value_name"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
     <sql id="selectAdmEmsObjAttrVo">
-        select id, model_code, attr_type, attr_key, attr_name, attr_unit, attr_value_type from adm_ems_obj_attr
+        select id, model_code, attr_group, attr_key, attr_name, attr_unit, attr_value_type from adm_ems_obj_attr
     </sql>
 
     <select id="selectObjAttrList" parameterType="com.ruoyi.ems.domain.EmsObjAttr" resultMap="ObjAttrResult">
         <include refid="selectAdmEmsObjAttrVo"/>
         <where>  
             <if test="modelCode != null  and modelCode != ''"> and model_code = #{modelCode}</if>
-            <if test="attrType != null"> and attr_type = #{attrType}</if>
+            <if test="attr_group != null and attr_group != ''"> and attr_group = #{attrGroup}</if>
             <if test="attrKey != null  and attrKey != ''"> and attr_key = #{attrKey}</if>
             <if test="attrName != null  and attrName != ''"> and attr_name like concat('%', #{attrName}, '%')</if>
         </where>
@@ -31,6 +40,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectByModelCode" parameterType="java.lang.String" resultMap="ObjAttrResult">
         <include refid="selectAdmEmsObjAttrVo"/>
         where model_code = #{modelCode}
+        order by attr_group, attr_name
+    </select>
+
+    <select id="selectObjAttrDto"  resultMap="ObjAttrDtoResult">
+        select
+            a.attr_group, a.attr_key, a.attr_name, v.attr_value, e.attr_value_name, v.update_time from  adm_ems_obj_attr a
+        left join
+            (
+               select
+                  attr_key, attr_value, update_time
+               from adm_ems_obj_attr_value
+               where model_code = #{modelCode} and obj_type = #{objType} and obj_code = #{objCode}
+            ) v on a.attr_key = v.attr_key
+        left join
+            adm_ems_obj_attr_enum e
+           on a.model_code = e.model_code and a.attr_key = e.attr_key and v.attr_value = e.attr_value
+        WHERE a.model_code = #{modelCode}
+        order by attr_group, attr_name
     </select>
     
     <select id="selectObjAttrById" parameterType="Long" resultMap="ObjAttrResult">
@@ -42,7 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         insert into adm_ems_obj_attr
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="modelCode != null and modelCode != ''">model_code,</if>
-            <if test="attrType != null and attrType != ''">attr_type,</if>
+            <if test="attrGroup != null and attrGroup != ''">attr_group,</if>
             <if test="attrKey != null and attrKey != ''">attr_key,</if>
             <if test="attrName != null and attrName != ''">attr_name,</if>
             <if test="attrUnit != null">attr_unit,</if>
@@ -50,7 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="modelCode != null and modelCode != ''">#{modelCode},</if>
-            <if test="attrType != null and attrType != ''">#{attrType},</if>
+            <if test="attrGroup != null and attrGroup != ''">#{attrGroup},</if>
             <if test="attrKey != null and attrKey != ''">#{attrKey},</if>
             <if test="attrName != null and attrName != ''">#{attrName},</if>
             <if test="attrUnit != null">#{attrUnit},</if>
@@ -59,10 +86,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </insert>
 
     <insert id="insertBatch" parameterType="java.util.List">
-        insert into adm_ems_obj_attr (model_code, attr_type, attr_key, attr_name, attr_unit, attr_value_type)
+        insert into adm_ems_obj_attr (model_code, attr_group, attr_key, attr_name, attr_unit, attr_value_type)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.modelCode}, #{item.attrType}, #{item.attrKey}, #{item.attrName}, #{item.attrUnit}, #{item.attrValueType})
+            (#{item.modelCode}, #{item.attrGroup}, #{item.attrKey}, #{item.attrName}, #{item.attrUnit}, #{item.attrValueType})
         </foreach>
     </insert>
 
@@ -70,7 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         update adm_ems_obj_attr
         <trim prefix="SET" suffixOverrides=",">
             <if test="modelCode != null and modelCode != ''">model_code = #{modelCode},</if>
-            <if test="attrType != null">attr_type = #{attrType},</if>
+            <if test="attrGroup != null and attrGroup !=''">attr_group = #{attrGroup},</if>
             <if test="attrKey != null and attrKey != ''">attr_key = #{attrKey},</if>
             <if test="attrName != null and attrName != ''">attr_name = #{attrName},</if>
             <if test="attrUnit != null">attr_unit = #{attrUnit},</if>

+ 59 - 16
ems/sql/ems_init_data.sql

@@ -260,29 +260,72 @@ INSERT INTO `adm_op_energy_strategy_param` (`strategy_code`, `param_group`, `par
 
 
 -- 对象模型表
-INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`) VALUES ('M_Z010', '照明设备模型', 2);
+INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_W2_QF_GEEKOPEN', 'GeekOpen断路器', 2, 'http://172.192.13.95:9203/ems-dev-adapter/circuit-breaker/GeekOpen/abilityCall', NULL);
 
 
 -- 对象属性DEMO数据
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`) VALUES ('M_Z010', 0, 'power',   '功率', 'kW-h');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Base', 'version', '固件版本号', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Base', 'iccid', '物联网卡ICCID号', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Base', 'imei', '设备imei', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'State', 'timerEnable', '上报定时开关', '', 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'State', 'timerInterval', '上报时间间隔', '秒(S)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'State', 'signal', '信号强度', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'State', 'keyLock', '状态-按键锁定', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'State', 'key', '状态-通断', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'State', 'resetLock', '重置锁', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'State', 'onState', '设备上电的默认状态', '1', 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Measure', 'power', '实时功率', '瓦(W)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Measure', 'voltage', '实时电压', '伏特(V)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Measure', 'current', '实时电流值', '安培(A)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Measure', 'energy', '累计电量值', '千瓦时(kW·h)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Protocol', 'protocol', '协议', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Protocol', 'server', 'MQTT地址', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Protocol', 'port', 'MQTT端口', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Protocol', 'clientId', '设备ID', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Protocol', 'username', '用户名', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Protocol', 'subcribe', '订阅主题', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 'Protocol', 'publish', '发布主题', NULL, 'Value');
+
 
 -- 对象属性DEMO数据
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-1001-QR_00', 3, 'M_W2_QR', 'onOffState', 'on');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-1001-QF_01', 3, 'M_W2_QF', 'onOffState', 'off');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-1001-QF_02', 3, 'M_W2_QF', 'onOffState', 'on');
-
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-T-1001', 2, 'M_W2_T', 'ratedCapacity', '1000');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-T-1001', 2, 'M_W2_T', 'ratedVoltage', '10');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-T-1001', 2, 'M_W2_T', 'ratedFrequency', '50');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-T-1001', 2, 'M_W2_T', 'phaseNumber', '3');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-N-T-1002', 2, 'M_W2_T', 'ratedCapacity', '1000');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-N-T-1002', 2, 'M_W2_T', 'ratedVoltage', '10');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-N-T-1002', 2, 'M_W2_T', 'ratedFrequency', '50');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-N-T-1002', 2, 'M_W2_T', 'phaseNumber', '3');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'current', '0.050', '2025-03-05 16:07:36');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'energy', '421.787', '2025-03-05 16:02:36');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'iccid', '898604E6192390306801', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'key', '1', '2025-03-05 15:57:59');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'keyLock', '0', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'onState', '2', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'power', '5.108', '2025-03-05 16:07:36');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'resetLock', '0', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'signal', '31', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'timerEnable', '1', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'timerInterval', '300', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'version', '1.0.1', '2025-03-05 15:51:00');
+
+-- 对象属性值枚举
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '1', '断开');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'key', '1', '通电');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'key', '0', '断电');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'timerEnable', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'timerEnable', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'resetLock', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'resetLock', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '0', '记忆');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '2', '通电');
 
 -- 对象能力DEMO数据
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`) VALUES ('M_W2', 'checkLine', '线路检测', '执行xx方法进行测试', '{\"enable\":\"1\"}');
-
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'event-0', '设备-断电', '控制设备通断', '{\"type\":\"event\",\"key\":0}', 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'event-1', '设备-通电', '控制设备通断', '{\"type\":\"event\",\"key\":1}', 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock-0', '按键锁定-关闭', '设置按键控制锁-关闭', '{\"type\":\"setting\",\"keyLock\":0}', 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock-1', '按键锁定-开启', '设置按键控制锁-开启', '{\"type\":\"setting\",\"keyLock\":1}', 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'restart', '软重启', '设备软重启', '{\"type\":\"setting\",\"system\":\"restart\"}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'settAutoReport', '设置电量信息定时上报', '开关(timerEnable:0:关闭上报 1:开启上报) 时间间隔(timerInterval: 上报时间间隔 单位秒)', '{\"type\":\"setting\",\"timerEnable\":1,\"timerInterval\":10}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'setReset', '重置/恢复出厂', '设备恢复出厂设置固定传\"reset\"', '{\"type\":\"setting\",\"system\":\"reset\"}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'setOnState', '设置设备上电默认状态', '0:记忆;1:关闭,即断开;2:开启,即通电,默认=1', '{\"type\":\"setting\",\"onState\":1}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'syncInfo', '同步基础信息', '获取设备状态信息', '{\"type\":\"info\"}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'syncProtocol', '同步设备通讯信息', '获取设备通讯信息', '{\"type\":\"protocol\"}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'syncStatistic', '同步设备电量信息', '获取设备电量信息', '{\"type\":\"statistic\"}', 1);
 
 -- 对象事件DEMO数据
 INSERT INTO `adm_ems_obj_event` (`model_code`, `event_type`, `event_key`, `event_name`, `event_desc`, `event_code`, `ext_event_code`) VALUES ('M_W2', 2, 'overload', '过载', '功率过载', 'e-gy-0001', '0x0001');

+ 19 - 19
ems/sql/ems_server.sql

@@ -571,7 +571,7 @@ drop table if exists adm_ems_obj_attr;
 create table adm_ems_obj_attr  (
   `id`              bigint(20)      not null auto_increment      comment '序号',
   `model_code`      varchar(64)     not null                     comment '模型code',
-  `attr_type`       int             default 0                    comment '属性类型',
+  `attr_group`      varchar(128)    not null                     comment '属性分组',
   `attr_key`        varchar(128)    not null                     comment '属性标识',
   `attr_name`       varchar(256)    default null                 comment '属性名称',
   `attr_unit`       varchar(32)     default null                 comment '属性单位',
@@ -582,24 +582,24 @@ create table adm_ems_obj_attr  (
 
 
 -- 对象属性初始数据
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2', 0, 'voltageLevel', '电压等级', 'kV', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2', 0, 'frequency', '电流频率', 'Hz', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_E5', 0, 'installedCapacity', '装机容量', 'kw', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_C1', 0, 'storageCapacity',   '储能容量', 'kW-h', 'Value');
-
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_T', 0, 'ratedCapacity', '额定容量', 'kVA', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_T', 0, 'ratedVoltage', '额定电压', 'kV', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_T', 0, 'ratedFrequency', '额定频率', 'Hz', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_T', 0, 'phaseNumber', '相数', '相', 'Value');
-
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QR', 0, 'ratedVoltage', '额定电压', 'V', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QR', 0, 'ratedCurrent', '额定电流', 'A', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QR', 0, 'triggerCurrent', '触发电流', 'A', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QR', 1, 'onOffState', '开关状态', null, 'Value');
-
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF', 0, 'ratedVoltage', '额定电压', 'V', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF', 0, 'ratedCurrent', '额定电流', 'A', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF', 1, 'onOffState', '开关状态', null, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2', 'Base', 'voltageLevel', '电压等级', 'kV', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2', 'Base', 'frequency', '电流频率', 'Hz', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_E5', 'Base', 'installedCapacity', '装机容量', 'kw', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_C1', 'Base', 'storageCapacity',   '储能容量', 'kW-h', 'Value');
+
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_T', 'Base', 'ratedCapacity', '额定容量', 'kVA', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_T', 'Base', 'ratedVoltage', '额定电压', 'kV', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_T', 'Base', 'ratedFrequency', '额定频率', 'Hz', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_T', 'Base', 'phaseNumber', '相数', '相', 'Value');
+
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QR', 'Base', 'ratedVoltage', '额定电压', 'V', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QR', 'Base', 'ratedCurrent', '额定电流', 'A', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QR', 'Base', 'triggerCurrent', '触发电流', 'A', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QR', 'State', 'onOffState', '开关状态', null, 'Value');
+
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF', 'Base', 'ratedVoltage', '额定电压', 'V', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF', 'Base', 'ratedCurrent', '额定电流', 'A', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF', 'State', 'onOffState', '开关状态', null, 'Value');
 
 
 -- ----------------------------