Browse Source

1、优化首页查询sql;

2、修复冷源能耗查询出现的bug,实体类缺少price;
dev_mz
25604 4 days ago
parent
commit
e0df3ad93a
  1. 76
      mh-common/src/main/java/com/mh/common/core/domain/entity/CollectionParamsManage.java
  2. 5
      mh-common/src/main/java/com/mh/common/utils/DateUtils.java
  3. 12
      mh-system/src/main/java/com/mh/system/mapper/energy/OverviewMapper.java
  4. 236
      mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java

76
mh-common/src/main/java/com/mh/common/core/domain/entity/CollectionParamsManage.java

@ -14,6 +14,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.StringJoiner;
/** /**
* @author LJF * @author LJF
@ -197,42 +198,49 @@ public class CollectionParamsManage extends BaseEntity {
*/ */
private String terminalDeviceType; private String terminalDeviceType;
/**
* 价格
*/
private BigDecimal price;
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this) return new StringJoiner(", ", CollectionParamsManage.class.getSimpleName() + "[", "]")
.append("id", id) .add("id='" + id + "'")
.append("deviceLedgerId", deviceLedgerId) .add("deviceLedgerId='" + deviceLedgerId + "'")
.append("mtType", mtType) .add("mtType='" + mtType + "'")
.append("mtNum", mtNum) .add("mtNum='" + mtNum + "'")
.append("mtCode", mtCode) .add("mtCode='" + mtCode + "'")
.append("registerAddr", registerAddr) .add("registerAddr='" + registerAddr + "'")
.append("funcCode", funcCode) .add("funcCode='" + funcCode + "'")
.append("identifyCode", identifyCode) .add("identifyCode='" + identifyCode + "'")
.append("mtCaliberPulse", mtCaliberPulse) .add("mtCaliberPulse='" + mtCaliberPulse + "'")
.append("mtRange", mtRange) .add("mtRange=" + mtRange)
.append("mtRatio", mtRatio) .add("mtRatio=" + mtRatio)
.append("mtInitValue", mtInitValue) .add("mtInitValue=" + mtInitValue)
.append("digits", digits) .add("digits=" + digits)
.append("dataType", dataType) .add("dataType=" + dataType)
.append("curValue", curValue) .add("curValue=" + curValue)
.append("curTime", curTime) .add("curTime=" + curTime)
.append("mtIsSum", mtIsSum) .add("mtIsSum=" + mtIsSum)
.append("unit", unit) .add("unit='" + unit + "'")
.append("orderNum", orderNum) .add("orderNum=" + orderNum)
.append("gatewayId", gatewayId) .add("gatewayId='" + gatewayId + "'")
.append("communicationParamId", communicationParamId) .add("communicationParamId='" + communicationParamId + "'")
.append("protocolType", protocolType) .add("protocolType='" + protocolType + "'")
.append("communicationType", communicationType) .add("communicationType='" + communicationType + "'")
.append("registerSize", registerSize) .add("quality='" + quality + "'")
.append("isUse", isUse) .add("registerSize=" + registerSize)
.append("otherName", otherName) .add("isUse=" + isUse)
.append("grade", grade) .add("otherName='" + otherName + "'")
.append("searchValue", searchValue) .add("grade=" + grade)
.append("params", params) .add("searchValue='" + searchValue + "'")
.append("paramType", paramType) .add("params=" + params)
.append("systemType", systemType) .add("paramType='" + paramType + "'")
.append("collectionType", collectionType) .add("systemType='" + systemType + "'")
.append("terminalDeviceType", terminalDeviceType) .add("collectionType='" + collectionType + "'")
.add("terminalDeviceType='" + terminalDeviceType + "'")
.add("price=" + price)
.toString(); .toString();
} }
} }

5
mh-common/src/main/java/com/mh/common/utils/DateUtils.java

