learshaw 1 сар өмнө
parent
commit
1b3dde9906

+ 13 - 0
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/ElecMeterHController.java

@@ -134,6 +134,19 @@ public class ElecMeterHController extends BaseController {
     }
 
     /**
+     * 查询区域用能统计数据
+     *
+     * @param queryMeter 查询条件
+     * @return
+     */
+    @GetMapping("/hour/listAreaMeter")
+    public TableDataInfo listAreaMeter(QueryMeter queryMeter) {
+        startPage();
+        List<ElecMeterH> list = boundaryObjService.getMeterByArea(queryMeter);
+        return getDataTable(list);
+    }
+
+    /**
      * 计算时间范围内日平均
      *
      * @param queryMeter 支持areaCode、deviceCode、date范围筛选

+ 69 - 4
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/ElecPvSupplyHController.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.controller;
 
 import com.huashe.common.domain.AjaxResult;
+import com.huashe.common.exception.BusinessException;
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.web.controller.BaseController;
 import com.ruoyi.common.core.web.page.TableDataInfo;
@@ -18,6 +19,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.List;
 
 /**
@@ -59,9 +64,69 @@ public class ElecPvSupplyHController extends BaseController {
      */
     @Log(title = "光伏并网计量光伏并网计量-小时", businessType = BusinessType.EXPORT)
     @PostMapping("/hour/export")
-    public void export(HttpServletResponse response, ElecPvSupplyH pvSupplyH) {
-        List<ElecPvSupplyH> list = pvSupplyHService.selectPvSupplyHList(pvSupplyH);
-        ExcelUtil<ElecPvSupplyH> util = new ExcelUtil<ElecPvSupplyH>(ElecPvSupplyH.class);
-        util.exportExcel(response, list, "光伏并网计量光伏并网计量-小时数据");
+    public void export(HttpServletResponse response, ElecPvSupplyH pvSupplyH) throws IOException {
+        try {
+            validateTimeRange(pvSupplyH);
+
+            List<ElecPvSupplyH> list = pvSupplyHService.selectPvSupplyHList(pvSupplyH);
+            ExcelUtil<ElecPvSupplyH> util = new ExcelUtil<ElecPvSupplyH>(ElecPvSupplyH.class);
+            util.exportExcel(response, list, "光伏并网计量光伏并网计量-小时数据");
+        } catch (BusinessException e) {
+            // 统一异常处理
+            handleExportException(response, e);
+        } catch (DateTimeParseException e) {
+            handleExportException(response, new BusinessException("时间格式错误,请使用yyyy-MM-dd HH:mm:ss格式"));
+        }
+    }
+
+    /**
+     * 校验时间范围有效性(精确到秒)
+     */
+    private void validateTimeRange(ElecPvSupplyH pvSupplyH) {
+        // 参数校验
+        if (pvSupplyH.getStartRecTime() == null || pvSupplyH.getEndRecTime() == null) {
+            throw new BusinessException("开始时间和结束时间必须同时填写");
+        }
+
+        // 日期时间格式化器
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        try {
+            // 解析日期时间
+            LocalDateTime startDateTime = LocalDateTime.parse(pvSupplyH.getStartRecTime(), formatter);
+            LocalDateTime endDateTime = LocalDateTime.parse(pvSupplyH.getEndRecTime(), formatter);
+
+            // 校验时间顺序
+            if (endDateTime.isBefore(startDateTime)) {
+                throw new BusinessException("结束时间不能早于开始时间");
+            }
+
+            // 计算最大允许结束时间(精确到秒)
+            LocalDateTime maxEndDateTime = startDateTime.plusDays(90).minusSeconds(1);
+
+            // 校验时间范围(90天范围)
+            if (endDateTime.isAfter(maxEndDateTime)) {
+                throw new BusinessException("时间范围不能超过90天(最大允许到:" +
+                    maxEndDateTime.format(formatter) + ")");
+            }
+
+        } catch (DateTimeParseException e) {
+            throw new BusinessException("时间格式错误,请使用yyyy-MM-dd HH:mm:ss格式");
+        }
+    }
+
+    /**
+     * 统一异常处理
+     */
+    private void handleExportException(HttpServletResponse response, BusinessException e) {
+        response.reset();
+        response.setContentType("application/json");
+        response.setCharacterEncoding("utf-8");
+        try {
+            response.getWriter().print("{\"code\":400,\"msg\":\"" + e.getMessage() + "\"}");
+        }
+        catch (IOException ex) {
+            // 记录日志等处理
+        }
     }
 }

