浏览代码

Merge remote-tracking branch 'origin/master'

chen.cheng 1 月之前
父节点
当前提交
708cb2a7ce

+ 1 - 1
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/WeatherColJuheServiceImpl.java

@@ -202,7 +202,7 @@ public class WeatherColJuheServiceImpl implements WeatherColService {
 
             String temp = entity.getString("temperature");
 
-            forecast.setDayTemp(safeDouble(StringUtils.substringAfter(temp, "/")));
+            forecast.setDayTemp(safeDouble(StringUtils.substringBetween(temp, "/", "℃")));
             forecast.setNightTemp(safeDouble(StringUtils.substringBefore(temp, "/")));
             forecast.setDayWindDir(entity.getString("direct"));
             forecast.setNightWindDir(entity.getString("direct"));

+ 7 - 0
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/config/AnalysisConfig.java

@@ -34,6 +34,9 @@ public class AnalysisConfig {
     @Value("${analysis-task.pv-forecast.area-codes}")
     private String pvForecastArea;
 
+    @Value("${analysis-task.elec-consume.area-codes}")
+    private String elecConsumeArea;
+
     @Value("${analysis-task.pv-forecast.forecastDays}")
     private int prodForecastDays;
 
@@ -45,6 +48,10 @@ public class AnalysisConfig {
         return StringUtils.split(pvForecastArea, ",");
     }
 
+    public String[] getElecConsumeAreas() {
+        return StringUtils.split(elecConsumeArea, ",");
+    }
+
     public int getProdForecastDays() {
         return prodForecastDays;
     }

+ 62 - 1
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/TaskService.java

@@ -21,11 +21,14 @@ import com.huashe.common.utils.HttpUtils;
 import com.ruoyi.ems.config.AnalysisConfig;
 import com.ruoyi.ems.config.DateAttrConfig;
 import com.ruoyi.ems.config.WeatherConfig;
+import com.ruoyi.ems.domain.Area;
 import com.ruoyi.ems.domain.EmsFacs;
 import com.ruoyi.ems.model.QueryMeter;
+import com.ruoyi.ems.service.IAreaService;
 import com.ruoyi.ems.service.IDateService;
 import com.ruoyi.ems.service.IEmsFacsService;
 import com.ruoyi.ems.service.IWeatherService;
+import com.ruoyi.ems.service.analysis.ElecConsumeForecastService;
 import com.ruoyi.ems.service.analysis.ElecProdForecastService;
 import com.ruoyi.ems.service.analysis.EmsEcoAnalysisService;
 import org.apache.commons.collections4.CollectionUtils;
@@ -61,6 +64,9 @@ public class TaskService {
     private static final Logger log = LoggerFactory.getLogger(TaskService.class);
 
     @Resource
+    private IAreaService areaService;
+
+    @Resource
     private IEmsFacsService facsService;
 
     @Resource
@@ -82,6 +88,9 @@ public class TaskService {
     private ElecProdForecastService elecProdForecastService;
 
     @Resource
+    private ElecConsumeForecastService elecConsumeForecastService;
+
+    @Resource
     private AnalysisConfig analysisConfig;
 
     /**
@@ -285,8 +294,60 @@ public class TaskService {
      * 用电预测
      */
     @Async
-    @Scheduled(cron = "${analysis-task.pv-forecast.cron}")
+    @Scheduled(cron = "${analysis-task.elec-consume.cron}")
     public void elecConsumeForecastTask() {
+        log.debug("start pv forecast task.");
 
+        try {
+            // 获取今天的日期
+            LocalDate today = LocalDate.now();
+            String[] areaCodes = analysisConfig.getElecConsumeAreas();
+
+            if (ArrayUtils.isNotEmpty(areaCodes)) {
+                for (String areaCode : areaCodes) {
+                    //  区域用能预测
+                    forecastAreas(areaCode, today);
+
+                    //  设施用能预测
+                    forecastFacs(areaCode, today);
+                }
+            }
+        }
+        catch (Exception e) {
+            log.error("pv forecast fail!", e);
+        }
+
+    }
+
+    private void forecastAreas(String rootArea, LocalDate today) {
+        List<Area> areas = areaService.selectAreaTree(rootArea, true);
+        forecastAreasSub(rootArea,areas, today);
+    }
+
+    private  void forecastAreasSub(String rootArea, List<?> areas, LocalDate today) {
+        if (CollectionUtils.isNotEmpty(areas)) {
+            for (Object obj : areas) {
+                Area area = (Area) obj;
+                elecConsumeForecastService.forecastAreas(analysisConfig.getAdcode(), rootArea, area, today, 5);
+
+                if (CollectionUtils.isNotEmpty(area.getChildren())) {
+                    List<?> children = area.getChildren();
+                    forecastAreasSub(rootArea, children, today);
+                }
+            }
+        }
+    }
+
+    private void forecastFacs(String areaCode, LocalDate today) {
+        EmsFacs param = new EmsFacs();
+        param.setRefArea(areaCode);
+        param.setFacsCategory("Z");
+        List<EmsFacs> facsList = facsService.selectEmsFacsList(param);
+
+        if (CollectionUtils.isNotEmpty(facsList)) {
+            for (EmsFacs facs : facsList) {
+                elecConsumeForecastService.forecastFacilities(analysisConfig.getAdcode(), areaCode, facs, today, 5);
+            }
+        }
     }
 }

+ 2 - 2
ems/ems-cloud/ems-server/src/main/resources/application-local.yml

@@ -67,8 +67,8 @@ analysis-task:
     forecastDays: 5
     cron: 0 30 8 * * ?
   elec-consume:
-    cron: 0 0 3 * * ?
-    obj-areaCodes: 321283124S3001,321283124S3002
+    cron: 0 0 2 * * ?
+    area-codes: 321283124S3001,321283124S3002
 
 # mybatis配置
 mybatis:

+ 3 - 0
ems/ems-cloud/ems-server/src/main/resources/application-prod-ct.yml

@@ -66,6 +66,9 @@ analysis-task:
     area-codes: 321283124S3001,321283124S3002,321283124S3003
     forecastDays: 5
     cron: 0 30 8 * * ?
+  elec-consume:
+    cron: 0 0 2 * * ?
+    area-codes: 321283124S3001,321283124S3002
 
 # mybatis配置
 mybatis:

+ 22 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/ElecConsumeForecastMapper.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.mapper;
 
 import com.ruoyi.ems.domain.ElecConsumeForecast;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -36,6 +37,14 @@ public interface ElecConsumeForecastMapper {
     int insertForecast(ElecConsumeForecast forecast);
 
     /**
+     * 新增电力产能预测
+     *
+     * @param list 电力产能预测
+     * @return 结果
+     */
+    int insertBatch(List<ElecConsumeForecast> list);
+
+    /**
      * 修改电力消耗预测
      *
      * @param forecast 电力消耗预测
@@ -52,6 +61,19 @@ public interface ElecConsumeForecastMapper {
     int deleteForecastById(Long id);
 
     /**
+     * 删除电力消耗预测
+     *
+     * @param areaCode  区域代码
+     * @param objType   对象类型
+     * @param objCode   对象代码
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     * @return 结果
+     */
+    int deleteByCondition(@Param("areaCode") String areaCode, @Param("objType") int objType,
+        @Param("objCode") String objCode, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    /**
      * 批量删除电力消耗预测
      *
      * @param ids 需要删除的数据主键集合

+ 9 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/ElecMeterHMapper.java

@@ -1,5 +1,6 @@
 package com.ruoyi.ems.mapper;
 
+import com.ruoyi.ems.domain.ElecPvSupplyH;
 import com.ruoyi.ems.domain.EnergyMeter;
 import com.ruoyi.ems.domain.ElecMeterH;
 import com.ruoyi.ems.model.QueryMeter;
@@ -31,6 +32,14 @@ public interface ElecMeterHMapper {
     List<ElecMeterH> selectElecMeterByDevs(QueryMeter queryMeter);
 
     /**
+     * 查询用电计量-日汇总列表
+     *
+     * @param queryMeter 查询计量条件
+     * @return 用电计量-日集合
+     */
+    List<ElecMeterH> selectElecMeterDayList(QueryMeter queryMeter);
+
+    /**
      * 查询最近一条计量
      *
      * @param deviceCode 设备编码

+ 7 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/IElecMeterHService.java

@@ -30,6 +30,13 @@ public interface IElecMeterHService {
     List<ElecMeterH> selectByMeterDevs(QueryMeter queryMeter);
 
     /**
+     * 统计日用电
+     * @param queryMeter 查询条件
+     * @return
+     */
+    List<ElecMeterH> staMeterDayList(QueryMeter queryMeter);
+
+    /**
      * 统计用电计量-根据时间
      *
      * @param queryMeter 查询条件

+ 341 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/analysis/ElecConsumeForecastService.java

@@ -0,0 +1,341 @@
+/*
+ * 文 件 名:  ElecConsumeForecastService
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/6/24
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.service.analysis;
+
+import com.huashe.common.domain.model.WeatherForecast;
+import com.huashe.common.utils.DateUtils;
+import com.ruoyi.ems.domain.Area;
+import com.ruoyi.ems.domain.ElecConsumeForecast;
+import com.ruoyi.ems.domain.ElecMeterH;
+import com.ruoyi.ems.domain.EmsFacs;
+import com.ruoyi.ems.domain.MeterBoundaryRel;
+import com.ruoyi.ems.mapper.ElecConsumeForecastMapper;
+import com.ruoyi.ems.model.QueryMeter;
+import com.ruoyi.ems.service.IElecMeterHService;
+import com.ruoyi.ems.service.IMeterBoundaryRelService;
+import com.ruoyi.ems.service.IWeatherService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 用电消耗预测服务
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/6/24]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+@Service
+public class ElecConsumeForecastService {
+    public enum FacilityType {
+        LIGHTING,        // 照明设施
+        AIR_CONDITION,   // 空调设施
+        PUBLIC,          // 公共设施
+        OTHER            // 其他设施
+    }
+
+    private static final Logger log = LoggerFactory.getLogger(ElecConsumeForecastService.class);
+
+    private final DateTimeFormatter dateForm = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    // 温度对空调用电的影响因子表
+    private static final Map<Integer, Double> tempToAcFactor = new HashMap<>();
+
+    // 光照时间对照明用电的影响因子表
+    private static final Map<Integer, Double> lightHourToLightFactor = new HashMap<>();
+
+    @Resource
+    private ElecConsumeForecastMapper forecastMapper;
+
+    @Resource
+    private IMeterBoundaryRelService meterBoundaryRelService;
+
+    @Resource
+    private IElecMeterHService elecMeterHService;
+
+    @Resource
+    private IWeatherService weatherService;
+
+    static {
+        // 初始化空调影响因子(温度-影响因子映射)
+        for (int i = 15; i <= 40; i++) {
+            if (i < 22) {
+                tempToAcFactor.put(i, 0.3 + (22 - i) * 0.05); // 15℃时0.65,22℃时0.3
+            }
+            else if (i <= 28) {
+                tempToAcFactor.put(i, 0.3 + (i - 22) * 0.1); // 22℃时0.3,28℃时0.9
+            }
+            else {
+                tempToAcFactor.put(i, 0.9 + (i - 28) * 0.1); // 28℃时0.9,40℃时2.1
+            }
+        }
+
+        // 初始化照明影响因子(光照时间-影响因子映射,假设夏季光照时间长)
+        for (int i = 8; i <= 16; i++) {
+            lightHourToLightFactor.put(i, 1.5 - (i - 8) * 0.1); // 8小时光照时1.5,16小时时0.7
+        }
+    }
+
+    // 地理区块用能预测
+    public void forecastAreas(String adcode, String rootArea, Area area, LocalDate today, int forecastDay) {
+        try {
+            // 获取区块绑定的计量设备
+            List<MeterBoundaryRel> boundaryRels = meterBoundaryRelService.selectRelByObj(area.getAreaCode(), 1, 45);
+
+            if (CollectionUtils.isEmpty(boundaryRels)) {
+                return;
+            }
+
+            Set<String> meterDevs = getMeterDevCodes(boundaryRels);
+            // 获取历史数据 (过去30天)
+            List<ElecMeterH> historicalData = getMeterDayList(rootArea, meterDevs, today);
+
+            if (CollectionUtils.isEmpty(historicalData)) {
+                return;
+            }
+
+            // 读取天气预报
+            LocalDate forecastStart = today;
+            LocalDate forecastEnd = today.plusDays(forecastDay - 1);
+            List<WeatherForecast> weatherForecasts = weatherService.getWeatherForecast(adcode,
+                forecastStart.format(dateForm), forecastEnd.format(dateForm));
+            Map<String, WeatherForecast> weatherMap = convertToWeatherMap(weatherForecasts);
+
+            List<ElecConsumeForecast> results = new ArrayList<>();
+
+            while (forecastStart.isBefore(forecastEnd) || forecastStart.isEqual(forecastEnd)) {
+                WeatherForecast weatherForecast = weatherMap.get(forecastStart.format(dateForm));
+                double consumeForecast = calcAreaprediction(historicalData, weatherForecast);
+
+                ElecConsumeForecast forecast = new ElecConsumeForecast();
+                forecast.setAreaCode(rootArea);
+                forecast.setObjCode(area.getAreaCode());
+                forecast.setObjType(1);
+                forecast.setDate(Date.from(forecastStart.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+                forecast.setElecUseQuantity(consumeForecast);
+
+                results.add(forecast);
+                forecastStart = forecastStart.plusDays(1);
+            }
+
+            forecastMapper.deleteByCondition(rootArea, 1, area.getAreaCode(), today.format(dateForm),
+                forecastEnd.format(dateForm));
+            forecastMapper.insertBatch(results);
+        }
+        catch (Exception e) {
+            log.error("forecastAreas fail! areaCode:{}", area.getAreaCode(), e);
+        }
+    }
+
+    // 设施用能预测
+    public void forecastFacilities(String adcode, String rootArea, EmsFacs facs, LocalDate today, int forecastDay) {
+        // 获取设施绑定的计量设备
+        List<MeterBoundaryRel> boundaryRels = meterBoundaryRelService.selectRelByObj(facs.getFacsCode(), 2, 45);
+
+        if (CollectionUtils.isEmpty(boundaryRels)) {
+            return;
+        }
+
+        Set<String> meterDevs = getMeterDevCodes(boundaryRels);
+        // 获取历史数据 (过去30天)
+        List<ElecMeterH> historicalData = getMeterDayList(rootArea, meterDevs, today);
+
+        if (CollectionUtils.isEmpty(historicalData)) {
+            return;
+        }
+
+        // 读取天气预报
+        LocalDate forecastStart = today;
+        LocalDate forecastEnd = today.plusDays(forecastDay - 1);
+        List<WeatherForecast> weatherForecasts = weatherService.getWeatherForecast(adcode,
+            forecastStart.format(dateForm), forecastEnd.format(dateForm));
+        Map<String, WeatherForecast> weatherMap = convertToWeatherMap(weatherForecasts);
+
+        List<ElecConsumeForecast> results = new ArrayList<>();
+
+        while (forecastStart.isBefore(forecastEnd) || forecastStart.isEqual(forecastEnd)) {
+            WeatherForecast weatherForecast = weatherMap.get(forecastStart.format(dateForm));
+            double consumeForecast = calcFacsPrediction(facs, historicalData, weatherForecast);
+
+            ElecConsumeForecast forecast = new ElecConsumeForecast();
+            forecast.setAreaCode(rootArea);
+            forecast.setObjCode(facs.getFacsCode());
+            forecast.setObjType(2);
+            forecast.setDate(Date.from(forecastStart.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+            forecast.setElecUseQuantity(consumeForecast);
+
+            results.add(forecast);
+            forecastStart = forecastStart.plusDays(1);
+        }
+
+        forecastMapper.deleteByCondition(rootArea, 2, facs.getFacsCode(), today.format(dateForm),
+            forecastEnd.format(dateForm));
+        forecastMapper.insertBatch(results);
+    }
+
+    private Set<String> getMeterDevCodes(List<MeterBoundaryRel> boundaryRels) {
+        Set<String> meterDevs = new HashSet<>();
+
+        for (MeterBoundaryRel meterBoundaryRel : boundaryRels) {
+            meterDevs.add(meterBoundaryRel.getMeterDevice());
+        }
+
+        return meterDevs;
+    }
+
+    private Map<String, WeatherForecast> convertToWeatherMap(List<WeatherForecast> weatherForecasts) {
+        Map<String, WeatherForecast> weatherMap = new HashMap<>();
+
+        for (WeatherForecast weatherForecast : weatherForecasts) {
+            String date = DateUtils.dateToString(weatherForecast.getDate(), "yyyy-MM-dd");
+            weatherMap.put(date, weatherForecast);
+        }
+
+        return weatherMap;
+    }
+
+    private double calcAreaprediction(List<ElecMeterH> historicalData, WeatherForecast weather) {
+        // 计算历史平均日用电量
+        double totalConsumeElec = historicalData.stream().mapToDouble(ElecMeterH::getElecQuantity).sum();
+        double historicalAvg = divideAndRound(totalConsumeElec, historicalData.size(), 2);
+
+        // 获取天气影响因子(区块主要受空调影响)
+        double weatherFactor = getAirConditionImpactFactor(weather);
+
+        // 计算预测值
+        return multiplyAndRound(historicalAvg, weatherFactor, 2);
+    }
+
+    private double calcFacsPrediction(EmsFacs emsFacs, List<ElecMeterH> historicalData, WeatherForecast weather) {
+        FacilityType facilityType = determineFacilityType(emsFacs.getFacsSubCategory());
+
+        // 计算历史平均日用电量
+        double totalConsumeElec = historicalData.stream().mapToDouble(ElecMeterH::getElecQuantity).sum();
+        double historicalAvg = divideAndRound(totalConsumeElec, historicalData.size(), 2);
+
+        // 获取影响因子
+        double factor = getFacilityImpactFactor(weather, facilityType);
+
+        // 计算预测值
+        return multiplyAndRound(historicalAvg, factor, 2);
+    }
+
+    private List<ElecMeterH> getMeterDayList(String rootArea, Set<String> meterDevs, LocalDate startDate) {
+        LocalDate historyStart = startDate.minusDays(30);
+        LocalDate historyEnd = startDate.minusDays(1);
+
+        QueryMeter queryMeter = new QueryMeter();
+        queryMeter.setAreaCode(rootArea);
+        queryMeter.setDeviceCodes(meterDevs);
+        queryMeter.setStartRecTime(historyStart.format(dateForm));
+        queryMeter.setEndRecTime(historyEnd.format(dateForm));
+
+        return elecMeterHService.staMeterDayList(queryMeter);
+    }
+
+    /**
+     * 除法运算并保留指定小数位数
+     *
+     * @param dividend 被除数
+     * @param divisor  除数
+     * @param scale    保留小数位数
+     * @return 四舍五入后的结果
+     */
+    private double divideAndRound(double dividend, double divisor, int scale) {
+        if (divisor == 0) {
+            return 0.0;
+        }
+
+        return BigDecimal.valueOf(dividend / divisor).setScale(scale, RoundingMode.HALF_UP).doubleValue();
+    }
+
+    // 获取空调设备的天气影响因子
+    public double getAirConditionImpactFactor(WeatherForecast weather) {
+        double temp = Math.max((weather.getDayTemp() != null) ? weather.getDayTemp() : 20,
+            (weather.getNightTemp() != null) ? weather.getNightTemp() : 20);
+        int tempInt = (int) Math.round(temp);
+        return tempToAcFactor.getOrDefault(tempInt, 1.0);
+    }
+
+    private double getFacilityImpactFactor(WeatherForecast weather, FacilityType type) {
+        switch (type) {
+            case AIR_CONDITION:
+                return getAirConditionImpactFactor(weather);
+            case LIGHTING:
+                return getLightingImpactFactor(weather);
+            default:
+                return 1.0; // 公共设施和其他设施默认影响因子为1
+        }
+    }
+
+    private double getLightingImpactFactor(WeatherForecast weather) {
+        LocalDate date = weather.getDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        int month = date.getMonthValue();
+        int lightHours;
+
+        // 简化处理:根据月份估算光照时间(实际应结合天气预报的日照时长)
+        if (month >= 5 && month <= 8) {
+            lightHours = 14; // 夏季光照时间长
+        }
+        else if (month >= 12 || month <= 2) {
+            lightHours = 10; // 冬季光照时间短
+        }
+        else {
+            lightHours = 12; // 春秋季
+        }
+
+        return lightHourToLightFactor.getOrDefault(lightHours, 1.0);
+    }
+
+    /**
+     * 乘法运算并保留指定小数位数
+     *
+     * @param a     乘数1
+     * @param b     乘数2
+     * @param scale 保留小数位数
+     * @return 四舍五入后的结果
+     */
+    private double multiplyAndRound(double a, double b, int scale) {
+        return BigDecimal.valueOf(a * b).setScale(scale, RoundingMode.HALF_UP).doubleValue();
+    }
+
+    private FacilityType determineFacilityType(String subcategory) {
+        if (subcategory.startsWith("Z010")) { // 照明
+            return FacilityType.LIGHTING;
+        }
+        else if (subcategory.startsWith("Z020")) { // 空调
+            return FacilityType.AIR_CONDITION;
+        }
+        else if (subcategory.startsWith("Z040")) { // 公共设施(充电桩等)
+            return FacilityType.PUBLIC;
+        }
+        else {
+            return FacilityType.OTHER;
+        }
+    }
+}

+ 6 - 2
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ElecMeterHServiceImpl.java

@@ -1,7 +1,7 @@
 package com.ruoyi.ems.service.impl;
 
-import com.ruoyi.ems.domain.EnergyMeter;
 import com.ruoyi.ems.domain.ElecMeterH;
+import com.ruoyi.ems.domain.EnergyMeter;
 import com.ruoyi.ems.mapper.ElecMeterHMapper;
 import com.ruoyi.ems.model.QueryMeter;
 import com.ruoyi.ems.service.IElecMeterHService;
@@ -44,6 +44,11 @@ public class ElecMeterHServiceImpl implements IElecMeterHService {
     }
 
     @Override
+    public List<ElecMeterH> staMeterDayList(QueryMeter queryMeter) {
+        return elecMeterHMapper.selectElecMeterDayList(queryMeter);
+    }
+
+    @Override
     public List<EnergyMeter> staByTime(QueryMeter queryMeter) {
         return elecMeterHMapper.selectStaByTime(queryMeter);
     }
@@ -130,7 +135,6 @@ public class ElecMeterHServiceImpl implements IElecMeterHService {
         return elecMeterHMapper.qryDateElecMeterByYear(dataRange);
     }
 
-
     @Override
     public List<ElecMeterH> qryDeviceTypeElecMeterByDay(ElecMeterH elecMeterH) {
         return elecMeterHMapper.qryDeviceTypeElecMeterByDay(elecMeterH);

+ 19 - 3
ems/ems-core/src/main/resources/mapper/ems/ElecConsumeForecastMapper.xml

@@ -32,7 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           LEFT JOIN adm_ems_facs fc ON f.obj_code = fc.facs_code AND f.obj_type = 2
           LEFT JOIN adm_ems_device d ON f.obj_code = d.device_code AND f.obj_type = 3
         <where>
-            <if test="areaCode != null  and areaCode != ''">and f.area_code = #{areaCode}</if>
+            <if test="areaCode != null  and areaCode != '' and areaCode !='-1'">and f.area_code = #{areaCode}</if>
             <if test="objCode != null  and objCode != ''">and f.obj_code = #{objCode}</if>
             <if test="objType != null ">and f.obj_type = #{objType}</if>
             <if test="startRecTime != null and startRecTime != ''">and f.date &gt;= #{startRecTime}</if>
@@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <insert id="insertForecast" parameterType="com.ruoyi.ems.domain.ElecConsumeForecast" useGeneratedKeys="true" keyProperty="id">
-        insert into adm_ems_elec_expend_forecast
+        insert into adm_ems_elec_consume_forecast
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="areaCode != null and areaCode != ''">area_code,</if>
             <if test="objCode != null and objCode != ''">obj_code,</if>
@@ -63,8 +63,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          </trim>
     </insert>
 
+    <insert id="insertBatch" parameterType="java.util.List">
+        insert into adm_ems_elec_consume_forecast (area_code, obj_code, obj_type, date, elec_use_quantity)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.areaCode}, #{item.objCode}, #{item.objType}, #{item.date}, #{item.elecUseQuantity})
+        </foreach>
+    </insert>
+
     <update id="updateForecast" parameterType="com.ruoyi.ems.domain.ElecConsumeForecast">
-        update adm_ems_elec_expend_forecast
+        update adm_ems_elec_consume_forecast
         <trim prefix="SET" suffixOverrides=",">
             <if test="areaCode != null and areaCode != ''">area_code = #{areaCode},</if>
             <if test="objCode != null and objCode != ''">obj_code = #{objCode},</if>
@@ -79,6 +87,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         delete from adm_ems_elec_consume_forecast where id = #{id}
     </delete>
 
+    <delete id="deleteByCondition">
+        delete from adm_ems_elec_consume_forecast
+               where area_code = #{areaCode}
+                 and obj_type = #{objType}
+                 and obj_code =#{objCode}
+                 and `date` between #{startTime} and #{endTime}
+    </delete>
+
     <delete id="deleteForecastByIds" parameterType="String">
         delete from adm_ems_elec_consume_forecast where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">

+ 26 - 0
ems/ems-core/src/main/resources/mapper/ems/ElecMeterHMapper.xml

@@ -87,6 +87,32 @@
         ORDER BY m.record_time ${orderFlag}
     </select>
 
+    <select id="selectElecMeterDayList" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="ElecMeterHResult">
+        SELECT
+        <if test="areaCode != null and areaCode !='' and areaCode !='-1'">
+            h.`area_code`,
+        </if>
+        h.`date`,
+        sum(COALESCE(h.elec_quantity,0)) as elec_quantity,
+        sum(COALESCE(h.use_elec_cost,0)) as use_elec_cost
+        FROM adm_elec_meter_h h
+            LEFT JOIN adm_area area on area.area_code = h.area_code
+        <where>
+            <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                and h.area_code = #{areaCode}
+            </if>
+            <if test="startRecTime != null and startRecTime != '' and endRecTime != null and endRecTime !=''">
+                and h.`date` &gt;= #{startRecTime} and h.`date` &lt;= #{endRecTime}
+            </if>
+            and h.device_code in
+            <foreach item="item" index="index" collection="deviceCodes" open="(" separator=", " close=")">
+                #{item}
+            </foreach>
+        </where>
+        GROUP BY h.`date`
+        ORDER BY h.`date`
+    </select>
+
     <select id="selectLatelyItem" parameterType="java.lang.String" resultMap="ElecMeterHResult">
         <include refid="selectElecMeterHVo"/>
         where device_code = #{deviceCode}