瀏覽代碼

碳排碳汇计算

learshaw 1 月之前
父節點
當前提交
d68b9abada
共有 22 個文件被更改,包括 357 次插入161 次删除
  1. 2 2
      ems/ems-application/ems-admin/src/main/java/com/ruoyi/web/controller/ems/ElecPgSupplyHController.java
  2. 15 1
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/config/AnalysisConfig.java
  3. 10 6
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/ElecPgSupplyHController.java
  4. 42 11
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/TaskService.java
  5. 6 1
      ems/ems-cloud/ems-server/src/main/resources/application-local.yml
  6. 5 1
      ems/ems-cloud/ems-server/src/main/resources/application-prod-ct.yml
  7. 3 0
      ems/ems-core/src/main/java/com/ruoyi/ems/mapper/CaMeterDMapper.java
  8. 3 0
      ems/ems-core/src/main/java/com/ruoyi/ems/mapper/EmissionFactorMapper.java
  9. 1 1
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IElecMeterHService.java
  10. 2 10
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IElecPgSupplyHService.java
  11. 9 0
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IElecPvSupplyHService.java
  12. 8 0
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IEmissionFactorService.java
  13. 143 0
      ems/ems-core/src/main/java/com/ruoyi/ems/service/analysis/CarbonCalculationService.java
  14. 9 12
      ems/ems-core/src/main/java/com/ruoyi/ems/service/analysis/ElecConsumeForecastService.java
  15. 6 7
      ems/ems-core/src/main/java/com/ruoyi/ems/service/analysis/EmsEcoAnalysisService.java
  16. 3 2
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ElecMeterHServiceImpl.java
  17. 18 66
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ElecPgSupplyHServiceImpl.java
  18. 55 0
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ElecPvSupplyHServiceImpl.java
  19. 5 0
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EmissionFactorServiceImpl.java
  20. 4 0
      ems/ems-core/src/main/resources/mapper/ems/CaMeterDMapper.xml
  21. 5 0
      ems/ems-core/src/main/resources/mapper/ems/EmissionFactorMapper.xml
  22. 3 41
      ems/sql/ems_server.sql

+ 2 - 2
ems/ems-application/ems-admin/src/main/java/com/ruoyi/web/controller/ems/ElecPgSupplyHController.java

@@ -86,12 +86,12 @@ public class ElecPgSupplyHController extends BaseController
 
     @GetMapping(value = "/summery/h")
     public AjaxResult getSummeryByH() {
-        return success(pgSupplyHService.selectSupplyPvByH());
+        return success(pgSupplyHService.selectSupplyByH());
     }
 
     @GetMapping(value = "/summery/this/day")
     public AjaxResult getSummeryByThisDay() {
-        return success(pgSupplyHService.selectSupplyPvByDay());
+        return success(pgSupplyHService.selectSupplyByDay());
     }
 
     /**

+ 15 - 1
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/config/AnalysisConfig.java

@@ -34,12 +34,18 @@ public class AnalysisConfig {
     @Value("${analysis-task.pv-forecast.area-codes}")
     private String pvForecastArea;
 
-    @Value("${analysis-task.elec-consume.area-codes}")
+    @Value("${analysis-task.elec-consume-forecast.area-codes}")
     private String elecConsumeArea;
 
+    @Value("${analysis-task.carbon-calculation.area-codes}")
+    private String carbonCalcArea;
+
     @Value("${analysis-task.pv-forecast.forecastDays}")
     private int prodForecastDays;
 
+    @Value("${analysis-task.elec-consume-forecast.forecastDays}")
+    private int elecConsumeForecastDays;
+
     public String[] getEcoAnalysisAreas() {
         return StringUtils.split(ecoAnalysisArea, ",");
     }
@@ -52,10 +58,18 @@ public class AnalysisConfig {
         return StringUtils.split(elecConsumeArea, ",");
     }
 
+    public String[] getCarbonCalcAreas() {
+        return StringUtils.split(carbonCalcArea, ",");
+    }
+
     public int getProdForecastDays() {
         return prodForecastDays;
     }
 
+    public int getElecConsumeForecastDays() {
+        return elecConsumeForecastDays;
+    }
+
     public String getAdcode() {
         return adcode;
     }

+ 10 - 6
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/ElecPgSupplyHController.java

@@ -10,6 +10,7 @@ import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.ems.domain.ElecPgSupplyH;
 import com.ruoyi.ems.model.QueryMeter;
 import com.ruoyi.ems.service.IElecPgSupplyHService;
+import com.ruoyi.ems.service.IElecPvSupplyHService;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -37,6 +38,9 @@ public class ElecPgSupplyHController extends BaseController {
     @Autowired
     private IElecPgSupplyHService pgSupplyHService;
 
+    @Autowired
+    private IElecPvSupplyHService pvSupplyHService;
+
     /**
      * 查询电网供应计量-小时列表
      */
