ソースを参照

Merge remote-tracking branch 'origin/master'

chen.cheng 1 ヶ月 前
コミット
994143e308

+ 48 - 0
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/config/ForecastConfig.java

@@ -0,0 +1,48 @@
+/*
+ * 文 件 名:  ForecastConfig
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/6/19
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 预测配置
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/6/19]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+@Configuration
+public class ForecastConfig {
+    @Value("${general-data.weather.adcode}")
+    private String adcode;
+
+    @Value("${forecast-task.area-codes}")
+    private String areaCodes;
+
+    @Value("${forecast-task.pv-forecast.forecastDays}")
+    private int prodForecastDays;
+
+    public String[] getAreaCodes() {
+        return StringUtils.split(areaCodes, ",");
+    }
+
+    public int getProdForecastDays() {
+        return prodForecastDays;
+    }
+
+    public String getAdcode() {
+        return adcode;
+    }
+}

+ 4 - 2
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/WeatherController.java

@@ -77,7 +77,9 @@ public class WeatherController extends BaseController {
     @ApiResponses({ @ApiResponse(code = 200, message = "success"),
         @ApiResponse(code = 400, message = "{code:****,message:'fail'}")
     })
-    public AjaxResult getWeatherForecast(@RequestParam(value = "adcode") String adcode) {
-        return success(weatherService.getWeatherForecast(adcode));
+    public AjaxResult getWeatherForecast(@RequestParam(value = "adcode") String adcode,
+        @RequestParam(value = "startTime", required = false) String startTime,
+        @RequestParam(value = "endTime", required = false) String endTime) {
+        return success(weatherService.getWeatherForecast(adcode, startTime, endTime));
     }
 }

+ 34 - 4
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/TaskService.java

@@ -19,11 +19,15 @@ import com.huashe.common.domain.model.WeatherRt;
 import com.huashe.common.exception.Assert;
 import com.huashe.common.utils.HttpUtils;
 import com.ruoyi.ems.config.DateAttrConfig;
+import com.ruoyi.ems.config.ForecastConfig;
 import com.ruoyi.ems.config.WeatherConfig;
+import com.ruoyi.ems.domain.EmsFacs;
 import com.ruoyi.ems.service.IDateService;
 import com.ruoyi.ems.service.IEmsFacsService;
 import com.ruoyi.ems.service.IWeatherService;
+import com.ruoyi.ems.service.forecast.ElecProdForecastService;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.client.utils.URIBuilder;
 import org.slf4j.Logger;
@@ -68,6 +72,12 @@ public class TaskService {
     @Resource
     private IDateService dateService;
 
+    @Resource
+    private ElecProdForecastService elecProdForecastService;
+
+    @Resource
+    private ForecastConfig forecastConfig;
+
     /**
      * 天气实况采集
      */
@@ -159,8 +169,8 @@ public class TaskService {
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
             URIBuilder uriBuilder = new URIBuilder(holidayConfig.getApiAddr());
-            uriBuilder.addParameter("startDate", formatter.format(firstDay)).addParameter("endDate", formatter.format(lastDay))
-                .addParameter("apiKey", weatherConfig.getApiKey());
+            uriBuilder.addParameter("startDate", formatter.format(firstDay))
+                .addParameter("endDate", formatter.format(lastDay)).addParameter("apiKey", weatherConfig.getApiKey());
             String res = HttpUtils.doGet(uriBuilder);
             log.debug("get res:\r\n{}", res);
 
@@ -186,7 +196,6 @@ public class TaskService {
         }
     }
 
-
     /**
      * 光伏发电预测
      */
