|
@@ -15,6 +15,8 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -35,331 +37,85 @@ public class TIronVisualScreenServiceImpl {
|
|
|
|
|
|
/***
|
|
|
* 实时数据图图例
|
|
|
- * @param result
|
|
|
+ * @param ironChart
|
|
|
* @return
|
|
|
*/
|
|
|
- public synchronized Map<String, Object> getIronLegend(Map<String, Object> result) {
|
|
|
- result = new LinkedHashMap<>();
|
|
|
-
|
|
|
-
|
|
|
-// // 1. 计算起止时间
|
|
|
-// int hours = 24;
|
|
|
-// //给固定时间,24小时之内
|
|
|
-// java.util.Date endTime = new java.util.Date();
|
|
|
-// java.util.Calendar cal = java.util.Calendar.getInstance();
|
|
|
-// cal.setTime(endTime);
|
|
|
-// cal.add(java.util.Calendar.HOUR_OF_DAY, -hours);
|
|
|
-// java.util.Date startTime = cal.getTime();
|
|
|
-
|
|
|
- // 1. 计算起止时间
|
|
|
- // 临时调试用,固定时间范围
|
|
|
- final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- final java.util.Date startTime;
|
|
|
- final java.util.Date endTime;
|
|
|
- try {
|
|
|
- startTime = sdf.parse("2025-07-13 02:15:00");
|
|
|
- endTime = sdf.parse("2025-07-14 00:20:00");
|
|
|
- } catch (Exception e) {
|
|
|
- throw new RuntimeException("时间解析失败", e);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 1. 生成完整的每一分钟时间点
|
|
|
- java.util.List<String> xAxis = new java.util.ArrayList<>();
|
|
|
- java.util.Calendar cursor = java.util.Calendar.getInstance();
|
|
|
- cursor.setTime(startTime);
|
|
|
- while (!cursor.getTime().after(endTime)) {
|
|
|
- xAxis.add(sdfMinute.format(cursor.getTime()));
|
|
|
- cursor.add(java.util.Calendar.MINUTE, 1);
|
|
|
+ public synchronized Map<String, Object> getIronLegend(Map<String, Object> ironChart, int ironPasstime) {
|
|
|
+ Map<String, Object> result = new LinkedHashMap<>();
|
|
|
+ if (ObjectUtils.isEmpty(ironChart)) {
|
|
|
+ return result;
|
|
|
}
|
|
|
+ // 1. 计算起止时间
|
|
|
+ int hours = 24;
|
|
|
+ //给固定时间,24小时之内
|
|
|
+ java.util.Date endTime = new java.util.Date();
|
|
|
+ java.util.Calendar cal = java.util.Calendar.getInstance();
|
|
|
+ cal.setTime(endTime);
|
|
|
+ cal.add(java.util.Calendar.HOUR_OF_DAY, -hours);
|
|
|
+ java.util.Date startTime = cal.getTime();
|
|
|
|
|
|
-
|
|
|
- //最新L2数据
|
|
|
- CompletableFuture<TL2Data> latestL2Future = CompletableFuture.supplyAsync(() ->
|
|
|
- tl2DataService.lambdaQuery()
|
|
|
- //.le(TL2Data::getIronStarttime, new SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date()))
|
|
|
- .eq(TL2Data::getTapholeId, "1")
|
|
|
- .orderByDesc(TL2Data::getIronStarttime)
|
|
|
- .last("limit 1").one()
|
|
|
- );
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //获取指定时间范围内的数据
|
|
|
- CompletableFuture<List<OPCData>> opcDataFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- opcDataService.lambdaQuery()
|
|
|
- .in(OPCData::getPointName, Arrays.asList(
|
|
|
- "BF4_1_IRONNOTCH_MIR_TEMP", // 温度
|
|
|
- "BF4_1_IRONNOTCH_RAILLINE_ACPIRON_SPEED1", // 1车流速
|
|
|
- "BF4_1_IRONNOTCH_RAILLINE_ACPIRON_SPEED2", // 2车流速
|
|
|
- "BF4_1TH_1_MIR_NWT", // 四高炉1TH-1号车铁水净重
|
|
|
- "BF4_1TH_2_MIR_NWT", // 四高炉1TH-2号车铁水净重
|
|
|
- "BF4_1_IRONNOTCH_TAPPING", // 四高炉1号铁口出铁状态
|
|
|
- "BF4_1TH_2_TPC_CARNO", // 1TH-2号车混铁车车号
|
|
|
- "BF4_1TH_1_TPC_CARNO" // 1TH-1号车混铁车车号
|
|
|
- ))
|
|
|
- .between(OPCData::getServerTime, startTime, endTime)
|
|
|
- .orderByAsc(OPCData::getServerTime)
|
|
|
- .list()
|
|
|
- );
|
|
|
-
|
|
|
- //获取指定时间范围的L2数据
|
|
|
- CompletableFuture<List<TL2Data>> l2DataFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- tl2DataService.lambdaQuery()
|
|
|
- .between(TL2Data::getIronStarttime,
|
|
|
- new SimpleDateFormat("yyyyMMddHHmmss").format(startTime),
|
|
|
- new SimpleDateFormat("yyyyMMddHHmmss").format(endTime))
|
|
|
- .eq(TL2Data::getTapholeId, "1")
|
|
|
- .orderByAsc(TL2Data::getIronStarttime)
|
|
|
- .list()
|
|
|
- );
|
|
|
-
|
|
|
-
|
|
|
- //获取上一个有效状态数据
|
|
|
- CompletableFuture<OPCData> preTappingFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- opcDataService.lambdaQuery()
|
|
|
- .eq(OPCData::getPointName, "BF4_1_IRONNOTCH_TAPPING")
|
|
|
- .isNotNull(OPCData::getData)
|
|
|
- .lt(OPCData::getServerTime, startTime)
|
|
|
- .orderByDesc(OPCData::getServerTime)
|
|
|
- .last("limit 1").one()
|
|
|
- );
|
|
|
-
|
|
|
- //获取当前有效出铁状态数据
|
|
|
- CompletableFuture<OPCData> currentTappingFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- opcDataService.lambdaQuery()
|
|
|
- .eq(OPCData::getPointName, "BF4_1_IRONNOTCH_TAPPING")
|
|
|
- .isNotNull(OPCData::getData)
|
|
|
- .orderByDesc(OPCData::getServerTime)
|
|
|
- .last("limit 1").one()
|
|
|
- );
|
|
|
-
|
|
|
-
|
|
|
- Integer preTappingVal = null;
|
|
|
- Integer currentTappingVal = 0;
|
|
|
-
|
|
|
- try {
|
|
|
- CompletableFuture.allOf(preTappingFuture, latestL2Future, opcDataFuture,currentTappingFuture,l2DataFuture).join();
|
|
|
- Map<String, List<OPCData>> opcDataMap = opcDataFuture.get().stream()
|
|
|
- .collect(Collectors.groupingBy(OPCData::getPointName));
|
|
|
-
|
|
|
- TL2Data latestL2 = latestL2Future.get();
|
|
|
- result.put("elementS", RealtimeData.builder().desc("铁水成分-硫").value(latestL2.getElementS()).build());
|
|
|
- result.put("elementSi", RealtimeData.builder().desc("铁水成分-硅").value(latestL2.getElementSi()).build());
|
|
|
- result.put("mudWeight", RealtimeData.builder().desc("打泥量").value(latestL2.getMudWeight()).unit("L").build());
|
|
|
- result.put("pollMm", RealtimeData.builder().desc("钻杆直径").value(latestL2.getPollMm()).unit("mm").build());
|
|
|
- result.put("openDepth", RealtimeData.builder().desc("开口深度").value(latestL2.getOpenDepth()).unit("mm").build());
|
|
|
-
|
|
|
- OPCData currentTapping = currentTappingFuture.get();
|
|
|
- if (currentTapping != null && currentTapping.getData() != null) {
|
|
|
- Object v = currentTapping.getData();
|
|
|
- if (v instanceof Number) currentTappingVal = ((Number) v).intValue();
|
|
|
- else if (v instanceof String) {
|
|
|
- String str = ((String) v).trim();
|
|
|
- if (!str.isEmpty()) {
|
|
|
- try {
|
|
|
- currentTappingVal = Integer.parseInt(str);
|
|
|
- } catch (Exception ignore) {
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- List<TL2Data> tl2DataList = l2DataFuture.get();
|
|
|
- RealtimeData ironCosttime = (RealtimeData) result.getOrDefault("ironCosttime", RealtimeData.builder().desc("出铁时间").unit("min").value(0).build());
|
|
|
- if (ObjectUtils.isNotEmpty(tl2DataList)) {
|
|
|
- List<List<Map<String, Object>>> collect = tl2DataList.stream().map(item -> {
|
|
|
- List<Map<String, Object>> mapList = new ArrayList<>();
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("name", String.format("第%s次出铁\n(%s号铁口)%s分钟", item.getIronNo(), item.getTapholeId(), item.getIronCosttime()));
|
|
|
- map.put("xAxis", TimeUtils.formatPartialDateString(item.getIronStarttime()));
|
|
|
- mapList.add(map);
|
|
|
-
|
|
|
- map = new HashMap<>();
|
|
|
- map.put("xAxis", TimeUtils.formatPartialDateString(item.getIronEndtime()));
|
|
|
- mapList.add(map);
|
|
|
-
|
|
|
- return mapList;
|
|
|
- }).collect(Collectors.toList());
|
|
|
-
|
|
|
- Map<String, Object> extraMap = new HashMap<>();
|
|
|
- extraMap.put("mark", collect);
|
|
|
- ironCosttime.setExtra(extraMap);
|
|
|
- }
|
|
|
- result.put("ironCosttime", ironCosttime);
|
|
|
-
|
|
|
- if(0 == currentTappingVal || 1 == currentTappingVal){
|
|
|
- result.put("ironWeight", RealtimeData.builder().desc("累计出铁量").unit("t").value(0).build());
|
|
|
- result.put("ironSpeed", RealtimeData.builder().desc("铁水流速").value(0).unit("t/min").build());
|
|
|
- result.put("ironTemp", RealtimeData.builder().desc("铁水温度").value(0).unit("℃").build());
|
|
|
-// result.put("ironCosttime", RealtimeData.builder().desc("出铁时间").value(0).unit("min").build());
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- //如果开始时间点没有值就从最近的获取
|
|
|
- OPCData preTapping = preTappingFuture.get();
|
|
|
-
|
|
|
- if (preTapping != null && preTapping.getData() != null) {
|
|
|
- Object v = preTapping.getData();
|
|
|
- if (v instanceof Number) preTappingVal = ((Number) v).intValue();
|
|
|
- else if (v instanceof String) {
|
|
|
- String str = ((String) v).trim();
|
|
|
- if (!str.isEmpty()) {
|
|
|
- try {
|
|
|
- preTappingVal = Integer.parseInt(str);
|
|
|
- } catch (Exception ignore) {
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //BF4_1TH_1_MIR_NWT 1号车净重
|
|
|
- CompletableFuture<List<IronTrendL1DTO>> weight1ListFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- opcDataMap.getOrDefault("BF4_1TH_1_MIR_NWT", new ArrayList<>())
|
|
|
- .stream().map(item -> {
|
|
|
- IronTrendL1DTO dto = new IronTrendL1DTO();
|
|
|
- dto.setData(item.getData());
|
|
|
- dto.setCreateTime(item.getSourceTime());
|
|
|
- return dto;
|
|
|
- }).collect(Collectors.toList())
|
|
|
- );
|
|
|
-
|
|
|
- //BF4_1TH_2_MIR_NWT 2号车净重
|
|
|
- CompletableFuture<List<IronTrendL1DTO>> weight2ListFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- opcDataMap.getOrDefault("BF4_1TH_2_MIR_NWT", new ArrayList<>())
|
|
|
- .stream().map(item -> {
|
|
|
- IronTrendL1DTO dto = new IronTrendL1DTO();
|
|
|
- dto.setData(item.getData());
|
|
|
- dto.setCreateTime(item.getSourceTime());
|
|
|
- return dto;
|
|
|
- }).collect(Collectors.toList())
|
|
|
- );
|
|
|
-
|
|
|
- //BF4_1TH_1_TPC_CARNO 2号车
|
|
|
- CompletableFuture<List<IronTrendL1DTO>> car1ListFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- opcDataMap.getOrDefault("BF4_1TH_1_TPC_CARNO", new ArrayList<>())
|
|
|
- .stream().map(item -> {
|
|
|
- IronTrendL1DTO dto = new IronTrendL1DTO();
|
|
|
- dto.setData(item.getData());
|
|
|
- dto.setCreateTime(item.getSourceTime());
|
|
|
- return dto;
|
|
|
- }).collect(Collectors.toList())
|
|
|
- );
|
|
|
-
|
|
|
- //BF4_1TH_2_TPC_CARNO 2号车
|
|
|
- CompletableFuture<List<IronTrendL1DTO>> car2ListFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- opcDataMap.getOrDefault("BF4_1TH_2_TPC_CARNO", new ArrayList<>())
|
|
|
- .stream().map(item -> {
|
|
|
- IronTrendL1DTO dto = new IronTrendL1DTO();
|
|
|
- dto.setData(item.getData());
|
|
|
- dto.setCreateTime(item.getSourceTime());
|
|
|
- return dto;
|
|
|
- }).collect(Collectors.toList())
|
|
|
- );
|
|
|
-
|
|
|
- //1号铁口状态
|
|
|
- CompletableFuture<List<IronTrendL1DTO>> tapping1ListFuture = CompletableFuture.supplyAsync(() ->
|
|
|
- opcDataMap.getOrDefault("BF4_1_IRONNOTCH_TAPPING", new ArrayList<>())
|
|
|
- .stream().map(item -> {
|
|
|
- IronTrendL1DTO dto = new IronTrendL1DTO();
|
|
|
- dto.setData(item.getData());
|
|
|
- dto.setCreateTime(item.getSourceTime());
|
|
|
- return dto;
|
|
|
- }).collect(Collectors.toList())
|
|
|
- );
|
|
|
-
|
|
|
- // 等待所有转换完成
|
|
|
- CompletableFuture.allOf(
|
|
|
- car1ListFuture,
|
|
|
- car2ListFuture,
|
|
|
- tapping1ListFuture,
|
|
|
- weight1ListFuture,
|
|
|
- weight2ListFuture
|
|
|
- ).join();
|
|
|
-
|
|
|
-
|
|
|
- // 构建每分钟tappingMap
|
|
|
- Map<String, Integer> tappingMap = new LinkedHashMap<>();
|
|
|
- List<OPCData> tappingList = opcDataMap.getOrDefault("BF4_1_IRONNOTCH_TAPPING", new ArrayList<>());
|
|
|
- Map<String, Integer> rawTappingMap = new LinkedHashMap<>();
|
|
|
- for (OPCData item : tappingList) {
|
|
|
- if (item.getServerTime() != null && item.getData() != null) {
|
|
|
- String min = sdfMinute.format(item.getServerTime());
|
|
|
- Integer val = null;
|
|
|
- Object v = item.getData();
|
|
|
- if (v instanceof Number) val = ((Number) v).intValue();
|
|
|
- else if (v instanceof String) {
|
|
|
- String str = ((String) v).trim();
|
|
|
- if (!str.isEmpty()) {
|
|
|
- try {
|
|
|
- val = Integer.parseInt(str);
|
|
|
- } catch (Exception ignore) {
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (val != null) rawTappingMap.put(min, val);
|
|
|
- }
|
|
|
- }
|
|
|
- Integer last = preTappingVal;
|
|
|
- for (String t : xAxis) {
|
|
|
- Integer v = rawTappingMap.getOrDefault(t, last);
|
|
|
- tappingMap.put(t, v);
|
|
|
- if (v != null) last = v;
|
|
|
- }
|
|
|
- List<IronTrendL1DTO> weight1List = weight1ListFuture.get();
|
|
|
- List<IronTrendL1DTO> weight2List = weight2ListFuture.get();
|
|
|
- List<IronTrendL1DTO> car1List = car1ListFuture.get();
|
|
|
- List<IronTrendL1DTO> car2List = car2ListFuture.get();
|
|
|
-
|
|
|
- int ironWeightScale = 2; // 可调整为0、1、2等
|
|
|
- List<List<Object>> ironWeightArr = buildIronWeightMinuteArray(xAxis, tappingMap, weight1List, weight2List, ironWeightScale);
|
|
|
-
|
|
|
- if (ObjectUtils.isNotEmpty(ironWeightArr)) {
|
|
|
+// // 1. 计算起止时间
|
|
|
+// // 临时调试用,固定时间范围
|
|
|
+// final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+// final java.util.Date startTime;
|
|
|
+// final java.util.Date endTime;
|
|
|
+// try {
|
|
|
+// startTime = sdf.parse("2025-07-13 02:15:00");
|
|
|
+// endTime = sdf.parse("2025-07-14 00:20:00");
|
|
|
+// } catch (Exception e) {
|
|
|
+// throw new RuntimeException("时间解析失败", e);
|
|
|
+// }
|
|
|
+
|
|
|
+ List<TL2Data> tl2DataList = tl2DataService.lambdaQuery()
|
|
|
+ .between(TL2Data::getIronStarttime,
|
|
|
+ new SimpleDateFormat("yyyyMMddHHmmss").format(startTime),
|
|
|
+ new SimpleDateFormat("yyyyMMddHHmmss").format(endTime))
|
|
|
+ .eq(TL2Data::getTapholeId, "1")
|
|
|
+ .orderByAsc(TL2Data::getIronStarttime)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ List<List<Object>> elementS = (List<List<Object>>) ironChart.get("elementS");
|
|
|
+ List<List<Object>> elementSi = (List<List<Object>>) ironChart.get("elementSi");
|
|
|
+ List<List<Object>> mudWeight = (List<List<Object>>) ironChart.get("mudWeight");
|
|
|
+ List<List<Object>> pollMm = (List<List<Object>>) ironChart.get("pollMm");
|
|
|
+ List<List<Object>> openDepth = (List<List<Object>>) ironChart.get("openDepth");
|
|
|
+ List<List<Object>> ironCosttime = (List<List<Object>>) ironChart.get("ironCosttime");
|
|
|
+ List<List<Object>> ironSpeed = (List<List<Object>>) ironChart.get("ironSpeed");
|
|
|
+ List<List<Object>> ironTemp = (List<List<Object>>) ironChart.get("ironTemp");
|
|
|
+ List<List<Object>> ironWeight = (List<List<Object>>) ironChart.get("ironWeight");
|
|
|
+
|
|
|
+ result.put("elementS", RealtimeData.builder().desc("铁水成分-硫").value(elementS.get(elementS.size() - 1).get(1)).build());
|
|
|
+ result.put("elementSi", RealtimeData.builder().desc("铁水成分-硅").value(elementSi.get(elementSi.size() - 1).get(1)).build());
|
|
|
+ result.put("mudWeight", RealtimeData.builder().desc("打泥量").value(mudWeight.get(mudWeight.size() - 1).get(1)).unit("L").build());
|
|
|
+ result.put("pollMm", RealtimeData.builder().desc("钻杆直径").value(pollMm.get(pollMm.size() - 1).get(1)).unit("mm").build());
|
|
|
+ result.put("openDepth", RealtimeData.builder().desc("开口深度").value(openDepth.get(openDepth.size() - 1).get(1)).unit("mm").build());
|
|
|
+
|
|
|
+
|
|
|
+ RealtimeData realtimeDataIronConsttime = RealtimeData.builder().desc("出铁时间").unit("min").value(ironPasstime).build();
|
|
|
+ if (ObjectUtils.isNotEmpty(tl2DataList)) {
|
|
|
+ List<List<Map<String, Object>>> collect = tl2DataList.stream().map(item -> {
|
|
|
List<Map<String, Object>> mapList = new ArrayList<>();
|
|
|
- for (List<Object> objects : ironWeightArr) {
|
|
|
- String string = objects.get(0).toString();
|
|
|
- String data = objects.get(1).toString();
|
|
|
- for (IronTrendL1DTO ironTrendL1DTO : car1List) {
|
|
|
- if (sdfMinute.format(ironTrendL1DTO.getCreateTime()).equals(string)) {
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("value", ironTrendL1DTO.getData() + "#");
|
|
|
- map.put("xAxis", sdfMinute.format(ironTrendL1DTO.getCreateTime()));
|
|
|
- map.put("yAxis", data);
|
|
|
- mapList.add(map);
|
|
|
- }
|
|
|
- }
|
|
|
- for (IronTrendL1DTO ironTrendL1DTO : car2List) {
|
|
|
- if (sdfMinute.format(ironTrendL1DTO.getCreateTime()).equals(string)) {
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("value", ironTrendL1DTO.getData() + "#");
|
|
|
- map.put("xAxis", sdfMinute.format(ironTrendL1DTO.getCreateTime()));
|
|
|
- map.put("yAxis", data);
|
|
|
- mapList.add(map);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- RealtimeData ironWeight = (RealtimeData) result.getOrDefault("ironWeight", RealtimeData.builder().desc("累计出铁量").unit("t").value(0).build());
|
|
|
- Map<String, Object> extraMap = new HashMap<>();
|
|
|
- extraMap.put("mark", new ArrayList<>());
|
|
|
- ironWeight.setExtra(extraMap);
|
|
|
-
|
|
|
- result.put("ironWeight", ironWeight);
|
|
|
- }
|
|
|
-
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("name", String.format("第%s次出铁\n(%s号铁口)%s分钟", item.getIronNo(), item.getTapholeId(), item.getIronCosttime()));
|
|
|
+ map.put("xAxis", TimeUtils.formatPartialDateString(item.getIronStarttime()));
|
|
|
+ mapList.add(map);
|
|
|
|
|
|
+ map = new HashMap<>();
|
|
|
+ map.put("xAxis", TimeUtils.formatPartialDateString(item.getIronEndtime()));
|
|
|
+ mapList.add(map);
|
|
|
|
|
|
+ return mapList;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
+ Map<String, Object> extraMap = new HashMap<>();
|
|
|
+ extraMap.put("mark", collect);
|
|
|
+ realtimeDataIronConsttime.setExtra(extraMap);
|
|
|
}
|
|
|
+ result.put("ironCosttime", realtimeDataIronConsttime);
|
|
|
+
|
|
|
+ result.put("ironWeight", RealtimeData.builder().desc("累计出铁量").value(ironWeight.get(ironWeight.size() - 1).get(1)).unit("t").build());
|
|
|
+ result.put("ironSpeed", RealtimeData.builder().desc("铁水流速").value(ironSpeed.get(ironSpeed.size() - 1).get(1)).unit("t/min").build());
|
|
|
+ result.put("ironTemp", RealtimeData.builder().desc("铁水温度").value(ironTemp.get(ironTemp.size() - 1).get(1)).unit("℃").build());
|
|
|
|
|
|
return result;
|
|
|
}
|
|
@@ -373,25 +129,25 @@ public class TIronVisualScreenServiceImpl {
|
|
|
* @return
|
|
|
*/
|
|
|
public synchronized Map<String, Object> getIronChart(TrendRequest queryDateType) {
|
|
|
-// // 1. 计算起止时间
|
|
|
-// int hours = Objects.isNull(queryDateType.getQueryHourBefore()) ? 24 : queryDateType.getQueryHourBefore();
|
|
|
-// //给固定时间,24小时之内
|
|
|
-// java.util.Date endTime = new java.util.Date();
|
|
|
-// java.util.Calendar cal = java.util.Calendar.getInstance();
|
|
|
-// cal.setTime(endTime);
|
|
|
-// cal.add(java.util.Calendar.HOUR_OF_DAY, -hours);
|
|
|
-// java.util.Date startTime = cal.getTime();
|
|
|
+ // 1. 计算起止时间
|
|
|
+ int hours = Objects.isNull(queryDateType.getQueryHourBefore()) ? 24 : queryDateType.getQueryHourBefore();
|
|
|
+ //给固定时间,24小时之内
|
|
|
+ java.util.Date endTime = new java.util.Date();
|
|
|
+ java.util.Calendar cal = java.util.Calendar.getInstance();
|
|
|
+ cal.setTime(endTime);
|
|
|
+ cal.add(java.util.Calendar.HOUR_OF_DAY, -hours);
|
|
|
+ java.util.Date startTime = cal.getTime();
|
|
|
|
|
|
// 临时调试用,固定时间范围
|
|
|
- final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- final java.util.Date startTime;
|
|
|
- final java.util.Date endTime;
|
|
|
- try {
|
|
|
- startTime = sdf.parse("2025-07-13 02:15:00");
|
|
|
- endTime = sdf.parse("2025-07-14 00:20:00");
|
|
|
- } catch (Exception e) {
|
|
|
- throw new RuntimeException("时间解析失败", e);
|
|
|
- }
|
|
|
+// final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+// final java.util.Date startTime;
|
|
|
+// final java.util.Date endTime;
|
|
|
+// try {
|
|
|
+// startTime = sdf.parse("2025-07-19 09:30:00");
|
|
|
+// endTime = sdf.parse("2025-07-20 09:30:00");
|
|
|
+// } catch (Exception e) {
|
|
|
+// throw new RuntimeException("时间解析失败", e);
|
|
|
+// }
|
|
|
|
|
|
// 2. 异步查询所有数据
|
|
|
CompletableFuture<List<OPCData>> opcDataFuture = CompletableFuture.supplyAsync(() ->
|
|
@@ -657,24 +413,24 @@ public class TIronVisualScreenServiceImpl {
|
|
|
|
|
|
|
|
|
// 处理L2类数据,tapping=0时设为0
|
|
|
- List<List<Object>> elementSArr = buildL2MinuteArray(elemenList, xAxis, "elementS", preL2 != null ? preL2.getElementS() : null);
|
|
|
- List<List<Object>> elementSiArr = buildL2MinuteArray(elemenList, xAxis, "elementSi", preL2 != null ? preL2.getElementSi() : null);
|
|
|
- List<List<Object>> mudWeightArr = buildL2MinuteArray(elemenList, xAxis, "mudWeight", preL2 != null ? preL2.getMudWeight() : null);
|
|
|
- List<List<Object>> pollMmArr = buildL2MinuteArray(elemenList, xAxis, "pollMm", preL2 != null ? preL2.getPollMm() : null);
|
|
|
- List<List<Object>> openDepthArr = buildL2MinuteArray(elemenList, xAxis, "openDepth", preL2 != null ? preL2.getOpenDepth() : null);
|
|
|
- List<List<Object>> ironCosttimeArr = buildL2MinuteArray(elemenList, xAxis, "ironCosttime", preL2 != null ? preL2.getIronCosttime() : null);
|
|
|
- for (int i = 0; i < xAxis.size(); i++) {
|
|
|
- String t = xAxis.get(i);
|
|
|
- Integer tapping = tappingMap.getOrDefault(t, 0);
|
|
|
- if (tapping == 0) {
|
|
|
- if (elementSArr.get(i).size() > 1) elementSArr.get(i).set(1, 0);
|
|
|
- if (elementSiArr.get(i).size() > 1) elementSiArr.get(i).set(1, 0);
|
|
|
- if (mudWeightArr.get(i).size() > 1) mudWeightArr.get(i).set(1, 0);
|
|
|
- if (pollMmArr.get(i).size() > 1) pollMmArr.get(i).set(1, 0);
|
|
|
- if (openDepthArr.get(i).size() > 1) openDepthArr.get(i).set(1, 0);
|
|
|
- if (ironCosttimeArr.get(i).size() > 1) ironCosttimeArr.get(i).set(1, 0);
|
|
|
- }
|
|
|
- }
|
|
|
+ List<List<Object>> elementSArr = buildL2MinuteArray(elemenList, xAxis, tappingMap, "elementS", preL2 != null ? preL2.getElementS() : null);
|
|
|
+ List<List<Object>> elementSiArr = buildL2MinuteArray(elemenList, xAxis, tappingMap, "elementSi", preL2 != null ? preL2.getElementSi() : null);
|
|
|
+ List<List<Object>> mudWeightArr = buildL2MinuteArray(elemenList, xAxis, tappingMap, "mudWeight", preL2 != null ? preL2.getMudWeight() : null);
|
|
|
+ List<List<Object>> pollMmArr = buildL2MinuteArray(elemenList, xAxis, tappingMap, "pollMm", preL2 != null ? preL2.getPollMm() : null);
|
|
|
+ List<List<Object>> openDepthArr = buildL2MinuteArray(elemenList, xAxis, tappingMap, "openDepth", preL2 != null ? preL2.getOpenDepth() : null);
|
|
|
+ List<List<Object>> ironCosttimeArr = buildL2MinuteArray(elemenList, xAxis, tappingMap, "ironCosttime", preL2 != null ? preL2.getIronCosttime() : null);
|
|
|
+// for (int i = 0; i < xAxis.size(); i++) {
|
|
|
+// String t = xAxis.get(i);
|
|
|
+// Integer tapping = tappingMap.getOrDefault(t, 0);
|
|
|
+// if (tapping == 0) {
|
|
|
+// if (elementSArr.get(i).size() > 1) elementSArr.get(i).set(1, 0);
|
|
|
+// if (elementSiArr.get(i).size() > 1) elementSiArr.get(i).set(1, 0);
|
|
|
+// if (mudWeightArr.get(i).size() > 1) mudWeightArr.get(i).set(1, 0);
|
|
|
+// if (pollMmArr.get(i).size() > 1) pollMmArr.get(i).set(1, 0);
|
|
|
+// if (openDepthArr.get(i).size() > 1) openDepthArr.get(i).set(1, 0);
|
|
|
+// if (ironCosttimeArr.get(i).size() > 1) ironCosttimeArr.get(i).set(1, 0);
|
|
|
+// }
|
|
|
+// }
|
|
|
result.put("elementS", elementSArr);
|
|
|
result.put("elementSi", elementSiArr);
|
|
|
result.put("mudWeight", mudWeightArr);
|
|
@@ -772,11 +528,12 @@ public class TIronVisualScreenServiceImpl {
|
|
|
}
|
|
|
|
|
|
//L2
|
|
|
- private java.util.List<java.util.List<Object>> buildL2MinuteArray(java.util.List<IronTrendL2DTO> list, java.util.List<String> xAxis, String field, Object preValue) {
|
|
|
+ private java.util.List<java.util.List<Object>> buildL2MinuteArray(java.util.List<IronTrendL2DTO> list, java.util.List<String> xAxis, Map<String, Integer> tappingMap, String field, Object preValue) {
|
|
|
java.util.Map<String, Object> timeValueMap = new java.util.LinkedHashMap<>();
|
|
|
for (IronTrendL2DTO e : list) {
|
|
|
- String min = e.getIronStarttime();
|
|
|
- if (min != null) {
|
|
|
+ String startMin = TimeUtils.formatPartialDateStringMin(e.getIronStarttime());
|
|
|
+ String endMin = TimeUtils.formatPartialDateStringMin(e.getIronEndtime());
|
|
|
+ if (startMin != null && endMin != null) {
|
|
|
Object v = null;
|
|
|
switch (field) {
|
|
|
case "elementS":
|
|
@@ -798,16 +555,75 @@ public class TIronVisualScreenServiceImpl {
|
|
|
v = e.getIronCosttime();
|
|
|
break;
|
|
|
}
|
|
|
- timeValueMap.put(TimeUtils.formatPartialDateString(min), v);
|
|
|
+ // 定义时间格式
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:00");
|
|
|
+ // 解析字符串为LocalDateTime对象
|
|
|
+ LocalDateTime startTime = LocalDateTime.parse(startMin, formatter);
|
|
|
+ LocalDateTime endTime = LocalDateTime.parse(endMin, formatter);
|
|
|
+ // 遍历每一分钟
|
|
|
+ LocalDateTime currentTime = startTime;
|
|
|
+ while (!currentTime.isAfter(endTime)) {
|
|
|
+ timeValueMap.put(currentTime.format(formatter), v);
|
|
|
+ // 增加一分钟
|
|
|
+ currentTime = currentTime.plusMinutes(1);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
java.util.List<java.util.List<Object>> arr = new java.util.ArrayList<>();
|
|
|
Object last = preValue;
|
|
|
- for (String t : xAxis) {
|
|
|
- Object v = timeValueMap.getOrDefault(t, last);
|
|
|
- arr.add(java.util.Arrays.asList(t, v));
|
|
|
- if (v != null) last = v;
|
|
|
+// for (String time : xAxis) {
|
|
|
+// Integer tapping = tappingMap.getOrDefault(time, 0);
|
|
|
+// Object v = timeValueMap.getOrDefault(time, last);
|
|
|
+// double value = Double.parseDouble(v.toString());
|
|
|
+// if (tapping == 1) {
|
|
|
+// if (value == 0 ) {
|
|
|
+// //
|
|
|
+// value = last != null ? Double.parseDouble(last.toString()) : 0;
|
|
|
+// }
|
|
|
+// arr.add(java.util.Arrays.asList(time,value));
|
|
|
+// if (value != 0){
|
|
|
+// last = value;
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// arr.add(java.util.Arrays.asList(time, 0));
|
|
|
+// last = 0;
|
|
|
+// }
|
|
|
+// }
|
|
|
+ for (String time : xAxis) {
|
|
|
+ Object value = timeValueMap.getOrDefault(time, last);
|
|
|
+ List item = new ArrayList();
|
|
|
+ item.add(time);
|
|
|
+ Integer tapping = tappingMap.getOrDefault(time, 0);
|
|
|
+ if (tapping == 0) {
|
|
|
+ item.add(0);
|
|
|
+ last = null;
|
|
|
+ } else {
|
|
|
+ if (null == value) {
|
|
|
+ item.add(0);
|
|
|
+ last = null;
|
|
|
+ } else {
|
|
|
+ item.add(value);
|
|
|
+ last = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ arr.add(item);
|
|
|
}
|
|
|
+
|
|
|
+ //处理正在出铁的情况
|
|
|
+ if (tappingMap.getOrDefault(xAxis.get(xAxis.size() - 1), 0) > 0) {
|
|
|
+ //表明正在出铁中
|
|
|
+ for (int i = xAxis.size() - 1; i >= 0; i--) {
|
|
|
+ Integer tapping = tappingMap.getOrDefault(xAxis.get(i), 0);
|
|
|
+ if (tapping <= 0) {
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ if (arr.get(i).size() > 1) arr.get(i).set(1, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
return arr;
|
|
|
}
|
|
|
|
|
@@ -875,7 +691,6 @@ public class TIronVisualScreenServiceImpl {
|
|
|
for (int i = 0; i < xAxis.size(); i++) {
|
|
|
String time = xAxis.get(i);
|
|
|
Integer tapping = tappingMap.getOrDefault(time, 0);
|
|
|
- Double orDefault = weightMap.get(time);
|
|
|
java.math.BigDecimal w = new java.math.BigDecimal(weightMap.getOrDefault(time, 0d).toString());
|
|
|
if (tapping == 1) {
|
|
|
if (!inTappingCycle) {
|