diff --git a/mh-admin/src/main/java/com/mh/web/controller/energy/FgdScrEnergyAnalyzeController.java b/mh-admin/src/main/java/com/mh/web/controller/energy/FgdScrEnergyAnalyzeController.java
new file mode 100644
index 0000000..728fe0b
--- /dev/null
+++ b/mh-admin/src/main/java/com/mh/web/controller/energy/FgdScrEnergyAnalyzeController.java
@@ -0,0 +1,37 @@
+package com.mh.web.controller.energy;
+
+import com.mh.common.core.controller.BaseController;
+import com.mh.common.core.domain.AjaxResult;
+import com.mh.common.core.domain.vo.EnergyQueryVO;
+import com.mh.system.service.energy.IEnergyQueryService;
+import com.mh.system.service.energy.IFdgScrEnergyQueryService;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author LJF
+ * @version 1.0
+ * @project EEMCS
+ * @description 脱硫脱硝系统能效分析controller
+ * @date 2026-04-29 14:43:45
+ */
+@RestController
+@RequestMapping("/fgdScr/energy")
+public class FgdScrEnergyAnalyzeController extends BaseController {
+
+ @Resource
+ private IFdgScrEnergyQueryService fdgScrEnergyQueryService;
+
+ /**
+ * 整体脱硫系统图形,表格数据查询(公用一个接口)
+ * @param page
+ * @return
+ */
+ @PostMapping("/sys/query")
+ public AjaxResult sysQuery(@RequestBody EnergyQueryVO page) {
+ return fdgScrEnergyQueryService.sysQuery(page);
+ }
+}
diff --git a/mh-system/src/main/java/com/mh/system/mapper/energy/FgdScrEnergyQueryMapper.java b/mh-system/src/main/java/com/mh/system/mapper/energy/FgdScrEnergyQueryMapper.java
new file mode 100644
index 0000000..f88c6c8
--- /dev/null
+++ b/mh-system/src/main/java/com/mh/system/mapper/energy/FgdScrEnergyQueryMapper.java
@@ -0,0 +1,209 @@
+package com.mh.system.mapper.energy;
+
+import com.mh.common.core.domain.entity.ConsumptionAnalyze;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * @author LJF
+ * @version 1.0
+ * @project EEMCS
+ * @description 脱硫脱硝能耗查询
+ * @date 2026-04-29 15:10:09
+ */
+public interface FgdScrEnergyQueryMapper {
+ @Select("")
+ List queryOneTable(@Param("startTime") String startTime,
+ @Param("endTime") String endTime,
+ @Param("lastTableName") String lastTableName,
+ @Param("curTableName") String curTableName,
+ @Param("len") String dateLen,
+ @Param("paramType") String paramType,
+ @Param("haveLoadCell") boolean haveLoadCell,
+ @Param("haveSO2") boolean haveSO2,
+ @Param("systemType") String systemType);
+
+
+ /**
+ * 跨表查询操作
+ * @param startTime 开始时间
+ * @param endTime 结束时间
+ * @param lastTableName 上一个表名
+ * @param curTableName 当前表名
+ * @return
+ */
+ @Select("")
+ List queryManyTable(@Param("startTime") String startTime,
+ @Param("endTime") String endTime,
+ @Param("lastTableName") String lastTableName,
+ @Param("curTableName") String curTableName,
+ @Param("len") String dateLen,
+ @Param("paramType") String paramType,
+ @Param("haveMeter") boolean haveMeter,
+ @Param("haveCloud") boolean haveCloud,
+ @Param("systemType") String systemType);
+
+}
diff --git a/mh-system/src/main/java/com/mh/system/service/energy/IFdgScrEnergyQueryService.java b/mh-system/src/main/java/com/mh/system/service/energy/IFdgScrEnergyQueryService.java
new file mode 100644
index 0000000..b8140e3
--- /dev/null
+++ b/mh-system/src/main/java/com/mh/system/service/energy/IFdgScrEnergyQueryService.java
@@ -0,0 +1,22 @@
+package com.mh.system.service.energy;
+
+import com.mh.common.core.domain.AjaxResult;
+import com.mh.common.core.domain.vo.EnergyQueryVO;
+
+/**
+ * @author LJF
+ * @version 1.0
+ * @project EEMCS
+ * @description 脱硫脱硝系统能效查询
+ * @date 2026-04-29 15:06:15
+ */
+public interface IFdgScrEnergyQueryService {
+
+ /**
+ * 能源查询
+ * @param page
+ * @return
+ */
+ AjaxResult sysQuery(EnergyQueryVO page);
+
+}
diff --git a/mh-system/src/main/java/com/mh/system/service/energy/impl/FdgScrEnergyQueryServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/energy/impl/FdgScrEnergyQueryServiceImpl.java
new file mode 100644
index 0000000..c67f89f
--- /dev/null
+++ b/mh-system/src/main/java/com/mh/system/service/energy/impl/FdgScrEnergyQueryServiceImpl.java
@@ -0,0 +1,198 @@
+package com.mh.system.service.energy.impl;
+
+import com.mh.common.core.domain.AjaxResult;
+import com.mh.common.core.domain.entity.ConsumptionAnalyze;
+import com.mh.common.core.domain.vo.EnergyQueryVO;
+import com.mh.common.utils.DateUtils;
+import com.mh.system.mapper.device.CollectionParamsManageMapper;
+import com.mh.system.mapper.energy.FgdScrEnergyQueryMapper;
+import com.mh.system.service.energy.IFdgScrEnergyQueryService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+/**
+ * @author LJF
+ * @version 1.0
+ * @project EEMCS
+ * @description 脱硫脱硝能效查询
+ * @date 2026-04-29 15:07:42
+ */
+@Slf4j
+@Service
+public class FdgScrEnergyQueryServiceImpl implements IFdgScrEnergyQueryService {
+
+ private final CollectionParamsManageMapper collectionParamsManageMapper;
+
+ private final FgdScrEnergyQueryMapper fgdScrEnergyQueryMapper;
+
+ public FdgScrEnergyQueryServiceImpl(CollectionParamsManageMapper collectionParamsManageMapper, FgdScrEnergyQueryMapper fgdScrEnergyQueryMapper) {
+ this.collectionParamsManageMapper = collectionParamsManageMapper;
+ this.fgdScrEnergyQueryMapper = fgdScrEnergyQueryMapper;
+ }
+
+
+ @Override
+ public AjaxResult sysQuery(EnergyQueryVO vo) {
+ DateUtils.sysEnergyDateChange(vo);
+ // 获取参数
+ AtomicReference lastTableName = new AtomicReference<>("data_" + vo.getTimeType());
+ AtomicReference curTableName = new AtomicReference<>("data_" + vo.getTimeType());
+ String timeType = vo.getTimeType();
+ // 判断是否有总表
+ boolean haveLoadCell = collectionParamsManageMapper.selectSummary(40, "32") != 0;
+ boolean haveSO2 = false;
+ if ("min".equals(timeType)) {
+ haveSO2 = true;
+ }
+ List consumptionAnalyzeEntities = null;
+ // 表格数据
+ if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) {
+ // 单表
+ consumptionAnalyzeEntities = fgdScrEnergyQueryMapper.queryOneTable(vo.getStartTime(),
+ vo.getEndTime(),
+ lastTableName.get(),
+ curTableName.get(),
+ DateUtils.getTimeLen(vo.getTimeType()),
+ null,
+ haveLoadCell,
+ haveSO2,
+ vo.getSystemType());
+ } else {
+ lastTableName.set(lastTableName + vo.getStartTime().substring(0, 4));
+ curTableName.set(curTableName + vo.getEndTime().substring(0, 4));
+ if (lastTableName.get().equalsIgnoreCase(curTableName.get())) {
+ // 单表
+ consumptionAnalyzeEntities = fgdScrEnergyQueryMapper.queryOneTable(vo.getStartTime(),
+ vo.getEndTime(),
+ lastTableName.get(),
+ curTableName.get(),
+ DateUtils.getTimeLen(vo.getTimeType()),
+ null,
+ haveLoadCell,
+ haveSO2,
+ vo.getSystemType());
+ } else {
+ // 多表
+ consumptionAnalyzeEntities = fgdScrEnergyQueryMapper.queryManyTable(vo.getStartTime(),
+ vo.getEndTime(),
+ lastTableName.get(),
+ curTableName.get(),
+ DateUtils.getTimeLen(vo.getTimeType()),
+ null,
+ haveLoadCell,
+ haveSO2,
+ vo.getSystemType());
+ }
+ }
+ if (null == consumptionAnalyzeEntities || consumptionAnalyzeEntities.isEmpty()) {
+ return AjaxResult.success();
+ }
+ // 分组并按时间排序操作,拿到冷量记和电表数据
+ Map> collect = consumptionAnalyzeEntities.stream()
+ .parallel()
+ .collect(Collectors.groupingBy(ConsumptionAnalyze::getDeviceType, HashMap::new, Collectors
+ .collectingAndThen(Collectors.toList(),
+ list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyze::getTimeStr)).collect(Collectors.toList()))));
+ List so1Data = new ArrayList<>();
+ List so2Data = new ArrayList<>();
+ List loadCellData = new ArrayList<>();
+ for (Map.Entry> nmap : collect.entrySet()) {
+ // 获取二氧化硫传感器的值
+ if (haveSO2) {
+ if (nmap.getKey().equalsIgnoreCase("so1")) {
+ so1Data = nmap.getValue();
+ }
+ if (nmap.getKey().equalsIgnoreCase("so2")) {
+ so2Data = nmap.getValue();
+ }
+ }
+ // 获取称重传感器的值
+ if (nmap.getKey().equalsIgnoreCase("loadCell")) {
+ loadCellData = nmap.getValue();
+ }
+ }
+ String[] loadCellDataArr = loadCellData.stream()
+ .map(ConsumptionAnalyze::getCurValue)
+ .toArray(String[]::new);
+ String[] timeStrArr = loadCellData.stream()
+ .map(ConsumptionAnalyze::getTimeStr)
+ .toArray(String[]::new);
+ String[] so1Arr = so1Data.stream()
+ .map(ConsumptionAnalyze::getCurValue)
+ .toArray(String[]::new);
+ String[] so2Arr = so2Data.stream()
+ .map(ConsumptionAnalyze::getCurValue)
+ .toArray(String[]::new);
+ // 表格数据
+ Map map = new HashMap<>();
+ int pageNum = vo.getPageNum();
+ int pageSize = vo.getPageSize();
+ if (pageNum == 0) {
+ map.put("loadCellDataArr", loadCellDataArr);
+ if (haveSO2) {
+ map.put("so1Arr", so1Arr);
+ map.put("so2Arr", so2Arr);
+ }
+ map.put("timeStrArr", timeStrArr);
+ } else {
+ int startIndex = (pageNum - 1) * pageSize;
+ int endIndex = Math.min(pageNum * pageSize, loadCellDataArr.length);
+ if (startIndex > endIndex) {
+ return AjaxResult.success();
+ }
+ map.put("loadCellDataArr", Arrays.copyOfRange(loadCellDataArr, startIndex, endIndex));
+ if (haveSO2) {
+ map.put("so1Arr", Arrays.copyOfRange(so1Arr, startIndex, endIndex));
+ map.put("so2Arr", Arrays.copyOfRange(so2Arr, startIndex, endIndex));
+ }
+ map.put("timeStrArr", Arrays.copyOfRange(timeStrArr, startIndex, endIndex));
+ }
+ map.put("total", timeStrArr.length);
+
+ // 组装赋值
+ List