|
|
|
|
@ -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)) {
|
|
|
|
|
|