Эх сурвалжийг харах

新风+空调接入,碳汇系数

learshaw 5 сар өмнө
parent
commit
66874b69ef

+ 3 - 1
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/TaskExecutor.java

@@ -90,12 +90,14 @@ public class TaskExecutor {
 //    }
 
     /**
-     * 每5min采集能耗数据
+     * 每15min采集能耗数据
      */
     @Scheduled(cron = "0 0/15 * * * ?")
     public void baMeterCollect() {
         int cnt = baCtlHandler.meterCollect();
         log.debug("采集室内能耗设备计量数据: {} 条", cnt);
+        baCtlHandler.xfCollect();
+        baCtlHandler.ahuCollect();
     }
 
     /**

+ 7 - 0
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/config/BaCtlConfig.java

@@ -14,6 +14,9 @@ import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 室内能耗参数
  * <功能详细描述>
@@ -30,4 +33,8 @@ public class BaCtlConfig {
     private String url;
 
     private String appId;
+
+    private Map<String, String> xfMapper;
+
+    private Map<String, String> ahuMapper;
 }

+ 216 - 38
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/BaCtlHandler.java

@@ -20,7 +20,6 @@ import com.ruoyi.ems.enums.DevObjType;
 import com.ruoyi.ems.model.AbilityPayload;
 import com.ruoyi.ems.model.BoundaryObj;
 import com.ruoyi.ems.model.CallResponse;
-import com.ruoyi.ems.model.ObjAttrTableItem;
 import com.ruoyi.ems.model.Price;
 import com.ruoyi.ems.model.QueryDevice;
 import com.ruoyi.ems.model.idenergy.CodesVal;
@@ -36,9 +35,9 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -71,8 +70,11 @@ public class BaCtlHandler extends BaseMeterDevHandler {
     // 水表测点模型代码
     private static final String METER_MODEL_W = "M_W4_DEV_BA_METER_W";
 
-    // DDC点位模型代码
-    private static final String DDC_MODEL = "M_Z_DEV_BA_DDC";
+    // 新风设备模型代码
+    private static final String METER_MODEL_XF = "M_Z020_DEV_BA_XF";
+
+    // 空调设备模型代码
+    private static final String METER_MODEL_AHU = "M_Z020_DEV_BA_AHU";
 
     // 照明模型代码
     private static final String LIGHT_MODEL = "M_Z_DEV_BA_LIGHT";
@@ -122,19 +124,23 @@ public class BaCtlHandler extends BaseMeterDevHandler {
 
     @Override
     public List<EmsDevice> getDeviceList() {
+        throw new UnsupportedOperationException();
+    }
+
+    public List<EmsDevice> getDeviceList(String modelCode) {
         QueryDevice queryDevice = new QueryDevice();
-        queryDevice.setDeviceModel(GATEWAY_MODEL);
+        queryDevice.setDeviceModel(modelCode);
         return deviceService.selectList(queryDevice);
     }
 
     @Override
-    public CallResponse<Void> call(AbilityPayload abilityParam) {
+    public CallResponse<Void> call(AbilityPayload param) {
         CallResponse<Void> callResponse = null;
 
         try {
-            if (DevObjType.SYSTEM.getCode() == abilityParam.getObjType()) {
-                if (StringUtils.equals("MeterReadingTotal", abilityParam.getAbilityKey())) {
-                    List<EmsDevice> deviceList = getDeviceList();
+            if (DevObjType.SYSTEM.getCode() == param.getObjType()) {
+                if (StringUtils.equals("MeterReadingTotal", param.getAbilityKey())) {
+                    List<EmsDevice> deviceList = getDeviceList(GATEWAY_MODEL);
 
                     for (EmsDevice device : deviceList) {
                         meterReadingGw(device.getDeviceModel(), "MeterReadingGw", device.getDeviceCode());
@@ -143,16 +149,15 @@ public class BaCtlHandler extends BaseMeterDevHandler {
 
                 callResponse = new CallResponse<>(0, "成功");
             }
-            else if (DevObjType.DEVC.getCode() == abilityParam.getObjType()) {
-                if (StringUtils.equals("MeterReadingGw", abilityParam.getAbilityKey())) {
-                    meterReadingGw(abilityParam.getModelCode(), abilityParam.getAbilityKey(),
-                        abilityParam.getObjCode());
+            else if (DevObjType.DEVC.getCode() == param.getObjType()) {
+                if (StringUtils.equals("MeterReadingGw", param.getAbilityKey())) {
+                    meterReadingGw(param.getModelCode(), param.getAbilityKey(), param.getObjCode());
                 }
 
                 callResponse = new CallResponse<>(0, "成功");
             }
             else {
-                callResponse = new CallResponse<>(-1, "不支持的能力key:" + abilityParam.getAbilityKey());
+                callResponse = new CallResponse<>(-1, "不支持的能力key:" + param.getAbilityKey());
             }
         }
         catch (BusinessException e) {
@@ -231,7 +236,7 @@ public class BaCtlHandler extends BaseMeterDevHandler {
                 String dataStr = resJson.getString("ResultPointObjArr");
                 List<CodesVal> retList = JSON.parseArray(dataStr, CodesVal.class);
                 // 更新设备属性
-                updateDeviceAttrList(objCode, subDevs, retList);
+                updateMeterDeviceAttrList(objCode, subDevs, retList);
             }
             else {
                 saveCallLog(objCode, modeCode, abilityKey, 2, JSON.toJSONString(req), callRes);
@@ -268,6 +273,36 @@ public class BaCtlHandler extends BaseMeterDevHandler {
         return cnt;
     }
 
+    public void xfCollect() {
+        try {
+            List<EmsDevice> deviceList = getDeviceList(METER_MODEL_XF);
+
+            if (CollectionUtils.isNotEmpty(deviceList)) {
+                for (EmsDevice device : deviceList) {
+                    xfDeviceCollect(device);
+                }
+            }
+        }
+        catch (Exception e) {
+            log.error("新风采集异常", e);
+        }
+    }
+
+    public void ahuCollect() {
+        try {
+            List<EmsDevice> deviceList = getDeviceList(METER_MODEL_AHU);
+
+            if (CollectionUtils.isNotEmpty(deviceList)) {
+                for (EmsDevice device : deviceList) {
+                    auhDeviceCollect(device);
+                }
+            }
+        }
+        catch (Exception e) {
+            log.error("新风采集异常", e);
+        }
+    }
+
     private int meterDevCollect(BaCtlEnergyTemplate template, EmsObjAttrValue subDevAttr) {
         int cnt = 0;
 
@@ -293,7 +328,7 @@ public class BaCtlHandler extends BaseMeterDevHandler {
                 List<CodesVal> retList = JSON.parseArray(dataStr, CodesVal.class);
 
                 // 更新设备属性
-                updateDeviceAttrList(subDevAttr.getObjCode(), subDevs, retList);
+                updateMeterDeviceAttrList(subDevAttr.getObjCode(), subDevs, retList);
             }
         }
         catch (Exception e) {
@@ -303,7 +338,169 @@ public class BaCtlHandler extends BaseMeterDevHandler {
         return cnt;
     }
 
-    private void updateDeviceAttrList(String gwDevieCode, JSONArray subDevs, List<CodesVal> retList) {
+    private void xfDeviceCollect(EmsDevice device) {
+        String deviceCode = device.getDeviceCode();
+        Map<String, String> paramKeys = config.getXfMapper();
+
+        Set<String> pointIds = paramKeys.entrySet().stream()
+            .filter(entry -> StringUtils.startsWith(entry.getKey(), deviceCode))
+            .flatMap(entry -> Arrays.stream(StringUtils.split(entry.getValue(), ","))).map(String::trim)
+            .collect(Collectors.toSet());
+
+        if (CollectionUtils.isNotEmpty(pointIds)) {
+            CodesValReq req = new CodesValReq(pointIds);
+
+            // 调用能耗数据接口获取实时数据
+            String callRes = new BaCtlEnergyTemplate(config.getUrl()).getCodesVal(req);
+            JSONObject resJson = JSONObject.parseObject(callRes);
+            Assert.isTrue(StringUtils.equals(resJson.getString("code"), "200"), resJson.getInteger("code"),
+                resJson.getString("error"));
+            String dataStr = resJson.getString("ResultPointObjArr");
+            List<CodesVal> retList = JSON.parseArray(dataStr, CodesVal.class);
+            Map<String, CodesVal> retMap = retList.stream()
+                .collect(Collectors.toMap(CodesVal::getPointId, Function.identity()));
+
+            List<EmsObjAttrValue> dbAttrList = objAttrValueService.selectByObjCode(METER_MODEL_XF, deviceCode);
+            Map<String, EmsObjAttrValue> dbMap = dbAttrList.stream()
+                .collect(Collectors.toMap(EmsObjAttrValue::getAttrKey, Function.identity()));
+
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "xfTemp", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "sfTemp", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "hfTemp", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "pfTemp", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "ppm", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "wCv", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "xfCv", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "pfCv", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "lwDpAlarm", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "fjUvAlarm", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "afAlarm", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "xfStatus", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "xfMA", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "xfFault", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "pfStatus", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "pfMA", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "pfFault", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "xfTempSetVal", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "LnSu", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "timeSetTag", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_XF, deviceCode, "manualTag", dbMap, retMap);
+            baDevTimeStatueCheckAndUpdate(METER_MODEL_XF, deviceCode, "timeStatus", dbMap, retMap);
+        }
+    }
+
+    private void auhDeviceCollect(EmsDevice device) {
+        String deviceCode = device.getDeviceCode();
+        Map<String, String> paramKeys = config.getAhuMapper();
+
+        Set<String> pointIds = paramKeys.entrySet().stream()
+            .filter(entry -> StringUtils.startsWith(entry.getKey(), deviceCode))
+            .flatMap(entry -> Arrays.stream(StringUtils.split(entry.getValue(), ","))).map(String::trim)
+            .collect(Collectors.toSet());
+
+        if (CollectionUtils.isNotEmpty(pointIds)) {
+            CodesValReq req = new CodesValReq(pointIds);
+
+            // 调用能耗数据接口获取实时数据
+            String callRes = new BaCtlEnergyTemplate(config.getUrl()).getCodesVal(req);
+            JSONObject resJson = JSONObject.parseObject(callRes);
+            Assert.isTrue(StringUtils.equals(resJson.getString("code"), "200"), resJson.getInteger("code"),
+                resJson.getString("error"));
+            String dataStr = resJson.getString("ResultPointObjArr");
+            List<CodesVal> retList = JSON.parseArray(dataStr, CodesVal.class);
+            Map<String, CodesVal> retMap = retList.stream()
+                .collect(Collectors.toMap(CodesVal::getPointId, Function.identity()));
+
+            List<EmsObjAttrValue> dbAttrList = objAttrValueService.selectByObjCode(METER_MODEL_AHU, deviceCode);
+            Map<String, EmsObjAttrValue> dbMap = dbAttrList.stream()
+                .collect(Collectors.toMap(EmsObjAttrValue::getAttrKey, Function.identity()));
+
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "xfTemp", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "sfTemp", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "hfTemp", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "wCv", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "xfCv", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "lwDpAlarm", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "fjUvAlarm", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "afAlarm", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "xfStatus", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "xfMA", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "xfFault", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "xfTempSetVal", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "LnSu", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "timeSetTag", dbMap, retMap);
+            baDevAttrCheckAndUpdate(METER_MODEL_AHU, deviceCode, "manualTag", dbMap, retMap);
+            baDevTimeStatueCheckAndUpdate(METER_MODEL_AHU, deviceCode, "timeStatus", dbMap, retMap);
+        }
+    }
+
+    private void baDevAttrCheckAndUpdate(String devModel, String deviceCode, String attrKey,
+        Map<String, EmsObjAttrValue> dbAttrMap, Map<String, CodesVal> retMap) {
+        EmsObjAttrValue dbAttr = dbAttrMap.get(attrKey);
+        Map<String, String> keyParamMap = config.getXfMapper();
+        String pointId = keyParamMap.get(String.format("%s.%s", deviceCode, attrKey));
+
+        if (null != dbAttr && retMap.containsKey(pointId)) {
+            CodesVal codesVal = retMap.get(pointId);
+
+            if (!StringUtils.equals(dbAttr.getAttrValue(), codesVal.getValue())) {
+                objAttrValueService.updateObjAttrValue(devModel, deviceCode, attrKey, codesVal.getValue());
+            }
+        }
+        else {
+            if (null != pointId && retMap.containsKey(pointId)) {
+                CodesVal codesVal = retMap.get(pointId);
+                EmsObjAttrValue attr = new EmsObjAttrValue(deviceCode, devModel, attrKey, codesVal.getValue());
+                objAttrValueService.mergeObjAttrValue(attr);
+            }
+        }
+    }
+
+    private void baDevTimeStatueCheckAndUpdate(String devModel, String deviceCode, String attrKey,
+        Map<String, EmsObjAttrValue> dbAttrMap, Map<String, CodesVal> retMap) {
+        EmsObjAttrValue dbAttr = dbAttrMap.get(attrKey);
+        String pointIdStr = config.getXfMapper().get(String.format("%s.%s", deviceCode, attrKey));
+
+        if (StringUtils.isNotEmpty(pointIdStr)) {
+            String[] array = StringUtils.split(pointIdStr, ",");
+            String value = "0";
+
+            // 定时开-小时
+            CodesVal codesVal = retMap.get(array[0]);
+
+            if (null != codesVal && StringUtils.equals(codesVal.getValue(), "1")) {
+                value = "160";
+            }
+
+            codesVal = retMap.get(array[1]);
+
+            if (null != codesVal && StringUtils.equals(codesVal.getValue(), "1")) {
+                value = "101";
+            }
+
+            codesVal = retMap.get(array[2]);
+
+            if (null != codesVal && StringUtils.equals(codesVal.getValue(), "1")) {
+                value = "260";
+            }
+
+            codesVal = retMap.get(array[3]);
+
+            if (null != codesVal && StringUtils.equals(codesVal.getValue(), "1")) {
+                value = "201";
+            }
+
+            if (null != dbAttr && !StringUtils.equals(dbAttr.getAttrValue(), value)) {
+                objAttrValueService.updateObjAttrValue(devModel, deviceCode, attrKey, value);
+            }
+            else if (null == dbAttr) {
+                EmsObjAttrValue attr = new EmsObjAttrValue(deviceCode, devModel, attrKey, value);
+                objAttrValueService.mergeObjAttrValue(attr);
+            }
+        }
+    }
+
+    private void updateMeterDeviceAttrList(String gwDevieCode, JSONArray subDevs, List<CodesVal> retList) {
         try {
             // 将新采集数据转换为Map
             Map<String, CodesVal> codesValMap = retList.stream()
@@ -428,7 +625,7 @@ public class BaCtlHandler extends BaseMeterDevHandler {
             .collect(Collectors.toMap(EmsObjAttrValue::getObjCode, EmsObjAttrValue::getAttrValue));
 
         // 网关设备列表
-        List<EmsDevice> gwDevices = getDeviceList();
+        List<EmsDevice> gwDevices = getDeviceList(GATEWAY_MODEL);
 
         if (CollectionUtils.isNotEmpty(gwDevices)) {
             for (EmsDevice gwDevice : gwDevices) {
@@ -719,25 +916,6 @@ public class BaCtlHandler extends BaseMeterDevHandler {
             .collect(Collectors.toList());
     }
 
-    private Set<String> getPointIds(List<EmsObjAttrValue> attrValues) {
-        Set<String> pointIds = new HashSet<>();
-
-        if (CollectionUtils.isNotEmpty(attrValues)) {
-            for (EmsObjAttrValue objAttr : attrValues) {
-                String attrValue = objAttr.getAttrValue();
-                List<ObjAttrTableItem> tableItems = JSON.parseArray(attrValue, ObjAttrTableItem.class);
-
-                if (CollectionUtils.isNotEmpty(tableItems)) {
-                    List<String> tmpList = tableItems.stream().map(ObjAttrTableItem::getKey)
-                        .collect(Collectors.toList());
-                    pointIds.addAll(tmpList);
-                }
-            }
-        }
-
-        return pointIds;
-    }
-
     /**
      * 验证抄表数据的合理性
      */
@@ -789,7 +967,7 @@ public class BaCtlHandler extends BaseMeterDevHandler {
 
                 // 如果连续异常次数太多,需要告警但仍然更新数据
                 if (abnormalCount >= ABNORMAL_DATA_CONFIRM_COUNT) {
-                    log.warn("连续异常数据 - 设备:{}, 测点:{}, 连续{}次异常, 当前差值:%.2f", deviceCode, pointId,
+                    log.warn("连续异常数据 - 设备:{}, 测点:{}, 连续{}次异常, 当前差值:{}", deviceCode, pointId,
                         abnormalCount, difference);
                     // 重置计数
                     redisService.setCacheMapValue(deviceCode, abnormalKey, "0");

+ 1 - 1
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/SquareLightCtlHandler.java

@@ -308,7 +308,7 @@ public class SquareLightCtlHandler extends BaseDevHandler {
     public void lightControl(String objCode, String paramValue) {
         List<EmsObjAttrValue> attrValues = objAttrValueService.selectByObjCode(DEV_MODE_CODE, objCode);
         Map<String, EmsObjAttrValue> attrValueMap = attrValues.stream()
-            .collect(Collectors.toMap(EmsObjAttrValue::getAttrKey, v -> v));
+            .collect(Collectors.toMap(EmsObjAttrValue::getAttrKey, Function.identity()));
 
         EmsObjAttrValue projectIdAttr = attrValueMap.get("projectId");
         Assert.notNull(projectIdAttr, -1, "lampList 属性未同步");

+ 237 - 5
ems/ems-cloud/ems-dev-adapter/src/main/resources/application-local.yml

@@ -62,10 +62,6 @@ adapter:
       loginName: admin
       password: Acrel001
     subids: 10100002,10100003
-  # BA楼控
-  ba-ctl:
-    url: http://127.0.0.1:8093
-    appId: httpsjy
   # 广场照明控制
   square-lighting-ctl:
     url: http://127.0.0.1:8686
@@ -73,7 +69,243 @@ adapter:
     user-name: developer3
     password: dev@admin123
     tenant-id: 1
-
+  # BA楼控
+  ba-ctl:
+    url: http://127.0.0.1:8093
+    appId: httpsjy
+    xfMapper:
+      'Z020-B-XF-1F-5':
+        xfTemp: 'C_2009_AI_0000'
+        sfTemp: 'C_2009_AI_0001'
+        hfTemp: 'C_2009_AI_0002'
+        pfTemp: 'C_2009_AI_0003'
+        ppm: 'C_2009_AI_0004'
+        wCv: 'C_2009_AI_0005'
+        xfCv: 'C_2009_AI_0006'
+        pfCv: 'C_2009_AI_0007'
+        lwDpAlarm: 'C_2009_DI_0008'
+        fjUvAlarm: 'C_2009_DI_0009'
+        afAlarm: 'C_2009_DI_0010'
+        xfStatus: 'C_2009_DI_0011'
+        xfMA: 'C_2009_DI_0012'
+        xfFault: 'C_2009_DI_0013'
+        pfStatus: 'C_2009_DI_0014'
+        pfMA: 'C_2009_DI_0015'
+        pfFault: 'C_2009_DI_0016'
+        timeStatus: 'C_2009_AV_0000,C_2009_AV_0001,C_2009_AV_0002,C_2009_AV_0003'
+        xfTempSetVal: 'C_2009_AV_0004'
+        LnSu: 'C_2009_BV_0009'
+        timeSetTag: 'C_2009_BV_0010'
+        manualTag: 'C_2009_BV_0011'
+      'Z020-B-XF-1F-4':
+        xfTemp: 'C_2010_AI_0000'
+        sfTemp: 'C_2010_AI_0001'
+        hfTemp: 'C_2010_AI_0002'
+        pfTemp: 'C_2010_AI_0003'
+        ppm: 'C_2010_AI_0004'
+        wCv: 'C_2010_AI_0005'
+        xfCv: 'C_2010_AI_0006'
+        pfCv: 'C_2010_AI_0007'
+        lwDpAlarm: 'C_2010_BI_0008'
+        fjUvAlarm: 'C_2010_BI_0009'
+        afAlarm: 'C_2010_BI_0010'
+        xfStatus: 'C_2010_BI_0011'
+        xfMA: 'C_2010_BI_0012'
+        xfFault: 'C_2010_BI_0013'
+        pfStatus: 'C_2010_BI_0014'
+        pfMA: 'C_2010_BI_0015'
+        pfFault: 'C_2010_BI_0016'
+        timeStatus: 'C_2010_AV_0000,C_2010_AV_0001,C_2010_AV_0002,C_2010_AV_0003'
+        xfTempSetVal: 'C_2010_AV_0004'
+        LnSu: 'C_2010_BV_0009'
+        timeSetTag: 'C_2010_BV_0010'
+        manualTag: 'C_2010_BV_0011'
+      'Z020-B-XF-1F-3':
+        xfTemp: 'C_2011_AI_0000'
+        sfTemp: 'C_2011_AI_0001'
+        hfTemp: 'C_2011_AI_0002'
+        pfTemp: 'C_2011_AI_0003'
+        ppm: 'C_2011_AI_0004'
+        wCv: 'C_2011_AI_0005'
+        xfCv: 'C_2011_AI_0006'
+        pfCv: 'C_2011_AI_0007'
+        lwDpAlarm: 'C_2011_DI_0008'
+        fjUvAlarm: 'C_2011_DI_0009'
+        afAlarm: 'C_2011_DI_0010'
+        timeStatus: 'C_2011_AV_0000,C_2011_AV_0001,C_2011_AV_0002,C_2011_AV_0003'
+        xfTempSetVal: 'C_2011_AV_0004'
+        LnSu: 'C_2011_BV_0009'
+        timeSetTag: 'C_2011_BV_0010'
+        manualTag: 'C_2011_BV_0011'
+      'Z020-B-XF-2F-1':
+        xfTemp: 'C_2012_AI_0000'
+        sfTemp: 'C_2012_AI_0001'
+        hfTemp: 'C_2012_AI_0002'
+        pfTemp: 'C_2012_AI_0003'
+        ppm: 'C_2012_AI_0004'
+        wCv: 'C_2012_AI_0005'
+        xfCv: 'C_2012_AI_0006'
+        pfCv: 'C_2012_AI_0007'
+        lwDpAlarm: 'C_2012_BI_0008'
+        fjUvAlarm: 'C_2012_BI_0009'
+        afAlarm: 'C_2012_BI_0010'
+        timeStatus: 'C_2012_AV_0000,C_2012_AV_0001,C_2012_AV_0002,C_2012_AV_0003'
+        xfTempSetVal: 'C_2012_AV_0004'
+        LnSu: 'C_2012_BV_0009'
+        timeSetTag: 'C_2012_BV_0010'
+        manualTag: 'C_2012_BV_0011'
+      'Z020-N-XF-1F-5':
+        xfTemp: 'C_1009_AI_0000'
+        sfTemp: 'C_1009_AI_0001'
+        hfTemp: 'C_1009_AI_0002'
+        pfTemp: 'C_1009_AI_0003'
+        ppm: 'C_1009_AI_0004'
+        wCv: 'C_1009_AI_0005'
+        xfCv: 'C_1009_AI_0006'
+        pfCv: 'C_1009_AI_0007'
+        lwDpAlarm: 'C_1009_BI_0008'
+        fjUvAlarm: 'C_1009_BI_0009'
+        afAlarm: 'C_1009_BI_0010'
+        xfStatus: 'C_1201_DI_0012'
+        xfMA: 'C_1201_DI_0014'
+        xfFault: 'C_1201_DI_0013'
+        timeStatus: 'C_1009_AV_0000,C_1009_AV_0001,C_1009_AV_0002,C_1009_AV_0003'
+        xfTempSetVal: 'C_1009_AV_0004'
+        LnSu: 'C_1009_BV_0009'
+        timeSetTag: 'C_1009_BV_0010'
+        manualTag: 'C_1009_BV_0011'
+      'Z020-N-XF-1F-4':
+        xfTemp: 'C_1010_AI_0000'
+        sfTemp: 'C_1010_AI_0001'
+        hfTemp: 'C_1010_AI_0002'
+        pfTemp: 'C_1010_AI_0003'
+        ppm: 'C_1010_AI_0004'
+        wCv: 'C_1010_AI_0005'
+        xfCv: 'C_1009_AI_0006'
+        pfCv: 'C_1010_AI_0007'
+        lwDpAlarm: 'C_1010_BI_0008'
+        fjUvAlarm: 'C_1010_BI_0009'
+        afAlarm: 'C_1010_BI_0010'
+        xfStatus: 'C_1201_DI_0009'
+        xfMA: 'C_1201_DI_0010'
+        xfFault: 'C_1201_DI_0011'
+        timeStatus: 'C_1010_AV_0000,C_1010_AV_0001,C_1010_AV_0002,C_1010_AV_0003'
+        xfTempSetVal: 'C_1010_AV_0004'
+        LnSu: 'C_1010_BV_0009'
+        timeSetTag: 'C_1010_BV_0010'
+        manualTag: 'C_1010_BV_0011'
+      'Z020-N-XF-1F-3':
+        xfTemp: 'C_1011_AI_0000'
+        sfTemp: 'C_1011_AI_0001'
+        hfTemp: 'C_1011_AI_0002'
+        pfTemp: 'C_1011_AI_0003'
+        ppm: 'C_1011_AI_0004'
+        wCv: 'C_1011_AI_0005'
+        xfCv: 'C_1011_AI_0006'
+        pfCv: 'C_1011_AI_0007'
+        lwDpAlarm: 'C_1011_BI_0008'
+        fjUvAlarm: 'C_1011_BI_0009'
+        afAlarm: 'C_1011_BI_0010'
+        xfStatus: 'C_1201_DI_0006'
+        xfMA: 'C_1201_DI_0007'
+        xfFault: 'C_1201_DI_0008'
+        timeStatus: 'C_1011_AV_0000,C_1011_AV_0001,C_1011_AV_0002,C_1011_AV_0003'
+        xfTempSetVal: 'C_1011_AV_0004'
+        LnSu: 'C_1011_BV_0009'
+        timeSetTag: 'C_1011_BV_0010'
+        manualTag: 'C_1011_BV_0011'
+      'Z020-N-XF-2F-1':
+        xfTemp: 'C_1012_AI_0000'
+        sfTemp: 'C_1012_AI_0001'
+        hfTemp: 'C_1012_AI_0002'
+        pfTemp: 'C_1012_AI_0003'
+        ppm: 'C_1012_AI_0004'
+        wCv: 'C_1012_AI_0005'
+        xfCv: 'C_1012_AI_0006'
+        pfCv: 'C_1012_AI_0007'
+        lwDpAlarm: 'C_1012_BI_0008'
+        fjUvAlarm: 'C_1012_BI_0009'
+        afAlarm: 'C_1012_BI_0010'
+        xfStatus: 'C_1012_BI_0011'
+        xfMA: 'C_1012_BI_0012'
+        xfFault: 'C_1012_BI_0013'
+        pfStatus: 'C_1012_BI_0014'
+        pfMA: 'C_1012_BI_0015'
+        pfFault: 'C_1012_BI_0016'
+        timeStatus: 'C_1012_AV_0000,C_1012_AV_0001,C_1012_AV_0002,C_1012_AV_0003'
+        xfTempSetVal: 'C_1012_AV_0004'
+        LnSu: 'C_1012_BV_0009'
+        timeSetTag: 'C_1012_BV_0010'
+        manualTag: 'C_1012_BV_0011'
+    ahuMapper:
+      'Z020-B-AHU-1F-1':
+        xfTemp: 'C_2011_AI_0016'
+        sfTemp: 'C_2011_AI_0017'
+        hfTemp: 'C_2011_AI_0018'
+        xfCv: 'C_2011_AI_0019'
+        wCv: 'C_2011_AI_0020'
+        lwDpAlarm: 'C_2011_DI_0037'
+        fjUvAlarm: 'C_2011_DI_0038'
+        afAlarm: 'C_2011_DI_0039'
+        xfStatus: 'C_2011_DI_0040'
+        xfMA: 'C_2011_DI_0041'
+        xfFault: 'C_2011_DI_0042'
+        timeStatus: 'C_2011_AV_0010,C_2011_AV_0011,C_2011_AV_0012,C_2011_AV_0013'
+        xfTempSetVal: 'C_2011_AV_0014'
+        LnSu: 'C_2011_BV_0019'
+        timeSetTag: 'C_2011_BV_0020'
+        manualTag: 'C_2011_BV_0021'
+      'Z020-B-AHU-2F-1':
+        xfTemp: 'C_2012_AI_0016'
+        sfTemp: 'C_2012_AI_0017'
+        hfTemp: 'C_2012_AI_0018'
+        xfCv: 'C_2012_AI_0019'
+        wCv: 'C_2012_AI_0020'
+        lwDpAlarm: 'C_2012_BI_0037'
+        fjUvAlarm: 'C_2012_BI_0038'
+        afAlarm: 'C_2012_BI_0039'
+        xfStatus: 'C_2012_BI_0040'
+        xfMA: 'C_2012_BI_0041'
+        xfFault: 'C_2012_BI_0042'
+        timeStatus: 'C_2012_AV_0010,C_2012_AV_0011,C_2012_AV_0012,C_2012_AV_0013'
+        xfTempSetVal: 'C_2012_AV_0014'
+        LnSu: 'C_2012_BV_0019'
+        timeSetTag: 'C_2012_BV_0020'
+        manualTag: 'C_2012_BV_0021'
+      'Z020-N-AHU-1F-1':
+        xfTemp: 'C_1011_AI_0016'
+        sfTemp: 'C_1011_AI_0017'
+        hfTemp: 'C_1011_AI_0018'
+        xfCv: 'C_1011_AI_0019'
+        wCv: 'C_1011_AI_0020'
+        lwDpAlarm: 'C_1011_BI_0037'
+        fjUvAlarm: 'C_1011_BI_0038'
+        afAlarm: 'C_1011_BI_0039'
+        xfStatus: 'C_1011_BI_0040'
+        xfMA: 'C_1011_BI_0041'
+        xfFault: 'C_1011_BI_0042'
+        timeStatus: 'C_1011_AV_0010,C_1011_AV_0011,C_1011_AV_0012,C_1011_AV_0013'
+        xfTempSetVal: 'C_1011_AV_0014'
+        LnSu: 'C_1011_BV_0019'
+        timeSetTag: 'C_1011_BV_0020'
+        manualTag: 'C_1011_BV_0021'
+      'Z020-N-AHU-2F-1':
+        xfTemp: 'C_1012_AI_0016'
+        sfTemp: 'C_1012_AI_0017'
+        hfTemp: 'C_1012_AI_0018'
+        xfCv: 'C_1012_AI_0019'
+        wCv: 'C_1012_AI_0020'
+        lwDpAlarm: 'C_1012_AI_0037'
+        fjUvAlarm: 'C_1012_AI_0038'
+        afAlarm: 'C_1012_AI_0039'
+        xfStatus: 'C_1012_AI_0040'
+        xfMA: 'C_1012_AI_0041'
+        xfFault: 'C_1012_AI_0042'
+        timeStatus: 'C_1012_AV_0010,C_1012_AV_0011,C_1012_AV_0012,C_1012_AV_0013'
+        xfTempSetVal: 'C_1012_AV_0014'
+        LnSu: 'C_1012_BV_0019'
+        timeSetTag: 'C_1012_BV_0020'
+        manualTag: 'C_1012_BV_0021'
 # mybatis配置
 mybatis:
   # 搜索指定包别名

+ 237 - 5
ems/ems-cloud/ems-dev-adapter/src/main/resources/application-prod-ct.yml

@@ -62,10 +62,6 @@ adapter:
       loginName: admin
       password: Acrel001
     subids: 10100002,10100003
-  # BA楼控
-  ba-ctl:
-    url: http://172.17.50.186:80
-    appId: httpsjy
   # 广场照明控制
   square-lighting-ctl:
     url: http://172.17.60.30:8686
@@ -73,7 +69,243 @@ adapter:
     user-name: developer3
     password: dev@admin123
     tenant-id: 1
-
+  # BA楼控
+  ba-ctl:
+    url: http://172.17.50.186:80
+    appId: httpsjy
+    xfMapper:
+      'Z020-B-XF-1F-5':
+        xfTemp: 'C_2009_AI_0000'
+        sfTemp: 'C_2009_AI_0001'
+        hfTemp: 'C_2009_AI_0002'
+        pfTemp: 'C_2009_AI_0003'
+        ppm: 'C_2009_AI_0004'
+        wCv: 'C_2009_AI_0005'
+        xfCv: 'C_2009_AI_0006'
+        pfCv: 'C_2009_AI_0007'
+        lwDpAlarm: 'C_2009_DI_0008'
+        fjUvAlarm: 'C_2009_DI_0009'
+        afAlarm: 'C_2009_DI_0010'
+        xfStatus: 'C_2009_DI_0011'
+        xfMA: 'C_2009_DI_0012'
+        xfFault: 'C_2009_DI_0013'
+        pfStatus: 'C_2009_DI_0014'
+        pfMA: 'C_2009_DI_0015'
+        pfFault: 'C_2009_DI_0016'
+        timeStatus: 'C_2009_AV_0000,C_2009_AV_0001,C_2009_AV_0002,C_2009_AV_0003'
+        xfTempSetVal: 'C_2009_AV_0004'
+        LnSu: 'C_2009_BV_0009'
+        timeSetTag: 'C_2009_BV_0010'
+        manualTag: 'C_2009_BV_0011'
+      'Z020-B-XF-1F-4':
+        xfTemp: 'C_2010_AI_0000'
+        sfTemp: 'C_2010_AI_0001'
+        hfTemp: 'C_2010_AI_0002'
+        pfTemp: 'C_2010_AI_0003'
+        ppm: 'C_2010_AI_0004'
+        wCv: 'C_2010_AI_0005'
+        xfCv: 'C_2010_AI_0006'
+        pfCv: 'C_2010_AI_0007'
+        lwDpAlarm: 'C_2010_BI_0008'
+        fjUvAlarm: 'C_2010_BI_0009'
+        afAlarm: 'C_2010_BI_0010'
+        xfStatus: 'C_2010_BI_0011'
+        xfMA: 'C_2010_BI_0012'
+        xfFault: 'C_2010_BI_0013'
+        pfStatus: 'C_2010_BI_0014'
+        pfMA: 'C_2010_BI_0015'
+        pfFault: 'C_2010_BI_0016'
+        timeStatus: 'C_2010_AV_0000,C_2010_AV_0001,C_2010_AV_0002,C_2010_AV_0003'
+        xfTempSetVal: 'C_2010_AV_0004'
+        LnSu: 'C_2010_BV_0009'
+        timeSetTag: 'C_2010_BV_0010'
+        manualTag: 'C_2010_BV_0011'
+      'Z020-B-XF-1F-3':
+        xfTemp: 'C_2011_AI_0000'
+        sfTemp: 'C_2011_AI_0001'
+        hfTemp: 'C_2011_AI_0002'
+        pfTemp: 'C_2011_AI_0003'
+        ppm: 'C_2011_AI_0004'
+        wCv: 'C_2011_AI_0005'
+        xfCv: 'C_2011_AI_0006'
+        pfCv: 'C_2011_AI_0007'
+        lwDpAlarm: 'C_2011_DI_0008'
+        fjUvAlarm: 'C_2011_DI_0009'
+        afAlarm: 'C_2011_DI_0010'
+        timeStatus: 'C_2011_AV_0000,C_2011_AV_0001,C_2011_AV_0002,C_2011_AV_0003'
+        xfTempSetVal: 'C_2011_AV_0004'
+        LnSu: 'C_2011_BV_0009'
+        timeSetTag: 'C_2011_BV_0010'
+        manualTag: 'C_2011_BV_0011'
+      'Z020-B-XF-2F-1':
+        xfTemp: 'C_2012_AI_0000'
+        sfTemp: 'C_2012_AI_0001'
+        hfTemp: 'C_2012_AI_0002'
+        pfTemp: 'C_2012_AI_0003'
+        ppm: 'C_2012_AI_0004'
+        wCv: 'C_2012_AI_0005'
+        xfCv: 'C_2012_AI_0006'
+        pfCv: 'C_2012_AI_0007'
+        lwDpAlarm: 'C_2012_BI_0008'
+        fjUvAlarm: 'C_2012_BI_0009'
+        afAlarm: 'C_2012_BI_0010'
+        timeStatus: 'C_2012_AV_0000,C_2012_AV_0001,C_2012_AV_0002,C_2012_AV_0003'
+        xfTempSetVal: 'C_2012_AV_0004'
+        LnSu: 'C_2012_BV_0009'
+        timeSetTag: 'C_2012_BV_0010'
+        manualTag: 'C_2012_BV_0011'
+      'Z020-N-XF-1F-5':
+        xfTemp: 'C_1009_AI_0000'
+        sfTemp: 'C_1009_AI_0001'
+        hfTemp: 'C_1009_AI_0002'
+        pfTemp: 'C_1009_AI_0003'
+        ppm: 'C_1009_AI_0004'
+        wCv: 'C_1009_AI_0005'
+        xfCv: 'C_1009_AI_0006'
+        pfCv: 'C_1009_AI_0007'
+        lwDpAlarm: 'C_1009_BI_0008'
+        fjUvAlarm: 'C_1009_BI_0009'
+        afAlarm: 'C_1009_BI_0010'
+        xfStatus: 'C_1201_DI_0012'
+        xfMA: 'C_1201_DI_0014'
+        xfFault: 'C_1201_DI_0013'
+        timeStatus: 'C_1009_AV_0000,C_1009_AV_0001,C_1009_AV_0002,C_1009_AV_0003'
+        xfTempSetVal: 'C_1009_AV_0004'
+        LnSu: 'C_1009_BV_0009'
+        timeSetTag: 'C_1009_BV_0010'
+        manualTag: 'C_1009_BV_0011'
+      'Z020-N-XF-1F-4':
+        xfTemp: 'C_1010_AI_0000'
+        sfTemp: 'C_1010_AI_0001'
+        hfTemp: 'C_1010_AI_0002'
+        pfTemp: 'C_1010_AI_0003'
+        ppm: 'C_1010_AI_0004'
+        wCv: 'C_1010_AI_0005'
+        xfCv: 'C_1009_AI_0006'
+        pfCv: 'C_1010_AI_0007'
+        lwDpAlarm: 'C_1010_BI_0008'
+        fjUvAlarm: 'C_1010_BI_0009'
+        afAlarm: 'C_1010_BI_0010'
+        xfStatus: 'C_1201_DI_0009'
+        xfMA: 'C_1201_DI_0010'
+        xfFault: 'C_1201_DI_0011'
+        timeStatus: 'C_1010_AV_0000,C_1010_AV_0001,C_1010_AV_0002,C_1010_AV_0003'
+        xfTempSetVal: 'C_1010_AV_0004'
+        LnSu: 'C_1010_BV_0009'
+        timeSetTag: 'C_1010_BV_0010'
+        manualTag: 'C_1010_BV_0011'
+      'Z020-N-XF-1F-3':
+        xfTemp: 'C_1011_AI_0000'
+        sfTemp: 'C_1011_AI_0001'
+        hfTemp: 'C_1011_AI_0002'
+        pfTemp: 'C_1011_AI_0003'
+        ppm: 'C_1011_AI_0004'
+        wCv: 'C_1011_AI_0005'
+        xfCv: 'C_1011_AI_0006'
+        pfCv: 'C_1011_AI_0007'
+        lwDpAlarm: 'C_1011_BI_0008'
+        fjUvAlarm: 'C_1011_BI_0009'
+        afAlarm: 'C_1011_BI_0010'
+        xfStatus: 'C_1201_DI_0006'
+        xfMA: 'C_1201_DI_0007'
+        xfFault: 'C_1201_DI_0008'
+        timeStatus: 'C_1011_AV_0000,C_1011_AV_0001,C_1011_AV_0002,C_1011_AV_0003'
+        xfTempSetVal: 'C_1011_AV_0004'
+        LnSu: 'C_1011_BV_0009'
+        timeSetTag: 'C_1011_BV_0010'
+        manualTag: 'C_1011_BV_0011'
+      'Z020-N-XF-2F-1':
+        xfTemp: 'C_1012_AI_0000'
+        sfTemp: 'C_1012_AI_0001'
+        hfTemp: 'C_1012_AI_0002'
+        pfTemp: 'C_1012_AI_0003'
+        ppm: 'C_1012_AI_0004'
+        wCv: 'C_1012_AI_0005'
+        xfCv: 'C_1012_AI_0006'
+        pfCv: 'C_1012_AI_0007'
+        lwDpAlarm: 'C_1012_BI_0008'
+        fjUvAlarm: 'C_1012_BI_0009'
+        afAlarm: 'C_1012_BI_0010'
+        xfStatus: 'C_1012_BI_0011'
+        xfMA: 'C_1012_BI_0012'
+        xfFault: 'C_1012_BI_0013'
+        pfStatus: 'C_1012_BI_0014'
+        pfMA: 'C_1012_BI_0015'
+        pfFault: 'C_1012_BI_0016'
+        timeStatus: 'C_1012_AV_0000,C_1012_AV_0001,C_1012_AV_0002,C_1012_AV_0003'
+        xfTempSetVal: 'C_1012_AV_0004'
+        LnSu: 'C_1012_BV_0009'
+        timeSetTag: 'C_1012_BV_0010'
+        manualTag: 'C_1012_BV_0011'
+    ahuMapper:
+      'Z020-B-AHU-1F-1':
+        xfTemp: 'C_2011_AI_0016'
+        sfTemp: 'C_2011_AI_0017'
+        hfTemp: 'C_2011_AI_0018'
+        xfCv: 'C_2011_AI_0019'
+        wCv: 'C_2011_AI_0020'
+        lwDpAlarm: 'C_2011_DI_0037'
+        fjUvAlarm: 'C_2011_DI_0038'
+        afAlarm: 'C_2011_DI_0039'
+        xfStatus: 'C_2011_DI_0040'
+        xfMA: 'C_2011_DI_0041'
+        xfFault: 'C_2011_DI_0042'
+        timeStatus: 'C_2011_AV_0010,C_2011_AV_0011,C_2011_AV_0012,C_2011_AV_0013'
+        xfTempSetVal: 'C_2011_AV_0014'
+        LnSu: 'C_2011_BV_0019'
+        timeSetTag: 'C_2011_BV_0020'
+        manualTag: 'C_2011_BV_0021'
+      'Z020-B-AHU-2F-1':
+        xfTemp: 'C_2012_AI_0016'
+        sfTemp: 'C_2012_AI_0017'
+        hfTemp: 'C_2012_AI_0018'
+        xfCv: 'C_2012_AI_0019'
+        wCv: 'C_2012_AI_0020'
+        lwDpAlarm: 'C_2012_BI_0037'
+        fjUvAlarm: 'C_2012_BI_0038'
+        afAlarm: 'C_2012_BI_0039'
+        xfStatus: 'C_2012_BI_0040'
+        xfMA: 'C_2012_BI_0041'
+        xfFault: 'C_2012_BI_0042'
+        timeStatus: 'C_2012_AV_0010,C_2012_AV_0011,C_2012_AV_0012,C_2012_AV_0013'
+        xfTempSetVal: 'C_2012_AV_0014'
+        LnSu: 'C_2012_BV_0019'
+        timeSetTag: 'C_2012_BV_0020'
+        manualTag: 'C_2012_BV_0021'
+      'Z020-N-AHU-1F-1':
+        xfTemp: 'C_1011_AI_0016'
+        sfTemp: 'C_1011_AI_0017'
+        hfTemp: 'C_1011_AI_0018'
+        xfCv: 'C_1011_AI_0019'
+        wCv: 'C_1011_AI_0020'
+        lwDpAlarm: 'C_1011_BI_0037'
+        fjUvAlarm: 'C_1011_BI_0038'
+        afAlarm: 'C_1011_BI_0039'
+        xfStatus: 'C_1011_BI_0040'
+        xfMA: 'C_1011_BI_0041'
+        xfFault: 'C_1011_BI_0042'
+        timeStatus: 'C_1011_AV_0010,C_1011_AV_0011,C_1011_AV_0012,C_1011_AV_0013'
+        xfTempSetVal: 'C_1011_AV_0014'
+        LnSu: 'C_1011_BV_0019'
+        timeSetTag: 'C_1011_BV_0020'
+        manualTag: 'C_1011_BV_0021'
+      'Z020-N-AHU-2F-1':
+        xfTemp: 'C_1012_AI_0016'
+        sfTemp: 'C_1012_AI_0017'
+        hfTemp: 'C_1012_AI_0018'
+        xfCv: 'C_1012_AI_0019'
+        wCv: 'C_1012_AI_0020'
+        lwDpAlarm: 'C_1012_AI_0037'
+        fjUvAlarm: 'C_1012_AI_0038'
+        afAlarm: 'C_1012_AI_0039'
+        xfStatus: 'C_1012_AI_0040'
+        xfMA: 'C_1012_AI_0041'
+        xfFault: 'C_1012_AI_0042'
+        timeStatus: 'C_1012_AV_0010,C_1012_AV_0011,C_1012_AV_0012,C_1012_AV_0013'
+        xfTempSetVal: 'C_1012_AV_0014'
+        LnSu: 'C_1012_BV_0019'
+        timeSetTag: 'C_1012_BV_0020'
+        manualTag: 'C_1012_BV_0021'
 # mybatis配置
 mybatis:
   # 搜索指定包别名

+ 4 - 1
ems/ems-cloud/ems-dev-adapter/src/test/java/com/huashe/test/BaCtlTest.java

@@ -61,7 +61,10 @@ public class BaCtlTest {
     @Test
     public void testGetCodesVal() {
         BaCtlEnergyTemplate template = new BaCtlEnergyTemplate(config.getUrl());
-        String ret = template.getCodesVal(new CodesValReq("C_2003_AV_0000", "C_2003_AV_0002"));
+        String ret = template.getCodesVal(new CodesValReq("C_2009_AI_0000","C_2009_AI_0001","C_2009_AI_0002","C_2009_AI_0003","C_2009_AI_0004","C_2009_AI_0005","C_2009_AI_0006","C_2009_AI_0007"));
+        log.info("ret:{}", ret);
+        ret = template.getCodesVal(new CodesValReq("C_2009_DI_0008","C_2009_DI_0009","C_2009_DI_0010","C_2009_DI_0011","C_2009_DI_0012","C_2009_DI_0013","C_2009_DI_0014","C_2009_DI_0015","C_2009_DI_0016"));
+        log.info("ret:{}", ret);
         Assert.assertNotNull(ret);
     }
 }

+ 106 - 0
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/PlantCarbonSinkController.java

@@ -0,0 +1,106 @@
+package com.ruoyi.ems.controller;
+
+import com.huashe.common.domain.AjaxResult;
+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.common.security.annotation.RequiresPermissions;
+import com.ruoyi.ems.domain.PlantCarbonSink;
+import com.ruoyi.ems.service.IPlantCarbonSinkService;
+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.PutMapping;
+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-11-12
+ */
+@RestController
+@RequestMapping("/plantCarbonSink")
+public class PlantCarbonSinkController extends BaseController {
+    @Autowired
+    private IPlantCarbonSinkService service;
+
+    /**
+     * 查询植物碳汇维列表
+     */
+    @RequiresPermissions("basecfg:casink:list")
+    @GetMapping("/list")
+    public TableDataInfo list(PlantCarbonSink param) {
+        startPage();
+        List<PlantCarbonSink> list = service.selectList(param);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询植物碳汇维列表
+     */
+    @RequiresPermissions("basecfg:casink:list")
+    @GetMapping("/areaCfg")
+    public AjaxResult getAreaCfg(@RequestParam(name = "areaCode") String areaCode) {
+        List<PlantCarbonSink> list = service.getAreaCfg(areaCode);
+        return success(list);
+    }
+
+    /**
+     * 查询植物碳汇维列表
+     */
+    @RequiresPermissions("basecfg:casink:list")
+    @PutMapping("/areaCfg")
+    public AjaxResult mergeAreaCfg(@RequestParam(name = "areaCode") String areaCode,
+        @RequestBody List<PlantCarbonSink> list) {
+        service.mergeAreaCfg(areaCode, list);
+        return success();
+    }
+
+    /**
+     * 获取植物碳汇维详细信息
+     */
+    @RequiresPermissions("basecfg:casink:query")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return success(service.selectById(id));
+    }
+
+    /**
+     * 新增植物碳汇维
+     */
+    @RequiresPermissions("basecfg:casink:add")
+    @Log(title = "植物碳汇维", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody PlantCarbonSink param) {
+        return toAjax(service.insert(param));
+    }
+
+    /**
+     * 修改植物碳汇维
+     */
+    @RequiresPermissions("basecfg:casink:edit")
+    @Log(title = "植物碳汇维", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody PlantCarbonSink param) {
+        return toAjax(service.update(param));
+    }
+
+    /**
+     * 删除植物碳汇维
+     */
+    @RequiresPermissions("basecfg:casink:remove")
+    @Log(title = "植物碳汇维", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long id) {
+        return toAjax(service.deleteById(id));
+    }
+}

+ 46 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/domain/PlantCarbonSink.java

@@ -0,0 +1,46 @@
+package com.ruoyi.ems.domain;
+
+import com.huashe.common.domain.BaseEntity;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 植物碳汇维对象 dim_plant_carbon_sink
+ * 
+ * @author ruoyi
+ * @date 2025-11-12
+ */
+@Data
+public class PlantCarbonSink extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 序号 */
+    private Long id;
+
+    /** 区域代码 */
+    private String areaCode;
+
+    /** 种植面积 */
+    private Double plantSize;
+
+    /** 种植方式 */
+    private String plantMethod;
+
+    /** 固碳量 kgC02/m2 */
+    private Double carbonQuantity;
+
+    /** 数据版本 */
+    private String version;
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("plantMethod", getPlantMethod())
+            .append("carbonQuantity", getCarbonQuantity())
+            .append("version", getVersion())
+            .toString();
+    }
+}

+ 78 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/PlantCarbonSinkMapper.java

@@ -0,0 +1,78 @@
+package com.ruoyi.ems.mapper;
+
+import com.ruoyi.ems.domain.PlantCarbonSink;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 植物碳汇维表Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-11-12
+ */
+@Mapper
+public interface PlantCarbonSinkMapper
+{
+    /**
+     * 查询植物碳汇维
+     * 
+     * @param id 植物碳汇维主键
+     * @return 植物碳汇维
+     */
+    PlantCarbonSink selectById(Long id);
+
+    /**
+     * 查询植物碳汇维列表
+     * 
+     * @param param 植物碳汇维表
+     * @return 植物碳汇维集合
+     */
+     List<PlantCarbonSink> selectList(PlantCarbonSink param);
+
+    /**
+     * 查询区域种植配置
+     * @param areaCode 区域代码
+     * @return 区域种植配置
+     */
+     List<PlantCarbonSink> selectAreaCfg(@Param("areaCode") String areaCode);
+
+    /**
+     * 删除区域种植配置
+     * @param areaCode 区域代码
+     * @return 区域种植配置
+     */
+     int deleteAreaCfg(@Param("areaCode") String areaCode);
+
+    /**
+     * 批量新增区域种植配置
+     * @param list 区域种植配置
+     * @return 批量新增结果
+     */
+     int addAreaCfgBatch(List<PlantCarbonSink> list);
+
+    /**
+     * 新增植物碳汇配置
+     * 
+     * @param param 植物碳汇维
+     * @return 结果
+     */
+    int insert(PlantCarbonSink param);
+
+    /**
+     * 修改植物碳汇配置
+     * 
+     * @param param 植物碳汇维
+     * @return 结果
+     */
+    int update(PlantCarbonSink param);
+
+    /**
+     * 删除植物碳汇维
+     * 
+     * @param id 植物碳汇维主键
+     * @return 结果
+     */
+     int deleteById(Long id);
+}

+ 67 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/IPlantCarbonSinkService.java

@@ -0,0 +1,67 @@
+package com.ruoyi.ems.service;
+
+import com.ruoyi.ems.domain.PlantCarbonSink;
+
+import java.util.List;
+
+/**
+ * 植物碳汇配置Service接口
+ *
+ * @author ruoyi
+ * @date 2025-11-12
+ */
+public interface IPlantCarbonSinkService {
+    /**
+     * 查询植物碳配置
+     *
+     * @param id 植物碳汇维主键
+     * @return 植物碳汇维
+     */
+    PlantCarbonSink selectById(Long id);
+
+    /**
+     * 查询植物碳汇配置列表
+     *
+     * @param param 植物碳汇配置
+     * @return 植物碳汇配置集合
+     */
+    List<PlantCarbonSink> selectList(PlantCarbonSink param);
+
+    /**
+     * 查询区域植物种植配置
+     * @param areaCode 区域编码
+     * @return list
+     */
+    List<PlantCarbonSink> getAreaCfg(String areaCode);
+
+    /**
+     * 批量更新区域配置
+     * @param areaCode 区域代码
+     * @param list 区域配置列表
+     */
+    void mergeAreaCfg(String areaCode, List<PlantCarbonSink> list);
+
+    /**
+     * 新增植物碳汇配置
+     *
+     * @param param 植物碳汇配置
+     * @return 结果
+     */
+    int insert(PlantCarbonSink param);
+
+    /**
+     * 修改植物碳汇配置
+     *
+     * @param param 植物碳汇配置
+     * @return 结果
+     */
+    int update(PlantCarbonSink param);
+
+    /**
+     * 删除植物碳汇配置信息
+     *
+     * @param id 植物碳汇维主键
+     * @return 结果
+     */
+    int deleteById(Long id);
+}

+ 56 - 14
ems/ems-core/src/main/java/com/ruoyi/ems/service/analysis/CarbonCalculationService.java

@@ -15,6 +15,7 @@ import com.ruoyi.ems.domain.CaMeterD;
 import com.ruoyi.ems.domain.ElecPgSupplyH;
 import com.ruoyi.ems.domain.ElecPvSupplyH;
 import com.ruoyi.ems.domain.EmissionFactor;
+import com.ruoyi.ems.domain.PlantCarbonSink;
 import com.ruoyi.ems.mapper.CaEmissionForecastMapper;
 import com.ruoyi.ems.mapper.CaMeterDMapper;
 import com.ruoyi.ems.model.PvSupplyVO;
@@ -22,8 +23,11 @@ import com.ruoyi.ems.model.QueryMeter;
 import com.ruoyi.ems.service.IElecPgSupplyHService;
 import com.ruoyi.ems.service.IElecPvSupplyHService;
 import com.ruoyi.ems.service.IEmissionFactorService;
+import com.ruoyi.ems.service.IPlantCarbonSinkService;
+import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -78,6 +82,9 @@ public class CarbonCalculationService {
     @Resource
     private IEmissionFactorService emissionFactorService;
 
+    @Autowired
+    private IPlantCarbonSinkService service;
+
     /**
      * 计算日碳排量
      * <功能详细描述>
@@ -93,13 +100,15 @@ public class CarbonCalculationService {
 
             // 计算碳排放量(基于电网用电数据)
             ElecPgSupplyH totalElectricity = getDailyElectricityConsumption(areaCode, date);
-            Double emission = calculateCarbonEmission(totalElectricity != null ? totalElectricity.getUseElecQuantity() : null);
-            caMeterD.setCaEmissionQuantity(emission);
+            BigDecimal emission = calculateCarbonEmission(
+                totalElectricity != null ? totalElectricity.getUseElecQuantity() : null);
+            caMeterD.setCaEmissionQuantity(emission.doubleValue());
 
             // 计算碳汇量(基于光伏产能数据)
             PvSupplyVO totalPVProduction = getDailyPVProduction(areaCode, date);
-            Double sink = calculateCarbonSink(totalPVProduction);
-            caMeterD.setCaSinkQuantity(sink);
+            BigDecimal pvSink = calculatePvCarbonSink(totalPVProduction);
+            BigDecimal plantSink = calculatePlantCarbonSink(areaCode);
+            caMeterD.setCaSinkQuantity(pvSink.add(plantSink).doubleValue());
 
             caMeterDMapper.deleteCaMeterDByArea(areaCode, date.format(dateForm));
             caMeterDMapper.insertCaMeterD(caMeterD);
@@ -116,7 +125,7 @@ public class CarbonCalculationService {
             Map<String, Double> monthElectricityMap = totalElectricitys.stream()
                 .collect(Collectors.toMap(ElecPgSupplyH::getStartRecTime, ElecPgSupplyH::getUseElecQuantity));
             Double totalElectricity = calculateForecastElectricity(monthElectricityMap);
-            Double emission = calculateCarbonEmission(totalElectricity);
+            Double emission = calculateCarbonEmission(totalElectricity).doubleValue();
 
             CaEmissionForecast caEmissionForecast = new CaEmissionForecast();
             caEmissionForecast.setAreaCode(areaCode);
@@ -160,34 +169,67 @@ public class CarbonCalculationService {
     }
 
     // 计算碳排放量
-    private Double calculateCarbonEmission(Double useElecQuantity) {
+    private BigDecimal calculateCarbonEmission(Double useElecQuantity) {
         EmissionFactor factor = emissionFactorService.selectByRegion("CN", 1);
 
         if (null == factor || useElecQuantity == null || factor.getFactorValue() == null) {
-            return null;
+            return BigDecimal.ZERO;
         }
 
         return round(useElecQuantity * factor.getFactorValue(), 2);
     }
 
-    private Double calculateCarbonSink(PvSupplyVO totalPVProduction) {
-        EmissionFactor factor = emissionFactorService.selectByRegion("CN", 4);
+    /**
+     * 计算光伏碳汇量
+     *
+     * @param totalPVProduction 光伏发电数据
+     * @return 碳汇量
+     */
+    private BigDecimal calculatePvCarbonSink(PvSupplyVO totalPVProduction) {
+        EmissionFactor factor = emissionFactorService.selectByRegion("CN", 1);
 
         if (null == factor || totalPVProduction == null || factor.getFactorValue() == null
             || totalPVProduction.getGenElecQuantity() == null) {
-            return null;
+            return BigDecimal.ZERO;
         }
 
         return round(totalPVProduction.getGenElecQuantity().doubleValue() * factor.getFactorValue(), 2);
     }
 
+    /**
+     * 计算绿植碳汇量
+     *
+     * @return 碳汇量
+     */
+    private BigDecimal calculatePlantCarbonSink(String areaCode) {
+        List<PlantCarbonSink> sinkCfgs = service.getAreaCfg(areaCode);
+
+        // 初始值应为0,但建议命名为totalCarbonSink提升可读性
+        BigDecimal totalCarbonSink = BigDecimal.ZERO;
+
+        if (CollectionUtils.isNotEmpty(sinkCfgs)) {
+            for (PlantCarbonSink sinkCfg : sinkCfgs) {
+                // 推荐使用valueOf避免字符串转换
+                BigDecimal q = BigDecimal.valueOf(sinkCfg.getCarbonQuantity());
+                BigDecimal a = BigDecimal.valueOf(sinkCfg.getPlantSize());
+
+                // 必须接收累加结果
+                totalCarbonSink = totalCarbonSink.add(q.multiply(a));
+            }
+
+            totalCarbonSink = totalCarbonSink.divide(BigDecimal.valueOf(365), 2, RoundingMode.HALF_UP);
+        }
+
+        return totalCarbonSink;
+    }
+
     // 数值四舍五入保留指定小数位
-    private double round(double value, int scale) {
-        if (scale < 0)
+    private BigDecimal round(double value, int scale) {
+        if (scale < 0) {
             throw new IllegalArgumentException("scale must be non-negative");
+        }
         BigDecimal bd = BigDecimal.valueOf(value);
-        bd = bd.setScale(scale, RoundingMode.HALF_UP);
-        return bd.doubleValue();
+        return bd.setScale(scale, RoundingMode.HALF_UP);
     }
 
     // 计算预测电网购电量

+ 92 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/PlantCarbonSinkServiceImpl.java

@@ -0,0 +1,92 @@
+package com.ruoyi.ems.service.impl;
+
+import com.ruoyi.ems.domain.PlantCarbonSink;
+import com.ruoyi.ems.mapper.PlantCarbonSinkMapper;
+import com.ruoyi.ems.service.IPlantCarbonSinkService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 植物碳汇配置Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-11-12
+ */
+@Service
+public class PlantCarbonSinkServiceImpl implements IPlantCarbonSinkService {
+    @Autowired
+    private PlantCarbonSinkMapper plantCarbonSinkMapper;
+
+    /**
+     * 查询植物碳汇配置
+     *
+     * @param id 植物碳汇配置主键
+     * @return 植物碳汇配置
+     */
+    @Override
+    public PlantCarbonSink selectById(Long id) {
+        return plantCarbonSinkMapper.selectById(id);
+    }
+
+    /**
+     * 查询植物碳汇配置列表
+     *
+     * @param param 植物碳汇配置
+     * @return 植物碳汇配置
+     */
+    @Override
+    public List<PlantCarbonSink> selectList(PlantCarbonSink param) {
+        return plantCarbonSinkMapper.selectList(param);
+    }
+
+    @Override
+    public List<PlantCarbonSink> getAreaCfg(String areaCode) {
+        return plantCarbonSinkMapper.selectAreaCfg(areaCode);
+    }
+
+    @Override
+    public void mergeAreaCfg(String areaCode, List<PlantCarbonSink> list) {
+        plantCarbonSinkMapper.deleteAreaCfg(areaCode);
+
+        if (CollectionUtils.isNotEmpty(list)) {
+            plantCarbonSinkMapper.addAreaCfgBatch(list);
+        }
+    }
+
+    /**
+     * 新增植物碳汇配置
+     *
+     * @param param 植物碳汇配置
+     * @return 结果
+     */
+    @Override
+    public int insert(PlantCarbonSink param) {
+        return plantCarbonSinkMapper.insert(param);
+    }
+
+    /**
+     * 修改植物碳汇配置
+     *
+     * @param param 植物碳汇配置
+     * @return 结果
+     */
+    @Override
+    public int update(PlantCarbonSink param) {
+        return plantCarbonSinkMapper.update(param);
+    }
+
+    /**
+     * 删除植物碳汇配置信息
+     *
+     * @param id 植物碳汇配置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteById(Long id) {
+        return plantCarbonSinkMapper.deleteById(id);
+    }
+}

+ 82 - 0
ems/ems-core/src/main/resources/mapper/ems/PlantCarbonSinkMapper.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.ems.mapper.PlantCarbonSinkMapper">
+    
+    <resultMap type="com.ruoyi.ems.domain.PlantCarbonSink" id="PlantCarbonSinkResult">
+        <result property="id"    column="id"    />
+        <result property="plantMethod"    column="plant_method"    />
+        <result property="carbonQuantity"    column="carbon_quantity"    />
+        <result property="version"    column="version"    />
+    </resultMap>
+
+    <resultMap type="com.ruoyi.ems.domain.PlantCarbonSink" id="RelResult">
+        <result property="id"    column="id"    />
+        <result property="areaCode"    column="area_code"    />
+        <result property="plantSize"   column="plant_size"    />
+        <result property="plantMethod"    column="plant_method"    />
+        <result property="carbonQuantity"    column="carbon_quantity"    />
+    </resultMap>
+
+    <sql id="selectDimPlantCarbonSinkVo">
+        select id, plant_method, carbon_quantity, version from dim_plant_carbon_sink
+    </sql>
+
+    <select id="selectList" parameterType="com.ruoyi.ems.domain.PlantCarbonSink" resultMap="PlantCarbonSinkResult">
+        <include refid="selectDimPlantCarbonSinkVo"/>
+        <where>  
+        </where>
+    </select>
+    
+    <select id="selectById" parameterType="Long" resultMap="PlantCarbonSinkResult">
+        <include refid="selectDimPlantCarbonSinkVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectAreaCfg" parameterType="String" resultMap="RelResult">
+        select r.area_code, r.plant_size, s.id, s.plant_method, s.carbon_quantity from adm_area_plant_rel r
+            left join dim_plant_carbon_sink s on r.carbon_sink_id = s.id
+        where r.area_code = #{areaCode}
+    </select>
+
+    <delete id="deleteAreaCfg" parameterType="java.lang.String" >
+        Delete from adm_area_plant_rel where area_code = #{areaCode}
+    </delete>
+
+    <insert id="addAreaCfgBatch" parameterType="java.util.List">
+        insert into adm_area_plant_rel (`area_code`, `plant_size`, `carbon_sink_id`)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.areaCode},#{item.plantSize},#{item.id})
+        </foreach>
+    </insert>
+
+    <insert id="insert" parameterType="com.ruoyi.ems.domain.PlantCarbonSink" useGeneratedKeys="true" keyProperty="id">
+        insert into dim_plant_carbon_sink
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="plantMethod != null and plantMethod != ''">plant_method,</if>
+            <if test="carbonQuantity != null">carbon_quantity,</if>
+            <if test="version != null">version,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="plantMethod != null and plantMethod != ''">#{plantMethod},</if>
+            <if test="carbonQuantity != null">#{carbonQuantity},</if>
+            <if test="version != null">#{version},</if>
+         </trim>
+    </insert>
+
+    <update id="update" parameterType="com.ruoyi.ems.domain.PlantCarbonSink">
+        update dim_plant_carbon_sink
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="plantMethod != null and plantMethod != ''">plant_method = #{plantMethod},</if>
+            <if test="carbonQuantity != null">carbon_quantity = #{carbonQuantity},</if>
+            <if test="version != null">version = #{version},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteById" parameterType="Long">
+        delete from dim_plant_carbon_sink where id = #{id}
+    </delete>
+</mapper>

+ 138 - 15
ems/sql/ems_init_data.sql

@@ -176,16 +176,30 @@ INSERT INTO `adm_ems_facs` (`facs_code`, `facs_name`, `facs_category`, `facs_sub
 INSERT INTO `adm_ems_facs` (`facs_code`, `facs_name`, `facs_category`, `facs_subcategory`, `enable`, `ref_area`) VALUES ('DEV01', '北区-设备监测', 'W', 'W4', 1, '321283124S3001');
 INSERT INTO `adm_ems_facs` (`facs_code`, `facs_name`, `facs_category`, `facs_subcategory`, `enable`, `ref_area`) VALUES ('DEV02', '南区-设备监测', 'W', 'W4', 1, '321283124S3002');
 
--- 能源设备
-INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-2003', '北区能耗采集器C', '-', '-', '1', '综合楼', '321283124S300101', '321283124S3001', 'M_W4_DEV_BA_GA', 'NH01', 'SM', 'SYS_NHJC');
-INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-2004', '北区能耗采集器D', '-', '-', '1', '综合楼', '321283124S300101', '321283124S3001', 'M_W4_DEV_BA_GA', 'NH01', 'SM', 'SYS_NHJC');
-INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-2005', '北区汽修间能耗采集器', '-', '-', '1', '司机之家', '321283124S300102', '321283124S3001', 'M_W4_DEV_BA_GA', 'NH01', 'SM', 'SYS_NHJC');
-INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-2006', '北区警务室能耗采集器', '-', '-', '1', '警务室', '321283124S300103', '321283124S3001', 'M_W4_DEV_BA_GA', 'NH01', 'SM', 'SYS_NHJC');
-
-INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-1003', '南区能耗采集器C', '-', '-', '1', '综合楼', '321283124S300201', '321283124S3002', 'M_W4_DEV_BA_GA', 'NH02', 'SM', 'SYS_NHJC');
-INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-1004', '南区能耗采集器D', '-', '-', '1', '综合楼', '321283124S300201', '321283124S3002', 'M_W4_DEV_BA_GA', 'NH02', 'SM', 'SYS_NHJC');
-INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-1005', '南区汽修间能耗采集器', '-', '-', '1', '司机之家', '321283124S300202', '321283124S3002', 'M_W4_DEV_BA_GA', 'NH02', 'SM', 'SYS_NHJC');
-INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-1007', '南区宿舍能耗采集器', '-', '-', '1', '宿舍', '321283124S300203', '321283124S3002', 'M_W4_DEV_BA_GA', 'NH02', 'SM', 'SYS_NHJC');
+-- BA能耗监测网关
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-2003', '北区能耗采集器C', '-', '-', '1', '综合楼', '321283124S300101', '321283124S3001', 'M_W4_DEV_BA_GA', 'NH01', 'SM', 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-2004', '北区能耗采集器D', '-', '-', '1', '综合楼', '321283124S300101', '321283124S3001', 'M_W4_DEV_BA_GA', 'NH01', 'SM', 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-2005', '北区汽修间能耗采集器', '-', '-', '1', '司机之家', '321283124S300102', '321283124S3001', 'M_W4_DEV_BA_GA', 'NH01', 'SM', 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-2006', '北区警务室能耗采集器', '-', '-', '1', '警务室', '321283124S300103', '321283124S3001', 'M_W4_DEV_BA_GA', 'NH01', 'SM', 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-1003', '南区能耗采集器C', '-', '-', '1', '综合楼', '321283124S300201', '321283124S3002', 'M_W4_DEV_BA_GA', 'NH02', 'SM', 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-1004', '南区能耗采集器D', '-', '-', '1', '综合楼', '321283124S300201', '321283124S3002', 'M_W4_DEV_BA_GA', 'NH02', 'SM', 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-1005', '南区汽修间能耗采集器', '-', '-', '1', '司机之家', '321283124S300202', '321283124S3002', 'M_W4_DEV_BA_GA', 'NH02', 'SM', 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'W4-E-C-1007', '南区宿舍能耗采集器', '-', '-', '1', '宿舍', '321283124S300203', '321283124S3002', 'M_W4_DEV_BA_GA', 'NH02', 'SM', 'SYS_BA');
+
+-- BA新风、空调设备
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-B-XF-1F-5', '北1F-5新风系统', '-', '-', '1', '综合楼-食堂', '321283124S30010101', '321283124S3001', 'M_Z020_DEV_BA_XF', 'Z-KT-01', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-B-XF-1F-4', '北1F-4新风系统', '-', '-', '1', '综合楼-一楼', '321283124S30010101', '321283124S3001', 'M_Z020_DEV_BA_XF', 'Z-KT-01', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-B-XF-1F-3', '北1F-3新风系统', '-', '-', '1', '综合楼-一楼', '321283124S30010101', '321283124S3001', 'M_Z020_DEV_BA_XF', 'Z-KT-01', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-B-XF-2F-1', '北2F-1新风系统', '-', '-', '1', '综合楼-二楼', '321283124S30010104', '321283124S3001', 'M_Z020_DEV_BA_XF', 'Z-KT-01', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-N-XF-1F-5', '南1F-5新风系统', '-', '-', '1', '综合楼-食堂', '321283124S30020101', '321283124S3002', 'M_Z020_DEV_BA_XF', 'Z-KT-02', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-N-XF-1F-4', '南1F-4新风系统', '-', '-', '1', '综合楼-一楼', '321283124S30020101', '321283124S3002', 'M_Z020_DEV_BA_XF', 'Z-KT-02', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-N-XF-1F-3', '南1F-3新风系统', '-', '-', '1', '综合楼-一楼', '321283124S30020101', '321283124S3002', 'M_Z020_DEV_BA_XF', 'Z-KT-02', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-N-XF-2F-1', '南2F-1新风系统', '-', '-', '1', '综合楼-二楼', '321283124S30020104', '321283124S3002', 'M_Z020_DEV_BA_XF', 'Z-KT-02', NULL, 'SYS_BA');
+
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-B-AHU-1F-1', '北1F-1空调系统', '-', '-', '1', '综合楼-一楼', '321283124S30010101', '321283124S3001', 'M_Z020_DEV_BA_AHU', 'Z-KT-01', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-B-AHU-2F-1', '北2F-1空调系统', '-', '-', '1', '综合楼-二楼', '321283124S30010104', '321283124S3001', 'M_Z020_DEV_BA_AHU', 'Z-KT-01', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-N-AHU-1F-1', '南1F-1空调系统', '-', '-', '1', '综合楼-一楼', '321283124S30020101', '321283124S3002', 'M_Z020_DEV_BA_AHU', 'Z-KT-02', NULL, 'SYS_BA');
+INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ( 'Z020-N-AHU-2F-1', '南2F-1空调系统', '-', '-', '1', '综合楼-二楼', '321283124S30020104', '321283124S3002', 'M_Z020_DEV_BA_AHU', 'Z-KT-02', NULL, 'SYS_BA');
 
 -- mock设备
 INSERT INTO `adm_ems_device` (`device_code`, `device_name`, `device_brand`, `device_spec`, `device_status`, `location`, `location_ref`, `area_code`, `device_model`, `ref_facs`, `ps_code`, `subsystem_code`) VALUES ('GCZR-001', '光储设备1',    'xxx', 'xxx', 1, '北区广场', '321283124S300104', '321283124S3001',  'test', 'C101', NULL, 'SYS_GCC');
@@ -251,6 +265,8 @@ INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `abilit
 INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_W4_DEV_BA_GA', 'BA采集控制网关', 2, 'http://172.17.60.27:9203/ems-dev-adapter/ba/ct/abilityCall', NULL);
 INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_W4_DEV_BA_METER_E', 'BA电能采集测点', 2, 'http://172.17.60.27:9203/ems-dev-adapter/ba/ct/abilityCall', NULL);
 INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_W4_DEV_BA_METER_W', 'BA用水采集测点', 2, 'http://172.17.60.27:9203/ems-dev-adapter/ba/ct/abilityCall', NULL);
+INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_Z020_DEV_BA_XF', 'BA新风设备', 2, 'http://172.17.60.27:9203/ems-dev-adapter/ba/ct/abilityCall', NULL);
+INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_Z020_DEV_BA_AHU', 'BA空调设备', 2, 'http://172.17.60.27:9203/ems-dev-adapter/ba/ct/abilityCall', NULL);
 INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_Z010_DEV_SQUARE_LAMP_POST', '智慧灯杆', 2, 'http://172.17.60.27:9203/ems-dev-adapter/square-light-ctl/ct/abilityCall', NULL);
 INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', '照明灯组', 2, 'http://172.17.60.27:9203/ems-dev-adapter/square-light-ctl/ct/abilityCall', NULL);
 INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', '照明集中器', 2, 'http://172.17.60.27:9203/ems-dev-adapter/square-light-ctl/ct/abilityCall', NULL);
@@ -281,6 +297,47 @@ INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_na
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_BA_METER_W', 'Base', 'location', '位置', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_BA_METER_W', 'Base', 'desc', '描述', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_BA_METER_W', 'Measure', 'value', '表计读数', '吨', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'Base', 'ddcTag', 'DDC标记', NULL, 'String');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'xfTemp', '新风温度', '℃', 'String');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'sfTemp', '送风温度', '℃', 'String');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'hfTemp', '回风温度', '℃', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'pfTemp', '排风温度', '℃', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'ppm', 'CO2浓度', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'wCv', '水阀开度反馈', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'xfCv', '新风阀开度反馈', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'pfCv', '排风阀开度反馈', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'lwDpAlarm', '滤网压差报警', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'fjUvAlarm', '风机欠压报警', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'afAlarm', '防冻开关报警', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'xfStatus', '新风机运行状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'xfMA', '新风机手自动', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'xfFault', '新风机故障', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'pfStatus', '排风机运行状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'pfMA', '排风机手自动', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'pfFault', '排风机故障', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'timeStatus', '定时状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'xfTempSetVal', '送风温度设定', '℃', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'LnSu', '冬夏季切换', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'timeSetTag', '定时状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_XF', 'State', 'manualTag', '手动模式状态', NULL, 'Enum');
+
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'Base', 'ddcTag', 'DDC标记', NULL, 'String');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'xfTemp', '新风温度', '℃', 'String');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'sfTemp', '送风温度', '℃', 'String');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'hfTemp', '回风温度', '℃', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'wCv', '水阀开度反馈', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'xfCv', '新风阀开度反馈', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'lwDpAlarm', '滤网压差报警', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'fjUvAlarm', '风机欠压报警', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'afAlarm', '防冻开关报警', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'xfStatus', '新风机运行状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'xfMA', '新风机手自动', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'xfFault', '新风机故障', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'timeStatus', '定时状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'xfTempSetVal', '送风温度设定', '℃', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'LnSu', '冬夏季切换', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'timeSetTag', '定时状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z020_DEV_BA_AHU', 'State', 'manualTag', '手动模式状态', NULL, 'Enum');
 
 
 -- 广场灯控属性
@@ -421,12 +478,64 @@ INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `at
 INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'deviceStatus', '0', '离线');
 INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'deviceStatus', '1', '在线');
 
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'lwDpAlarm', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'lwDpAlarm', '1', '报警');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'fjUvAlarm', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'fjUvAlarm', '1', '报警');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'afAlarm', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'afAlarm', '1', '报警');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'xfStatus', '0', '停止');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'xfStatus', '1', '工作中');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'xfMA', '0', '手动');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'xfMA', '1', '自动');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'xfFault', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'xfFault', '1', '故障');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'pfStatus', '0', '停止');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'pfStatus', '1', '工作中');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'pfMA', '0', '手动');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'pfMA', '1', '自动');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'timeStatus', '0', '无');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'timeStatus', '160', '定时开-小时');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'timeStatus', '101', '定时开-分钟');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'timeStatus', '260', '定时关-小时');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'timeStatus', '201', '定时关-分钟');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'LnSu', '0', '冬季');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'LnSu', '1', '夏季');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'timeSetTag', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'timeSetTag', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'manualTag', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_XF', 'manualTag', '1', '开启');
+
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'lwDpAlarm', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'lwDpAlarm', '1', '报警');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'fjUvAlarm', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'fjUvAlarm', '1', '报警');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'afAlarm', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'afAlarm', '1', '报警');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'xfStatus', '0', '停止');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'xfStatus', '1', '工作中');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'xfMA', '0', '手动');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'xfMA', '1', '自动');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'xfFault', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'xfFault', '1', '故障');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'timeStatus', '0', '无');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'timeStatus', '160', '定时开-小时');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'timeStatus', '101', '定时开-分钟');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'timeStatus', '260', '定时关-小时');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'timeStatus', '201', '定时关-分钟');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'LnSu', '0', '冬季');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'LnSu', '1', '夏季');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'timeSetTag', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'timeSetTag', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'manualTag', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z020_DEV_BA_AHU', 'manualTag', '1', '开启');
+
 
 -- 对象属性
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_NHJC', 'M_W4_SYS_BA', 'interfaceType', 'http', NULL);
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_NHJC', 'M_W4_SYS_BA', 'url', 'http://172.17.50.186:80', NULL);
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_NHJC', 'M_W4_SYS_BA', 'appId', 'httpsjy', NULL);
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_NHJC', 'M_W4_SYS_BA', 'interfaceStatus', '1', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_BA', 'M_W4_SYS_BA', 'interfaceType', 'http', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_BA', 'M_W4_SYS_BA', 'url', 'http://172.17.50.186:80', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_BA', 'M_W4_SYS_BA', 'appId', 'httpsjy', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_BA', 'M_W4_SYS_BA', 'interfaceStatus', '1', NULL);
 
 -- BA设备属性(计量,控制)
 INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('W4-E-C-2003', 'M_W4_DEV_BA_GA', 'ip', '172.17.50.175', NULL);
@@ -1004,6 +1113,20 @@ INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `att
 INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_DLJK', 'M_W4_SYS_ELEC_MONITOR', 'password', 'Acrel001', NULL);
 INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('SYS_DLJK', 'M_W4_SYS_ELEC_MONITOR', 'interfaceStatus', '1', NULL);
 
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-B-XF-1F-5', 'M_Z020_DEV_BA_XF', 'ddcTag', 'DDC2食堂', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-B-XF-1F-4', 'M_Z020_DEV_BA_XF', 'ddcTag', 'DDC3备用', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-B-XF-1F-3', 'M_Z020_DEV_BA_XF', 'ddcTag', 'DDC4', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-B-XF-2F-1', 'M_Z020_DEV_BA_XF', 'ddcTag', 'DDC6', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-N-XF-1F-5', 'M_Z020_DEV_BA_XF', 'ddcTag', 'DDC2食堂', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-N-XF-1F-4', 'M_Z020_DEV_BA_XF', 'ddcTag', 'DDC3备用', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-N-XF-1F-3', 'M_Z020_DEV_BA_XF', 'ddcTag', 'DDC4', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-N-XF-2F-1', 'M_Z020_DEV_BA_XF', 'ddcTag', 'DDC6', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-B-AHU-1F-1', 'M_Z020_DEV_BA_AHU', 'ddcTag', 'DDC5', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-B-AHU-2F-1', 'M_Z020_DEV_BA_AHU', 'ddcTag', 'DDC7', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-N-AHU-1F-1', 'M_Z020_DEV_BA_AHU', 'ddcTag', 'DDC5', NULL);
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('Z020-N-AHU-2F-1', 'M_Z020_DEV_BA_AHU', 'ddcTag', 'DDC7', NULL);
+
+
 -- 对象能力数据
 INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `param_definition`, `hidden_flag`) VALUES ('M_W4_SYS_BA', 'MeterReadingTotal', '全量抄报-网关', '网关-测点批量抄报', null, 1);
 INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `param_definition`, `hidden_flag`) VALUES ('M_W4_DEV_BA_GA', 'MeterReadingGw', '实时抄报-网关', '网关-测点批量抄报', null, 1);
@@ -1591,7 +1714,7 @@ INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`
 INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-W-B-102', '321283124S3001', '2025', '202506', 3666, '2025-05-31', 3915, '2025-06-30', 249, NULL, NULL);
 INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-W-B-102', '321283124S3001', '2025', '202507', 3915, '2025-06-30', 4182, '2025-07-31', 267, NULL, NULL);
 
-INSERT INTO `adm_ems_subsystem` (`system_code`, `system_name`, `short_name`, `model_code`, `man_facturer`, `contact_person`, `contact_number`, `maintainer_person`, `maintainer_number`, `descr`) VALUES ('SYS_NHJC', 'BA楼宇监控采集', 'BA楼宇监控采集', 'M_W4_SYS_BA','能耗监测厂商', '东边', '', '', '', NULL);
+INSERT INTO `adm_ems_subsystem` (`system_code`, `system_name`, `short_name`, `model_code`, `man_facturer`, `contact_person`, `contact_number`, `maintainer_person`, `maintainer_number`, `descr`) VALUES ('SYS_BA', 'BA楼宇监控采集', 'BA楼宇监控采集', 'M_W4_SYS_BA','能耗监测厂商', '东边', '', '', '', NULL);
 INSERT INTO `adm_ems_subsystem` (`system_code`, `system_name`, `short_name`, `model_code`, `man_facturer`, `contact_person`, `contact_number`, `maintainer_person`, `maintainer_number`, `descr`) VALUES ('SYS_ZHZM', '智慧照明系统', '智慧照明', 'M_Z010_SYS_SQUARE_LIGHT', '智慧照明厂商', '林工', '1212121121', '刘工', '1212221111', NULL);
 INSERT INTO `adm_ems_subsystem` (`system_code`, `system_name`, `short_name`, `model_code`, `man_facturer`, `contact_person`, `contact_number`, `maintainer_person`, `maintainer_number`, `descr`) VALUES ('SYS_DLJK', '电力监控系统', '电力监控', 'M_W4_SYS_ELEC_MONITOR', '安科瑞', 'gzl', '1212121121', 'gzl', '1212221111', NULL);
 INSERT INTO `adm_ems_subsystem` (`system_code`, `system_name`, `short_name`, `model_code`, `man_facturer`, `contact_person`, `contact_number`, `maintainer_person`, `maintainer_number`, `descr`) VALUES ('SYS_GF', '光伏系统', '光伏', 'M_TEST', '南通', '张', '1380000', '李工', '123123', NULL);

+ 39 - 2
ems/sql/ems_server.sql

@@ -349,7 +349,7 @@ create table dim_ems_emission_factor (
   `region_name`   varchar(16)     not null                   comment '地区名称',
   `region_type`   int             not null                   comment '地区类型 0:国家,1:地区,2:省份,3:城市',
   `factor_value`  double          default null               comment '因子值 单位: kgCO2/kWh',
-  `factor_type`   int             default null               comment '1:电力平均二氧化碳排放因子 2:电力平均二氧化碳排放因子(不含市场化交易的非化石能源电量)3:化石能源电力二氧化碳排放因子,4:全国光伏发电电力碳足迹因子',
+  `factor_type`   int             default null               comment '1:电力平均二氧化碳排放因子 2:电力平均二氧化碳排放因子(不含市场化交易的非化石能源电量)3:化石能源电力二氧化碳排放因子,',
   `version`       varchar(64)     default null               comment '数据版本',
   primary key (`id`),
   unique key ux_ems_emission_factor(`region_code`,`region_type`,`factor_type`)
@@ -357,7 +357,32 @@ create table dim_ems_emission_factor (
 
 -- 排放因子初始数据
 INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('CN', '中国', '0', '0.5366', '1', '2022');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('CN', '中国', '0', '0.0545', '4', '2023');
+
+-- ----------------------------
+-- 植物碳汇维表
+-- ----------------------------
+drop table if exists dim_plant_carbon_sink;
+create table dim_plant_carbon_sink (
+    `id`                bigint(20)      not null auto_increment    comment '序号',
+    `plant_method`      varchar(128)    not null                   comment '种植方式',
+    `carbon_quantity`   double          not null                   comment '固碳量 kgC02/m2',
+    `version`           varchar(64)     default null               comment '数据版本',
+    primary key (`id`)
+) engine=innodb auto_increment=1 comment = '植物碳汇维表';
+
+-- 植物碳汇维表初始数据
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (1, '大小乔木、灌木、花草密植混种区(乔木平均种植间距)<3.0m,土壤深度>1.0m', '27.5', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (2, '大小乔木密植混种区(平均种植间距)<3.0m,土壤深度>0.9m', '22.5', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (3, '落叶大乔木(土壤深度>1.0m)', '20.2', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (4, '落叶小乔木、针叶木或疏叶性乔木(土壤深度>1.0m)', '14.3', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (5, '小棕榈类(土壤深度>1.0m)', '10.25', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (6, '密植灌木丛(高约1.3m,土壤深度>0.5m)', '10.95', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (7, '密植灌木丛(高约0.9m,土壤深度>0.5m)', '8.15', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (8, '密植灌木丛(高约0.45m,土壤深度>0.5m)', '5.13', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (9, '多年生蔓藤(以立体攀附面积计算,土壤深度>0.5m)', '2.58', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (10, '高草花花圃或高茎野草地(高约1.0m,土壤深度>0.3m)', '1.15', '江苏2023');
+INSERT INTO `dim_plant_carbon_sink` (`id`, `plant_method`, `carbon_quantity`, `version`) VALUES (11, '一年生蔓藤、低草花花圃或低茎野草地(高约0.25m,土壤深度>0.3m)', '0.34', '江苏2023');
+
 
 -- ----------------------------
 -- 行政区划表
@@ -415,6 +440,18 @@ create table adm_area_attr (
 
 
 -- ----------------------------
+-- 区域植物配置表
+-- ----------------------------
+drop table if exists adm_area_plant_rel;
+create table adm_area_plant_rel (
+    `area_code`                varchar(32)     not null    comment '区域代码',
+    `plant_size`               double          not null    comment '种植区域面积m²',
+    `carbon_sink_id`           bigint          not null    comment '固碳配置id',
+    primary key (`area_code`, `carbon_sink_id`)
+) engine=innodb auto_increment=1 comment = '区域植物配置表';
+
+
+-- ----------------------------
 -- 日期属性表
 -- ----------------------------
 DROP TABLE IF EXISTS `adm_date_attr`;

+ 5 - 3
ems/sql/ems_sys_data.sql

@@ -80,7 +80,7 @@ insert into sys_menu values ('178',  '日志管理',       '7',   '9',  'log',
 insert into sys_menu values ('179',  '在线用户',       '7',   '10', 'online',             'monitor/online/index',   '', 1, 0, 'C', '0', '0',   'monitor:online:list',    'online',         'admin', sysdate(), '', null, '在线用户菜单');
 INSERT INTO sys_menu VALUES ('180',  '任务调度',       '7',   '10', 'task/job',           'monitor/job/index',      '', 1, 0, 'C', '0', '0',   'monitor:job',            'date-range',     'admin', sysdate(), '', NULL, '任务调度');
 
-insert into sys_menu values ('1550',  '能耗监测',       '155',   '1',  'adapter-nhjc',       'adapter/nhjc/index',    '', 1, 0, 'C', '0', '0',   'adapter:devc:list',     'system',       'admin', sysdate(), '', null, '能耗监测');
+insert into sys_menu values ('1550',  '楼控能耗',       '155',   '1',  'adapter-nhjc',       'adapter/nhjc/index',    '', 1, 0, 'C', '0', '0',   'adapter:devc:list',     'system',       'admin', sysdate(), '', null, '能耗监测');
 insert into sys_menu values ('1551',  '智慧照明',       '155',   '2',  'adapter-zm',         'adapter/zm/index',      '', 1, 0, 'C', '0', '0',   'adapter:devc:list',     'system',        'admin', sysdate(), '', null, '智慧照明');
 insert into sys_menu values ('1552',  '电力监控',       '155',   '3',  'adapter-dljk',       'adapter/dljk/index',    '', 1, 0, 'C', '0', '0',   'adapter:devc:list',     'system',        'admin', sysdate(), '', null, '智慧照明');
 insert into sys_menu values ('1553',  '光伏',          '155',   '4',  'adapter-pv',         'adapter/pv/index',      '', 1, 0, 'C', '0', '0',   'adapter:devc:list',     'photovoltaic',   'admin', sysdate(), '', null, '光伏');
@@ -121,10 +121,11 @@ insert into sys_menu values ('1622',  '能流关系',   '162', '3',  'basecfg-fl
 insert into sys_menu values ('1623',  '设施管理',   '162', '4',  'basecfg-facscfg',        'basecfg/emsfacs/index',      '', 1, 0, 'C', '0', '0',   'basecfg:emsfacs:list',          'cfgwrite',   'admin', sysdate(), '', null, '设施配置');
 insert into sys_menu values ('1624',  '设备管理',   '162', '5',  'basecfg-devccfg',        'basecfg/device/index',       '', 1, 0, 'C', '0', '0',   'basecfg:device:list',           'cfgwrite',   'admin', sysdate(), '', null, '设备配置');
 insert into sys_menu values ('1630',  '计量设备',   '163', '1',  'basecfg-meterdevc',      'basecfg/meterdevc/index',    '', 1, 0, 'C', '0', '0',   'ems:meterdevc:list',            'cfgwrite',   'admin', sysdate(), '', null, '计量设备');
-insert into sys_menu values ('1631',  '计量绑定',   '163', '2',  'basecfg-boundaryRel',    'basecfg/boundaryRel/index',  '', 1, 0, 'C', '0', '0',   'ems:meterBoundary:list',     'cfgwrite',   'admin', sysdate(), '', null, '边界划分');
+insert into sys_menu values ('1631',  '计量绑定',   '163', '2',  'basecfg-boundaryRel',    'basecfg/boundaryRel/index',  '', 1, 0, 'C', '0', '0',   'ems:meterBoundary:list',      'cfgwrite',   'admin', sysdate(), '', null, '边界划分');
 insert into sys_menu values ('1632',  '价格策略',   '163', '3',  'basecfg-electricity',    'basecfg/price/index',        '', 1, 0, 'C', '0', '0',   'basecfg:price:list',            'cfgwrite',   'admin', sysdate(), '', null, '价格策略');
 insert into sys_menu values ('1633',  '碳排因子',   '163', '4',  'basecfg-cacfg',          'basecfg/cacfg/index',        '', 1, 0, 'C', '0', '0',   'basecfg:cacfg:list',            'cfgwrite',   'admin', sysdate(), '', null, '碳排因子');
-insert into sys_menu values ('1634',  '折煤系数',   '163', '5',  'basecfg-dsccfg',         'basecfg/dsccfg/index',       '', 1, 0, 'C', '0', '0',   'basecfg:dsccfg:list',           'cfgwrite',   'admin', sysdate(), '', null, '折煤系数');
+insert into sys_menu values ('1634',  '碳汇系数',   '163', '5',  'basecfg-casinkcfg',      'basecfg/casinkcfg/index',    '', 1, 0, 'C', '0', '0',   'basecfg:casink:list',            'cfgwrite',   'admin', sysdate(), '', null, '碳汇系数');
+insert into sys_menu values ('1635',  '折煤系数',   '163', '6',  'basecfg-dsccfg',         'basecfg/dsccfg/index',       '', 1, 0, 'C', '0', '0',   'basecfg:dsccfg:list',           'cfgwrite',   'admin', sysdate(), '', null, '折煤系数');
 
 -- 用户管理按钮
 insert into sys_menu values ('1700', '用户查询', '170', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:query',          '#', 'admin', sysdate(), '', null, '');
@@ -459,6 +460,7 @@ INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1631);
 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1632);
 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1633);
 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1634);
+INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1635);
 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1700);
 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1701);
 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2, 1702);