+ 7 - 8
ems/ems-core/src/main/java/com/ruoyi/ems/domain/ElecPvSupplyH.java

@@ -29,7 +29,7 @@ public class ElecPvSupplyH extends BaseEntity {
     /**
      * 园区名称
      */
-    @Excel(name = "园区名称")
+    @Excel(name = "位置")
     private String areaName;
 
     /**
@@ -45,7 +45,6 @@ public class ElecPvSupplyH extends BaseEntity {
     /**
      * 设施名称
      */
-    @Excel(name = "设施名称")
     private String facsName;
 
     /**
@@ -58,14 +57,14 @@ public class ElecPvSupplyH extends BaseEntity {
      * 日期 yyyy-MM-dd
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "日期 yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd")
+    @Excel(name = "日期", width = 30, dateFormat = "yyyy-MM-dd")
     private Date date;
 
     /**
      * 时间 HH:mm:ss
      */
     @JsonFormat(pattern = "HH:mm:ss")
-    @Excel(name = "时间 HH:mm:ss", width = 30, dateFormat = "HH:mm:ss")
+    @Excel(name = "时间", width = 30, dateFormat = "HH:mm:ss")
     private Time time;
 
     /**
@@ -83,25 +82,25 @@ public class ElecPvSupplyH extends BaseEntity {
     /**
      * 发电量 单位:kW-h(千瓦时)
      */
-    @Excel(name = "发电量 单位:kW-h")
+    @Excel(name = "发电量(kW·h)")
     private Double genElecQuantity;
 
     /**
      * 自用电量 单位:kW-h(千瓦时)
      */
-    @Excel(name = "自用电量 单位:kW-h")
+    @Excel(name = "自用电量(kW·h)")
     private Double useElecQuantity;
 
     /**
      * 上网电量 单位:kW-h(千瓦时)
      */
-    @Excel(name = "上网电量 单位:kW-h")
+    @Excel(name = "上网电量(kW·h)")
     private Double upElecQuantity;
 
     /**
      * 发电收益 单位: ¥(元)
      */
-    @Excel(name = "发电收益 单位: ¥")
+    @Excel(name = "发电收益(元)")
     private Double upElecEarn;
 
     public Long getId() {

+ 2 - 2
ems/ems-core/src/main/java/com/ruoyi/ems/service/IBoundaryObjService.java

@@ -57,7 +57,7 @@ public interface IBoundaryObjService {
      * @param queryMeter 查询条件
      * @return 用电计量统计结果
      */
-    List<EnergyMeter> getMeterStaByBoundaryObj(QueryMeter queryMeter);
+    List<ElecMeterH> getMeterStaByArea(QueryMeter queryMeter);
 
     /**
      * 查询用电计量-根据边界对象
@@ -65,5 +65,5 @@ public interface IBoundaryObjService {
      * @param queryMeter 查询条件
      * @return 用电计量结果
      */
-    List<ElecMeterH> getMeterByBoundaryObj(QueryMeter queryMeter);
+    List<ElecMeterH> getMeterByArea(QueryMeter queryMeter);
 }

+ 71 - 6
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/BoundaryObjServiceImpl.java

@@ -14,6 +14,7 @@ import com.huashe.common.exception.Assert;
 import com.huashe.common.exception.BusinessException;
 import com.ruoyi.ems.core.BaseCache;
 import com.ruoyi.ems.domain.Area;
+import com.ruoyi.ems.domain.EmsFacs;
 import com.ruoyi.ems.domain.EnergyMeter;
 import com.ruoyi.ems.domain.ElecMeterH;
 import com.ruoyi.ems.domain.FacsCategory;
@@ -22,11 +23,13 @@ import com.ruoyi.ems.domain.MeterBoundaryRel;
 import com.ruoyi.ems.enums.MeterObjType;
 import com.ruoyi.ems.model.BoundaryObj;
 import com.ruoyi.ems.model.QueryMeter;
+import com.ruoyi.ems.model.TreeEntity;
 import com.ruoyi.ems.service.IAreaService;
 import com.ruoyi.ems.service.IBoundaryObjService;
 import com.ruoyi.ems.service.IElecMeterHService;
 import com.ruoyi.ems.service.IEmsFacsService;
 import com.ruoyi.ems.service.IMeterBoundaryRelService;
+import com.ruoyi.ems.util.AreaUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -66,7 +69,7 @@ public class BoundaryObjServiceImpl implements IBoundaryObjService {
 
     // 注入设施服务
     @Autowired
-    private IEmsFacsService emsFacsService;
+    private IEmsFacsService facsService;
 
     // 注入电表数据服务
     @Autowired
@@ -118,7 +121,7 @@ public class BoundaryObjServiceImpl implements IBoundaryObjService {
     @Override
     public List<EnergyMeter> getMeterStaByFacsCategory(QueryMeter queryMeter) {
         List<EnergyMeter> result = new ArrayList<>();
-        List<BoundaryObj> bObjs = emsFacsService.getFacsWithMeterDev(queryMeter.getAreaCode(),
+        List<BoundaryObj> bObjs = facsService.getFacsWithMeterDev(queryMeter.getAreaCode(),
             queryMeter.getFacsCategory(), queryMeter.getFacsSubCategory());
 
         if (CollectionUtils.isNotEmpty(bObjs)) {
@@ -148,7 +151,7 @@ public class BoundaryObjServiceImpl implements IBoundaryObjService {
     @Override
     public List<ElecMeterH> getMeterByFacsCategory(QueryMeter queryMeter) {
         List<ElecMeterH> result = new ArrayList<>();
-        List<BoundaryObj> bObjs = emsFacsService.getFacsWithMeterDev(queryMeter.getAreaCode(),
+        List<BoundaryObj> bObjs = facsService.getFacsWithMeterDev(queryMeter.getAreaCode(),
             queryMeter.getFacsCategory(), queryMeter.getFacsSubCategory());
 
         if (CollectionUtils.isNotEmpty(bObjs)) {
@@ -190,13 +193,75 @@ public class BoundaryObjServiceImpl implements IBoundaryObjService {
     }
 
     @Override
-    public List<EnergyMeter> getMeterStaByBoundaryObj(QueryMeter queryMeter) {
+    public List<ElecMeterH> getMeterStaByArea(QueryMeter queryMeter) {
         return Collections.emptyList();
     }
 
     @Override
-    public List<ElecMeterH> getMeterByBoundaryObj(QueryMeter queryMeter) {
-        return Collections.emptyList();
+    public List<ElecMeterH> getMeterByArea(QueryMeter queryMeter) {
+
+        List<ElecMeterH> result = new ArrayList<>();
+
+        if (StringUtils.equals("-1", queryMeter.getAreaCode())) {
+            // 查询区域树
+            List<Area> areaTree = areaService.selectAreaTree("0", false);
+
+            // 查询设施列表
+            EmsFacs facsParam = new EmsFacs();
+            facsParam.setFacsCategory("Z");
+            List<EmsFacs> facsList = facsService.selectEmsFacsList(facsParam);
+            Set<String> facsAreaCodes = facsList.stream().map(EmsFacs::getRefArea).collect(Collectors.toSet());
+
+            // 过滤树节点
+            areaTree = AreaUtils.filterTree(areaTree, facsAreaCodes);
+            List<String> areaCodes = areaTree.stream().map(Area::getAreaCode).collect(Collectors.toList());
+
+            List<MeterBoundaryRel> relList = new ArrayList<>();
+
+            for (String areaCode : areaCodes) {
+                List<MeterBoundaryRel> rels = boundaryRelService.selectRelByObj(areaCode,
+                    MeterObjType.METER_AREA.getType(), 45);
+                relList.addAll(rels);
+            }
+
+            if (CollectionUtils.isNotEmpty(relList)) {
+                Area rootArea = new Area();
+                rootArea.setAreaCode(queryMeter.getAreaCode());
+                rootArea.setAreaName("全部区域");
+
+                Set<String> bdDevs = relList.stream().map(MeterBoundaryRel::getMeterDevice).collect(Collectors.toSet());
+
+                result = getAreaMeterQuery(queryMeter.getAreaCode(), rootArea, bdDevs, queryMeter.getStartRecTime(),
+                    queryMeter.getEndRecTime());
+            }
+        }
+        else {
+            Area area = areaService.selectAreaByCode(queryMeter.getObjCode());
+            List<MeterBoundaryRel> relList = boundaryRelService.selectRelByObj(queryMeter.getAreaCode(),
+                MeterObjType.METER_AREA.getType(), 45);
+
+            if (null != area && CollectionUtils.isNotEmpty(relList)) {
+                Set<String> bdDevs = relList.stream().map(MeterBoundaryRel::getMeterDevice).collect(Collectors.toSet());
+
+                result = getAreaMeterQuery(queryMeter.getAreaCode(), area, bdDevs, queryMeter.getStartRecTime(),
+                    queryMeter.getEndRecTime());
+            }
+        }
+
+        return result;
+    }
+
+    private List<ElecMeterH> getAreaMeterQuery(String rootArea, Area area, Set<String> bdDevs, String startTime,
+        String endTime) {
+        QueryMeter condition = new QueryMeter();
+        condition.setAreaCode(rootArea);
+        condition.setObjCode(area.getAreaCode());
+        condition.setObjName(area.getAreaName());
+        condition.setStartRecTime(startTime);
+        condition.setEndRecTime(endTime);
+        condition.setDeviceCodes(bdDevs);
+
+        return elecMeterHService.selectByMeterDevs(condition);
     }
 
     private EnergyMeter getElecMeter(QueryMeter queryMeter, BoundaryObj bObj) {

+ 1 - 0
ems/ems-core/src/main/resources/mapper/ems/ElecPvSupplyHMapper.xml

@@ -67,6 +67,7 @@
 
     <select id="selectPvSupplyHAll" parameterType="com.ruoyi.ems.domain.ElecPvSupplyH" resultMap="PvSupplyHResult">
         SELECT
+        '全部' as area_name,
         facCategory.`name` facs_name,
         pv.`record_time`,
         pv.`date`,

+ 6 - 7
ems/sql/ems_sys_data.sql

@@ -31,7 +31,7 @@ insert into sys_menu values ('4',  '设备', '0', '4', 'device-mgr',       null,
 insert into sys_menu values ('5',  '运维', '0', '5', 'oper-mgr',         null, '', 1, 0, 'M', '0', '0', '',  'opermgr',     'admin', sysdate(), '', null, '运维保障');
 insert into sys_menu values ('6',  '设置', '0', '6', 'param-cfg',        null, '', 1, 0, 'M', '0', '0', '',  'paramcfg',    'admin', sysdate(), '', null, '业务配置');
 insert into sys_menu values ('7',  '系统', '0', '7', 'system',           null, '', 1, 0, 'M', '0', '0', '',  'system',      'admin', sysdate(), '', null, '系统管理');
-insert into sys_menu values ('99', '开发工具', '0', '99', 'tool',            null, '', 1, 0, 'M', '0', '0', '',  'tool',        'admin', sysdate(), '', null, '开发工具');
+insert into sys_menu values ('99', '开发工具', '0', '99', 'tool',         null, '', 1, 0, 'M', '0', '0', '',  'tool',        'admin', sysdate(), '', null, '开发工具');
 
 -- 二级菜单
 insert into sys_menu values ('100',  '服务区',         '1',   '1',   '/largeScreen',         'view/servicearea',          '', 1, 0, 'C', '0', '0',   'view:service-area',      'servicearea',    'admin', sysdate(), '', null, '园区能源概览');
@@ -81,7 +81,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 ('1650',  '系统信息',       '165',   '1',  'adapter-subsystem',  'adapter/subsystem/index',  '', 1, 0, 'C', '0', '0',   'adapter:subsystem:list',  'note',           'admin', sysdate(), '', null, '光伏');
+insert into sys_menu values ('1650',  '系统信息',       '165',   '1',  'adapter-subsystem',  'adapter/subsystem/index',  '', 1, 0, 'C', '0', '0',   'adapter:subsystem:list',  'note',           'admin', sysdate(), '', null, '系统信息');
 insert into sys_menu values ('1651',  '光伏',          '165',   '2',  'adapter-pv',         'adapter/pv/index',      '', 1, 0, 'C', '0', '0',   'adapter:user:list',       'photovoltaic',        'admin', sysdate(), '', null, '光伏');
 insert into sys_menu values ('1652',  '光储直柔',       '165',   '3',  'adapter-gczr',       'adapter/gczr/index',    '', 1, 0, 'C', '0', '0',   'adapter:role:list',       'deviceaccess',      'admin', sysdate(), '', null, '光储直柔');
 insert into sys_menu values ('1653',  '光储充',         '165',   '4',  'adapter-gcc',        'adapter/gcc/index',     '', 1, 0, 'C', '0', '0',   'adapter:menu:list',       'energyconsume',       'admin', sysdate(), '', null, '光储充');
@@ -90,7 +90,6 @@ insert into sys_menu values ('1655',  '智慧照明',       '165',   '6',  'adap
 insert into sys_menu values ('1656',  '智慧海绵',       '165',   '7',  'adapter-hm',         'adapter/hm/index',      '', 1, 0, 'C', '0', '0',   'adapter:dict:list',       'system',        'admin', sysdate(), '', null, '智慧海绵');
 insert into sys_menu values ('1657',  '垃圾厨余',       '165',   '8',  'adapter-ljcy',       'adapter/ljcy/index',    '', 1, 0, 'C', '0', '0',   'adapter:config:list',     'system',      'admin', sysdate(), '', null, '垃圾厨余');
 insert into sys_menu values ('1658',  '能耗监测',       '165',   '9',  'adapter-nhjc',       'adapter/nhjc/index',    '', 1, 0, 'C', '0', '0',   'adapter:notice:list',     'system',      'admin', sysdate(), '', null, '能耗监测');
-insert into sys_menu values ('1659',  '设备管理',       '165',   '10',  'adapter-devc',       'adapter/devc/index',    '', 1, 0, 'M', '0', '0',   'adapter:devc:list',       'system',      'admin', sysdate(), '', null, '设备管理');
 
 insert into sys_menu values ('997',  '表单构建',       '99',   '1',  'build',              'tool/build/index',       '', 1, 0, 'C', '0', '0',   'tool:build:list',        'build',          'admin', sysdate(), '', null, '表单构建菜单');
 insert into sys_menu values ('998',  '代码生成',       '99',   '2',  'gen',                'tool/gen/index',         '', 1, 0, 'C', '0', '0',   'tool:gen:list',          'code',           'admin', sysdate(), '', null, '代码生成菜单');
@@ -102,10 +101,10 @@ insert into sys_menu values ('1200',  '产能预测', '120', '1',  'prediction-p
 insert into sys_menu values ('1201',  '用能预测', '120', '2',  'prediction-consume', 'prediction/consume',     '', 1, 0, 'C', '0', '0',   'prediction:consume',     'energyconsume',  'admin', sysdate(), '', null, '用能预测');
 insert into sys_menu values ('1202',  '碳排预测', '120', '3',  'prediction-ca',      'prediction/ca',          '', 1, 0, 'C', '0', '0',   'prediction:ca',          'caemission',     'admin', sysdate(), '', null, '碳排预测');
 -- 报表菜单
-insert into sys_menu values ('1210',  '产能报表',   '121', '1',  'statement-prod',    'analysis/statement/prod',     '', 1, 0, 'C', '0', '0',    'analysis:statement:prod',      'energyprod',     'admin', sysdate(), '', null, '产能报表');
-insert into sys_menu values ('1211',  '用能报表',   '121', '2',  'statement-consume', 'analysis/statement/consume',  '', 1, 0, 'C', '0', '0',    'analysis:statement:consume',   'energyconsume',  'admin', sysdate(), '', null, '用能报表');
-insert into sys_menu values ('1212',  '告警报表',   '121', '3',  'statement-warn',    'analysis/statement/warn',     '', 1, 0, 'C', '0', '0',    'analysis:statement:warn',      'warn',     'admin', sysdate(), '', null, '告警报表');
-insert into sys_menu values ('1213',  '自定义',     '121', '4',  'statement-warn',    'analysis/statement/custom',   '', 1, 0, 'C', '0', '0',   'analysis:statement:custom',    'statement-zdy',   'admin', sysdate(), '', null, '自定义报表');
+insert into sys_menu values ('1210',  '产能报表',   '121', '1',  'statement-prod',    'analysis/report/statement-prod',     '', 1, 0, 'C', '0', '0',    'analysis:statement:prod',      'energyprod',     'admin', sysdate(), '', null, '产能报表');
+insert into sys_menu values ('1211',  '用能报表',   '121', '2',  'statement-consume', 'analysis/report/statement-consume',  '', 1, 0, 'C', '0', '0',    'analysis:statement:consume',   'energyconsume',  'admin', sysdate(), '', null, '用能报表');
+insert into sys_menu values ('1212',  '告警报表',   '121', '3',  'statement-warn',    'analysis/report/statement-warn',     '', 1, 0, 'C', '0', '0',    'analysis:statement:warn',      'warn',     'admin', sysdate(), '', null, '告警报表');
+insert into sys_menu values ('1213',  '自定义',     '121', '4',  'statement-self',    'analysis/report/statement-self',   '', 1, 0, 'C', '0', '0',   'analysis:statement:custom',    'statement-zdy',   'admin', sysdate(), '', null, '自定义报表');
 
 -- 碳分析菜单
 insert into sys_menu values ('1231',  '碳排计量',       '123',    '1',  'ca-emission',        'ca/emission',            '', 1, 0, 'C', '0', '0',   'ca-analysis:emission',   'caemission',     'admin', sysdate(), '', null, '碳排分析');