@@ -196,7 +205,28 @@ public class TaskService {
         log.debug("start pv forecast task.");
 
         try {
-            //facsService.getFacsWithMeterDev()
+            // 获取今天的日期
+            LocalDate today = LocalDate.now();
+            String[] areaCodes = forecastConfig.getAreaCodes();
+
+            if (ArrayUtils.isNotEmpty(areaCodes)) {
+                String adcode = forecastConfig.getAdcode();
+                int prodForecastDays = forecastConfig.getProdForecastDays();
+
+                for (String areaCode : areaCodes) {
+                    EmsFacs param = new EmsFacs();
+                    param.setRefArea(areaCode);
+                    param.setFacsCategory("E");
+                    List<EmsFacs> facsList = facsService.selectEmsFacsList(param);
+
+                    if (CollectionUtils.isNotEmpty(facsList)) {
+                        for (EmsFacs facs : facsList) {
+                            elecProdForecastService.executePvForecast(adcode, areaCode, facs.getFacsCode(), today,
+                                prodForecastDays);
+                        }
+                    }
+                }
+            }
         }
         catch (Exception e) {
             log.error("pv forecast fail!", e);

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

@@ -55,14 +55,13 @@ general-data:
       cron: 0 15 8 * * ?
       api-addr: http://${general-data.server}/general-data/weather/getWeatherForecast
   date:
-    #cron: 0 0 12 1 * ?
-    cron: 0 13 19 * * ?
+    cron: 0 0 12 1 * ?
     api-addr: http://${general-data.server}/general-data/date/getAttrs
 
 forecast-task:
-  area:
+  area-codes: 321283124S3001,321283124S3002,321283124S3003
   pv-forecast:
-
+    forecastDays: 5
     cron: 0 30 8 * * ?
 
 # mybatis配置

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

@@ -59,7 +59,9 @@ general-data:
     api-addr: http://${general-data.server}/general-data/date/getAttrs
 
 forecast-task:
+  area-codes: 321283124S3001,321283124S3002,321283124S3003
   pv-forecast:
+    forecastDays: 5
     cron: 0 30 8 * * ?
 
 # mybatis配置

+ 0 - 13
ems/ems-core/src/main/java/com/ruoyi/ems/domain/EmsFacs.java

@@ -50,10 +50,6 @@ public class EmsFacs extends BaseEntity
     @Excel(name = "归属区域")
     private String refAreaName;
 
-    /** 设施模型名称 */
-    @Excel(name = "设施模型")
-    private String facsModelName;
-
     public Long getId() {
         return id;
     }
@@ -134,14 +130,6 @@ public class EmsFacs extends BaseEntity
         this.refAreaName = refAreaName;
     }
 
-    public String getFacsModelName() {
-        return facsModelName;
-    }
-
-    public void setFacsModelName(String facsModelName) {
-        this.facsModelName = facsModelName;
-    }
-
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -152,7 +140,6 @@ public class EmsFacs extends BaseEntity
             .append("facsSubCategory", getFacsSubCategory())
             .append("enable", getEnable())
             .append("refArea", getRefArea())
-            .append("facsModelName", getFacsModelName())
             .toString();
     }
 }

+ 3 - 2
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/AdmWeatherForecastMapper.java

