Browse Source

1、首页添加缓存优化;

dev_mz
25604 2 weeks ago
parent
commit
0a76509188
  1. 21
      mh-admin/src/test/java/com/mh/MHApplicationTest.java
  2. 10
      mh-common/src/main/java/com/mh/common/constant/CacheConstants.java
  3. 1
      mh-framework/src/main/java/com/mh/framework/dealdata/impl/DataProcessServiceImpl.java
  4. 38
      mh-quartz/src/main/java/com/mh/quartz/task/HomeTask.java
  5. 244
      mh-system/src/main/java/com/mh/system/mapper/report/ComprehensiveReportMapper.java
  6. 29
      mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java
  7. 287
      mh-system/src/main/java/com/mh/system/service/report/impl/ComprehensiveReportServiceImpl.java

21
mh-admin/src/test/java/com/mh/MHApplicationTest.java

@ -7,6 +7,7 @@ import com.mh.common.core.domain.entity.DeviceReport;
import com.mh.common.core.domain.entity.SysParams; import com.mh.common.core.domain.entity.SysParams;
import com.mh.common.core.domain.entity.SysUser; import com.mh.common.core.domain.entity.SysUser;
import com.mh.common.core.domain.entity.WeatherData; import com.mh.common.core.domain.entity.WeatherData;
import com.mh.common.core.domain.vo.EnergyQueryVO;
import com.mh.common.utils.DateUtils; import com.mh.common.utils.DateUtils;
import com.mh.common.utils.StringUtils; import com.mh.common.utils.StringUtils;
import com.mh.quartz.task.DealDataTask; import com.mh.quartz.task.DealDataTask;
@ -18,6 +19,7 @@ import com.mh.system.service.ISysUserService;
import com.mh.system.service.device.IDeviceQrManageService; import com.mh.system.service.device.IDeviceQrManageService;
import com.mh.system.service.operation.IAlarmRecordsService; import com.mh.system.service.operation.IAlarmRecordsService;
import com.mh.system.service.overview.IProOverviewService; import com.mh.system.service.overview.IProOverviewService;
import com.mh.system.service.report.IComprehensiveReportService;
import com.mh.system.service.report.IMeterReadingsHisService; import com.mh.system.service.report.IMeterReadingsHisService;
import com.mh.system.service.report.IReportHotWaterService; import com.mh.system.service.report.IReportHotWaterService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -61,6 +63,23 @@ public class MHApplicationTest {
@Autowired @Autowired
private IProOverviewService proOverviewService; private IProOverviewService proOverviewService;
@Autowired
private IComprehensiveReportService comprehensiveReportService;
@Test
public void comprehensiveReport() {
long startTime = System.currentTimeMillis();
EnergyQueryVO vo = new EnergyQueryVO();
vo.setStartTime("2025-12-24 00:00:00");
vo.setEndTime("2025-12-24 23:59:59");
vo.setPageNum(1);
vo.setPageSize(10);
vo.setTimeType("hour");
System.out.println("开始查询");
List<?> report = comprehensiveReportService.report(vo);
System.out.println("报表耗时:" + (System.currentTimeMillis() - startTime) + "ms");
}
@Test @Test
public void testHome() throws Exception { public void testHome() throws Exception {
// 开始计时 // 开始计时
@ -76,7 +95,7 @@ public class MHApplicationTest {
@Test @Test
public void testExecProMeterReadingsHis() { public void testExecProMeterReadingsHis() {
meterReadingsHisService.execProMeterReadingsHis("2025-10-22"); meterReadingsHisService.execProMeterReadingsHis("2025-12-11");
} }
@Test @Test

10
mh-common/src/main/java/com/mh/common/constant/CacheConstants.java

@ -41,4 +41,14 @@ public class CacheConstants
* 登录账户密码错误次数 redis key * 登录账户密码错误次数 redis key
*/ */
public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
/**
* 获取项目概况
*/
public static final String PRO_PROFILE = "pro_profile";
/**
* 首页各个采集类型月数据
*/
public static final String ENERGY_ANALYSIS = "energy_analysis";
} }

1
mh-framework/src/main/java/com/mh/framework/dealdata/impl/DataProcessServiceImpl.java

@ -280,7 +280,6 @@ public class DataProcessServiceImpl implements DataProcessService {
entity = dataProcessMapper.queryLastValue(deviceNum, lastTable); entity = dataProcessMapper.queryLastValue(deviceNum, lastTable);
} catch (Exception e) { } catch (Exception e) {
log.error("没有当前表:{}", lastTable); log.error("没有当前表:{}", lastTable);
e.printStackTrace();
} }
} }
return entity; return entity;

38
mh-quartz/src/main/java/com/mh/quartz/task/HomeTask.java