@@ -81,12 +85,12 @@ public class ElecPgSupplyHController extends BaseController {
 
     @GetMapping(value = "/summery/h")
     public AjaxResult getSummeryByH() {
-        return success(pgSupplyHService.selectSupplyPvByH());
+        return success(pgSupplyHService.selectSupplyByH());
     }
 
     @GetMapping(value = "/summery/this/day")
     public AjaxResult getSummeryByThisDay() {
-        return success(pgSupplyHService.selectSupplyPvByDay());
+        return success(pgSupplyHService.selectSupplyByDay());
     }
 
     /**
@@ -122,22 +126,22 @@ public class ElecPgSupplyHController extends BaseController {
 
     @GetMapping(value = "/total/pv")
     public AjaxResult calPvByDateRange(QueryMeter param) {
-        return success(pgSupplyHService.calPvByDateRange(param));
+        return success(pvSupplyHService.calPvByDateRange(param));
     }
 
     @GetMapping(value = "/day/pv")
     public AjaxResult calDayPvRange(QueryMeter param) {
-        return success(pgSupplyHService.calDayPvRange(param));
+        return success(pvSupplyHService.calDayPvRange(param));
     }
 
     @GetMapping(value = "/hour/pv")
     public AjaxResult calHourPvRange(QueryMeter param) {
-        return success(pgSupplyHService.calHourPvRange(param));
+        return success(pvSupplyHService.calHourPvRange(param));
     }
 
     @GetMapping(value = "/month/pv")
     public AjaxResult calMonthPvByDateRange(QueryMeter param) {
-        return success(pgSupplyHService.calMonthPvByDateRange(param));
+        return success(pvSupplyHService.calMonthPvByDateRange(param));
     }
 
     @GetMapping(value = "/month/pg")

+ 42 - 11
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/TaskService.java

@@ -28,6 +28,7 @@ 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.CarbonCalculationService;
 import com.ruoyi.ems.service.analysis.ElecConsumeForecastService;
 import com.ruoyi.ems.service.analysis.ElecProdForecastService;
 import com.ruoyi.ems.service.analysis.EmsEcoAnalysisService;
@@ -91,6 +92,9 @@ public class TaskService {
     private ElecConsumeForecastService elecConsumeForecastService;
 
     @Resource
+    private CarbonCalculationService carbonCalculationService;
+
+    @Resource
     private AnalysisConfig analysisConfig;
 
     /**
@@ -244,7 +248,7 @@ public class TaskService {
                     queryMeter.setStartRecTime(firstDayOfLastMonth.format(dateForm));
                     queryMeter.setEndRecTime(lastDayOfLastMonth.format(dateForm));
 
-                    ecoAnalysisService.executePvForecast(areaCode, date, queryMeter);
+                    ecoAnalysisService.executePvForecast(date, queryMeter);
                 }
             }
         }
@@ -294,7 +298,7 @@ public class TaskService {
      * 用电预测
      */
     @Async
-    @Scheduled(cron = "${analysis-task.elec-consume.cron}")
+    @Scheduled(cron = "${analysis-task.elec-consume-forecast.cron}")
     public void elecConsumeForecastTask() {
         log.debug("start pv forecast task.");
 
@@ -306,39 +310,65 @@ public class TaskService {
             if (ArrayUtils.isNotEmpty(areaCodes)) {
                 for (String areaCode : areaCodes) {
                     //  区域用能预测
-                    forecastAreas(areaCode, today);
+                    areaElecConsumeForecast(areaCode, today);
 
                     //  设施用能预测
-                    forecastFacs(areaCode, today);
+                    facsElecConsumeForecast(areaCode, today);
                 }
             }
         }
         catch (Exception e) {
             log.error("pv forecast fail!", e);
         }
+    }
+
+    /**
+     * 碳计算(碳排碳汇)
+     */
+    @Async
+    @Scheduled(cron = "${analysis-task.carbon-calculation.cron}")
+    public void carbonCalculationTask() {
+        log.debug("start carbon calculation task.");
 
+        try {
+            // 获取今天的日期
+            LocalDate today = LocalDate.now();
+            LocalDate yesterday = today.minusDays(1);
+            String[] areaCodes = analysisConfig.getCarbonCalcAreas();
+
+            if (ArrayUtils.isNotEmpty(areaCodes)) {
+                for (String areaCode : areaCodes) {
+                    // 碳排碳汇
+                    carbonCalculationService.calculateDailyCarbonEmission(areaCode, yesterday);
+                }
+            }
+        }
+        catch (Exception e) {
+            log.error("carbon calculation fail!", e);
+        }
     }
 
-    private void forecastAreas(String rootArea, LocalDate today) {
+    private void areaElecConsumeForecast(String rootArea, LocalDate today) {
         List<Area> areas = areaService.selectAreaTree(rootArea, true);
-        forecastAreasSub(rootArea,areas, today);
+        areaElecConsumeForecastSub(rootArea, areas, today);
     }
 
-    private  void forecastAreasSub(String rootArea, List<?> areas, LocalDate today) {
+    private void areaElecConsumeForecastSub(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);
+                elecConsumeForecastService.forecastAreas(analysisConfig.getAdcode(), rootArea, area, today,
+                    analysisConfig.getElecConsumeForecastDays());
 
                 if (CollectionUtils.isNotEmpty(area.getChildren())) {
                     List<?> children = area.getChildren();
-                    forecastAreasSub(rootArea, children, today);
+                    areaElecConsumeForecastSub(rootArea, children, today);
                 }
             }
         }
     }
 