@@ -29,11 +29,12 @@ import java.util.List;
 public interface AdmWeatherForecastMapper {
     /**
      * 根据adcode和date查询
+     *
      * @param adcode 行政区划代码
-
      * @return List<WeatherRt>
      */
-    List<WeatherForecast> getByAdcode(@Param("adcode") String adcode);
+    List<WeatherForecast> getByAdcode(@Param("adcode") String adcode, @Param("startTime") String startTime,
+        @Param("endTime") String endTime);
 
     /**
      * 天气预报入库

+ 21 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/ElecProdForecastMapper.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.mapper;
 
 import com.ruoyi.ems.domain.ElecProdForecast;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -36,6 +37,14 @@ public interface ElecProdForecastMapper {
     int insertElecProdForecast(ElecProdForecast elecProdForecast);
 
     /**
+     * 新增电力产能预测
+     *
+     * @param list 电力产能预测
+     * @return 结果
+     */
+    int insertBatch(List<ElecProdForecast> list);
+
+    /**
      * 修改电力产能预测
      *
      * @param elecProdForecast 电力产能预测
@@ -52,6 +61,18 @@ public interface ElecProdForecastMapper {
     int deleteElecProdForecastById(Long id);
 
     /**
+     * 条件删除
+     *
+     * @param areaCode  园区代码
+     * @param facsCode  设施代码
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     * @return 删除条数
+     */
+    int deleteByCondition(@Param("areaCode") String areaCode, @Param("facsCode") String facsCode,
+        @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    /**
      * 批量删除电力产能预测
      *
      * @param ids 需要删除的数据主键集合

+ 22 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/model/QueryMeter.java

@@ -40,6 +40,11 @@ public class QueryMeter extends BaseEntity implements Serializable {
     private String deviceCode;
 
     /**
+     * 设施代码
+     */
+    private String facsCode;
+
+    /**
      * 设备编号集合
      */
     private Set<String> deviceCodes;
@@ -104,6 +109,15 @@ public class QueryMeter extends BaseEntity implements Serializable {
         this.setEndRecTime(endTime);
     }
 
+    public QueryMeter(String areaCode, String facsCode, String startTime, String endTime) {
+        super();
+        this.areaCode = areaCode;
+        this.facsCode = facsCode;
+        this.setStartRecTime(startTime);
+        this.setEndRecTime(endTime);
+    }
+
+
     public String getAreaCode() {
         return areaCode;
     }
@@ -120,6 +134,14 @@ public class QueryMeter extends BaseEntity implements Serializable {
         this.deviceCode = deviceCode;
     }
 
+    public String getFacsCode() {
+        return facsCode;
+    }
+
+    public void setFacsCode(String facsCode) {
+        this.facsCode = facsCode;
+    }
+
     public Set<String> getDeviceCodes() {
         return deviceCodes;
     }

+ 1 - 1
ems/ems-core/src/main/java/com/ruoyi/ems/service/IWeatherService.java

@@ -55,7 +55,7 @@ public interface IWeatherService {
      * @param adcode 行政区划代码
      * @return 未来天气预报数据
      */
-    List<WeatherForecast> getWeatherForecast(String adcode);
+    List<WeatherForecast> getWeatherForecast(String adcode, String startTime, String endTime);
 
     /**
      * 根据code删除预报

+ 192 - 4
ems/ems-core/src/main/java/com/ruoyi/ems/service/forecast/ElecProdForecastService.java

@@ -10,12 +10,30 @@
  */
 package com.ruoyi.ems.service.forecast;
 
+import com.huashe.common.domain.model.WeatherForecast;
+import com.huashe.common.utils.DateUtils;
+import com.ruoyi.ems.domain.ElecProdForecast;
+import com.ruoyi.ems.domain.ElecPvSupplyH;
+import com.ruoyi.ems.mapper.ElecProdForecastMapper;
+import com.ruoyi.ems.model.QueryMeter;
 import com.ruoyi.ems.service.IElecPvSupplyHService;
 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.List;
+import java.util.Map;
 
 /**
  * 产能预测
@@ -28,9 +46,17 @@ import java.time.LocalDate;
  */
 @Service
 public class ElecProdForecastService {
+    private static final Logger log = LoggerFactory.getLogger(ElecProdForecastService.class);
+
+    // 天气影响因子
+    private final static Map<String, Double> weatherFactorMap = new HashMap<>();
+
+    private final DateTimeFormatter dateForm = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
     /**
      * 光伏产能预测数据服务
      */
+    @Resource
     private IElecPvSupplyHService pvSupplyHService;
 
     /**
@@ -39,15 +65,177 @@ public class ElecProdForecastService {
     @Resource
     private IWeatherService weatherService;
 
+    @Resource
+    private ElecProdForecastMapper forecastMapper;
+
+    static {
+        // 初始化默认影响因子
+        weatherFactorMap.put("1101", 1.0);   // 晴
+        weatherFactorMap.put("1103", 0.8);   // 多云
+        weatherFactorMap.put("1106", 0.4);   // 阴天
+        weatherFactorMap.put("2100", 0.5);   // 雨
+        weatherFactorMap.put("2101", 0.6);   // 小雨
+        weatherFactorMap.put("2102", 0.5);   // 中雨
+        weatherFactorMap.put("2103", 0.4);   // 大雨
+        weatherFactorMap.put("2104", 0.3);   // 暴雨
+        weatherFactorMap.put("2111", 0.7);   // 阵雨
+        weatherFactorMap.put("2121", 0.7);   // 雷阵雨
+        weatherFactorMap.put("2200", 0.3);   // 雪
+        weatherFactorMap.put("2201", 0.3);   // 小雪
+        weatherFactorMap.put("2202", 0.3);   // 中雪
+        weatherFactorMap.put("2203", 0.2);   // 大雪
+        weatherFactorMap.put("2204", 0.1);   // 暴雪
+        weatherFactorMap.put("2211", 0.4);   // 雨夹雪
+        weatherFactorMap.put("4101", 0.8);   // 轻雾
+        weatherFactorMap.put("4102", 0.7);   // 大雾
+        weatherFactorMap.put("4103", 0.6);   // 浓雾
+        weatherFactorMap.put("4200", 0.5);   // 霾
+        weatherFactorMap.put("4301", 0.5);   // 浮尘
+        weatherFactorMap.put("4302", 0.4);   // 扬沙
+        weatherFactorMap.put("4303", 0.3);   // 沙尘暴
+    }
+
     /**
      * 执行光伏产能预测
      *
-     * @param areaCode   园区代码
-     * @param facsCode   设施编码
-     * @param today      当前日期
+     * @param areaCode    园区代码
+     * @param facsCode    设施编码
+     * @param today       当前日期
      * @param forecastDay 预测天数
      */
-    public void executePvForecast(String areaCode, String facsCode, LocalDate today, int forecastDay) {
+    public void executePvForecast(String adcode, String areaCode, String facsCode, LocalDate today, int forecastDay) {
+
+        try {
+            // 1. 读取历史数据 (使用过去30天的数据作为训练集)
+            LocalDate historyStart = today.minusDays(30);
+            LocalDate historyEnd = today.minusDays(1);
+            QueryMeter queryMeter = new QueryMeter(areaCode, facsCode, historyStart.format(dateForm),
+                historyEnd.format(dateForm));
+            List<ElecPvSupplyH> historicalData = pvSupplyHService.selectPvSupplyDayList(queryMeter);
+
+            if (historicalData.isEmpty()) {
+                // 没有历史数据,无法进行预测
+                return;
+            }
+
+            // 2. 读取天气预报
+            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<ElecProdForecast> result = new ArrayList<>();
+
+            while (forecastStart.isBefore(forecastEnd) || forecastStart.isEqual(forecastEnd)) {
+                WeatherForecast weatherForecast = weatherMap.get(forecastStart.format(dateForm));
+                ElecProdForecast elecProdForecast = predictDailyProduction(areaCode, facsCode, forecastStart,
+                    historicalData, weatherForecast);
+                result.add(elecProdForecast);
+                forecastStart = forecastStart.plusDays(1);
+            }
+
+            // 保存数据到数据库
+            forecastMapper.deleteByCondition(areaCode, facsCode, today.format(dateForm), forecastEnd.format(dateForm));
+
+            if (CollectionUtils.isNotEmpty(result)) {
+                forecastMapper.insertBatch(result);
+            }
+        }
+        catch (Exception e) {
+            log.error("execute Pv forecast fail! areaCode:{}, facsCode:{}", areaCode, facsCode, e);
+        }
+    }
+
+    private ElecProdForecast predictDailyProduction(String areaCode, String facsCode, LocalDate date,
+        List<ElecPvSupplyH> trainingData, WeatherForecast weatherForecast) {
+        // 计算历史平均日发电量(保留两位小数)
+        double totalGenElec = trainingData.stream().mapToDouble(ElecPvSupplyH::getGenElecQuantity).sum();
+        double historicalAvgDailyProduction = divideAndRound(totalGenElec, trainingData.size(), 2);
+
+        // 计算历史平均上网电量(保留两位小数)
+        double totalUpElec = trainingData.stream().mapToDouble(ElecPvSupplyH::getUpElecQuantity).sum();
+        double upElecQuantity = divideAndRound(totalUpElec, trainingData.size(), 2);
+
+        // 获取天气影响因子
+        double weatherFactor = getWeatherFactor(weatherForecast);
+
+        // 计算预测值 = 历史平均值 * 天气影响因子
+        double forecastProduction = multiplyAndRound(historicalAvgDailyProduction, weatherFactor, 2);
+
+        // 计算平均功率 (kW)
+        double avgPower = divideAndRound(forecastProduction, 24.0, 2);
+
+        ElecProdForecast forecast = new ElecProdForecast();
+        forecast.setAreaCode(areaCode);
+        forecast.setFacsCode(facsCode);
+        forecast.setDate(Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+        forecast.setElecProdQuantity(forecastProduction);
+        forecast.setAvgPower(avgPower);
+        forecast.setUpElecQuantity(upElecQuantity);
+        return forecast;
+    }
+
+    private double getWeatherFactor(WeatherForecast forecast) {
+        Double factor = null;
+
+        if (null != forecast) {
+            // 优先使用日间天气
+            String weatherCode = forecast.getDayWeatherType();
+            factor = weatherFactorMap.get(weatherCode);
+
+            // 如果日间天气没有影响因子,使用夜间天气
+            if (factor == null) {
+                weatherCode = forecast.getNightWeatherType();
+                factor = weatherFactorMap.get(weatherCode);
+            }
+
+            // 如果仍然没有,使用默认值
+            factor = factor != null ? factor : 0.8;
+        }
+        else {
+            factor = 0.8;
+        }
+
+        return factor;
+    }
+
+    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;
+    }
+
+    /**
+     * 除法运算并保留指定小数位数
+     * @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();
+    }
 
+    /**
+     * 乘法运算并保留指定小数位数
+     * @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();
     }
 }

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

@@ -57,8 +57,8 @@ public class WeatherServiceImpl implements IWeatherService {
     }
 
     @Override
-    public List<WeatherForecast> getWeatherForecast(String adcode) {
-        return weatherForecastMapper.getByAdcode(adcode);
+    public List<WeatherForecast> getWeatherForecast(String adcode, String startTime, String endTime) {
+        return weatherForecastMapper.getByAdcode(adcode, startTime, endTime);
     }
 
     @Override

+ 6 - 1
ems/ems-core/src/main/resources/mapper/ems/AdmWeatherForecastMapper.xml

@@ -22,7 +22,12 @@
         SELECT
             `adcode`, `area_name`, `date`, `day_weather_type`, `day_weather_cn`, `night_weather_type`, `night_weather_cn`, `day_temp`, `night_temp`, `day_wind_power`, `night_wind_power`, `day_wind_dir`, `night_wind_dir`, `report_time`
         FROM `adm_area_weather_forecast`
-        WHERE `adcode` = #{adcode}
+        <where>
+            `adcode` = #{adcode}
+            <if test="startTime != null and startTime != '' and endTime != null and endTime !=''">
+                and `date` &gt;= #{startTime} and `date` &lt;= #{endTime}
+            </if>
+        </where>
     </select>
 
     <update id="insertBatch" parameterType="java.util.List">

+ 20 - 6
ems/ems-core/src/main/resources/mapper/ems/ElecProdForecastMapper.xml

@@ -31,18 +31,18 @@
             resultType="com.ruoyi.ems.domain.ElecProdForecast">
         <include refid="selectElecProdForecastVo"/>
         <where>
-            <if test="areaCode != null  and areaCode != ''">and area_code = #{areaCode}</if>
-            <if test="facsCode != null  and facsCode != ''">and facs_code = #{facsCode}</if>
-            <if test="date != null ">and date = #{date}</if>
-            <if test="elecProdQuantity != null ">and elec_prod_quantity = #{elecProdQuantity}</if>
-            <if test="avgPower != null ">and avg_power = #{avgPower}</if>
+            <if test="areaCode != null  and areaCode != '' and areaCode != '-1'">and forecast.area_code = #{areaCode}</if>
+            <if test="facsCode != null  and facsCode != ''">and forecast.facs_code = #{facsCode}</if>
+            <if test="startRecTime != null  and startRecTime != ''">
+                and forecast.`date` &gt;= #{startRecTime}
+            </if>
         </where>
     </select>
 
     <select id="selectElecProdForecastById" parameterType="Long"
             resultType="com.ruoyi.ems.domain.ElecProdForecast">
         <include refid="selectElecProdForecastVo"/>
-        where id = #{id}
+        where forecast.id = #{id}
     </select>
 
     <insert id="insertElecProdForecast" parameterType="com.ruoyi.ems.domain.ElecProdForecast"
@@ -64,6 +64,14 @@
         </trim>
     </insert>
 
+    <insert id="insertBatch" parameterType="java.util.List">
+        insert into adm_ems_elec_prod_forecast (area_code, facs_code, date, elec_prod_quantity, avg_power, up_elec_quantity)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.areaCode}, #{item.facsCode}, #{item.date}, #{item.elecProdQuantity}, #{item.avgPower}, #{item.upElecQuantity})
+        </foreach>
+    </insert>
+
     <update id="updateElecProdForecast" parameterType="com.ruoyi.ems.domain.ElecProdForecast">
         update adm_ems_elec_prod_forecast
         <trim prefix="SET" suffixOverrides=",">
@@ -82,6 +90,12 @@
         where id = #{id}
     </delete>
 
+    <delete id="deleteByCondition">
+        delete from adm_ems_elec_prod_forecast
+        where area_code = #{areaCode} and facs_code = #{facsCode} and `date` &gt;= #{startTime} and `date` &lt;= #{endTime}
+    </delete>
+
+
     <delete id="deleteElecProdForecastByIds" parameterType="String">
         delete from adm_ems_elec_prod_forecast where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">

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

@@ -102,6 +102,9 @@
         <if test="facsSubCategory != null and facsSubCategory !=''">
             sc.`name` as facs_name,
         </if>
+        <if test="facsCode != null and facsCode !=''">
+            pv.`facs_code`,
+        </if>
         <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
             pv.area_code,
         </if>
@@ -120,6 +123,9 @@
         <where>
             <if test="areaName != null  and areaName != ''">and area.area_name like concat('%', #{areaName}, '%')</if>
             <if test="areaCode != null and areaCode != '' and areaCode != '-1'">
+                and pv.facs_code = #{facsCode}
+            </if>
+            <if test="facsCode != null and facsCode != ''">
                 and pv.area_code = #{areaCode}
             </if>
             <if test="startRecTime != null and startRecTime != '' and endRecTime != null and endRecTime !=''">

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

@@ -15,7 +15,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="enable"    column="enable"    />
         <result property="refArea"    column="ref_area"    />
         <result property="refAreaName"    column="ref_area_name"    />
-        <result property="facsModelName"    column="facs_model_name"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateTime"    column="update_time"    />
     </resultMap>