@ -0,0 +1,38 @@
package com.mh.quartz.task;
import com.mh.common.constant.CacheConstants;
import com.mh.common.core.redis.RedisCache;
import com.mh.system.service.overview.IProOverviewService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 首页任务
* @date 2025-12-24 09:04:57
*/
@Slf4j
@Component("homeTask")
public class HomeTask {
@Autowired
private IProOverviewService proOverviewService;
@Autowired
private RedisCache redisCache;
public void updateHomeData() {
if (redisCache.hasKey(CacheConstants.PRO_PROFILE)) {
redisCache.deleteObject(CacheConstants.PRO_PROFILE);
}
proOverviewService.getProProfile();
if (redisCache.hasKey(CacheConstants.ENERGY_ANALYSIS)) {
redisCache.deleteObject(CacheConstants.ENERGY_ANALYSIS);
}
proOverviewService.energyAnalysis();
}
}

244
mh-system/src/main/java/com/mh/system/mapper/report/ComprehensiveReportMapper.java

@ -36,88 +36,57 @@ public interface ComprehensiveReportMapper {
@Select("<script>" + @Select("<script>" +
"WITH periods AS ( " + "WITH combined_data AS ( " +
" SELECT " + " SELECT " +
" <choose>" + " CASE " +
" <when test='timeType == \"year\"'>" + " WHEN #{timeType} = 'year' THEN to_char(date_trunc('year', cur_time), 'YYYY') " +
" to_char(generate_series( " + " WHEN #{timeType} = 'month' THEN to_char(date_trunc('month', cur_time), 'YYYY-MM') " +
" date_trunc('year', #{startTime}::timestamp), " + " WHEN #{timeType} = 'day' THEN to_char(date_trunc('day', cur_time), 'YYYY-MM-DD') " +
" date_trunc('year', #{endTime}::timestamp), " + " WHEN #{timeType} = 'hour' THEN to_char(date_trunc('hour', cur_time), 'YYYY-MM-DD HH24') " +
" '1 year' " + " ELSE to_char(date_trunc('month', cur_time), 'YYYY-MM') " +
" ), 'YYYY') AS period " + " END AS period, " +
" </when>" + " calc_value " +
" <when test='timeType == \"month\"'>" + " FROM ${lastTableName} " +
" to_char(generate_series( " + " WHERE cur_time >= #{startTime}::timestamp AND cur_time &lt;= #{endTime}::timestamp " +
" date_trunc('month', #{startTime}::timestamp), " + " <if test='deviceNums != null and deviceNums.size() > 0'>" +
" date_trunc('month', #{endTime}::timestamp), " + " AND device_num IN " +
" '1 month' " + " <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
" ), 'YYYY-MM') AS period " + " #{item.mtNum} " +
" </when>" + " </foreach>" +
" <when test='timeType == \"day\"'>" + " </if>" +
" to_char(generate_series( " + " UNION ALL " +
" date_trunc('day', #{startTime}::timestamp), " + " SELECT " +
" date_trunc('day', #{endTime}::timestamp), " + " CASE " +
" '1 day' " + " WHEN #{timeType} = 'year' THEN to_char(date_trunc('year', cur_time), 'YYYY') " +
" ), 'YYYY-MM-DD') AS period " + " WHEN #{timeType} = 'month' THEN to_char(date_trunc('month', cur_time), 'YYYY-MM') " +
" </when>" + " WHEN #{timeType} = 'day' THEN to_char(date_trunc('day', cur_time), 'YYYY-MM-DD') " +
" <when test='timeType == \"hour\"'>" + " WHEN #{timeType} = 'hour' THEN to_char(date_trunc('hour', cur_time), 'YYYY-MM-DD HH24') " +
" to_char(generate_series( " + " ELSE to_char(date_trunc('month', cur_time), 'YYYY-MM') " +
" date_trunc('hour', #{startTime}::timestamp), " + " END AS period, " +
" date_trunc('hour', #{endTime}::timestamp), " + " calc_value " +
" '1 hour' " + " FROM ${curTableName} " +
" ), 'YYYY-MM-DD HH24') AS period " + " WHERE cur_time >= #{startTime}::timestamp AND cur_time &lt;= #{endTime}::timestamp " +
" </when>" + " <if test='deviceNums != null and deviceNums.size() > 0'>" +
" <otherwise>" + " AND device_num IN " +
" to_char(generate_series( " + " <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
" date_trunc('month', #{startTime}::timestamp), " + " #{item.mtNum} " +
" date_trunc('month', #{endTime}::timestamp), " + " </foreach>" +
" '1 month' " + " </if>" +
" ), 'YYYY-MM') AS period " + ") " +
" </otherwise>" + "SELECT " +
" </choose>" + " period AS name, " +
") " + " SUM(calc_value) AS value " +
"SELECT " + "FROM combined_data " +
" p.period as name, " + "GROUP BY period " +
" COALESCE(SUM(all_data.calc_value), 0) AS value " + "ORDER BY period; " +
"FROM periods p " + "</script>")
"LEFT JOIN ( " + List<ColumnFilter> energyAnalysisManyTable(@Param("deviceNums") List<CollectionParamsManage> deviceNums,
" SELECT cur_time, calc_value, device_num FROM ${lastTableName} " + @Param("lastTableName") String lastTableName,
" WHERE cur_time >= #{startTime} AND cur_time &lt;= #{endTime} " + @Param("curTableName") String curTableName,
" UNION ALL " + @Param("startTime") Date startTime,
" SELECT cur_time, calc_value, device_num FROM ${curTableName} " + @Param("endTime") Date endTime,
" WHERE cur_time >= #{startTime} AND cur_time &lt;= #{endTime} " + @Param("timeType") String timeType);
") all_data ON <choose>" +
" <when test='timeType == \"year\"'>" +
" to_char(all_data.cur_time, 'YYYY') = p.period " +
" </when>" +
" <when test='timeType == \"month\"'>" +
" to_char(all_data.cur_time, 'YYYY-MM') = p.period " +
" </when>" +
" <when test='timeType == \"day\"'>" +
" to_char(all_data.cur_time, 'YYYY-MM-DD') = p.period " +
" </when>" +
" <when test='timeType == \"hour\"'>" +
" to_char(all_data.cur_time, 'YYYY-MM-DD HH24') = p.period " +
" </when>" +
" <otherwise>" +
" to_char(all_data.cur_time, 'YYYY-MM') = p.period " +
" </otherwise>" +
" </choose>" +
" <if test='deviceNums != null and deviceNums.size() > 0'>" +
" AND all_data.device_num IN " +
" <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
" #{item.mtNum} " +
" </foreach>" +
" </if>" +
"GROUP BY p.period " +
"ORDER BY p.period; " +
"</script>")
List<ColumnFilter> energyAnalysisManyTable(@Param("deviceNums") List<CollectionParamsManage> deviceNums,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime,
@Param("timeType") String timeType);
@Select("<script>" + @Select("<script>" +
"select sum(cur_value) from collect_param_manage where id in " + "select sum(cur_value) from collect_param_manage where id in " +
@ -128,83 +97,38 @@ public interface ComprehensiveReportMapper {
BigDecimal selectEER(@Param("deviceNums") List<CollectionParamsManage> deviceNums); BigDecimal selectEER(@Param("deviceNums") List<CollectionParamsManage> deviceNums);
@Select("<script>" + @Select("<script>" +
"WITH periods AS ( " + "WITH time_bucketed_data AS ( " +
" SELECT " + " SELECT " +
" <choose>" + " CASE " +
" <when test='timeType == \"year\"'>" + " WHEN #{timeType} = 'year' THEN to_char(date_trunc('year', cur_time), 'YYYY') " +
" to_char(generate_series( " + " WHEN #{timeType} = 'month' THEN to_char(date_trunc('month', cur_time), 'YYYY-MM') " +
" date_trunc('year', #{startTime}::timestamp), " + " WHEN #{timeType} = 'day' THEN to_char(date_trunc('day', cur_time), 'YYYY-MM-DD') " +
" date_trunc('year', #{endTime}::timestamp), " + " WHEN #{timeType} = 'hour' THEN to_char(date_trunc('hour', cur_time), 'YYYY-MM-DD HH24') " +
" '1 year' " + " ELSE to_char(date_trunc('month', cur_time), 'YYYY-MM') " +
" ), 'YYYY') AS period " + " END AS period, " +
" </when>" + " calc_value " +
" <when test='timeType == \"month\"'>" + " FROM ${lastTableName} " +
" to_char(generate_series( " + " WHERE cur_time >= #{startTime}::timestamp AND cur_time &lt;= #{endTime}::timestamp " +
" date_trunc('month', #{startTime}::timestamp), " + " <if test='deviceNums != null and deviceNums.size() > 0'>" +
" date_trunc('month', #{endTime}::timestamp), " + " AND device_num IN " +
" '1 month' " + " <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
" ), 'YYYY-MM') AS period " + " #{item.mtNum} " +
" </when>" + " </foreach>" +
" <when test='timeType == \"day\"'>" + " </if>" +
" to_char(generate_series( " + ") " +
" date_trunc('day', #{startTime}::timestamp), " + "SELECT " +
" date_trunc('day', #{endTime}::timestamp), " + " period AS name, " +
" '1 day' " + " SUM(calc_value) AS value " +
" ), 'YYYY-MM-DD') AS period " + "FROM time_bucketed_data " +
" </when>" + "GROUP BY period " +
" <when test='timeType == \"hour\"'>" + "ORDER BY period; " +
" to_char(generate_series( " + "</script>")
" date_trunc('hour', #{startTime}::timestamp), " + List<ColumnFilter> energyAnalysisOneTable(@Param("deviceNums") List<CollectionParamsManage> deviceNums,
" date_trunc('hour', #{endTime}::timestamp), " + @Param("lastTableName") String lastTableName,
" '1 hour' " + @Param("curTableName") String curTableName,
" ), 'YYYY-MM-DD HH24') AS period " + @Param("startTime") Date startTime,
" </when>" + @Param("endTime") Date endTime,
" <otherwise>" + @Param("timeType") String timeType);
" to_char(generate_series( " +
" date_trunc('month', #{startTime}::timestamp), " +
" date_trunc('month', #{endTime}::timestamp), " +
" '1 month' " +
" ), 'YYYY-MM') AS period " +
" </otherwise>" +
" </choose>" +
") " +
"SELECT " +
" p.period as name, " +
" COALESCE(SUM(dm.calc_value), 0) AS value " +
"FROM periods p " +
"LEFT JOIN ${lastTableName} dm " +
" ON <choose>" +
" <when test='timeType == \"year\"'>" +
" to_char(dm.cur_time, 'YYYY') = p.period " +
" </when>" +
" <when test='timeType == \"month\"'>" +
" to_char(dm.cur_time, 'YYYY-MM') = p.period " +
" </when>" +
" <when test='timeType == \"day\"'>" +
" to_char(dm.cur_time, 'YYYY-MM-DD') = p.period " +
" </when>" +
" <when test='timeType == \"hour\"'>" +
" to_char(dm.cur_time, 'YYYY-MM-DD HH24') = p.period " +
" </when>" +
" <otherwise>" +
" to_char(dm.cur_time, 'YYYY-MM') = p.period " +
" </otherwise>" +
" </choose>" +
" <if test='deviceNums != null and deviceNums.size() > 0'>" +
" AND dm.device_num IN " +
" <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
" #{item.mtNum} " +
" </foreach>" +
" </if>" +
" AND dm.cur_time >= #{startTime} AND dm.cur_time &lt;= #{endTime} " +
"GROUP BY p.period " +
"ORDER BY p.period; " +
"</script>")
List<ColumnFilter> energyAnalysisOneTable(@Param("deviceNums") List<CollectionParamsManage> deviceNums,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime,
@Param("timeType") String timeType);
} }

29
mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java

@ -1,14 +1,14 @@
package com.mh.system.service.overview.impl; package com.mh.system.service.overview.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mh.common.constant.CacheConstants;
import com.mh.common.core.domain.ColumnFilter; import com.mh.common.core.domain.ColumnFilter;
import com.mh.common.core.domain.dto.DeviceMonitorDTO; import com.mh.common.core.domain.dto.DeviceMonitorDTO;
import com.mh.common.core.domain.dto.OverviewEnergyDTO; import com.mh.common.core.domain.dto.OverviewEnergyDTO;
import com.mh.common.core.domain.dto.ProProfileDTO; import com.mh.common.core.domain.dto.ProProfileDTO;
import com.mh.common.core.domain.entity.ChillersEntity;
import com.mh.common.core.domain.entity.CollectionParamsManage; import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.DataMonth;
import com.mh.common.core.domain.entity.SysDictData; import com.mh.common.core.domain.entity.SysDictData;
import com.mh.common.core.redis.RedisCache;
import com.mh.common.utils.DateUtils; import com.mh.common.utils.DateUtils;
import com.mh.system.mapper.SysDictDataMapper; import com.mh.system.mapper.SysDictDataMapper;
import com.mh.system.mapper.device.CollectionParamsManageMapper; import com.mh.system.mapper.device.CollectionParamsManageMapper;
@ -35,13 +35,16 @@ import java.util.stream.Stream;
@Service @Service
public class ProOverviewServiceImpl implements IProOverviewService { public class ProOverviewServiceImpl implements IProOverviewService {
private final RedisCache redisCache;
private final CollectionParamsManageMapper collectionParamsManageMapper; private final CollectionParamsManageMapper collectionParamsManageMapper;
private final SysDictDataMapper sysDictDataMapper; private final SysDictDataMapper sysDictDataMapper;
private final OverviewMapper overviewMapper; private final OverviewMapper overviewMapper;
public ProOverviewServiceImpl(CollectionParamsManageMapper collectionParamsManageMapper, SysDictDataMapper sysDictDataMapper, OverviewMapper overviewMapper) { public ProOverviewServiceImpl(RedisCache redisCache, CollectionParamsManageMapper collectionParamsManageMapper, SysDictDataMapper sysDictDataMapper, OverviewMapper overviewMapper) {
this.redisCache = redisCache;
this.collectionParamsManageMapper = collectionParamsManageMapper; this.collectionParamsManageMapper = collectionParamsManageMapper;
this.sysDictDataMapper = sysDictDataMapper; this.sysDictDataMapper = sysDictDataMapper;
this.overviewMapper = overviewMapper; this.overviewMapper = overviewMapper;
@ -222,6 +225,13 @@ public class ProOverviewServiceImpl implements IProOverviewService {
@Override @Override
public List<OverviewEnergyDTO> energyAnalysis() { public List<OverviewEnergyDTO> energyAnalysis() {
// 添加缓存处理
if (redisCache.hasKey(CacheConstants.ENERGY_ANALYSIS)) {
List<OverviewEnergyDTO> energyAnalysis = redisCache.getCacheList(CacheConstants.ENERGY_ANALYSIS, OverviewEnergyDTO.class);
if (energyAnalysis != null && !energyAnalysis.isEmpty()) {
return energyAnalysis;
}
}
// 查询系统类型数据 // 查询系统类型数据
List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type"); List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type");
// 定义参数类型 // 定义参数类型
@ -270,6 +280,9 @@ public class ProOverviewServiceImpl implements IProOverviewService {
initialEnergyData(dataList, energyMap.get(paramType), getEnergyLabel(paramType), getEnergyUnit(paramType), result); initialEnergyData(dataList, energyMap.get(paramType), getEnergyLabel(paramType), getEnergyUnit(paramType), result);
} }
})).toArray(CompletableFuture[]::new)).join(); })).toArray(CompletableFuture[]::new)).join();
redisCache.deleteObject(CacheConstants.ENERGY_ANALYSIS);
redisCache.setCacheList(CacheConstants.ENERGY_ANALYSIS, result.isEmpty() ? List.of() : result);
redisCache.expire(CacheConstants.ENERGY_ANALYSIS, 60 * 60);
return result.isEmpty() ? List.of() : result; return result.isEmpty() ? List.of() : result;
} }
@ -381,6 +394,13 @@ public class ProOverviewServiceImpl implements IProOverviewService {
@Override @Override
public List<ProProfileDTO> getProProfile() { public List<ProProfileDTO> getProProfile() {
// 增加缓存处理
if (redisCache.hasKey(CacheConstants.PRO_PROFILE)) {
List<ProProfileDTO> resultList = redisCache.getCacheList(CacheConstants.PRO_PROFILE, ProProfileDTO.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
}
// 请求各个系统中有没有对应的总表,如果有直接查询总表,没有就是各个分表之和 // 请求各个系统中有没有对应的总表,如果有直接查询总表,没有就是各个分表之和
List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type"); List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type");
String[] paramTypes = {"16", "17", "18", "19"}; String[] paramTypes = {"16", "17", "18", "19"};
@ -482,6 +502,9 @@ public class ProOverviewServiceImpl implements IProOverviewService {
} }
ProProfileDTO proProfileDTO = new ProProfileDTO(totalEle, totalCold, totalWater, totalGas, yearEle, yearCold, yearWater, yearGas); ProProfileDTO proProfileDTO = new ProProfileDTO(totalEle, totalCold, totalWater, totalGas, yearEle, yearCold, yearWater, yearGas);
redisCache.deleteObject(CacheConstants.PRO_PROFILE);
redisCache.setCacheList(CacheConstants.PRO_PROFILE, List.of(proProfileDTO));
redisCache.expire(CacheConstants.PRO_PROFILE, 60 * 60);
return List.of(proProfileDTO); return List.of(proProfileDTO);
} }

