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.util.Date;
import java.util.Map;
import java.util.StringJoiner;
/**
* @author LJF
@ -197,42 +198,49 @@ public class CollectionParamsManage extends BaseEntity {
*/
private String terminalDeviceType;
/**
* 价格
*/
private BigDecimal price;
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("deviceLedgerId", deviceLedgerId)
.append("mtType", mtType)
.append("mtNum", mtNum)
.append("mtCode", mtCode)
.append("registerAddr", registerAddr)
.append("funcCode", funcCode)
.append("identifyCode", identifyCode)
.append("mtCaliberPulse", mtCaliberPulse)
.append("mtRange", mtRange)
.append("mtRatio", mtRatio)
.append("mtInitValue", mtInitValue)
.append("digits", digits)
.append("dataType", dataType)
.append("curValue", curValue)
.append("curTime", curTime)
.append("mtIsSum", mtIsSum)
.append("unit", unit)
.append("orderNum", orderNum)
.append("gatewayId", gatewayId)
.append("communicationParamId", communicationParamId)
.append("protocolType", protocolType)
.append("communicationType", communicationType)
.append("registerSize", registerSize)
.append("isUse", isUse)
.append("otherName", otherName)
.append("grade", grade)
.append("searchValue", searchValue)
.append("params", params)
.append("paramType", paramType)
.append("systemType", systemType)
.append("collectionType", collectionType)
.append("terminalDeviceType", terminalDeviceType)
return new StringJoiner(", ", CollectionParamsManage.class.getSimpleName() + "[", "]")
.add("id='" + id + "'")
.add("deviceLedgerId='" + deviceLedgerId + "'")
.add("mtType='" + mtType + "'")
.add("mtNum='" + mtNum + "'")
.add("mtCode='" + mtCode + "'")
.add("registerAddr='" + registerAddr + "'")
.add("funcCode='" + funcCode + "'")
.add("identifyCode='" + identifyCode + "'")
.add("mtCaliberPulse='" + mtCaliberPulse + "'")
.add("mtRange=" + mtRange)
.add("mtRatio=" + mtRatio)
.add("mtInitValue=" + mtInitValue)
.add("digits=" + digits)
.add("dataType=" + dataType)
.add("curValue=" + curValue)
.add("curTime=" + curTime)
.add("mtIsSum=" + mtIsSum)
.add("unit='" + unit + "'")
.add("orderNum=" + orderNum)
.add("gatewayId='" + gatewayId + "'")
.add("communicationParamId='" + communicationParamId + "'")
.add("protocolType='" + protocolType + "'")
.add("communicationType='" + communicationType + "'")
.add("quality='" + quality + "'")
.add("registerSize=" + registerSize)
.add("isUse=" + isUse)
.add("otherName='" + otherName + "'")
.add("grade=" + grade)
.add("searchValue='" + searchValue + "'")
.add("params=" + params)
.add("paramType='" + paramType + "'")
.add("systemType='" + systemType + "'")
.add("collectionType='" + collectionType + "'")
.add("terminalDeviceType='" + terminalDeviceType + "'")
.add("price=" + price)
.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"};
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() {
int dayOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
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 java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
@ -22,9 +23,9 @@ import java.util.List;
public interface OverviewMapper {
@Select("<script>" +
"select sum(calc_value) as calc_value from data_year where " +
" cur_time >= DATE_TRUNC('year', CURRENT_DATE)" +
" AND cur_time &lt; DATE_TRUNC('year', CURRENT_DATE) + INTERVAL '1 year'" +
"SELECT SUM(calc_value) AS calc_value FROM data_year WHERE " +
" cur_time >= #{yearStart}::timestamp " +
" AND cur_time &lt;= #{yearEnd}::timestamp " +
" <if test='deviceNums != null and deviceNums.size() > 0'>" +
" AND device_num IN " +
" <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
@ -32,7 +33,10 @@ public interface OverviewMapper {
" </foreach>" +
" </if>" +
"</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>" +
"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.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -190,45 +193,67 @@ public class ProOverviewServiceImpl implements IProOverviewService {
// 定义参数类型
String[] paramTypes = {"16", "17", "18", "19"};
// 初始化结果列表
List<OverviewEnergyDTO> result = new ArrayList<>();
List<OverviewEnergyDTO> result = Collections.synchronizedList(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()) {
List<ColumnFilter> columnFilters = overviewMapper.energyAnalysis(collectionParamsManages);
dataList.addAll(columnFilters);
}
}
// 初始化能源数据
initialEnergyData(dataList, energyMap.get(paramType), getEnergyLabel(paramType), getEnergyUnit(paramType), result);
}
// 开始计时
long startTime = System.currentTimeMillis();
// 使用 CompletableFuture 并行处理不同参数类型
// 等待所有任务完成
CompletableFuture.allOf(Arrays.stream(paramTypes)
.map(paramType -> CompletableFuture.runAsync(() -> {
List<ColumnFilter> dataList = new ArrayList<>();
// 并行处理系统类型
List<CompletableFuture<List<ColumnFilter>>> sysTypeFutures = sysTypeData.stream()
.map(sysDictData -> CompletableFuture.supplyAsync(() -> {
String sysType = sysDictData.getDictValue();
// 查询采集参数
List<CollectionParamsManage> collectionParamsManages = queryCollectionParams(paramType, sysType, 40, null, false);
// 合并数据
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;
}
private List<CollectionParamsManage> queryCollectionParams(String paramType, String sysType, int grade, String terminalDeviceType, boolean isNow) {
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
LocalDate today = LocalDate.now();
String todayStr = today.toString(); // 格式为 'YYYY-MM-DD'
queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType)
.eq("grade", grade);
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()) {
queryWrapper.eq("terminal_device_type", terminalDeviceType);
}
@ -245,16 +270,18 @@ public class ProOverviewServiceImpl implements IProOverviewService {
queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType)
.eq("grade", grade);
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);
}
private String getEnergyLabel(String paramType) {
switch (paramType) {
case "16":
@ -322,81 +349,111 @@ public class ProOverviewServiceImpl implements IProOverviewService {
public List<ProProfileDTO> getProProfile() {
// 请求各个系统中有没有对应的总表,如果有直接查询总表,没有就是各个分表之和
List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type");
// 查询采集参数是这几个的:
// 耗电量 16
// 产冷量 17
// 用水量 18
// 用气量 19
BigDecimal totalEle = new BigDecimal(0);
BigDecimal totalCold = new BigDecimal(0);
BigDecimal totalWater = new BigDecimal(0);
BigDecimal totalGas = new BigDecimal(0);
BigDecimal yearEle = new BigDecimal(0);
BigDecimal yearCold = new BigDecimal(0);
BigDecimal yearWater = new BigDecimal(0);
BigDecimal yearGas = new BigDecimal(0);
String[] paramTypes = {"16", "17", "18", "19"};
BigDecimal totalEle = BigDecimal.ZERO;
BigDecimal totalCold = BigDecimal.ZERO;
BigDecimal totalWater = BigDecimal.ZERO;
BigDecimal totalGas = BigDecimal.ZERO;
BigDecimal yearEle = BigDecimal.ZERO;
BigDecimal yearCold = BigDecimal.ZERO;
BigDecimal yearWater = BigDecimal.ZERO;
BigDecimal yearGas = BigDecimal.ZERO;
// 今年开始时间,格式是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) {
String sysType = sysDictData.getDictValue();
String[] paramTypes = {"16", "17", "18", "19"};
for (String paramType : paramTypes) {
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("param_type", paramType);
queryWrapper.eq("system_type", sysType);
queryWrapper.eq("grade", 40);
queryWrapper.eq("mt_is_sum", 0);
queryWrapper.eq("is_use", 0);
Long count = collectionParamsManageMapper.selectCount(queryWrapper);
HashMap<String, BigDecimal> totalData = new HashMap<>();
if (count > 0) {
// 查询总表
// queryWrapper.eq("terminal_device_type", "15");
totalData = getTotalData(paramType, queryWrapper);
} else {
// 查询分表综合
queryWrapper = new QueryWrapper<>();
Map<String, Object> condition = new HashMap<>();
condition.put("paramType", paramType);
condition.put("sysType", sysType);
condition.put("startTime", startTime);
condition.put("endTime", endTime);
queryConditions.add(condition);
}
}
// 并行处理所有查询条件
List<CompletableFuture<Map<String, Object>>> futures = queryConditions.stream()
.map(condition -> CompletableFuture.supplyAsync(() -> {
String paramType = (String) condition.get("paramType");
String sysType = (String) condition.get("sysType");
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("param_type", paramType);
queryWrapper.eq("system_type", sysType);
queryWrapper.eq("grade", 40);
queryWrapper.eq("mt_is_sum", 1);
// queryWrapper.ne("terminal_device_type", "15");
// 查询分表总和
totalData = getTotalData(paramType, queryWrapper);
}
BigDecimal totalValue = totalData.get("totalValue")==null ? BigDecimal.ZERO : totalData.get("totalValue");
BigDecimal yearValue = totalData.get("yearValue")==null ? BigDecimal.ZERO : totalData.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;
default:
break;
}
}
queryWrapper.eq("mt_is_sum", 0);
queryWrapper.eq("is_use", 0);
Long count = collectionParamsManageMapper.selectCount(queryWrapper);
HashMap<String, BigDecimal> totalData = new HashMap<>();
if (count > 0) {
totalData = getTotalData(paramType, queryWrapper, startTime, endTime);
} else {
queryWrapper = new QueryWrapper<>();
queryWrapper.eq("param_type", paramType);
queryWrapper.eq("system_type", sysType);
queryWrapper.eq("grade", 40);
queryWrapper.eq("mt_is_sum", 1);
totalData = getTotalData(paramType, queryWrapper, startTime, endTime);
}
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);
List<ProProfileDTO> proProfileDTOS = new ArrayList<>();
proProfileDTOS.add(proProfileDTO);
return proProfileDTOS;
return List.of(proProfileDTO);
}
private HashMap<String, BigDecimal> getTotalData(String paramType,
QueryWrapper<CollectionParamsManage> queryWrapper) {
QueryWrapper<CollectionParamsManage> queryWrapper, LocalDateTime startTime, LocalDateTime endTime) {
List<CollectionParamsManage> collectionParamsManages = collectionParamsManageMapper.selectList(queryWrapper);
HashMap<String, BigDecimal> result = new HashMap<>();
// 遍历计算得出总用电量
@ -412,7 +469,8 @@ public class ProOverviewServiceImpl implements IProOverviewService {
result.put("totalValue", totalValue[0]);
// 计算得出今年的各个参数用量
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);
}
// switch (Integer.parseInt(paramType)) {

Loading…
Cancel
Save