Forráskód Böngészése

计量报表重构

learshaw 1 hete
szülő
commit
42838ca174

+ 248 - 0
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/EnergyConsumptionController.java

@@ -0,0 +1,248 @@
+/*
+ * 文 件 名:  EnergyConsumptionController
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/8/26
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.controller;
+
+import com.huashe.common.domain.AjaxResult;
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
+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.model.EnergyConsumptionVO;
+import com.ruoyi.ems.model.QueryMeter;
+import com.ruoyi.ems.service.IEnergyConsumptionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 用能统计分析Controller
+ *
+ * @author ruoyi
+ * @date 2024-12-20
+ */
+@RestController
+@RequestMapping("/consumption")
+@Api(value = "EnergyConsumptionController", description = "用能统计分析")
+public class EnergyConsumptionController extends BaseController {
+
+    @Autowired
+    private IEnergyConsumptionService energyConsumptionService;
+
+    // ==================== 区域用能统计 ====================
+
+    /**
+     * 查询区域用能统计列表
+     */
+    @RequiresPermissions("ems:consumption:list")
+    @GetMapping("/area/list")
+    @ApiOperation("查询区域用能统计列表")
+    public TableDataInfo getAreaConsumptionList(@ApiParam("查询参数") QueryMeter queryMeter) {
+        // 参数校验和默认值设置
+        if (queryMeter == null) {
+            queryMeter = new QueryMeter();
+        }
+
+        // 设置默认时间维度
+        if (StringUtils.isBlank(queryMeter.getTimeDimension())) {
+            queryMeter.setTimeDimension("month");
+        }
+
+        // 设置对象类型
+        queryMeter.setObjType(1);
+
+        startPage();
+        List<EnergyConsumptionVO> list = energyConsumptionService.selectAreaConsumptionList(queryMeter);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询区域用能统计汇总
+     */
+    @RequiresPermissions("ems:consumption:list")
+    @GetMapping("/area/summary")
+    @ApiOperation("查询区域用能统计汇总")
+    public AjaxResult getAreaConsumptionSummary(@ApiParam("查询参数") QueryMeter queryMeter) {
+        if (queryMeter == null) {
+            queryMeter = new QueryMeter();
+        }
+
+        queryMeter.setObjType(1);
+        EnergyConsumptionVO summary = energyConsumptionService.selectAreaConsumptionSummary(queryMeter);
+        return success(summary);
+    }
+
+    /**
+     * 导出区域用能统计数据
+     */
+    @RequiresPermissions("ems:consumption:export")
+    @Log(title = "区域用能统计", businessType = BusinessType.EXPORT)
+    @PostMapping("/area/export")
+    @ApiOperation("导出区域用能统计数据")
+    public void exportAreaConsumption(HttpServletResponse response, @ApiParam("查询参数") QueryMeter queryMeter) {
+        if (queryMeter == null) {
+            queryMeter = new QueryMeter();
+        }
+
+        if (StringUtils.isBlank(queryMeter.getTimeDimension())) {
+            queryMeter.setTimeDimension("month");
+        }
+
+        queryMeter.setObjType(1);
+        List<EnergyConsumptionVO> list = energyConsumptionService.exportAreaConsumptionList(queryMeter);
+
+        ExcelUtil<EnergyConsumptionVO> util = new ExcelUtil<>(EnergyConsumptionVO.class);
+        String fileName = String.format("区域用能统计_%s_%s.xlsx",
+            queryMeter.getTimeDimension(),
+            System.currentTimeMillis());
+        util.exportExcel(response, list, fileName);
+    }
+
+    // ==================== 设施用能统计 ====================
+
+    /**
+     * 查询设施用能统计列表
+     */
+    @RequiresPermissions("ems:consumption:list")
+    @GetMapping("/facs/list")
+    @ApiOperation("查询设施用能统计列表")
+    public TableDataInfo getFacsConsumptionList(@ApiParam("查询参数") QueryMeter queryMeter) {
+        // 参数校验和默认值设置
+        if (queryMeter == null) {
+            queryMeter = new QueryMeter();
+        }
+
+        // 设置默认时间维度
+        if (StringUtils.isBlank(queryMeter.getTimeDimension())) {
+            queryMeter.setTimeDimension("month");
+        }
+
+        // 设置默认设施分类
+        if (StringUtils.isBlank(queryMeter.getFacsCategory())) {
+            queryMeter.setFacsCategory("Z");
+        }
+
+        // 设置对象类型
+        queryMeter.setObjType(2);
+
+        startPage();
+        List<EnergyConsumptionVO> list = energyConsumptionService.selectFacsConsumptionList(queryMeter);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询设施用能统计汇总
+     */
+    @RequiresPermissions("ems:consumption:list")
+    @GetMapping("/facs/summary")
+    @ApiOperation("查询设施用能统计汇总")
+    public AjaxResult getFacsConsumptionSummary(@ApiParam("查询参数") QueryMeter queryMeter) {
+        if (queryMeter == null) {
+            queryMeter = new QueryMeter();
+        }
+
+        if (StringUtils.isBlank(queryMeter.getFacsCategory())) {
+            queryMeter.setFacsCategory("Z");
+        }
+
+        queryMeter.setObjType(2);
+        EnergyConsumptionVO summary = energyConsumptionService.selectFacsConsumptionSummary(queryMeter);
+        return success(summary);
+    }
+
+    /**
+     * 导出设施用能统计数据
+     */
+    @RequiresPermissions("ems:consumption:export")
+    @Log(title = "设施用能统计", businessType = BusinessType.EXPORT)
+    @PostMapping("/facs/export")
+    @ApiOperation("导出设施用能统计数据")
+    public void exportFacsConsumption(HttpServletResponse response, @ApiParam("查询参数") QueryMeter queryMeter) {
+        if (queryMeter == null) {
+            queryMeter = new QueryMeter();
+        }
+
+        if (StringUtils.isBlank(queryMeter.getTimeDimension())) {
+            queryMeter.setTimeDimension("month");
+        }
+
+        if (StringUtils.isBlank(queryMeter.getFacsCategory())) {
+            queryMeter.setFacsCategory("Z");
+        }
+
+        queryMeter.setObjType(2);
+        List<EnergyConsumptionVO> list = energyConsumptionService.exportFacsConsumptionList(queryMeter);
+
+        ExcelUtil<EnergyConsumptionVO> util = new ExcelUtil<>(EnergyConsumptionVO.class);
+        String fileName = String.format("设施用能统计_%s_%s.xlsx",
+            queryMeter.getTimeDimension(),
+            System.currentTimeMillis());
+        util.exportExcel(response, list, fileName);
+    }
+
+    // ==================== 兼容性接口 ====================
+
+    /**
+     * 查询区域用能数据 (兼容旧接口)
+     */
+    @RequiresPermissions("ems:consumption:list")
+    @GetMapping("/hour/listAreaMeter")
+    @ApiOperation("查询区域用能数据(兼容接口)")
+    @Deprecated
+    public TableDataInfo listAreaMeter(@ApiParam("查询参数") QueryMeter queryMeter) {
+        return getAreaConsumptionList(queryMeter);
+    }
+
+    /**
+     * 查询设施用能数据 (兼容旧接口)
+     */
+    @RequiresPermissions("ems:consumption:list")
+    @GetMapping("/hour/listFacsMeter")
+    @ApiOperation("查询设施用能数据(兼容接口)")
+    @Deprecated
+    public TableDataInfo listFacsMeter(@ApiParam("查询参数") QueryMeter queryMeter) {
+        return getFacsConsumptionList(queryMeter);
+    }
+
+    /**
+     * 导出区域用能数据 (兼容旧接口)
+     */
+    @RequiresPermissions("ems:consumption:export")
+    @Log(title = "区域用能统计", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportAreaMeter")
+    @ApiOperation("导出区域用能数据(兼容接口)")
+    @Deprecated
+    public void exportAreaMeter(HttpServletResponse response, @ApiParam("查询参数") QueryMeter queryMeter) {
+        exportAreaConsumption(response, queryMeter);
+    }
+
+    /**
+     * 导出设施用能数据 (兼容旧接口)
+     */
+    @RequiresPermissions("ems:consumption:export")
+    @Log(title = "设施用能统计", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportFacsMeter")
+    @ApiOperation("导出设施用能数据(兼容接口)")
+    @Deprecated
+    public void exportFacsMeter(HttpServletResponse response, @ApiParam("查询参数") QueryMeter queryMeter) {
+        exportFacsConsumption(response, queryMeter);
+    }
+}

+ 137 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/EnergyConsumptionMapper.java

@@ -0,0 +1,137 @@
+/*
+ * 文 件 名:  EnergyConsumptionMapper
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/8/26
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.mapper;
+
+/**
+ * <一句话功能简述>
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/8/26]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+import com.ruoyi.ems.model.EnergyConsumptionVO;
+import com.ruoyi.ems.model.QueryMeter;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 用能统计Mapper接口
+ *
+ * @author ruoyi
+ * @date 2024-12-20
+ */
+public interface EnergyConsumptionMapper {
+
+    // ==================== 区域用能统计 ====================
+
+    /**
+     * 查询区域日用能统计
+     *
+     * @param queryMeter 查询参数
+     * @return 区域日用能统计列表
+     */
+    List<EnergyConsumptionVO> selectAreaDailyConsumption(QueryMeter queryMeter);
+
+    /**
+     * 查询区域月用能统计
+     *
+     * @param queryMeter 查询参数
+     * @return 区域月用能统计列表
+     */
+    List<EnergyConsumptionVO> selectAreaMonthlyConsumption(QueryMeter queryMeter);
+
+    /**
+     * 查询区域年用能统计
+     *
+     * @param queryMeter 查询参数
+     * @return 区域年用能统计列表
+     */
+    List<EnergyConsumptionVO> selectAreaYearlyConsumption(QueryMeter queryMeter);
+
+    /**
+     * 查询区域用能统计汇总
+     *
+     * @param queryMeter 查询参数
+     * @return 区域用能统计汇总
+     */
+    EnergyConsumptionVO selectAreaConsumptionSummary(QueryMeter queryMeter);
+
+    // ==================== 设施用能统计 ====================
+
+    /**
+     * 查询设施日用能统计
+     *
+     * @param queryMeter 查询参数
+     * @return 设施日用能统计列表
+     */
+    List<EnergyConsumptionVO> selectFacsDailyConsumption(QueryMeter queryMeter);
+
+    /**
+     * 查询设施月用能统计
+     *
+     * @param queryMeter 查询参数
+     * @return 设施月用能统计列表
+     */
+    List<EnergyConsumptionVO> selectFacsMonthlyConsumption(QueryMeter queryMeter);
+
+    /**
+     * 查询设施年用能统计
+     *
+     * @param queryMeter 查询参数
+     * @return 设施年用能统计列表
+     */
+    List<EnergyConsumptionVO> selectFacsYearlyConsumption(QueryMeter queryMeter);
+
+    /**
+     * 查询设施用能统计汇总
+     *
+     * @param queryMeter 查询参数
+     * @return 设施用能统计汇总
+     */
+    EnergyConsumptionVO selectFacsConsumptionSummary(QueryMeter queryMeter);
+
+    // ==================== 辅助查询 ====================
+
+    /**
+     * 根据区域获取绑定的计量设备
+     *
+     * @param areaCode 区域代码
+     * @param meterCls 计量类别
+     * @return 设备代码列表
+     */
+    List<String> selectMeterDevicesByArea(@Param("areaCode") String areaCode,
+        @Param("meterCls") Integer meterCls);
+
+    /**
+     * 根据设施获取绑定的计量设备
+     *
+     * @param facsCode 设施代码
+     * @param meterCls 计量类别
+     * @return 设备代码列表
+     */
+    List<String> selectMeterDevicesByFacs(@Param("facsCode") String facsCode,
+        @Param("meterCls") Integer meterCls);
+
+    /**
+     * 根据设施分类获取绑定的计量设备
+     *
+     * @param facsCategory 设施分类
+     * @param areaCode 区域代码(可选)
+     * @param meterCls 计量类别
+     * @return 设备代码列表
+     */
+    List<String> selectMeterDevicesByFacsCategory(@Param("facsCategory") String facsCategory,
+        @Param("areaCode") String areaCode,
+        @Param("meterCls") Integer meterCls);
+}

+ 238 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/model/EnergyConsumptionVO.java

@@ -0,0 +1,238 @@
+/*
+ * 文 件 名:  EnergyConsumptionVO
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/8/26
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.model;
+
+/**
+ * <一句话功能简述>
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/8/26]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.huashe.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用能统计视图对象
+ *
+ * @author ruoyi
+ * @date 2024-12-20
+ */
+@ApiModel("用能统计响应模型")
+public class EnergyConsumptionVO {
+
+    @ApiModelProperty("区域代码")
+    private String areaCode;
+
+    @ApiModelProperty("区域名称")
+    @Excel(name = "区域名称")
+    private String areaName;
+
+    @ApiModelProperty("对象代码")
+    private String objCode;
+
+    @ApiModelProperty("对象名称")
+    @Excel(name = "对象名称")
+    private String objName;
+
+    @ApiModelProperty("对象类型 1-区域 2-设施")
+    private Integer objType;
+
+    @ApiModelProperty("统计日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "统计日期", dateFormat = "yyyy-MM-dd")
+    private Date statisticDate;
+
+    @ApiModelProperty("统计年份")
+    @Excel(name = "统计年份")
+    private String statisticYear;
+
+    @ApiModelProperty("统计月份")
+    @Excel(name = "统计月份")
+    private String statisticMonth;
+
+    @ApiModelProperty("统计时间维度 DAY-日 MONTH-月 YEAR-年")
+    private String timeDimension;
+
+    @ApiModelProperty("用电量(kWh)")
+    @Excel(name = "用电量(kWh)")
+    private BigDecimal elecQuantity;
+
+    @ApiModelProperty("用电费用(元)")
+    @Excel(name = "用电费用(元)")
+    private BigDecimal elecCost;
+
+    @ApiModelProperty("用水量(m³)")
+    @Excel(name = "用水量(m³)")
+    private BigDecimal waterQuantity;
+
+    @ApiModelProperty("用水费用(元)")
+    @Excel(name = "用水费用(元)")
+    private BigDecimal waterCost;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    // 构造方法
+    public EnergyConsumptionVO() {}
+
+    public EnergyConsumptionVO(String objCode, String objName, Integer objType,
+        String timeDimension, BigDecimal elecQuantity, BigDecimal elecCost) {
+        this.objCode = objCode;
+        this.objName = objName;
+        this.objType = objType;
+        this.timeDimension = timeDimension;
+        this.elecQuantity = elecQuantity;
+        this.elecCost = elecCost;
+    }
+
+    // Getters and Setters
+    public String getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
+
+    public String getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
+
+    public String getObjCode() {
+        return objCode;
+    }
+
+    public void setObjCode(String objCode) {
+        this.objCode = objCode;
+    }
+
+    public String getObjName() {
+        return objName;
+    }
+
+    public void setObjName(String objName) {
+        this.objName = objName;
+    }
+
+    public Integer getObjType() {
+        return objType;
+    }
+
+    public void setObjType(Integer objType) {
+        this.objType = objType;
+    }
+
+    public Date getStatisticDate() {
+        return statisticDate;
+    }
+
+    public void setStatisticDate(Date statisticDate) {
+        this.statisticDate = statisticDate;
+    }
+
+    public String getStatisticYear() {
+        return statisticYear;
+    }
+
+    public void setStatisticYear(String statisticYear) {
+        this.statisticYear = statisticYear;
+    }
+
+    public String getStatisticMonth() {
+        return statisticMonth;
+    }
+
+    public void setStatisticMonth(String statisticMonth) {
+        this.statisticMonth = statisticMonth;
+    }
+
+    public String getTimeDimension() {
+        return timeDimension;
+    }
+
+    public void setTimeDimension(String timeDimension) {
+        this.timeDimension = timeDimension;
+    }
+
+    public BigDecimal getElecQuantity() {
+        return elecQuantity;
+    }
+
+    public void setElecQuantity(BigDecimal elecQuantity) {
+        this.elecQuantity = elecQuantity;
+    }
+
+    public BigDecimal getElecCost() {
+        return elecCost;
+    }
+
+    public void setElecCost(BigDecimal elecCost) {
+        this.elecCost = elecCost;
+    }
+
+    public BigDecimal getWaterQuantity() {
+        return waterQuantity;
+    }
+
+    public void setWaterQuantity(BigDecimal waterQuantity) {
+        this.waterQuantity = waterQuantity;
+    }
+
+    public BigDecimal getWaterCost() {
+        return waterCost;
+    }
+
+    public void setWaterCost(BigDecimal waterCost) {
+        this.waterCost = waterCost;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public String toString() {
+        return "EnergyConsumptionVO{" +
+            "areaCode='" + areaCode + '\'' +
+            ", areaName='" + areaName + '\'' +
+            ", objCode='" + objCode + '\'' +
+            ", objName='" + objName + '\'' +
+            ", objType=" + objType +
+            ", statisticDate=" + statisticDate +
+            ", statisticYear='" + statisticYear + '\'' +
+            ", statisticMonth='" + statisticMonth + '\'' +
+            ", timeDimension='" + timeDimension + '\'' +
+            ", elecQuantity=" + elecQuantity +
+            ", elecCost=" + elecCost +
+            ", waterQuantity=" + waterQuantity +
+            ", waterCost=" + waterCost +
+            ", createTime=" + createTime +
+            '}';
+    }
+}

+ 117 - 72
ems/ems-core/src/main/java/com/ruoyi/ems/model/QueryMeter.java

@@ -10,9 +10,10 @@
  */
 package com.ruoyi.ems.model;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.huashe.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 
-import java.io.Serializable;
 import java.util.Set;
 
 /**
@@ -25,47 +26,58 @@ import java.util.Set;
  * @since [产品/模块版本]
  */
 public class QueryMeter extends BaseEntity  {
-    /**
-     * 服务区代码
-     */
+    @ApiModelProperty("区域代码")
     private String areaCode;
 
-    private String areaName;
-
-    /**
-     * 设备编号
-     */
+    @ApiModelProperty("设备代码")
     private String deviceCode;
 
-    /**
-     * 设施代码
-     */
-    private String facsCode;
-
-    /**
-     * 设备编号集合
-     */
+    @ApiModelProperty("设备代码列表")
     private Set<String> deviceCodes;
 
-    /**
-     * 对象标签
-     */
-    private Integer objTag;
-
-    /**
-     * 对象类型
-     */
+    @ApiModelProperty("对象类型 1-区域 2-设施")
     private Integer objType;
 
+    @ApiModelProperty("对象代码")
+    private String objCode;
+
+    @ApiModelProperty("对象名称")
+    private String objName;
+
+    @ApiModelProperty("设施分类")
+    private String facsCategory;
+
+    @ApiModelProperty("开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String startRecTime;
+
+    @ApiModelProperty("结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String endRecTime;
+
+    @ApiModelProperty("时间维度 day-日 month-月 year-年")
+    private String timeDimension;
+
+    @ApiModelProperty("排序方式 asc-升序 desc-降序")
+    private String orderFlag = "desc";
+
+    @ApiModelProperty("页码")
+    private Integer pageNum = 1;
+
+    @ApiModelProperty("页大小")
+    private Integer pageSize = 10;
+
+    private String areaName;
+
     /**
-     * 对象code
+     * 设施代码
      */
-    private String objCode;
+    private String facsCode;
 
     /**
-     * 对象名称
+     * 对象标签
      */
-    private String objName;
+    private Integer objTag;
 
     /**
      * 计量介质
@@ -78,22 +90,12 @@ public class QueryMeter extends BaseEntity  {
     private String year;
 
     /**
-     * 设施分类
-     */
-    private String facsCategory;
-
-    /**
      * 设施子类
      */
     private String facsSubCategory;
 
     private String date;
 
-    /**
-     * 排序方式
-     */
-    private String orderFlag = "ASC";
-
     public QueryMeter() {
         super();
     }
@@ -115,7 +117,6 @@ public class QueryMeter extends BaseEntity  {
         this.setEndRecTime(endTime);
     }
 
-
     public String getAreaCode() {
         return areaCode;
     }
@@ -132,14 +133,6 @@ public class QueryMeter extends BaseEntity  {
         this.deviceCode = deviceCode;
     }
 
-    public String getFacsCode() {
-        return facsCode;
-    }
-
-    public void setFacsCode(String facsCode) {
-        this.facsCode = facsCode;
-    }
-
     public Set<String> getDeviceCodes() {
         return deviceCodes;
     }
@@ -148,14 +141,6 @@ public class QueryMeter extends BaseEntity  {
         this.deviceCodes = deviceCodes;
     }
 
-    public Integer getObjTag() {
-        return objTag;
-    }
-
-    public void setObjTag(Integer objTag) {
-        this.objTag = objTag;
-    }
-
     public Integer getObjType() {
         return objType;
     }
@@ -180,36 +165,40 @@ public class QueryMeter extends BaseEntity  {
         this.objName = objName;
     }
 
-    public Integer getMeterCls() {
-        return meterCls;
+    public String getFacsCategory() {
+        return facsCategory;
     }
 
-    public void setMeterCls(Integer meterCls) {
-        this.meterCls = meterCls;
+    public void setFacsCategory(String facsCategory) {
+        this.facsCategory = facsCategory;
     }
 
-    public String getYear() {
-        return year;
+    @Override
+    public String getStartRecTime() {
+        return startRecTime;
     }
 
-    public void setYear(String year) {
-        this.year = year;
+    @Override
+    public void setStartRecTime(String startRecTime) {
+        this.startRecTime = startRecTime;
     }
 
-    public String getFacsCategory() {
-        return facsCategory;
+    @Override
+    public String getEndRecTime() {
+        return endRecTime;
     }
 
-    public void setFacsCategory(String facsCategory) {
-        this.facsCategory = facsCategory;
+    @Override
+    public void setEndRecTime(String endRecTime) {
+        this.endRecTime = endRecTime;
     }
 
-    public String getFacsSubCategory() {
-        return facsSubCategory;
+    public String getTimeDimension() {
+        return timeDimension;
     }
 
-    public void setFacsSubCategory(String facsSubCategory) {
-        this.facsSubCategory = facsSubCategory;
+    public void setTimeDimension(String timeDimension) {
+        this.timeDimension = timeDimension;
     }
 
     public String getOrderFlag() {
@@ -220,6 +209,22 @@ public class QueryMeter extends BaseEntity  {
         this.orderFlag = orderFlag;
     }
 
+    public Integer getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
     public String getAreaName() {
         return areaName;
     }
@@ -228,6 +233,46 @@ public class QueryMeter extends BaseEntity  {
         this.areaName = areaName;
     }
 
+    public String getFacsCode() {
+        return facsCode;
+    }
+
+    public void setFacsCode(String facsCode) {
+        this.facsCode = facsCode;
+    }
+
+    public Integer getObjTag() {
+        return objTag;
+    }
+
+    public void setObjTag(Integer objTag) {
+        this.objTag = objTag;
+    }
+
+    public Integer getMeterCls() {
+        return meterCls;
+    }
+
+    public void setMeterCls(Integer meterCls) {
+        this.meterCls = meterCls;
+    }
+
+    public String getYear() {
+        return year;
+    }
+
+    public void setYear(String year) {
+        this.year = year;
+    }
+
+    public String getFacsSubCategory() {
+        return facsSubCategory;
+    }
+
+    public void setFacsSubCategory(String facsSubCategory) {
+        this.facsSubCategory = facsSubCategory;
+    }
+
     public String getDate() {
         return date;
     }

+ 63 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/IEnergyConsumptionService.java

@@ -0,0 +1,63 @@
+package com.ruoyi.ems.service;
+
+import com.ruoyi.ems.model.EnergyConsumptionVO;
+import com.ruoyi.ems.model.QueryMeter;
+
+import java.util.List;
+
+/**
+ * 用能统计服务接口
+ *
+ * @author ruoyi
+ * @date 2024-12-20
+ */
+public interface IEnergyConsumptionService {
+
+    /**
+     * 查询区域用能统计列表
+     *
+     * @param queryMeter 查询参数
+     * @return 区域用能统计列表
+     */
+    List<EnergyConsumptionVO> selectAreaConsumptionList(QueryMeter queryMeter);
+
+    /**
+     * 查询设施用能统计列表
+     *
+     * @param queryMeter 查询参数
+     * @return 设施用能统计列表
+     */
+    List<EnergyConsumptionVO> selectFacsConsumptionList(QueryMeter queryMeter);
+
+    /**
+     * 查询区域用能统计汇总
+     *
+     * @param queryMeter 查询参数
+     * @return 用能统计汇总
+     */
+    EnergyConsumptionVO selectAreaConsumptionSummary(QueryMeter queryMeter);
+
+    /**
+     * 查询设施用能统计汇总
+     *
+     * @param queryMeter 查询参数
+     * @return 用能统计汇总
+     */
+    EnergyConsumptionVO selectFacsConsumptionSummary(QueryMeter queryMeter);
+
+    /**
+     * 导出区域用能统计数据
+     *
+     * @param queryMeter 查询参数
+     * @return 导出数据列表
+     */
+    List<EnergyConsumptionVO> exportAreaConsumptionList(QueryMeter queryMeter);
+
+    /**
+     * 导出设施用能统计数据
+     *
+     * @param queryMeter 查询参数
+     * @return 导出数据列表
+     */
+    List<EnergyConsumptionVO> exportFacsConsumptionList(QueryMeter queryMeter);
+}

+ 142 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EnergyConsumptionServiceImpl.java

@@ -0,0 +1,142 @@
+package com.ruoyi.ems.service.impl;
+
+import com.ruoyi.ems.mapper.EnergyConsumptionMapper;
+import com.ruoyi.ems.model.EnergyConsumptionVO;
+import com.ruoyi.ems.model.QueryMeter;
+import com.ruoyi.ems.service.IEnergyConsumptionService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 用能统计服务实现
+ *
+ * @author ruoyi
+ * @date 2024-12-20
+ */
+@Service
+public class EnergyConsumptionServiceImpl implements IEnergyConsumptionService {
+
+    @Autowired
+    private EnergyConsumptionMapper energyConsumptionMapper;
+
+    @Override
+    public List<EnergyConsumptionVO> selectAreaConsumptionList(QueryMeter queryMeter) {
+        // 参数校验
+        if (queryMeter == null) {
+            return Collections.emptyList();
+        }
+
+        // 设置默认时间维度
+        if (StringUtils.isBlank(queryMeter.getTimeDimension())) {
+            queryMeter.setTimeDimension("day");
+        }
+
+        // 根据时间维度调用不同的查询方法
+        switch (queryMeter.getTimeDimension().toLowerCase()) {
+            case "day":
+                return energyConsumptionMapper.selectAreaDailyConsumption(queryMeter);
+            case "month":
+                return energyConsumptionMapper.selectAreaMonthlyConsumption(queryMeter);
+            case "year":
+                return energyConsumptionMapper.selectAreaYearlyConsumption(queryMeter);
+            default:
+                return energyConsumptionMapper.selectAreaDailyConsumption(queryMeter);
+        }
+    }
+
+    @Override
+    public List<EnergyConsumptionVO> selectFacsConsumptionList(QueryMeter queryMeter) {
+        // 参数校验
+        if (queryMeter == null) {
+            return Collections.emptyList();
+        }
+
+        // 设置默认时间维度
+        if (StringUtils.isBlank(queryMeter.getTimeDimension())) {
+            queryMeter.setTimeDimension("day");
+        }
+
+        // 根据时间维度调用不同的查询方法
+        switch (queryMeter.getTimeDimension().toLowerCase()) {
+            case "day":
+                return energyConsumptionMapper.selectFacsDailyConsumption(queryMeter);
+            case "month":
+                return energyConsumptionMapper.selectFacsMonthlyConsumption(queryMeter);
+            case "year":
+                return energyConsumptionMapper.selectFacsYearlyConsumption(queryMeter);
+            default:
+                return energyConsumptionMapper.selectFacsDailyConsumption(queryMeter);
+        }
+    }
+
+    @Override
+    public EnergyConsumptionVO selectAreaConsumptionSummary(QueryMeter queryMeter) {
+        if (queryMeter == null) {
+            return new EnergyConsumptionVO();
+        }
+
+        EnergyConsumptionVO summary = energyConsumptionMapper.selectAreaConsumptionSummary(queryMeter);
+        return summary != null ? summary : new EnergyConsumptionVO();
+    }
+
+    @Override
+    public EnergyConsumptionVO selectFacsConsumptionSummary(QueryMeter queryMeter) {
+        if (queryMeter == null) {
+            return new EnergyConsumptionVO();
+        }
+
+        EnergyConsumptionVO summary = energyConsumptionMapper.selectFacsConsumptionSummary(queryMeter);
+        return summary != null ? summary : new EnergyConsumptionVO();
+    }
+
+    @Override
+    public List<EnergyConsumptionVO> exportAreaConsumptionList(QueryMeter queryMeter) {
+        if (queryMeter == null) {
+            return Collections.emptyList();
+        }
+
+        // 导出时不分页,设置大数据量限制
+        queryMeter.setPageNum(null);
+        queryMeter.setPageSize(null);
+
+        return selectAreaConsumptionList(queryMeter);
+    }
+
+    @Override
+    public List<EnergyConsumptionVO> exportFacsConsumptionList(QueryMeter queryMeter) {
+        if (queryMeter == null) {
+            return Collections.emptyList();
+        }
+
+        // 导出时不分页,设置大数据量限制
+        queryMeter.setPageNum(null);
+        queryMeter.setPageSize(null);
+
+        return selectFacsConsumptionList(queryMeter);
+    }
+
+    /**
+     * 计算统计数据的平均值
+     */
+    private BigDecimal calculateAverage(BigDecimal total, int count) {
+        if (total == null || count == 0) {
+            return BigDecimal.ZERO;
+        }
+        return total.divide(BigDecimal.valueOf(count), 2, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 格式化统计时间
+     */
+    private String formatStatisticTime(QueryMeter queryMeter) {
+        if (StringUtils.isNotBlank(queryMeter.getStartRecTime())) {
+            return queryMeter.getStartRecTime().substring(0, 10);
+        }
+        return "";
+    }
+}

+ 371 - 0
ems/ems-core/src/main/resources/mapper/ems/EnergyConsumptionMapper.xml

@@ -0,0 +1,371 @@
+<?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.EnergyConsumptionMapper">
+
+    <resultMap type="com.ruoyi.ems.model.EnergyConsumptionVO" id="EnergyConsumptionResult">
+        <result property="areaCode" column="area_code"/>
+        <result property="areaName" column="area_name"/>
+        <result property="objCode" column="obj_code"/>
+        <result property="objName" column="obj_name"/>
+        <result property="objType" column="obj_type"/>
+        <result property="statisticDate" column="statistic_date"/>
+        <result property="statisticYear" column="statistic_year"/>
+        <result property="statisticMonth" column="statistic_month"/>
+        <result property="timeDimension" column="time_dimension"/>
+        <result property="elecQuantity" column="elec_quantity"/>
+        <result property="elecCost" column="elec_cost"/>
+        <result property="waterQuantity" column="water_quantity"/>
+        <result property="waterCost" column="water_cost"/>
+        <result property="createTime" column="create_time"/>
+    </resultMap>
+
+    <!-- ==================== 区域用能统计查询 ==================== -->
+
+    <!-- 查询区域日用能统计 -->
+    <select id="selectAreaDailyConsumption" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="EnergyConsumptionResult">
+        SELECT
+        a.area_code,
+        a.area_name as obj_name,
+        a.area_code as obj_code,
+        1 as obj_type,
+        h.date as statistic_date,
+        'DAY' as time_dimension,
+        ROUND(SUM(COALESCE(h.elec_quantity, 0)), 2) as elec_quantity,
+        ROUND(SUM(COALESCE(h.use_elec_cost, 0)), 2) as elec_cost,
+        NOW() as create_time
+        FROM adm_area a
+        LEFT JOIN adm_meter_boundary_rel rel ON (
+        (rel.obj_type = 1 AND rel.boundary_obj = a.area_code) OR
+        (rel.obj_type = 1 AND EXISTS (
+        SELECT 1 FROM adm_area child
+        WHERE child.parent_code = a.area_code
+        AND rel.boundary_obj = child.area_code
+        ))
+        )
+        LEFT JOIN adm_elec_meter_h h ON h.device_code = rel.meter_device AND rel.meter_cls = 45
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                AND (a.area_code = #{areaCode} OR a.parent_code = #{areaCode} OR a.ancestors LIKE CONCAT('%,', #{areaCode}, ',%'))
+            </if>
+            <if test="objCode != null and objCode != '' and objCode != '-1'">
+                AND a.area_code = #{objCode}
+            </if>
+            <if test="startRecTime != null and startRecTime != ''">
+                AND h.date &gt;= DATE(#{startRecTime})
+            </if>
+            <if test="endRecTime != null and endRecTime != ''">
+                AND h.date &lt;= DATE(#{endRecTime})
+            </if>
+            AND h.date IS NOT NULL
+        </where>
+        GROUP BY a.area_code, a.area_name, h.date
+        ORDER BY h.date ${orderFlag}, a.area_code
+    </select>
+
+    <!-- 查询区域月用能统计 -->
+    <select id="selectAreaMonthlyConsumption" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="EnergyConsumptionResult">
+        SELECT
+        a.area_code,
+        a.area_name as obj_name,
+        a.area_code as obj_code,
+        1 as obj_type,
+        DATE(CONCAT(DATE_FORMAT(h.date, '%Y-%m'), '-01')) as statistic_date,
+        DATE_FORMAT(h.date, '%Y-%m') as statistic_month,
+        'MONTH' as time_dimension,
+        ROUND(SUM(COALESCE(h.elec_quantity, 0)), 2) as elec_quantity,
+        ROUND(SUM(COALESCE(h.use_elec_cost, 0)), 2) as elec_cost,
+        NOW() as create_time
+        FROM adm_area a
+        LEFT JOIN adm_meter_boundary_rel rel ON (
+        (rel.obj_type = 1 AND rel.boundary_obj = a.area_code) OR
+        (rel.obj_type = 1 AND EXISTS (
+        SELECT 1 FROM adm_area child
+        WHERE child.parent_code = a.area_code
+        AND rel.boundary_obj = child.area_code
+        ))
+        )
+        LEFT JOIN adm_elec_meter_h h ON h.device_code = rel.meter_device AND rel.meter_cls = 45
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                AND (a.area_code = #{areaCode} OR a.parent_code = #{areaCode} OR a.ancestors LIKE CONCAT('%,', #{areaCode}, ',%'))
+            </if>
+            <if test="objCode != null and objCode != '' and objCode != '-1'">
+                AND a.area_code = #{objCode}
+            </if>
+            <if test="startRecTime != null and startRecTime != ''">
+                AND h.date &gt;= DATE(#{startRecTime})
+            </if>
+            <if test="endRecTime != null and endRecTime != ''">
+                AND h.date &lt;= DATE(#{endRecTime})
+            </if>
+            AND h.date IS NOT NULL
+        </where>
+        GROUP BY a.area_code, a.area_name, DATE_FORMAT(h.date, '%Y-%m')
+        ORDER BY DATE_FORMAT(h.date, '%Y-%m') ${orderFlag}, a.area_code
+    </select>
+
+    <!-- 查询区域年用能统计 -->
+    <select id="selectAreaYearlyConsumption" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="EnergyConsumptionResult">
+        SELECT
+        a.area_code,
+        a.area_name as obj_name,
+        a.area_code as obj_code,
+        1 as obj_type,
+        DATE(CONCAT(YEAR(h.date), '-01-01')) as statistic_date,
+        YEAR(h.date) as statistic_year,
+        'YEAR' as time_dimension,
+        ROUND(SUM(COALESCE(h.elec_quantity, 0)), 2) as elec_quantity,
+        ROUND(SUM(COALESCE(h.use_elec_cost, 0)), 2) as elec_cost,
+        NOW() as create_time
+        FROM adm_area a
+        LEFT JOIN adm_meter_boundary_rel rel ON (
+        (rel.obj_type = 1 AND rel.boundary_obj = a.area_code) OR
+        (rel.obj_type = 1 AND EXISTS (
+        SELECT 1 FROM adm_area child
+        WHERE child.parent_code = a.area_code
+        AND rel.boundary_obj = child.area_code
+        ))
+        )
+        LEFT JOIN adm_elec_meter_h h ON h.device_code = rel.meter_device AND rel.meter_cls = 45
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                AND (a.area_code = #{areaCode} OR a.parent_code = #{areaCode} OR a.ancestors LIKE CONCAT('%,', #{areaCode}, ',%'))
+            </if>
+            <if test="objCode != null and objCode != '' and objCode != '-1'">
+                AND a.area_code = #{objCode}
+            </if>
+            <if test="startRecTime != null and startRecTime != ''">
+                AND h.date &gt;= DATE(#{startRecTime})
+            </if>
+            <if test="endRecTime != null and endRecTime != ''">
+                AND h.date &lt;= DATE(#{endRecTime})
+            </if>
+            AND h.date IS NOT NULL
+        </where>
+        GROUP BY a.area_code, a.area_name, YEAR(h.date)
+        ORDER BY YEAR(h.date) ${orderFlag}, a.area_code
+    </select>
+
+    <!-- 查询区域用能统计汇总 -->
+    <select id="selectAreaConsumptionSummary" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="EnergyConsumptionResult">
+        SELECT
+        COALESCE(#{areaCode}, '0') as area_code,
+        '总计' as obj_name,
+        'TOTAL' as obj_code,
+        1 as obj_type,
+        'SUMMARY' as time_dimension,
+        ROUND(SUM(COALESCE(h.elec_quantity, 0)), 2) as elec_quantity,
+        ROUND(SUM(COALESCE(h.use_elec_cost, 0)), 2) as elec_cost
+        FROM adm_area a
+        LEFT JOIN adm_meter_boundary_rel rel ON (
+        (rel.obj_type = 1 AND rel.boundary_obj = a.area_code) OR
+        (rel.obj_type = 1 AND EXISTS (
+        SELECT 1 FROM adm_area child
+        WHERE child.parent_code = a.area_code
+        AND rel.boundary_obj = child.area_code
+        ))
+        )
+        LEFT JOIN adm_elec_meter_h h ON h.device_code = rel.meter_device AND rel.meter_cls = 45
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                AND (a.area_code = #{areaCode} OR a.parent_code = #{areaCode} OR a.ancestors LIKE CONCAT('%,', #{areaCode}, ',%'))
+            </if>
+            <if test="startRecTime != null and startRecTime != ''">
+                AND h.date &gt;= DATE(#{startRecTime})
+            </if>
+            <if test="endRecTime != null and endRecTime != ''">
+                AND h.date &lt;= DATE(#{endRecTime})
+            </if>
+            AND h.date IS NOT NULL
+        </where>
+    </select>
+
+    <!-- ==================== 设施用能统计查询 ==================== -->
+
+    <!-- 查询设施日用能统计 -->
+    <select id="selectFacsDailyConsumption" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="EnergyConsumptionResult">
+        SELECT
+        f.ref_area as area_code,
+        f.facs_name as obj_name,
+        f.facs_code as obj_code,
+        2 as obj_type,
+        h.date as statistic_date,
+        'DAY' as time_dimension,
+        ROUND(SUM(COALESCE(h.elec_quantity, 0)), 2) as elec_quantity,
+        ROUND(SUM(COALESCE(h.use_elec_cost, 0)), 2) as elec_cost,
+        NOW() as create_time
+        FROM adm_ems_facs f
+        LEFT JOIN adm_meter_boundary_rel rel ON rel.obj_type = 2 AND rel.boundary_obj = f.facs_code
+        LEFT JOIN adm_elec_meter_h h ON h.device_code = rel.meter_device AND rel.meter_cls = 45
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                AND f.ref_area = #{areaCode}
+            </if>
+            <if test="objCode != null and objCode != '' and objCode != '-1'">
+                AND f.facs_code = #{objCode}
+            </if>
+            <if test="facsCategory != null and facsCategory != ''">
+                AND f.facs_category = #{facsCategory}
+            </if>
+            <if test="startRecTime != null and startRecTime != ''">
+                AND h.date &gt;= DATE(#{startRecTime})
+            </if>
+            <if test="endRecTime != null and endRecTime != ''">
+                AND h.date &lt;= DATE(#{endRecTime})
+            </if>
+            AND h.date IS NOT NULL
+            AND f.enable = 1
+        </where>
+        GROUP BY f.facs_code, f.facs_name, f.ref_area, h.date
+        ORDER BY h.date ${orderFlag}, f.facs_code
+    </select>
+
+    <!-- 查询设施月用能统计 -->
+    <select id="selectFacsMonthlyConsumption" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="EnergyConsumptionResult">
+        SELECT
+        f.ref_area as area_code,
+        f.facs_name as obj_name,
+        f.facs_code as obj_code,
+        2 as obj_type,
+        DATE(CONCAT(DATE_FORMAT(h.date, '%Y-%m'), '-01')) as statistic_date,
+        DATE_FORMAT(h.date, '%Y-%m') as statistic_month,
+        'MONTH' as time_dimension,
+        ROUND(SUM(COALESCE(h.elec_quantity, 0)), 2) as elec_quantity,
+        ROUND(SUM(COALESCE(h.use_elec_cost, 0)), 2) as elec_cost,
+        NOW() as create_time
+        FROM adm_ems_facs f
+        LEFT JOIN adm_meter_boundary_rel rel ON rel.obj_type = 2 AND rel.boundary_obj = f.facs_code
+        LEFT JOIN adm_elec_meter_h h ON h.device_code = rel.meter_device AND rel.meter_cls = 45
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                AND f.ref_area = #{areaCode}
+            </if>
+            <if test="objCode != null and objCode != '' and objCode != '-1'">
+                AND f.facs_code = #{objCode}
+            </if>
+            <if test="facsCategory != null and facsCategory != ''">
+                AND f.facs_category = #{facsCategory}
+            </if>
+            <if test="startRecTime != null and startRecTime != ''">
+                AND h.date &gt;= DATE(#{startRecTime})
+            </if>
+            <if test="endRecTime != null and endRecTime != ''">
+                AND h.date &lt;= DATE(#{endRecTime})
+            </if>
+            AND h.date IS NOT NULL
+            AND f.enable = 1
+        </where>
+        GROUP BY f.facs_code, f.facs_name, f.ref_area, DATE_FORMAT(h.date, '%Y-%m')
+        ORDER BY DATE_FORMAT(h.date, '%Y-%m') ${orderFlag}, f.facs_code
+    </select>
+
+    <!-- 查询设施年用能统计 -->
+    <select id="selectFacsYearlyConsumption" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="EnergyConsumptionResult">
+        SELECT
+        f.ref_area as area_code,
+        f.facs_name as obj_name,
+        f.facs_code as obj_code,
+        2 as obj_type,
+        DATE(CONCAT(YEAR(h.date), '-01-01')) as statistic_date,
+        YEAR(h.date) as statistic_year,
+        'YEAR' as time_dimension,
+        ROUND(SUM(COALESCE(h.elec_quantity, 0)), 2) as elec_quantity,
+        ROUND(SUM(COALESCE(h.use_elec_cost, 0)), 2) as elec_cost,
+        NOW() as create_time
+        FROM adm_ems_facs f
+        LEFT JOIN adm_meter_boundary_rel rel ON rel.obj_type = 2 AND rel.boundary_obj = f.facs_code
+        LEFT JOIN adm_elec_meter_h h ON h.device_code = rel.meter_device AND rel.meter_cls = 45
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                AND f.ref_area = #{areaCode}
+            </if>
+            <if test="objCode != null and objCode != '' and objCode != '-1'">
+                AND f.facs_code = #{objCode}
+            </if>
+            <if test="facsCategory != null and facsCategory != ''">
+                AND f.facs_category = #{facsCategory}
+            </if>
+            <if test="startRecTime != null and startRecTime != ''">
+                AND h.date &gt;= DATE(#{startRecTime})
+            </if>
+            <if test="endRecTime != null and endRecTime != ''">
+                AND h.date &lt;= DATE(#{endRecTime})
+            </if>
+            AND h.date IS NOT NULL
+            AND f.enable = 1
+        </where>
+        GROUP BY f.facs_code, f.facs_name, f.ref_area, YEAR(h.date)
+        ORDER BY YEAR(h.date) ${orderFlag}, f.facs_code
+    </select>
+
+    <!-- 查询设施用能统计汇总 -->
+    <select id="selectFacsConsumptionSummary" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="EnergyConsumptionResult">
+        SELECT
+        COALESCE(#{areaCode}, '0') as area_code,
+        '总计' as obj_name,
+        'TOTAL' as obj_code,
+        2 as obj_type,
+        'SUMMARY' as time_dimension,
+        ROUND(SUM(COALESCE(h.elec_quantity, 0)), 2) as elec_quantity,
+        ROUND(SUM(COALESCE(h.use_elec_cost, 0)), 2) as elec_cost
+        FROM adm_ems_facs f
+        LEFT JOIN adm_meter_boundary_rel rel ON rel.obj_type = 2 AND rel.boundary_obj = f.facs_code
+        LEFT JOIN adm_elec_meter_h h ON h.device_code = rel.meter_device AND rel.meter_cls = 45
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                AND f.ref_area = #{areaCode}
+            </if>
+            <if test="facsCategory != null and facsCategory != ''">
+                AND f.facs_category = #{facsCategory}
+            </if>
+            <if test="objCode != null and objCode != '' and objCode != '-1'">
+                AND f.facs_code = #{objCode}
+            </if>
+            <if test="startRecTime != null and startRecTime != ''">
+                AND h.date &gt;= DATE(#{startRecTime})
+            </if>
+            <if test="endRecTime != null and endRecTime != ''">
+                AND h.date &lt;= DATE(#{endRecTime})
+            </if>
+            AND h.date IS NOT NULL
+            AND f.enable = 1
+        </where>
+    </select>
+
+    <!-- ==================== 辅助查询 ==================== -->
+
+    <!-- 根据区域获取绑定的计量设备 -->
+    <select id="selectMeterDevicesByArea" resultType="java.lang.String">
+        SELECT DISTINCT rel.meter_device
+        FROM adm_meter_boundary_rel rel
+        WHERE rel.obj_type = 1
+          AND rel.boundary_obj = #{areaCode}
+          AND rel.meter_cls = #{meterCls}
+    </select>
+
+    <!-- 根据设施获取绑定的计量设备 -->
+    <select id="selectMeterDevicesByFacs" resultType="java.lang.String">
+        SELECT DISTINCT rel.meter_device
+        FROM adm_meter_boundary_rel rel
+        WHERE rel.obj_type = 2
+          AND rel.boundary_obj = #{facsCode}
+          AND rel.meter_cls = #{meterCls}
+    </select>
+
+    <!-- 根据设施分类获取绑定的计量设备 -->
+    <select id="selectMeterDevicesByFacsCategory" resultType="java.lang.String">
+        SELECT DISTINCT rel.meter_device
+        FROM adm_meter_boundary_rel rel
+        INNER JOIN adm_ems_facs f ON f.facs_code = rel.boundary_obj
+        WHERE rel.obj_type = 2
+        AND f.facs_category = #{facsCategory}
+        <if test="areaCode != null and areaCode != ''">
+            AND f.ref_area = #{areaCode}
+        </if>
+        AND rel.meter_cls = #{meterCls}
+        AND f.enable = 1
+    </select>
+
+</mapper>

+ 106 - 69
ems/sql/ems_init_data.sql

@@ -52,19 +52,19 @@ INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `s
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020102', '321283124S300201', '0,321283124S3002,321283124S300201', '商铺', '商铺', '综合楼商铺', 2, 0);
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020103', '321283124S300201', '0,321283124S3002,321283124S300201', '厨房', '厨房', '综合楼厨房', 3, 0);
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020104', '321283124S300201', '0,321283124S3002,321283124S300201', '二楼', '二楼', '综合楼厨房', 4, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10101', 'N-101', '0,321283124S3002,321283124S300201,N-101', '卫生间', '卫生间', '卫生间', 1, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10102', 'N-101', '0,321283124S3002,321283124S300201,N-101', '开水间', '开水间', '开水间', 2, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10103', 'N-101', '0,321283124S3002,321283124S300201,N-101', '货车服务空间', '货车服务空间', '货车服务空间', 16, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10201', 'N-102', '0,321283124S3002,321283124S300201,N-102', '超市', '超市', '超市', 3, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10202', 'N-102', '0,321283124S3002,321283124S300201,N-102', '特产市集', '特产市集', '特产市集', 4, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10203', 'N-102', '0,321283124S3002,321283124S300201,N-102', '中餐厅', '中餐厅', '中餐厅', 5, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10204', 'N-102', '0,321283124S3002,321283124S300201,N-102', '德克士', '德克士', '德克士', 6, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10205', 'N-102', '0,321283124S3002,321283124S300201,N-102', '共和春面馆', '共和春面馆', '共和春面馆', 7, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10206', 'N-102', '0,321283124S3002,321283124S300201,N-102', '堂食餐饮', '堂食餐饮', '堂食餐饮', 8, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10207', 'N-102', '0,321283124S3002,321283124S300201,N-102', '传统小吃', '传统小吃', '传统小吃', 9, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10208', 'N-102', '0,321283124S3002,321283124S300201,N-102', '沪上阿姨', '沪上阿姨', '沪上阿姨', 10, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10209', 'N-102', '0,321283124S3002,321283124S300201,N-102', '微团生活馆', '微团生活馆', '微团生活馆', 11, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10210', 'N-102', '0,321283124S3002,321283124S300201,N-102', '服饰鞋帽', '服饰鞋帽', '服饰鞋帽', 12, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10101', '321283124S30020101', '0,321283124S3002,321283124S300201,321283124S30020101', '卫生间', '卫生间', '卫生间', 1, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10102', '321283124S30020101', '0,321283124S3002,321283124S300201,321283124S30020101', '开水间', '开水间', '开水间', 2, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10103', '321283124S30020101', '0,321283124S3002,321283124S300201,321283124S30020101', '货车服务空间', '货车服务空间', '货车服务空间', 16, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10201', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '超市', '超市', '超市', 3, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10202', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '特产市集', '特产市集', '特产市集', 4, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10203', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '中餐厅', '中餐厅', '中餐厅', 5, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10204', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '德克士', '德克士', '德克士', 6, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10205', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '共和春面馆', '共和春面馆', '共和春面馆', 7, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10206', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '堂食餐饮', '堂食餐饮', '堂食餐饮', 8, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10207', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '传统小吃', '传统小吃', '传统小吃', 9, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10208', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '沪上阿姨', '沪上阿姨', '沪上阿姨', 10, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10209', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '微团生活馆', '微团生活馆', '微团生活馆', 11, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10210', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '服饰鞋帽', '服饰鞋帽', '服饰鞋帽', 12, 0);
 
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020201', '321283124S300202', '0,321283124S3002,321283124S300202', '南区司机之家维修间', '南区司机之家维修间', '南区司机之家维修间', 2, 0);
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020202', '321283124S300202', '0,321283124S3002,321283124S300202', '南区司机之家二楼', '南区司机之家二楼', '南区司机之家二楼', 3, 0);
@@ -326,61 +326,9 @@ 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 ('ID-E-C-1007', 'M_W2_SM_INDOOR_ENERGY', 'interface1', '[{"name":"(电表)南区宿舍ALZ","key":"C_1007_AV_0000","value":null,"updateTime":null}]', NULL);
 INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('ID-E-C-1007', 'M_W2_SM_INDOOR_ENERGY', 'interface2', '[{"name":"(电表)南区宿舍ALE","key":"C_1007_AV_0200","value":null,"updateTime":null}]', NULL);
 
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'current', '0.050', '2025-03-05 16:07:36');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'energy', '421.787', '2025-03-05 16:02:36');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'iccid', '898604E6192390306801', '2025-03-05 15:51:00');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'key', '1', '2025-03-05 15:57:59');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'keyLock', '0', '2025-03-05 15:51:00');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'onState', '2', '2025-03-05 15:51:00');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'power', '5.108', '2025-03-05 16:07:36');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'resetLock', '0', '2025-03-05 15:51:00');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'signal', '31', '2025-03-05 15:51:00');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'timerEnable', '1', '2025-03-05 15:51:00');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'timerInterval', '300', '2025-03-05 15:51:00');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 'M_W2_QF_GEEKOPEN', 'version', '1.0.1', '2025-03-05 15:51:00');
-
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('D-B-QS-10000001', 'M_W2_QS_KEKA_86', 'gatewayId', '864814074089037', null);
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('D-B-QS-10000001', 'M_W2_QS_KEKA_86', 'protocol', 'mqtt', null);
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('D-B-QS-10000001', 'M_W2_QS_KEKA_86', 'server', 'xt.wenhq.top', null);
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('D-B-QS-10000001', 'M_W2_QS_KEKA_86', 'port', '8581', null);
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('D-B-QS-10000001', 'M_W2_QS_KEKA_86', 'publish', '/sc/dtu/rep/864814074089037', null);
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('D-B-QS-10000001', 'M_W2_QS_KEKA_86', 'subcribe', '/sc/dtu/ctl/864814074089037', null);
-
--- 对象属性值枚举
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '0', '记忆');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '1', '分闸');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '2', '合闸');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'key', '1', '合闸');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'key', '0', '分闸');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'timerEnable', '0', '关闭');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'timerEnable', '1', '开启');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock', '0', '关闭');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock', '1', '开启');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'resetLock', '0', '关闭');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'resetLock', '1', '开启');
-
-
 -- 对象能力DEMO数据
 INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_SM_INDOOR_ENERGY', 'MeterReadingGw', '实时抄报-网关', '网关-测点批量抄报', null, 1);
 
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'Circuit-Closing', '分闸', '控制线路断电', '{\"type\":\"event\",\"key\":0}', 1);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'Circuit-Opening', '合闸', '控制线路通电', '{\"type\":\"event\",\"key\":1}', 1);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'Key-Lock', '按键解锁', '设置按键控制锁-关闭', '{\"type\":\"setting\",\"keyLock\":0}', 1);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'Key-Unlock', '按键锁定', '设置按键控制锁-开启', '{\"type\":\"setting\",\"keyLock\":1}', 1);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'restart', '软重启', '设备软重启', '{\"type\":\"setting\",\"system\":\"restart\"}', 0);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'settAutoReport', '设置电量信息定时上报', '设置电量信息定时上报(timerEnable:0:关闭上报 1:开启上报) timerInterval: 上报时间间隔单位秒', '{\"type\":\"setting\",\"timerEnable\":1,\"timerInterval\":900}', 0);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'setReset', '重置/恢复出厂', '设备恢复出厂设置固定传\"reset\"', '{\"type\":\"setting\",\"system\":\"reset\"}', 0);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'setOnState', '设置默认上电状态', '0:记忆;1:关闭,即断开;2:开启,即通电,默认=1', '{\"type\":\"setting\",\"onState\":1}', 0);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'syncProtocol', '触发通讯信息同步', '获取设备通讯信息', '{\"type\":\"protocol\"}', 0);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'syncStatistic', '触发电量信息同步', '获取设备电量信息', '{\"type\":\"statistic\"}', 1);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'syncInfo', '触发基础信息同步', '获取设备状态信息', '{\"type\":\"info\"}', 0);
-
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QS_KEKA_86', 'light1-on', '灯1-开启', '灯1-开启', '01 06 10 21 00 01 1C C0', 1);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QS_KEKA_86', 'light1-off', '灯1-关闭', '灯1-关闭', '01 06 10 21 00 00 DD 00', 1);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QS_KEKA_86', 'light2-on', '灯2-开启', '灯2-开启', '01 06 10 22 00 01 EC C0', 1);
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QS_KEKA_86', 'light2-off', '灯2-关闭', '灯2-关闭', '01 06 10 22 00 00 2D 00', 1);
-
-
 -- 能源设施能流关系DEMO数据
 INSERT INTO `adm_ems_flow_rel` (`export_obj`, `export_obj_type`, `input_obj`, `input_obj_type`, `ems_cls`, `flow_desc`) VALUES ('W201', 1, 'Z101', 1, '45', '供电');
 INSERT INTO `adm_ems_flow_rel` (`export_obj`, `export_obj_type`, `input_obj`, `input_obj_type`, `ems_cls`, `flow_desc`) VALUES ('E501', 1, 'W201', 1, '45', '供电');
@@ -405,7 +353,7 @@ insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('B-1020
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('B-10208', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('B-10209', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('B-10210', 1, 'Area_01');
-
+insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('321283124S300102', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-102', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10201', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10202', 1, 'Area_01');
@@ -417,6 +365,7 @@ insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-1020
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10208', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10209', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10210', 1, 'Area_01');
+insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('321283124S300202', 1, 'Area_01');
 
 
 -- 服务区用电属性数据
@@ -617,8 +566,94 @@ INSERT INTO `adm_meter_device` (`area_code`, `device_code`, `device_model`, `dev
 -- 测试表
 INSERT INTO `adm_meter_device` (`area_code`, `device_code`, `device_model`, `device_name`, `location_ref`, `location`, `meter_cls`, `obj_tag`, `col_cycle`, `col_mode`, `magnification`, `spec_desc`) VALUES ('321283124S3001', '864142073640059', 'M_W2_QF_GEEKOPEN', '智能断路器', '321283124S300101', '综合楼C3-茶水间', 45, 0, 3600, 0, 1, '智能表');
 
-
--- 表计绑定关系
+-- 北区区域-表计测点绑定关系
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2003_AV_0000');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2003_AV_0001');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2003_AV_0002');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2003_AV_0003');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2003_AV_0005');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2003_AV_0006');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2004_AV_0400');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10204', 45, 'C_2003_AV_0206');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10209', 45, 'C_2003_AV_0214');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10209', 45, 'C_2003_AV_0238');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10210', 45, 'C_2003_AV_0246');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10207', 45, 'C_2003_AV_0278');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10205', 45, 'C_2003_AV_0294');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10202', 45, 'C_2003_AV_0310');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10201', 45, 'C_2003_AV_0318');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30010103', 45, 'C_2003_AV_0406');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30010104', 45, 'C_2003_AV_0600');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30010104', 45, 'C_2003_AV_0601');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30010104', 45, 'C_2003_AV_0603');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30010104', 45, 'C_2003_AV_0604');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300102', 45, 'C_2005_AV_0200');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300102', 45, 'C_2005_AV_0201');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300102', 45, 'C_2005_AV_0400');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300102', 45, 'C_2005_AV_0401');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300103', 45, 'C_2006_AV_0000');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10103', 70, 'C_2004_AV_0000');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10208', 70, 'C_2004_AV_0001');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10209', 70, 'C_2004_AV_0002');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10210', 70, 'C_2004_AV_0003');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10101', 70, 'C_2004_AV_0004');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10102', 70, 'C_2004_AV_0005');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10201', 70, 'C_2004_AV_0006');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10202', 70, 'C_2004_AV_0007');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10206', 70, 'C_2004_AV_0008');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10207', 70, 'C_2004_AV_0009');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10204', 70, 'C_2004_AV_0010');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10205', 70, 'C_2004_AV_0011');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10203', 70, 'C_2004_AV_0012');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30010104', 70, 'C_2004_AV_0200');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300102', 70, 'C_2005_AV_0600');
+
+-- 南区区域-表计测点绑定关系
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300201', 45, 'C_1003_AV_0000');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300201', 45, 'C_1003_AV_0001');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300201', 45, 'C_1003_AV_0002');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300201', 45, 'C_1003_AV_0003');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300201', 45, 'C_1003_AV_0004');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300201', 45, 'C_1003_AV_0005');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300201', 45, 'C_1003_AV_0006');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300201', 45, 'C_1004_AV_0400');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10204', 45, 'C_1003_AV_0206');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10209', 45, 'C_1003_AV_0214');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10208', 45, 'C_1003_AV_0238');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10210', 45, 'C_1003_AV_0246');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10207', 45, 'C_1003_AV_0278');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10205', 45, 'C_1003_AV_0294');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10202', 45, 'C_1003_AV_0310');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10201', 45, 'C_1003_AV_0318');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30020103', 45, 'C_1003_AV_0406');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30020104', 45, 'C_1003_AV_0600');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30020104', 45, 'C_1003_AV_0601');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30020104', 45, 'C_1003_AV_0602');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30020104', 45, 'C_1003_AV_0603');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30020104', 45, 'C_1003_AV_0604');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300202', 45, 'C_1005_AV_0000');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300202', 45, 'C_1005_AV_0200');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300202', 45, 'C_1005_AV_0201');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300202', 45, 'C_1005_AV_0400');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300203', 45, 'C_1007_AV_0000');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300203', 45, 'C_1007_AV_0200');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10103', 70, 'C_1004_AV_0000');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10208', 70, 'C_1004_AV_0001');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10209', 70, 'C_1004_AV_0002');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10210', 70, 'C_1004_AV_0003');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10101', 70, 'C_1004_AV_0004');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10102', 70, 'C_1004_AV_0005');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10201', 70, 'C_1004_AV_0006');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10202', 70, 'C_1004_AV_0007');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10206', 70, 'C_1004_AV_0008');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10207', 70, 'C_1004_AV_0009');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10204', 70, 'C_1004_AV_0010');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10205', 70, 'C_1004_AV_0011');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'N-10203', 70, 'C_1004_AV_0012');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S30020104', 70, 'C_1004_AV_0200');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300202', 70, 'C_1005_AV_0600');
+
+-- 北区负荷设施-表计测点绑定关系
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-KT-01', 45, 'C_2003_AV_0001');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-ZM-01', 45, 'C_2003_AV_0000');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-FW-01', 45, 'C_2003_AV_0206');
@@ -671,6 +706,7 @@ INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-QT-01', 70, 'C_2004_AV_0200');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-QT-01', 70, 'C_2005_AV_0600');
 
+-- 南区负荷设施-表计测点绑定关系
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-KT-02', 45, 'C_1003_AV_0001');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-ZM-02', 45, 'C_1003_AV_0000');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-FW-02', 45, 'C_1003_AV_0206');
@@ -726,6 +762,7 @@ INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-QT-02', 70, 'C_1004_AV_0200');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'Z-QT-02', 70, 'C_1005_AV_0600');
 
+-- 北区市电供能设施-表计测点绑定关系
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'W201', 45, 'C_2003_AV_0001');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'W201', 45, 'C_2003_AV_0000');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'W201', 45, 'C_2003_AV_0206');
@@ -763,7 +800,7 @@ INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'W201', 45, 'C_2003_AV_0604');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'W201', 45, 'C_2004_AV_0400');
 
-
+-- 南区市电供能设施-表计测点绑定关系
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'W202', 45, 'C_1003_AV_0001');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'W202', 45, 'C_1003_AV_0000');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (2, 'W202', 45, 'C_1003_AV_0206');