287
mh-system/src/main/java/com/mh/system/service/report/impl/ComprehensiveReportServiceImpl.java

@ -42,77 +42,185 @@ public class ComprehensiveReportServiceImpl implements IComprehensiveReportServi
@Override @Override
public List<?> report(EnergyQueryVO vo) { public List<?> report(EnergyQueryVO vo) {
DateUtils.sysEnergyDateChange(vo); DateUtils.sysEnergyDateChange(vo);
// 获取参数 // 获取参数
AtomicReference<String> lastTableName = new AtomicReference<>("data_" + vo.getTimeType()); String lastTableName = "data_" + vo.getTimeType();
AtomicReference<String> curTableName = new AtomicReference<>("data_" + vo.getTimeType()); String curTableName = "data_" + vo.getTimeType();
String timeType = vo.getTimeType(); String timeType = vo.getTimeType();
// 判断是否是单表 // 判断是否是单表
boolean isSingleTable = "month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType); boolean isSingleTable = "month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType);
if (!isSingleTable) { if (!isSingleTable) {
lastTableName.set(lastTableName + vo.getStartTime().substring(0, 4)); lastTableName = lastTableName + vo.getStartTime().substring(0, 4);
curTableName.set(curTableName + vo.getEndTime().substring(0, 4)); curTableName = curTableName + vo.getEndTime().substring(0, 4);
} }
// 查询系统类型数据 // 查询系统类型数据
List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type"); List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type");
// 定义参数类型 // 定义参数类型
String[] paramTypes = {"16", "17", "18", "19"}; String[] paramTypes = {"16", "17", "18", "19"};
// 初始化结果列表
// 批量查询所有采集参数
Map<String, List<CollectionParamsManage>> allCollectionParams = batchQueryCollectionParams(paramTypes, sysTypeData);
// 批量查询能耗数据
Map<String, List<ColumnFilter>> allEnergyData = batchQueryEnergyData(
allCollectionParams, lastTableName, curTableName, vo, timeType, isSingleTable);
// 构建结果
List<OverviewEnergyDTO> result = new ArrayList<>(); List<OverviewEnergyDTO> result = new ArrayList<>();
// 使用Map存储不同类型的能源DTO
Map<String, OverviewEnergyDTO> energyMap = new HashMap<>(); Map<String, OverviewEnergyDTO> energyMap = new HashMap<>();
energyMap.put("16", new OverviewEnergyDTO()); energyMap.put("16", new OverviewEnergyDTO());
energyMap.put("17", new OverviewEnergyDTO()); energyMap.put("17", new OverviewEnergyDTO());
energyMap.put("18", new OverviewEnergyDTO()); energyMap.put("18", new OverviewEnergyDTO());
energyMap.put("19", new OverviewEnergyDTO()); energyMap.put("19", new OverviewEnergyDTO());
// 组合并处理数据
for (String paramType : paramTypes) { for (String paramType : paramTypes) {
List<ColumnFilter> dataList = new ArrayList<>(); List<ColumnFilter> combinedData = new ArrayList<>();
for (SysDictData sysDictData : sysTypeData) { for (SysDictData sysDictData : sysTypeData) {
String sysType = sysDictData.getDictValue(); String sysType = sysDictData.getDictValue();
// 查询采集参数 String key = paramType + "_" + sysType;
List<CollectionParamsManage> collectionParamsManages = queryCollectionParams(paramType, sysType, 40, null, false); List<ColumnFilter> typeData = allEnergyData.get(key);
// 合并数据 if (typeData != null) {
if (collectionParamsManages != null && !collectionParamsManages.isEmpty()) { combinedData.addAll(typeData);
// 判断两个表是否一样 }
boolean isSameTable = lastTableName.get().equals(curTableName.get()); }
if (isSameTable) { initialEnergyData(combinedData, energyMap.get(paramType),
List<ColumnFilter> columnFilters = comprehensiveReportMapper.energyAnalysisOneTable(collectionParamsManages, getEnergyLabel(paramType), getEnergyUnit(paramType), result);
lastTableName.get(), }
curTableName.get(),
DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getStartTime()), // 转换为最终结果
DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getEndTime()), return convertToCompreReportDTO(result);
timeType); }
dataList.addAll(columnFilters);
private Map<String, List<CollectionParamsManage>> batchQueryCollectionParams(
String[] paramTypes, List<SysDictData> sysTypeData) {
Map<String, List<CollectionParamsManage>> allCollectionParams = new HashMap<>();
// 批量查询所有参数
List<CollectionParamsManage> allParams = queryAllCollectionParams(paramTypes, sysTypeData);
// 按参数类型和系统类型分组
Map<String, List<CollectionParamsManage>> groupedParams = allParams.stream()
.collect(Collectors.groupingBy(param ->
param.getParamType() + "_" + param.getSystemType()));
// 验证并补充缺失的总表数据
for (String paramType : paramTypes) {
for (SysDictData sysDictData : sysTypeData) {
String sysType = sysDictData.getDictValue();
String key = paramType + "_" + sysType;
List<CollectionParamsManage> params = groupedParams.get(key);
if (params == null || params.isEmpty()) {
// 尝试查询总表
params = queryCollectionParamsFromSumTable(paramType, sysType, 40);
if (params != null && !params.isEmpty()) {
allCollectionParams.put(key, params);
}
} else {
allCollectionParams.put(key, params);
}
}
}
return allCollectionParams;
}
private List<CollectionParamsManage> queryAllCollectionParams(String[] paramTypes, List<SysDictData> sysTypeData) {
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("grade", 40);
// 构建所有条件的组合
if (paramTypes.length > 0 && sysTypeData.size() > 0) {
boolean firstCondition = true;
for (String paramType : paramTypes) {
for (SysDictData sysDictData : sysTypeData) {
if (firstCondition) {
queryWrapper.nested(nested -> nested.eq("param_type", paramType)
.eq("system_type", sysDictData.getDictValue()));
firstCondition = false;
} else { } else {
// 两个表不一样 queryWrapper.or().nested(nested -> nested.eq("param_type", paramType)
List<ColumnFilter> columnFilters = comprehensiveReportMapper.energyAnalysisManyTable(collectionParamsManages, .eq("system_type", sysDictData.getDictValue()));
lastTableName.get(),
curTableName.get(),
DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getStartTime()),
DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getEndTime()),
timeType);
dataList.addAll(columnFilters);
} }
} }
} }
// 初始化能源数据 }
initialEnergyData(dataList, energyMap.get(paramType), getEnergyLabel(paramType), getEnergyUnit(paramType), result);
return collectionParamsManageMapper.selectList(queryWrapper);
}
private List<CollectionParamsManage> queryCollectionParamsFromSumTable(String paramType, String sysType, int grade) {
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType)
.eq("grade", grade)
.eq("mt_is_sum", 0); // 查询总表
return collectionParamsManageMapper.selectList(queryWrapper);
}
// private Map<String, List<CollectionParamsManage>> batchQueryCollectionParams(
// String[] paramTypes, List<SysDictData> sysTypeData) {
//
// Map<String, List<CollectionParamsManage>> allCollectionParams = new HashMap<>();
//
// // 构建所有需要查询的组合
// for (String paramType : paramTypes) {
// for (SysDictData sysDictData : sysTypeData) {
// String sysType = sysDictData.getDictValue();
// List<CollectionParamsManage> params = queryCollectionParams(paramType, sysType, 40, null, false);
// if (params != null && !params.isEmpty()) {
// String key = paramType + "_" + sysType;
// allCollectionParams.put(key, params);
// }
// }
// }
//
// return allCollectionParams;
// }
private Map<String, List<ColumnFilter>> batchQueryEnergyData(
Map<String, List<CollectionParamsManage>> allCollectionParams,
String lastTableName, String curTableName, EnergyQueryVO vo,
String timeType, boolean isSingleTable) {
Map<String, List<ColumnFilter>> result = new HashMap<>();
Date startTime = DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getStartTime());
Date endTime = DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getEndTime());
for (Map.Entry<String, List<CollectionParamsManage>> entry : allCollectionParams.entrySet()) {
String key = entry.getKey();
List<CollectionParamsManage> params = entry.getValue();
List<ColumnFilter> data;
if (isSingleTable) {
data = comprehensiveReportMapper.energyAnalysisOneTable(
params, lastTableName, curTableName, startTime, endTime, timeType);
} else {
data = comprehensiveReportMapper.energyAnalysisManyTable(
params, lastTableName, curTableName, startTime, endTime, timeType);
}
result.put(key, data);
} }
// 这里再拆分result数据,根据每个对象的时间进行比较赋值,如果都是相等,然后分别赋值给CompreReportDTO,其中
// name="总用电量"的对应的data赋值给CompreReportDTO的electValue, return result;
// name="总热水补水量"的对应的data赋值给CompreReportDTO的hotValue, }
// name="总产冷量"的对应的data赋值给CompreReportDTO的coldValue,
// name="总蒸汽流量"的对应的data赋值给CompreReportDTO的steamValue, private List<CompreReportDTO> convertToCompreReportDTO(List<OverviewEnergyDTO> result) {
// timeStr就赋值给CompreReportDTO的time
List<CompreReportDTO> compreReportDTOS = new ArrayList<>(); List<CompreReportDTO> compreReportDTOS = new ArrayList<>();
if (!result.isEmpty()) { if (!result.isEmpty()) {
// 将结果按照名称映射
Map<String, OverviewEnergyDTO> energyDataMap = result.stream() Map<String, OverviewEnergyDTO> energyDataMap = result.stream()
.collect(Collectors.toMap(OverviewEnergyDTO::getName, dto -> dto)); .collect(Collectors.toMap(OverviewEnergyDTO::getName, dto -> dto, (existing, replacement) -> existing));
// 获取各种能源类型的数据
OverviewEnergyDTO electDto = energyDataMap.get("总用电量"); OverviewEnergyDTO electDto = energyDataMap.get("总用电量");
OverviewEnergyDTO hotDto = energyDataMap.get("总热水补水量"); OverviewEnergyDTO hotDto = energyDataMap.get("总热水补水量");
OverviewEnergyDTO coldDto = energyDataMap.get("总产冷量"); OverviewEnergyDTO coldDto = energyDataMap.get("总产冷量");
@ -138,9 +246,110 @@ public class ComprehensiveReportServiceImpl implements IComprehensiveReportServi
} }
return compreReportDTOS.isEmpty() ? List.of() : compreReportDTOS; return compreReportDTOS.isEmpty() ? List.of() : compreReportDTOS;
} }
// @Override
// public List<?> report(EnergyQueryVO vo) {
// DateUtils.sysEnergyDateChange(vo);
// // 获取参数
// AtomicReference<String> lastTableName = new AtomicReference<>("data_" + vo.getTimeType());
// AtomicReference<String> curTableName = new AtomicReference<>("data_" + vo.getTimeType());
// String timeType = vo.getTimeType();
//
// // 判断是否是单表
// boolean isSingleTable = "month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType);
// if (!isSingleTable) {
// lastTableName.set(lastTableName + vo.getStartTime().substring(0, 4));
// curTableName.set(curTableName + vo.getEndTime().substring(0, 4));
// }
//
// // 查询系统类型数据
// List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type");
// // 定义参数类型
// String[] paramTypes = {"16", "17", "18", "19"};
// // 初始化结果列表
// List<OverviewEnergyDTO> result = new ArrayList<>();
// // 使用Map存储不同类型的能源DTO
// Map<String, OverviewEnergyDTO> energyMap = new HashMap<>();
// energyMap.put("16", new OverviewEnergyDTO());
// energyMap.put("17", new OverviewEnergyDTO());
// energyMap.put("18", new OverviewEnergyDTO());
// energyMap.put("19", new OverviewEnergyDTO());
//
// for (String paramType : paramTypes) {
// List<ColumnFilter> dataList = new ArrayList<>();
// for (SysDictData sysDictData : sysTypeData) {
// String sysType = sysDictData.getDictValue();
// // 查询采集参数
// List<CollectionParamsManage> collectionParamsManages = queryCollectionParams(paramType, sysType, 40, null, false);
// // 合并数据
// if (collectionParamsManages != null && !collectionParamsManages.isEmpty()) {
// // 判断两个表是否一样
// boolean isSameTable = lastTableName.get().equals(curTableName.get());
// if (isSameTable) {
// List<ColumnFilter> columnFilters = comprehensiveReportMapper.energyAnalysisOneTable(collectionParamsManages,
// lastTableName.get(),
// curTableName.get(),
// DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getStartTime()),
// DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getEndTime()),
// timeType);
// dataList.addAll(columnFilters);
// } else {
// // 两个表不一样
// List<ColumnFilter> columnFilters = comprehensiveReportMapper.energyAnalysisManyTable(collectionParamsManages,
// lastTableName.get(),
// curTableName.get(),
// DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getStartTime()),
// DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", vo.getEndTime()),
// timeType);
// dataList.addAll(columnFilters);
// }
// }
// }
// // 初始化能源数据
// initialEnergyData(dataList, energyMap.get(paramType), getEnergyLabel(paramType), getEnergyUnit(paramType), result);
//
// }
// // 这里再拆分result数据,根据每个对象的时间进行比较赋值,如果都是相等,然后分别赋值给CompreReportDTO,其中
// // name="总用电量"的对应的data赋值给CompreReportDTO的electValue,
// // name="总热水补水量"的对应的data赋值给CompreReportDTO的hotValue,
// // name="总产冷量"的对应的data赋值给CompreReportDTO的coldValue,
// // name="总蒸汽流量"的对应的data赋值给CompreReportDTO的steamValue,
// // timeStr就赋值给CompreReportDTO的time
// List<CompreReportDTO> compreReportDTOS = new ArrayList<>();
//
// if (!result.isEmpty()) {
// Map<String, OverviewEnergyDTO> energyDataMap = result.stream()
// .collect(Collectors.toMap(OverviewEnergyDTO::getName, dto -> dto));
//
// OverviewEnergyDTO electDto = energyDataMap.get("总用电量");
// OverviewEnergyDTO hotDto = energyDataMap.get("总热水补水量");
// OverviewEnergyDTO coldDto = energyDataMap.get("总产冷量");
// OverviewEnergyDTO steamDto = energyDataMap.get("总蒸汽流量");
//
// if (electDto != null && electDto.getTimeStr() != null) {
// String[] times = electDto.getTimeStr();
// String[] electValues = electDto.getData();
// String[] hotValues = hotDto != null ? hotDto.getData() : new String[times.length];
// String[] coldValues = coldDto != null ? coldDto.getData() : new String[times.length];
// String[] steamValues = steamDto != null ? steamDto.getData() : new String[times.length];
//
// for (int i = 0; i < times.length; i++) {
// CompreReportDTO dto = new CompreReportDTO();
// dto.setTime(times[i]);
// dto.setElectValue(i < electValues.length ? electValues[i] : "0.00");
// dto.setHotValue(i < hotValues.length ? hotValues[i] : "0.00");
// dto.setColdValue(i < coldValues.length ? coldValues[i] : "0.00");
// dto.setSteamValue(i < steamValues.length ? steamValues[i] : "0.00");
// compreReportDTOS.add(dto);
// }
// }
// }
//
// return compreReportDTOS.isEmpty() ? List.of() : compreReportDTOS;
//
// }
private List<CollectionParamsManage> queryCollectionParams(String paramType, String sysType, int grade, String terminalDeviceType, boolean isNow) { private List<CollectionParamsManage> queryCollectionParams(String paramType, String sysType, int grade, String terminalDeviceType, boolean isNow) {
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>(); QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();

Loading…
Cancel
Save