@ -37,6 +37,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String localDateToStr(LocalDateTime timeType) {
return timeType.format(DATE_TIME_FORMATTER);
}
public static String dayOfWeekValue() { public static String dayOfWeekValue() {
int dayOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); int dayOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
String result = ""; String result = "";

12
mh-system/src/main/java/com/mh/system/mapper/energy/OverviewMapper.java

@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
/** /**
@ -22,9 +23,9 @@ import java.util.List;
public interface OverviewMapper { public interface OverviewMapper {
@Select("<script>" + @Select("<script>" +
"select sum(calc_value) as calc_value from data_year where " + "SELECT SUM(calc_value) AS calc_value FROM data_year WHERE " +
" cur_time >= DATE_TRUNC('year', CURRENT_DATE)" + " cur_time >= #{yearStart}::timestamp " +
" AND cur_time &lt; DATE_TRUNC('year', CURRENT_DATE) + INTERVAL '1 year'" + " AND cur_time &lt;= #{yearEnd}::timestamp " +
" <if test='deviceNums != null and deviceNums.size() > 0'>" + " <if test='deviceNums != null and deviceNums.size() > 0'>" +
" AND device_num IN " + " AND device_num IN " +
" <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" + " <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
@ -32,7 +33,10 @@ public interface OverviewMapper {
" </foreach>" + " </foreach>" +
" </if>" + " </if>" +
"</script>") "</script>")
BigDecimal queryByDeviceNum(@Param("deviceNums") List<CollectionParamsManage> deviceNums); BigDecimal queryByDeviceNum(@Param("deviceNums") List<CollectionParamsManage> deviceNums,
@Param("yearStart") String yearStart,
@Param("yearEnd") String yearEnd);
@Select("<script>" + @Select("<script>" +
"WITH months AS ( " + "WITH months AS ( " +

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

@ -18,7 +18,10 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -190,45 +193,67 @@ public class ProOverviewServiceImpl implements IProOverviewService {
// 定义参数类型 // 定义参数类型
String[] paramTypes = {"16", "17", "18", "19"}; String[] paramTypes = {"16", "17", "18", "19"};
// 初始化结果列表 // 初始化结果列表
List<OverviewEnergyDTO> result = new ArrayList<>(); List<OverviewEnergyDTO> result = Collections.synchronizedList(new ArrayList<>());
// 使用Map存储不同类型的能源DTO // 使用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) { long startTime = System.currentTimeMillis();
List<ColumnFilter> dataList = new ArrayList<>(); // 使用 CompletableFuture 并行处理不同参数类型
for (SysDictData sysDictData : sysTypeData) {
String sysType = sysDictData.getDictValue(); // 等待所有任务完成
// 查询采集参数 CompletableFuture.allOf(Arrays.stream(paramTypes)
List<CollectionParamsManage> collectionParamsManages = queryCollectionParams(paramType, sysType, 40, null, false); .map(paramType -> CompletableFuture.runAsync(() -> {
// 合并数据 List<ColumnFilter> dataList = new ArrayList<>();
if (collectionParamsManages != null && !collectionParamsManages.isEmpty()) { // 并行处理系统类型
List<ColumnFilter> columnFilters = overviewMapper.energyAnalysis(collectionParamsManages); List<CompletableFuture<List<ColumnFilter>>> sysTypeFutures = sysTypeData.stream()
dataList.addAll(columnFilters); .map(sysDictData -> CompletableFuture.supplyAsync(() -> {
} String sysType = sysDictData.getDictValue();
} // 查询采集参数
// 初始化能源数据 List<CollectionParamsManage> collectionParamsManages = queryCollectionParams(paramType, sysType, 40, null, false);
initialEnergyData(dataList, energyMap.get(paramType), getEnergyLabel(paramType), getEnergyUnit(paramType), result); // 合并数据
if (collectionParamsManages != null && !collectionParamsManages.isEmpty()) {
} return overviewMapper.energyAnalysis(collectionParamsManages);
}
return new ArrayList<ColumnFilter>();
}))
.toList();
// 等待所有系统类型查询完成并合并数据
sysTypeFutures.forEach(future -> {
try {
List<ColumnFilter> columnFilters = future.get();
dataList.addAll(columnFilters);
} catch (Exception e) {
// 处理异常
e.printStackTrace();
}
});
// 初始化能源数据
synchronized (result) {
initialEnergyData(dataList, energyMap.get(paramType), getEnergyLabel(paramType), getEnergyUnit(paramType), result);
}
})).toArray(CompletableFuture[]::new)).join();
return result.isEmpty() ? List.of() : result; return result.isEmpty() ? List.of() : result;
} }
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();
String todayStr = today.toString(); // 格式为 'YYYY-MM-DD'
queryWrapper.eq("param_type", paramType) queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType) .eq("system_type", sysType)
.eq("grade", grade); .eq("grade", grade);
if (isNow) { if (isNow) {
queryWrapper.apply("DATE(cur_time) = DATE({0})", todayStr); // 使用 BETWEEN 替代函数调用,更好地利用索引
LocalDate today = LocalDate.now();
LocalDateTime startTime = today.atStartOfDay();
LocalDateTime endTime = today.atTime(23, 59, 59, 999_000_000);
queryWrapper.between("cur_time", startTime, endTime);
} }
if (terminalDeviceType != null && !terminalDeviceType.isEmpty()) { if (terminalDeviceType != null && !terminalDeviceType.isEmpty()) {
queryWrapper.eq("terminal_device_type", terminalDeviceType); queryWrapper.eq("terminal_device_type", terminalDeviceType);
} }
@ -245,16 +270,18 @@ public class ProOverviewServiceImpl implements IProOverviewService {
queryWrapper.eq("param_type", paramType) queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType) .eq("system_type", sysType)
.eq("grade", grade); .eq("grade", grade);
if (isNow) { if (isNow) {
queryWrapper.apply("DATE(cur_time) = DATE({0})", todayStr); LocalDate today = LocalDate.now();
LocalDateTime startTime = today.atStartOfDay();
LocalDateTime endTime = today.atTime(23, 59, 59, 999_000_000);
queryWrapper.between("cur_time", startTime, endTime);
} }
// if (terminalDeviceType != null && !terminalDeviceType.isEmpty()) {
// queryWrapper.eq("terminal_device_type", terminalDeviceType);
// }
return collectionParamsManageMapper.selectList(queryWrapper); return collectionParamsManageMapper.selectList(queryWrapper);
} }
private String getEnergyLabel(String paramType) { private String getEnergyLabel(String paramType) {
switch (paramType) { switch (paramType) {
case "16": case "16":
@ -322,81 +349,111 @@ public class ProOverviewServiceImpl implements IProOverviewService {
public List<ProProfileDTO> getProProfile() { public List<ProProfileDTO> getProProfile() {
// 请求各个系统中有没有对应的总表,如果有直接查询总表,没有就是各个分表之和 // 请求各个系统中有没有对应的总表,如果有直接查询总表,没有就是各个分表之和
List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type"); List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type");
// 查询采集参数是这几个的: String[] paramTypes = {"16", "17", "18", "19"};
// 耗电量 16
// 产冷量 17 BigDecimal totalEle = BigDecimal.ZERO;
// 用水量 18 BigDecimal totalCold = BigDecimal.ZERO;
// 用气量 19 BigDecimal totalWater = BigDecimal.ZERO;
BigDecimal totalEle = new BigDecimal(0); BigDecimal totalGas = BigDecimal.ZERO;
BigDecimal totalCold = new BigDecimal(0);
BigDecimal totalWater = new BigDecimal(0); BigDecimal yearEle = BigDecimal.ZERO;
BigDecimal totalGas = new BigDecimal(0); BigDecimal yearCold = BigDecimal.ZERO;
BigDecimal yearWater = BigDecimal.ZERO;
BigDecimal yearEle = new BigDecimal(0); BigDecimal yearGas = BigDecimal.ZERO;
BigDecimal yearCold = new BigDecimal(0);
BigDecimal yearWater = new BigDecimal(0);
BigDecimal yearGas = new BigDecimal(0);
// 今年开始时间,格式是yyyy-01-01 00:00:00
LocalDate now = LocalDate.now();
LocalDateTime startTime = now.with(TemporalAdjusters.firstDayOfYear()).atStartOfDay();
// 今年结束时间,格式是yyyy-MM-dd 23:59:59.999999999
LocalDateTime endTime = now.atTime(23, 59, 59, 999_000_000);
// 批量构建查询条件
List<Map<String, Object>> queryConditions = new ArrayList<>();
for (SysDictData sysDictData : sysTypeData) { for (SysDictData sysDictData : sysTypeData) {
String sysType = sysDictData.getDictValue(); String sysType = sysDictData.getDictValue();
String[] paramTypes = {"16", "17", "18", "19"};
for (String paramType : paramTypes) { for (String paramType : paramTypes) {
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>(); Map<String, Object> condition = new HashMap<>();
queryWrapper.eq("param_type", paramType); condition.put("paramType", paramType);
queryWrapper.eq("system_type", sysType); condition.put("sysType", sysType);
queryWrapper.eq("grade", 40); condition.put("startTime", startTime);
queryWrapper.eq("mt_is_sum", 0); condition.put("endTime", endTime);
queryWrapper.eq("is_use", 0); queryConditions.add(condition);
Long count = collectionParamsManageMapper.selectCount(queryWrapper); }
HashMap<String, BigDecimal> totalData = new HashMap<>(); }
if (count > 0) {
// 查询总表 // 并行处理所有查询条件
// queryWrapper.eq("terminal_device_type", "15"); List<CompletableFuture<Map<String, Object>>> futures = queryConditions.stream()
totalData = getTotalData(paramType, queryWrapper); .map(condition -> CompletableFuture.supplyAsync(() -> {
} else { String paramType = (String) condition.get("paramType");
// 查询分表综合 String sysType = (String) condition.get("sysType");
queryWrapper = new QueryWrapper<>();
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("param_type", paramType); queryWrapper.eq("param_type", paramType);
queryWrapper.eq("system_type", sysType); queryWrapper.eq("system_type", sysType);
queryWrapper.eq("grade", 40); queryWrapper.eq("grade", 40);
queryWrapper.eq("mt_is_sum", 1); queryWrapper.eq("mt_is_sum", 0);
// queryWrapper.ne("terminal_device_type", "15"); queryWrapper.eq("is_use", 0);
// 查询分表总和
totalData = getTotalData(paramType, queryWrapper); Long count = collectionParamsManageMapper.selectCount(queryWrapper);
} HashMap<String, BigDecimal> totalData = new HashMap<>();
BigDecimal totalValue = totalData.get("totalValue")==null ? BigDecimal.ZERO : totalData.get("totalValue");
BigDecimal yearValue = totalData.get("yearValue")==null ? BigDecimal.ZERO : totalData.get("yearValue"); if (count > 0) {
switch (Integer.parseInt(paramType)) { totalData = getTotalData(paramType, queryWrapper, startTime, endTime);
case 16: } else {
totalEle = totalEle.add(totalValue); queryWrapper = new QueryWrapper<>();
yearEle = yearEle.add(yearValue); queryWrapper.eq("param_type", paramType);
break; queryWrapper.eq("system_type", sysType);
case 17: queryWrapper.eq("grade", 40);
totalCold = totalCold.add(totalValue); queryWrapper.eq("mt_is_sum", 1);
yearCold = yearCold.add(yearValue); totalData = getTotalData(paramType, queryWrapper, startTime, endTime);
break; }
case 18:
totalWater = totalWater.add(totalValue);
yearWater = yearWater.add(yearValue);
break;
case 19:
totalGas = totalGas.add(totalValue);
yearGas = yearGas.add(yearValue);
break;
default:
break;
}
}
Map<String, Object> result = new HashMap<>();
result.put("paramType", paramType);
result.put("totalValue", totalData.get("totalValue") == null ? BigDecimal.ZERO : totalData.get("totalValue"));
result.put("yearValue", totalData.get("yearValue") == null ? BigDecimal.ZERO : totalData.get("yearValue"));
return result;
}))
.collect(Collectors.toList());
// 收集所有结果
List<Map<String, Object>> results = futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
// 汇总结果
for (Map<String, Object> result : results) {
String paramType = (String) result.get("paramType");
BigDecimal totalValue = (BigDecimal) result.get("totalValue");
BigDecimal yearValue = (BigDecimal) result.get("yearValue");
switch (Integer.parseInt(paramType)) {
case 16:
totalEle = totalEle.add(totalValue);
yearEle = yearEle.add(yearValue);
break;
case 17:
totalCold = totalCold.add(totalValue);
yearCold = yearCold.add(yearValue);
break;
case 18:
totalWater = totalWater.add(totalValue);
yearWater = yearWater.add(yearValue);
break;
case 19:
totalGas = totalGas.add(totalValue);
yearGas = yearGas.add(yearValue);
break;
}
} }
ProProfileDTO proProfileDTO = new ProProfileDTO(totalEle, totalCold, totalWater, totalGas, yearEle, yearCold, yearWater, yearGas); ProProfileDTO proProfileDTO = new ProProfileDTO(totalEle, totalCold, totalWater, totalGas, yearEle, yearCold, yearWater, yearGas);
List<ProProfileDTO> proProfileDTOS = new ArrayList<>(); return List.of(proProfileDTO);
proProfileDTOS.add(proProfileDTO);
return proProfileDTOS;
} }
private HashMap<String, BigDecimal> getTotalData(String paramType, private HashMap<String, BigDecimal> getTotalData(String paramType,
QueryWrapper<CollectionParamsManage> queryWrapper) { QueryWrapper<CollectionParamsManage> queryWrapper, LocalDateTime startTime, LocalDateTime endTime) {
List<CollectionParamsManage> collectionParamsManages = collectionParamsManageMapper.selectList(queryWrapper); List<CollectionParamsManage> collectionParamsManages = collectionParamsManageMapper.selectList(queryWrapper);
HashMap<String, BigDecimal> result = new HashMap<>(); HashMap<String, BigDecimal> result = new HashMap<>();
// 遍历计算得出总用电量 // 遍历计算得出总用电量
@ -412,7 +469,8 @@ public class ProOverviewServiceImpl implements IProOverviewService {
result.put("totalValue", totalValue[0]); result.put("totalValue", totalValue[0]);
// 计算得出今年的各个参数用量 // 计算得出今年的各个参数用量
if (!collectionParamsManages.isEmpty()) { if (!collectionParamsManages.isEmpty()) {
BigDecimal yearValue = overviewMapper.queryByDeviceNum(collectionParamsManages); // 开始计时
BigDecimal yearValue = overviewMapper.queryByDeviceNum(collectionParamsManages, DateUtils.localDateToStr(startTime), DateUtils.localDateToStr(endTime));
result.put("yearValue", yearValue == null ? BigDecimal.ZERO : yearValue); result.put("yearValue", yearValue == null ? BigDecimal.ZERO : yearValue);
} }
// switch (Integer.parseInt(paramType)) { // switch (Integer.parseInt(paramType)) {

Loading…
Cancel
Save