-    private void forecastFacs(String areaCode, LocalDate today) {
+    private void facsElecConsumeForecast(String areaCode, LocalDate today) {
         EmsFacs param = new EmsFacs();
         param.setRefArea(areaCode);
         param.setFacsCategory("Z");
@@ -346,7 +376,8 @@ public class TaskService {
 
         if (CollectionUtils.isNotEmpty(facsList)) {
             for (EmsFacs facs : facsList) {
-                elecConsumeForecastService.forecastFacilities(analysisConfig.getAdcode(), areaCode, facs, today, 5);
+                elecConsumeForecastService.forecastFacilities(analysisConfig.getAdcode(), areaCode, facs, today,
+                    analysisConfig.getElecConsumeForecastDays());
             }
         }
     }

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

@@ -66,10 +66,15 @@ analysis-task:
     area-codes: 321283124S3001,321283124S3002,321283124S3003
     forecastDays: 5
     cron: 0 30 8 * * ?
-  elec-consume:
+  elec-consume-forecast:
     cron: 0 0 2 * * ?
+    forecastDays: 5
+    area-codes: 321283124S3001,321283124S3002
+  carbon-calculation:
+    cron: 0 17 19 * * ?
     area-codes: 321283124S3001,321283124S3002
 
+# 定时任务配置
 # mybatis配置
 mybatis:
   # 搜索指定包别名

+ 5 - 1
ems/ems-cloud/ems-server/src/main/resources/application-prod-ct.yml

@@ -66,7 +66,11 @@ analysis-task:
     area-codes: 321283124S3001,321283124S3002,321283124S3003
     forecastDays: 5
     cron: 0 30 8 * * ?
-  elec-consume:
+  elec-consume-forecast:
+    cron: 0 0 2 * * ?
+    forecastDays: 5
+    area-codes: 321283124S3001,321283124S3002
+  carbon-calculation:
     cron: 0 0 2 * * ?
     area-codes: 321283124S3001,321283124S3002
 

+ 3 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/CaMeterDMapper.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.mapper;
 
 import com.ruoyi.ems.domain.CaMeterD;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -51,6 +52,8 @@ public interface CaMeterDMapper {
      */
     int deleteCaMeterDById(Long id);
 
+    int deleteCaMeterDByArea(@Param("areaCode") String areaCode, @Param("date") String date);
+
     /**
      * 批量删除碳计量日
      *

+ 3 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/EmissionFactorMapper.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.mapper;
 
 import com.ruoyi.ems.domain.EmissionFactor;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -19,6 +20,8 @@ public interface EmissionFactorMapper {
      */
     EmissionFactor selectEmissionFactorById(Long id);
 
+    EmissionFactor selectByRegion(@Param("regionCode") String regionCode, @Param("factorType") int factorType);
+
     /**
      * 查询排放因子维列表
      *

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

@@ -99,7 +99,7 @@ public interface IElecMeterHService {
      */
     int deleteElecMeterHByDate(String date);
 
-    EnergyMeter qryElecMeterByDate(String dateRange, String areaCode);
+    EnergyMeter qryElecMeterByDate(String date, String areaCode);
 
     List<ElecMeterH> qryTimeIndexElecMeterByDay(String dateRange, Integer timeIndex);
 

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

@@ -38,10 +38,6 @@ public interface IElecPgSupplyHService {
      */
     List<ElecPgSupplyH> selectPgSupplyH(QueryMeter queryMeter);
 
-    Map<String, Object> selectSupplyPvByH();
-
-    Map<String, Object> selectSupplyPvByDay();
-
     /**
      * 新增电网供应计量-小时
      *
@@ -74,13 +70,9 @@ public interface IElecPgSupplyHService {
      */
     int deletePgSupplyHById(Long id);
 
-    Map<String, ElecPvSupplyH> calPvByDateRange(QueryMeter param);
-
-    List<ElecPvSupplyH> calDayPvRange(QueryMeter param);
-
-    List<ElecPvSupplyH> calHourPvRange(QueryMeter param);
+    Map<String, Object> selectSupplyByH();
 
-    List<ElecPvSupplyH> calMonthPvByDateRange(QueryMeter param);
+    Map<String, Object> selectSupplyByDay();
 
     List<ElecPgSupplyH> calMonthSupplyByH(ElecPgSupplyH param);
 }

+ 9 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/IElecPvSupplyHService.java

@@ -4,6 +4,7 @@ import com.ruoyi.ems.domain.ElecPvSupplyH;
 import com.ruoyi.ems.model.QueryMeter;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 光伏并网计量-小时Service接口
@@ -67,4 +68,12 @@ public interface IElecPvSupplyHService {
      * @return 结果
      */
     int deletePvSupplyHById(Long id);
+
+    Map<String, ElecPvSupplyH> calPvByDateRange(QueryMeter param);
+
+    List<ElecPvSupplyH> calDayPvRange(QueryMeter param);
+
+    List<ElecPvSupplyH> calHourPvRange(QueryMeter param);
+
+    List<ElecPvSupplyH> calMonthPvByDateRange(QueryMeter param);
 }

+ 8 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/IEmissionFactorService.java

@@ -20,6 +20,14 @@ public interface IEmissionFactorService {
     EmissionFactor selectEmissionFactorById(Long id);
 
     /**
+     * 根据区域编码和因子类型查询排放因子
+     * @param regionCode 区域编码
+     * @param factorType 因子类型
+     * @return 排放因子
+     */
+    EmissionFactor selectByRegion(String regionCode, int factorType);
+
+    /**
      * 查询排放因子列表
      *
      * @param emissionFactor 排放因子

+ 143 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/analysis/CarbonCalculationService.java

@@ -0,0 +1,143 @@
+/*
+ * 文 件 名:  CarbonCalculationService
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/6/25
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.service.analysis;
+
+import com.ruoyi.ems.domain.CaMeterD;
+import com.ruoyi.ems.domain.ElecPvSupplyH;
+import com.ruoyi.ems.domain.EmissionFactor;
+import com.ruoyi.ems.domain.EnergyMeter;
+import com.ruoyi.ems.mapper.CaMeterDMapper;
+import com.ruoyi.ems.model.QueryMeter;
+import com.ruoyi.ems.service.IElecMeterHService;
+import com.ruoyi.ems.service.IElecPvSupplyHService;
+import com.ruoyi.ems.service.IEmissionFactorService;
+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.Date;
+import java.util.List;
+
+/**
+ * 碳计算任务
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/6/25]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+@Service
+public class CarbonCalculationService {
+    private static final Logger log = LoggerFactory.getLogger(CarbonCalculationService.class);
+
+    private final DateTimeFormatter dateForm = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    @Resource
+    private CaMeterDMapper caMeterDMapper;
+
+    @Resource
+    private IElecMeterHService elecMeterHService;
+
+    @Resource
+    private IElecPvSupplyHService pvSupplyHService;
+
+    @Resource
+    private IEmissionFactorService emissionFactorService;
+
+    /**
+     * 计算日碳排量
+     * <功能详细描述>
+     *
+     * @param areaCode 行政区划代码
+     * @param date     日期
+     */
+    public void calculateDailyCarbonEmission(String areaCode, LocalDate date) {
+        try {
+            CaMeterD caMeterD = new CaMeterD();
+            caMeterD.setAreaCode(areaCode);
+            caMeterD.setDate(Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+
+            // 计算碳排放量(基于用电数据)
+            EnergyMeter totalElectricity = getDailyElectricityConsumption(areaCode, date);
+            Double emission = calculateCarbonEmission(totalElectricity);
+            caMeterD.setCaEmissionQuantity(emission);
+
+            // 计算碳汇量(基于光伏产能数据)
+            ElecPvSupplyH totalPVProduction = getDailyPVProduction(areaCode, date);
+            Double sink = calculateCarbonSink(totalPVProduction);
+            caMeterD.setCaSinkQuantity(sink);
+
+            caMeterDMapper.deleteCaMeterDByArea(areaCode, date.format(dateForm));
+            caMeterDMapper.insertCaMeterD(caMeterD);
+        }
+        catch (Exception e) {
+            log.error("calculate daily carbon emission error! areaCode:{}, date:{}", areaCode, date.format(dateForm),
+                e);
+        }
+    }
+
+    private ElecPvSupplyH getDailyPVProduction(String areaCode, LocalDate date) {
+        QueryMeter queryMeter = new QueryMeter();
+        queryMeter.setAreaCode(areaCode);
+        queryMeter.setDate(date.format(dateForm));
+        List<ElecPvSupplyH> res = pvSupplyHService.calDayPvRange(queryMeter);
+        return res.isEmpty() ? null : res.get(0);
+    }
+
+    private EnergyMeter getDailyElectricityConsumption(String areaCode, LocalDate date) {
+        return elecMeterHService.qryElecMeterByDate(date.format(dateForm), areaCode);
+    }
+
+    // 计算碳排放量
+    private Double calculateCarbonEmission(EnergyMeter totalElectricity) {
+        EmissionFactor factor = emissionFactorService.selectByRegion("CN", 1);
+
+        if (null == factor || factor.getFactorValue() == null) {
+            return null;
+        }
+
+        if (totalElectricity == null || totalElectricity.getQuantity() == null) {
+            return null;
+        }
+
+        return round(totalElectricity.getQuantity() * factor.getFactorValue(), 2);
+    }
+
+    private Double calculateCarbonSink(ElecPvSupplyH totalPVProduction) {
+        EmissionFactor factor = emissionFactorService.selectByRegion("CN", 4);
+
+        if (null == factor || factor.getFactorValue() == null) {
+            return null;
+        }
+
+        if (totalPVProduction == null || totalPVProduction.getGenElecQuantity() == null) {
+            return null;
+        }
+
+        return round(totalPVProduction.getGenElecQuantity() * factor.getFactorValue(), 2);
+    }
+
+    // 数值四舍五入保留指定小数位
+    private double round(double value, int scale) {
+        if (scale < 0)
+            throw new IllegalArgumentException("scale must be non-negative");
+        BigDecimal bd = BigDecimal.valueOf(value);
+        bd = bd.setScale(scale, RoundingMode.HALF_UP);
+        return bd.doubleValue();
+    }
+}

+ 9 - 12
ems/ems-core/src/main/java/com/ruoyi/ems/service/analysis/ElecConsumeForecastService.java

@@ -40,6 +40,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 用电消耗预测服务
@@ -111,7 +112,10 @@ public class ElecConsumeForecastService {
                 return;
             }
 
-            Set<String> meterDevs = getMeterDevCodes(boundaryRels);
+            Set<String> meterDevs = boundaryRels.stream()
+                .map(MeterBoundaryRel::getMeterDevice)
+                .collect(Collectors.toCollection(HashSet::new));
+
             // 获取历史数据 (过去30天)
             List<ElecMeterH> historicalData = getMeterDayList(rootArea, meterDevs, today);
 
@@ -161,7 +165,10 @@ public class ElecConsumeForecastService {
             return;
         }
 
-        Set<String> meterDevs = getMeterDevCodes(boundaryRels);
+        Set<String> meterDevs = boundaryRels.stream()
+            .map(MeterBoundaryRel::getMeterDevice)
+            .collect(Collectors.toCollection(HashSet::new));
+
         // 获取历史数据 (过去30天)
         List<ElecMeterH> historicalData = getMeterDayList(rootArea, meterDevs, today);
 
@@ -198,16 +205,6 @@ public class ElecConsumeForecastService {
         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<>();
 

+ 6 - 7
ems/ems-core/src/main/java/com/ruoyi/ems/service/analysis/EmsEcoAnalysisService.java

@@ -50,14 +50,14 @@ public class EmsEcoAnalysisService {
     @Resource
     private IWaterMeterHService waterMeterHService;
 
-    public void executePvForecast(String adcode, String date, QueryMeter reference) {
+    public void executePvForecast(String date, QueryMeter reference) {
         try {
             EmsEcoD emsEcoD = new EmsEcoD();
-            emsEcoD.setAreaCode(adcode);
+            emsEcoD.setAreaCode(reference.getAreaCode());
             emsEcoD.setDate(DateUtils.stringToDate(date, "yyyy-MM-dd"));
 
             // 节电计算
-            EnergyMeter yestElecMeter = elecMeterHService.qryElecMeterByDate(date, adcode);
+            EnergyMeter yestElecMeter = elecMeterHService.qryElecMeterByDate(date, reference.getAreaCode());
 
             if (null != yestElecMeter) {
                 // 参照对比数据提取
@@ -70,7 +70,7 @@ public class EmsEcoAnalysisService {
                 emsEcoD.setElecEcoCost(cost);
             }
 
-            EnergyMeter yestWaterMeter = waterMeterHService.qryWaterMeterByDate(date, adcode);
+            EnergyMeter yestWaterMeter = waterMeterHService.qryWaterMeterByDate(date, reference.getAreaCode());
 
             if (null != yestWaterMeter) {
                 // 参照对比数据提取
@@ -83,13 +83,12 @@ public class EmsEcoAnalysisService {
                 emsEcoD.setWaterEcoCost(cost);
             }
 
-            emsEcoDMapper.deleteEmsEcoD(date, adcode);
+            emsEcoDMapper.deleteEmsEcoD(date, reference.getAreaCode());
             emsEcoDMapper.insertEmsEcoD(emsEcoD);
         }
         catch (Exception e) {
-            log.error("executePvForecast fail! adcode:{}, date:{}", adcode, date, e);
+            log.error("executePvForecast fail! adcode:{}, date:{}", reference.getAreaCode(), date, e);
         }
-
     }
 
     /**

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

@@ -1,5 +1,6 @@
 package com.ruoyi.ems.service.impl;
 
+import com.huashe.common.utils.DateUtils;
 import com.ruoyi.ems.domain.ElecMeterH;
 import com.ruoyi.ems.domain.EnergyMeter;
 import com.ruoyi.ems.mapper.ElecMeterHMapper;
@@ -113,9 +114,9 @@ public class ElecMeterHServiceImpl implements IElecMeterHService {
     }
 
     @Override
-    public EnergyMeter qryElecMeterByDate(String dateRange, String areaCode) {
+    public EnergyMeter qryElecMeterByDate(String date, String areaCode) {
         return elecMeterHMapper.qryElecMeterByDate(new ElecMeterH() {{
-            setStartRecTime(dateRange);
+            setStartRecTime(date);
             setAreaCode(areaCode);
         }});
     }

+ 18 - 66
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ElecPgSupplyHServiceImpl.java

@@ -1,9 +1,7 @@
 package com.ruoyi.ems.service.impl;
 
-import cn.hutool.core.thread.ThreadUtil;
 import com.ruoyi.common.core.utils.DateTimeUtil;
 import com.ruoyi.ems.domain.ElecPgSupplyH;
-import com.ruoyi.ems.domain.ElecPvSupplyH;
 import com.ruoyi.ems.mapper.ElecPgSupplyHMapper;
 import com.ruoyi.ems.mapper.ElecPvSupplyHMapper;
 import com.ruoyi.ems.model.QueryMeter;
@@ -16,7 +14,6 @@ import org.springframework.stereotype.Service;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.Future;
 
 /**
  * 电网供应计量-小时Service业务层处理
@@ -64,27 +61,7 @@ public class ElecPgSupplyHServiceImpl implements IElecPgSupplyHService {
         return pgSupplyHMapper.selectPgSupplyH(queryMeter);
     }
 
-    @Override
-    public Map<String, Object> selectSupplyPvByH() {
-        String thisDay = DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM_dd);
-        Map<String, Map<String, Object>> supplyByHMap = pgSupplyHMapper.calThisDaySupplyByH(thisDay);
-        Map<String, Map<String, Object>> pvByHMap = pvSupplyHMapper.calThisDayPvByH(thisDay);
-        return new HashMap<String, Object>() {{
-            put("supply", supplyByHMap);
-            put("pv", pvByHMap);
-        }};
-    }
 
-    @Override
-    public Map<String, Object> selectSupplyPvByDay() {
-        String thisDay = DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM_dd);
-        Map<String, Object> thisDaySupply = pgSupplyHMapper.calThisDaySupply(thisDay);
-        Map<String, Object> thisDayPv = pvSupplyHMapper.calThisDayPv(thisDay);
-        return new HashMap<String, Object>() {{
-            put("supply", thisDaySupply);
-            put("pv", thisDayPv);
-        }};
-    }
 
     /**
      * 新增电网供应计量-小时
@@ -130,55 +107,30 @@ public class ElecPgSupplyHServiceImpl implements IElecPgSupplyHService {
         return pgSupplyHMapper.deletePgSupplyHById(id);
     }
 
-
-    @Override
-    public Map<String, ElecPvSupplyH> calPvByDateRange(QueryMeter param) {
-        Future<?> thisDay = ThreadUtil.execAsync(() -> pvSupplyHMapper.calPvByDateRange(new QueryMeter() {{
-            setDate(DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM_dd));
-            setAreaCode(param.getAreaCode());
-        }}));
-        Future<?> thisMonth = ThreadUtil.execAsync(() -> pvSupplyHMapper.calPvByDateRange(new QueryMeter() {
-            {
-                setDate(DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM));
-                setAreaCode(param.getAreaCode());
-            }
-        }));
-        Future<?> thisYear = ThreadUtil.execAsync(() -> pvSupplyHMapper.calPvByDateRange(new QueryMeter() {{
-            setAreaCode(param.getAreaCode());
-            setDate(DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy));
-        }}));
-        Future<?> total = ThreadUtil.execAsync(() -> pvSupplyHMapper.calPvByDateRange(new QueryMeter() {{
-            setAreaCode(param.getAreaCode());
-        }}));
-        Map<String, ElecPvSupplyH> result = new HashMap<>();
-        try {
-            result.put("thisDay", (ElecPvSupplyH) thisDay.get());
-            result.put("thisMonth", (ElecPvSupplyH) thisMonth.get());
-            result.put("thisYear", (ElecPvSupplyH) thisYear.get());
-            result.put("total", (ElecPvSupplyH) total.get());
-        } catch (Exception e) {
-            log.error("calPvByDateRange error {}", e.getMessage());
-        }
-        return result;
-    }
-
-    @Override
-    public List<ElecPvSupplyH> calDayPvRange(QueryMeter param) {
-        return pvSupplyHMapper.calDayPvRange(param);
-    }
-
     @Override
-    public List<ElecPvSupplyH> calHourPvRange(QueryMeter param) {
-        return pvSupplyHMapper.calHourPvRange(param);
+    public List<ElecPgSupplyH> calMonthSupplyByH(ElecPgSupplyH param) {
+        return pgSupplyHMapper.calMonthSupplyByH(param);
     }
 
     @Override
-    public List<ElecPvSupplyH> calMonthPvByDateRange(QueryMeter param) {
-        return pvSupplyHMapper.calMonthPvByDateRange(param);
+    public Map<String, Object> selectSupplyByH() {
+        String thisDay = DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM_dd);
+        Map<String, Map<String, Object>> supplyByHMap = pgSupplyHMapper.calThisDaySupplyByH(thisDay);
+        Map<String, Map<String, Object>> pvByHMap = pvSupplyHMapper.calThisDayPvByH(thisDay);
+        return new HashMap<String, Object>() {{
+            put("supply", supplyByHMap);
+            put("pv", pvByHMap);
+        }};
     }
 
     @Override
-    public List<ElecPgSupplyH> calMonthSupplyByH(ElecPgSupplyH param) {
-        return pgSupplyHMapper.calMonthSupplyByH(param);
+    public Map<String, Object> selectSupplyByDay() {
+        String thisDay = DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM_dd);
+        Map<String, Object> thisDaySupply = pgSupplyHMapper.calThisDaySupply(thisDay);
+        Map<String, Object> thisDayPv = pvSupplyHMapper.calThisDayPv(thisDay);
+        return new HashMap<String, Object>() {{
+            put("supply", thisDaySupply);
+            put("pv", thisDayPv);
+        }};
     }
 }

+ 55 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ElecPvSupplyHServiceImpl.java

@@ -1,14 +1,20 @@
 package com.ruoyi.ems.service.impl;
 
+import cn.hutool.core.thread.ThreadUtil;
+import com.ruoyi.common.core.utils.DateTimeUtil;
 import com.ruoyi.ems.domain.ElecPvSupplyH;
 import com.ruoyi.ems.mapper.ElecPvSupplyHMapper;
 import com.ruoyi.ems.model.QueryMeter;
 import com.ruoyi.ems.service.IElecPvSupplyHService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Future;
 
 /**
  * 光伏并网计量光伏并网计量-小时Service业务层处理
@@ -16,6 +22,7 @@ import java.util.List;
  * @author ruoyi
  * @date 2024-08-02
  */
+@Slf4j
 @Service
 public class ElecPvSupplyHServiceImpl implements IElecPvSupplyHService {
     @Autowired
@@ -96,4 +103,52 @@ public class ElecPvSupplyHServiceImpl implements IElecPvSupplyHService {
     public int deletePvSupplyHById(Long id) {
         return pvSupplyHMapper.deletePvSupplyHById(id);
     }
+
+
+
+    @Override
+    public Map<String, ElecPvSupplyH> calPvByDateRange(QueryMeter param) {
+        Future<?> thisDay = ThreadUtil.execAsync(() -> pvSupplyHMapper.calPvByDateRange(new QueryMeter() {{
+            setDate(DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM_dd));
+            setAreaCode(param.getAreaCode());
+        }}));
+        Future<?> thisMonth = ThreadUtil.execAsync(() -> pvSupplyHMapper.calPvByDateRange(new QueryMeter() {
+            {
+                setDate(DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM));
+                setAreaCode(param.getAreaCode());
+            }
+        }));
+        Future<?> thisYear = ThreadUtil.execAsync(() -> pvSupplyHMapper.calPvByDateRange(new QueryMeter() {{
+            setAreaCode(param.getAreaCode());
+            setDate(DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy));
+        }}));
+        Future<?> total = ThreadUtil.execAsync(() -> pvSupplyHMapper.calPvByDateRange(new QueryMeter() {{
+            setAreaCode(param.getAreaCode());
+        }}));
+        Map<String, ElecPvSupplyH> result = new HashMap<>();
+        try {
+            result.put("thisDay", (ElecPvSupplyH) thisDay.get());
+            result.put("thisMonth", (ElecPvSupplyH) thisMonth.get());
+            result.put("thisYear", (ElecPvSupplyH) thisYear.get());
+            result.put("total", (ElecPvSupplyH) total.get());
+        } catch (Exception e) {
+            log.error("calPvByDateRange error {}", e.getMessage());
+        }
+        return result;
+    }
+
+    @Override
+    public List<ElecPvSupplyH> calDayPvRange(QueryMeter param) {
+        return pvSupplyHMapper.calDayPvRange(param);
+    }
+
+    @Override
+    public List<ElecPvSupplyH> calHourPvRange(QueryMeter param) {
+        return pvSupplyHMapper.calHourPvRange(param);
+    }
+
+    @Override
+    public List<ElecPvSupplyH> calMonthPvByDateRange(QueryMeter param) {
+        return pvSupplyHMapper.calMonthPvByDateRange(param);
+    }
 }

+ 5 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EmissionFactorServiceImpl.java

@@ -30,6 +30,11 @@ public class EmissionFactorServiceImpl implements IEmissionFactorService {
         return emissionFactorMapper.selectEmissionFactorById(id);
     }
 
+    @Override
+    public EmissionFactor selectByRegion(String regionCode, int factorType) {
+        return emissionFactorMapper.selectByRegion(regionCode, factorType);
+    }
+
     /**
      * 查询排放因子维列表
      *

+ 4 - 0
ems/ems-core/src/main/resources/mapper/ems/CaMeterDMapper.xml

@@ -65,6 +65,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         delete from adm_ems_ca_meter_d where id = #{id}
     </delete>
 
+    <delete id="deleteCaMeterDByArea" >
+        delete from adm_ems_ca_meter_d where area_code = #{areaCode} and `date` = #{date}
+    </delete>
+
     <delete id="deleteCaMeterDByIds" parameterType="String">
         delete from adm_ems_ca_meter_d where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">

+ 5 - 0
ems/ems-core/src/main/resources/mapper/ems/EmissionFactorMapper.xml

@@ -34,6 +34,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectEmissionFactorVo"/>
         where id = #{id}
     </select>
+
+    <select id="selectByRegion" resultMap="EmissionFactorResult">
+        <include refid="selectEmissionFactorVo"/>
+        where region_code = #{regionCode} and factor_type = #{factorType}
+    </select>
         
     <insert id="insertEmissionFactor" parameterType="com.ruoyi.ems.domain.EmissionFactor" useGeneratedKeys="true" keyProperty="id">
         insert into dim_ems_emission_factor

+ 3 - 41
ems/sql/ems_server.sql

@@ -348,53 +348,15 @@ create table dim_ems_emission_factor (
   `region_name`   varchar(16)     not null                   comment '地区名称',
   `region_type`   int             not null                   comment '地区类型 0:国家,1:地区,2:省份,3:城市',
   `factor_value`  double          default null               comment '因子值 单位: kgCO2/kWh',
-  `factor_type`   int             default null               comment '1:电力平均二氧化碳排放因子 2:电力平均二氧化碳排放因子(不含市场化交易的非化石能源电量)3:化石能源电力二氧化碳排放因子',
+  `factor_type`   int             default null               comment '1:电力平均二氧化碳排放因子 2:电力平均二氧化碳排放因子(不含市场化交易的非化石能源电量)3:化石能源电力二氧化碳排放因子,4:全国光伏发电电力碳足迹因子',
   `version`       varchar(64)     default null               comment '数据版本',
   primary key (`id`),
   unique key ux_ems_emission_factor(`region_code`,`region_type`,`factor_type`)
 ) engine=innodb auto_increment=1 comment = '排放因子维表';
 
 -- 排放因子初始数据
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('CN', '中国', '0', '0.5568', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('HB', '华北', '1', '0.7120', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('DB', '东北', '1', '0.6012', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('HD', '华东', '1', '0.5992', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('HZ', '华中', '1', '0.5354', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('XB', '西北', '1', '0.5951', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('HN', '华南', '1', '0.4326', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('XN', '西南', '1', '0.2113', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('110000', '北京', '2', '0.5688', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('120000', '天津', '2', '0.7355', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('130000', '河北', '2', '0.7901', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('140000', '山西', '2', '0.7222', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('150000', '内蒙古', '2', '0.7025', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('210000', '辽宁', '2', '0.5876', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('220000', '吉林', '2', '0.5629', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('230000', '黑龙江', '2', '0.6342', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('310000', '上海', '2', '0.5834', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('320000', '江苏', '2', '0.6451', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('330000', '浙江', '2', '0.5422', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('340000', '安徽', '2', '0.7075', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('350000', '福建', '2', '0.4711', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('360000', '江西', '2', '0.5835', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('370000', '山东', '2', '0.6838', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('410000', '河南', '2', '0.6369', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('420000', '湖北', '2', '0.3672', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('430000', '湖南', '2', '0.5138', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('440000', '广东', '2', '0.4715', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('450000', '广西', '2', '0.5154', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('460000', '海南', '2', '0.4524', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('500000', '重庆', '2', '0.4743', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('510000', '四川', '2', '0.1255', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('520000', '贵州', '2', '0.5182', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('530000', '云南', '2', '0.1235', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('610000', '陕西', '2', '0.6336', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('620000', '甘肃', '2', '0.4955', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('630000', '青海', '2', '0.1326', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('640000', '宁夏', '2', '0.6546', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('650000', '新疆', '2', '0.6577', '1', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('CN', '中国', '0', '0.5942', '2', '2021');
-INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('CN', '中国', '0', '0.8426', '3', '2021');
+INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('CN', '中国', '0', '0.5366', '1', '2022');
+INSERT INTO `dim_ems_emission_factor` (`region_code`, `region_name`, `region_type`, `factor_value`, `factor_type`, `version`) VALUES ('CN', '中国', '0', '0.0545', '4', '2023');
 
 -- ----------------------------
 -- 行政区划表