|
@@ -41,19 +41,15 @@ public class TIronVisualScreenServiceImpl {
|
|
|
* @return
|
|
|
*/
|
|
|
public Map<String, Object> getIronLegend(Map<String, Object> result) {
|
|
|
- java.util.Date startTime = new java.util.Date();
|
|
|
|
|
|
// L2类
|
|
|
- TL2Data preL2 = tl2DataService.lambdaQuery()
|
|
|
- .le(TL2Data::getIronStarttime, new SimpleDateFormat("yyyyMMddHHmmss").format(startTime))
|
|
|
- .orderByDesc(TL2Data::getIronStarttime)
|
|
|
- .last("limit 1").one();
|
|
|
-
|
|
|
- result.put("elementS", RealtimeData.builder().desc("铁水成分-硫").value(preL2.getElementS()).build());
|
|
|
- result.put("elementSi", RealtimeData.builder().desc("铁水成分-硅").value(preL2.getElementSi()).build());
|
|
|
- result.put("mudWeight", RealtimeData.builder().desc("泥炮量").value(preL2.getMudWeight()).unit("L").build());
|
|
|
- result.put("pollMm", RealtimeData.builder().desc("钻杆直径").value(preL2.getPollMm()).unit("mm").build());
|
|
|
- result.put("openDepth", RealtimeData.builder().desc("开口深度").value(preL2.getOpenDepth()).unit("mm").build());
|
|
|
+ CompletableFuture<TL2Data> preL2Future = 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()
|
|
|
+ );
|
|
|
|
|
|
// 1. 计算起止时间
|
|
|
int hours = 24;
|
|
@@ -62,52 +58,247 @@ public class TIronVisualScreenServiceImpl {
|
|
|
java.util.Calendar cal = java.util.Calendar.getInstance();
|
|
|
cal.setTime(endTime);
|
|
|
cal.add(java.util.Calendar.HOUR_OF_DAY, -hours);
|
|
|
- startTime = cal.getTime();
|
|
|
- List<OPCData> list = opcDataService.lambdaQuery()
|
|
|
- .in(OPCData::getPointName, Arrays.asList(
|
|
|
- "BF4_1TH_2_TPC_CARNO", // 1TH-2号车混铁车车号
|
|
|
- "BF4_1TH_1_TPC_CARNO" // 1TH-1号车混铁车车号
|
|
|
- ))
|
|
|
- .between(OPCData::getServerTime, startTime, endTime)
|
|
|
- .orderByAsc(OPCData::getServerTime)
|
|
|
- .list();
|
|
|
- if (ObjectUtils.isNotEmpty(list)) {
|
|
|
- RealtimeData ironWeight = (RealtimeData) result.getOrDefault("ironWeight", RealtimeData.builder().desc("铁水流量").unit("t").value(0).build());
|
|
|
- List<Map<String, Object>> collect = list.stream().map(item -> {
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("data", item.getData());
|
|
|
- map.put("createTime", sdfMinute.format(item.getSourceTime()));
|
|
|
- return map;
|
|
|
- }).collect(Collectors.toList());
|
|
|
-
|
|
|
- Map<String, Object> extraMap = new HashMap<>();
|
|
|
- extraMap.put("mark", collect);
|
|
|
- ironWeight.setExtra(extraMap);
|
|
|
-
|
|
|
- result.put("ironWeight", ironWeight);
|
|
|
+ java.util.Date startTime = cal.getTime();
|
|
|
+
|
|
|
+
|
|
|
+ // 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);
|
|
|
}
|
|
|
|
|
|
- List<TL2Data> list1 = tl2DataService.lambdaQuery()
|
|
|
- .between(TL2Data::getIronStarttime,
|
|
|
- new SimpleDateFormat("yyyyMMddHHmmss").format(startTime),
|
|
|
- new SimpleDateFormat("yyyyMMddHHmmss").format(endTime))
|
|
|
- .orderByAsc(TL2Data::getIronStarttime)
|
|
|
- .list();
|
|
|
-
|
|
|
- if (ObjectUtils.isNotEmpty(list1)) {
|
|
|
- RealtimeData ironCosttime = (RealtimeData) result.getOrDefault("ironCosttime", RealtimeData.builder().desc("出铁时间").unit("min").value(0).build());
|
|
|
- List<Map<String, Object>> collect = list1.stream().map(item -> {
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("data", String.format("第%s次出铁(%s号铁口)%s分钟",item.getIronNo(),item.getTapholeId(),item.getIronCosttime()));
|
|
|
- map.put("createTime", TimeUtils.formatPartialDateString(item.getIronStarttime()));
|
|
|
- return map;
|
|
|
- }).collect(Collectors.toList());
|
|
|
-
|
|
|
- Map<String, Object> extraMap = new HashMap<>();
|
|
|
- extraMap.put("mark", collect);
|
|
|
- ironCosttime.setExtra(extraMap);
|
|
|
-
|
|
|
- result.put("ironCosttime", ironCosttime);
|
|
|
+ //获取指定时间范围内的数据
|
|
|
+ CompletableFuture<List<OPCData>> opcDataFuture = CompletableFuture.supplyAsync(() ->
|
|
|
+ opcDataService.lambdaQuery()
|
|
|
+ .in(OPCData::getPointName, Arrays.asList(
|
|
|
+ "BF4_1TH_1_MIR_NWT", // 四高炉1TH-1号车铁水净重
|
|
|
+ "BF4_1TH_2_MIR_NWT", // 四高炉1TH-2号车铁水净重
|
|
|
+ "BF4_1_IRONNOTCH_TAPPING", // 四高炉1TH-2号车铁水净重
|
|
|
+ "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()
|
|
|
+ );
|
|
|
+
|
|
|
+ Integer preTappingVal = null;
|
|
|
+
|
|
|
+
|
|
|
+ try {
|
|
|
+ CompletableFuture.allOf(preTappingFuture, preL2Future, opcDataFuture).join();
|
|
|
+ Map<String, List<OPCData>> opcDataMap = opcDataFuture.get().stream()
|
|
|
+ .collect(Collectors.groupingBy(OPCData::getPointName));
|
|
|
+
|
|
|
+ TL2Data preL2 = preL2Future.get();
|
|
|
+
|
|
|
+
|
|
|
+ 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) {
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ result.put("elementS", RealtimeData.builder().desc("铁水成分-硫").value(preL2.getElementS()).build());
|
|
|
+ result.put("elementSi", RealtimeData.builder().desc("铁水成分-硅").value(preL2.getElementSi()).build());
|
|
|
+ result.put("mudWeight", RealtimeData.builder().desc("泥炮量").value(preL2.getMudWeight()).unit("L").build());
|
|
|
+ result.put("pollMm", RealtimeData.builder().desc("钻杆直径").value(preL2.getPollMm()).unit("mm").build());
|
|
|
+ result.put("openDepth", RealtimeData.builder().desc("开口深度").value(preL2.getOpenDepth()).unit("mm").build());
|
|
|
+
|
|
|
+ //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())
|
|
|
+ );
|
|
|
+ //BF4_1TH_2_TPC_CARNO 2号车净重
|
|
|
+ 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>> ironFlowArr = buildIronFlowMinuteArray(xAxis, tappingMap, weight1List, weight2List, ironWeightScale);
|
|
|
+
|
|
|
+ if (ObjectUtils.isNotEmpty(ironFlowArr)) {
|
|
|
+ List<Map<String, Object>> mapList = new ArrayList<>();
|
|
|
+ for (List<Object> objects : ironFlowArr) {
|
|
|
+ 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", mapList);
|
|
|
+ ironWeight.setExtra(extraMap);
|
|
|
+
|
|
|
+ result.put("ironWeight", ironWeight);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ List<TL2Data> tl2DataList = l2DataFuture.get();
|
|
|
+ if (ObjectUtils.isNotEmpty(tl2DataList)) {
|
|
|
+ RealtimeData ironCosttime = (RealtimeData) result.getOrDefault("ironCosttime", RealtimeData.builder().desc("出铁时间").unit("min").value(0).build());
|
|
|
+ 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次出铁(%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);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -155,6 +346,7 @@ public class TIronVisualScreenServiceImpl {
|
|
|
.between(TL2Data::getIronStarttime,
|
|
|
new SimpleDateFormat("yyyyMMddHHmmss").format(startTime),
|
|
|
new SimpleDateFormat("yyyyMMddHHmmss").format(endTime))
|
|
|
+ .eq(TL2Data::getTapholeId,"1")
|
|
|
.orderByAsc(TL2Data::getIronStarttime)
|
|
|
.list()
|
|
|
);
|
|
@@ -314,6 +506,7 @@ public class TIronVisualScreenServiceImpl {
|
|
|
// tappingMap补齐每一分钟,前面无数据用前置值补齐
|
|
|
// 先查区间前最近一条tapping
|
|
|
Integer preTappingVal = 0;
|
|
|
+
|
|
|
OPCData preTapping = opcDataService.lambdaQuery()
|
|
|
.eq(OPCData::getPointName, "BF4_1_IRONNOTCH_TAPPING")
|
|
|
.isNotNull(OPCData::getData)
|
|
@@ -324,6 +517,7 @@ public class TIronVisualScreenServiceImpl {
|
|
|
// L2类
|
|
|
TL2Data preL2 = tl2DataService.lambdaQuery()
|
|
|
.lt(TL2Data::getIronStarttime, new SimpleDateFormat("yyyyMMddHHmmss").format(startTime))
|
|
|
+ .eq(TL2Data::getTapholeId,"1")
|
|
|
.orderByDesc(TL2Data::getIronStarttime)
|
|
|
.last("limit 1").one();
|
|
|
|
|
@@ -337,7 +531,7 @@ public class TIronVisualScreenServiceImpl {
|
|
|
result.put("openDepth", buildMinuteArray(elemenList, xAxis, "openDepth", preL2 != null ? preL2.getOpenDepth() : null));
|
|
|
|
|
|
|
|
|
- // 统计出铁累计重量递增曲线
|
|
|
+ //
|
|
|
if (preTapping != null && preTapping.getData() != null) {
|
|
|
Object v = preTapping.getData();
|
|
|
if (v instanceof Number) preTappingVal = ((Number) v).intValue();
|
|
@@ -379,6 +573,7 @@ public class TIronVisualScreenServiceImpl {
|
|
|
tappingMap.put(t, v);
|
|
|
if (v != null) last = v;
|
|
|
}
|
|
|
+
|
|
|
int ironWeightScale = 2; // 可调整为0、1、2等
|
|
|
List<List<Object>> ironFlowArr = buildIronFlowMinuteArray(xAxis, tappingMap, weight1List, weight2List, ironWeightScale);
|
|
|
result.put("ironWeight", ironFlowArr);
|