فهرست منبع

1.完善生产环境摄像头播放问题
2.动态刷新数据
3.异常日志和诊断日志优化

wangxiaofei 1 ماه پیش
والد
کامیت
dd29772321
31فایلهای تغییر یافته به همراه1052 افزوده شده و 680 حذف شده
  1. 2 1
      taphole-common/src/main/java/com/sckj/common/enums/RefreshItemEnum.java
  2. 10 0
      taphole-common/src/main/java/com/sckj/common/enums/RefreshModeEnum.java
  3. 9 0
      taphole-common/src/main/java/com/sckj/common/enums/RefreshRangeEnum.java
  4. 27 0
      taphole-common/src/main/java/com/sckj/common/eventbus/RefreshItem.java
  5. 48 0
      taphole-common/src/main/java/com/sckj/common/util/TimeUtils.java
  6. 1 1
      taphole-iron/src/main/java/com/sckj/iron/aop/HikCameraAspect.java
  7. 2 2
      taphole-iron/src/main/java/com/sckj/iron/constant/TaskNameConstants.java
  8. 1 1
      taphole-iron/src/main/java/com/sckj/iron/controller/TIronVisualScreenController.java
  9. 41 0
      taphole-iron/src/main/java/com/sckj/iron/dto/IronTestItem.java
  10. 31 16
      taphole-iron/src/main/java/com/sckj/iron/dto/WarnData.java
  11. 3 0
      taphole-iron/src/main/java/com/sckj/iron/entity/TCamera.java
  12. 3 0
      taphole-iron/src/main/java/com/sckj/iron/entity/TIronTest.java
  13. 2 1
      taphole-iron/src/main/java/com/sckj/iron/manager/hik/HCNetTools.java
  14. 3 4
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TCameraServiceImpl.java
  15. 2 1
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronModelServiceImpl.java
  16. 2 1
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronParamServiceImpl.java
  17. 7 5
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronScheduleServiceImpl.java
  18. 2 1
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepServiceImpl.java
  19. 175 360
      taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronVisualScreenServiceImpl.java
  20. 581 259
      taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java
  21. 37 0
      taphole-iron/src/main/java/com/sckj/iron/vo/TIronTestBigScreenVo.java
  22. 16 5
      taphole-l2/src/main/java/com/sckj/l2/service/impl/TL2DataServiceImpl.java
  23. 8 2
      taphole-warn/src/main/java/com/sckj/warn/controller/TExceptionLogController.java
  24. 3 0
      taphole-warn/src/main/java/com/sckj/warn/entity/TExceptionLog.java
  25. 1 1
      taphole-warn/src/main/java/com/sckj/warn/mapper/TExceptionLogMapper.java
  26. 14 13
      taphole-warn/src/main/java/com/sckj/warn/service/impl/TAudioServiceImpl.java
  27. 4 4
      taphole-warn/src/main/java/com/sckj/warn/service/impl/TExceptionLogServiceImpl.java
  28. 3 1
      taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogCreateValidate.java
  29. 4 0
      taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogSearchValidate.java
  30. 3 0
      taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogUpdateValidate.java
  31. 7 1
      taphole-warn/src/main/resources/mapper/TExceptionLogMapper.xml

+ 2 - 1
taphole-common/src/main/java/com/sckj/common/enums/RefreshItemEnum.java

@@ -8,7 +8,8 @@ public enum RefreshItemEnum {
     PARAM(2, "参数"),
     MODEL(3, "模型"),
     AUDIO(4, "报警音频"),
-    SCHEDULE(4, "定时任务");
+    SCHEDULE(5, "定时任务"),
+    OTHER(5, "其他");
     /**
      * 构造方法
      */

+ 10 - 0
taphole-common/src/main/java/com/sckj/common/enums/RefreshModeEnum.java

@@ -0,0 +1,10 @@
+package com.sckj.common.enums;
+
+/**
+ * 刷新模式
+ */
+public enum RefreshModeEnum {
+    INSERT,
+    UPDATE,
+    DELETE
+}

+ 9 - 0
taphole-common/src/main/java/com/sckj/common/enums/RefreshRangeEnum.java

@@ -0,0 +1,9 @@
+package com.sckj.common.enums;
+
+/**
+ * 刷新范围
+ */
+public enum RefreshRangeEnum {
+    ONE,
+    ALL
+}

+ 27 - 0
taphole-common/src/main/java/com/sckj/common/eventbus/RefreshItem.java

@@ -0,0 +1,27 @@
+package com.sckj.common.eventbus;
+
+import com.sckj.common.enums.RefreshItemEnum;
+import com.sckj.common.enums.RefreshModeEnum;
+import com.sckj.common.enums.RefreshRangeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 刷新项
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Data
+public class RefreshItem {
+    //刷新项类型
+    private RefreshItemEnum refreshItemEnum;
+    private Object object;
+    //刷新范围
+    private RefreshRangeEnum refreshRangeEnum;
+    //刷新模式
+    private RefreshModeEnum refreshModeEnum;
+
+}

+ 48 - 0
taphole-common/src/main/java/com/sckj/common/util/TimeUtils.java

@@ -537,6 +537,54 @@ public class TimeUtils {
     }
 
     /***
+     * yyyyMMddHHmmss -> yyyy-MM-dd HH:mm:00
+     * @param input
+     * @return
+     */
+    public static String formatPartialDateStringMin(String input){
+        if (input == null || input.isEmpty()) {
+            return "";
+        }
+
+        StringBuilder result = new StringBuilder();
+        int len = input.length();
+
+        // 年 (yyyy)
+        if (len >= 4) {
+            result.append(input.substring(0, 4));
+        } else {
+            return input; // 不足4位直接返回原字符串
+        }
+
+        // 月 (MM)
+        if (len >= 6) {
+            result.append("-").append(input.substring(4, 6));
+        }
+
+        // 日 (dd)
+        if (len >= 8) {
+            result.append("-").append(input.substring(6, 8));
+        }
+
+        // 时 (HH)
+        if (len >= 10) {
+            result.append(" ").append(input.substring(8, 10));
+        }
+
+        // 分 (mm)
+        if (len >= 12) {
+            result.append(":").append(input.substring(10, 12));
+        }
+
+        // 秒 (ss)
+        if (len >= 14) {
+            result.append(":00");
+        }
+
+        return result.toString();
+    }
+
+    /***
      * yyyyMMddHHmmss -> yyyy-MM-dd HH:mm:ss
      * @param input
      * @return

+ 1 - 1
taphole-iron/src/main/java/com/sckj/iron/aop/HikCameraAspect.java

@@ -86,7 +86,7 @@ public class HikCameraAspect {
                 if ("1".equals(cameraDTO.getType())) {
                     //有VCR录像机
                     if (ObjectUtils.isNotEmpty(cameraDTO.getVcr())) {
-                        channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(), cameraDTO.getIp());
+                        channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(), ObjectUtils.isNotEmpty(cameraDTO.getIpLocal())?cameraDTO.getIpLocal().trim():"");
                     } else {
                         //没有VCR录像机
                         channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));

+ 2 - 2
taphole-iron/src/main/java/com/sckj/iron/constant/TaskNameConstants.java

@@ -33,12 +33,12 @@ public class TaskNameConstants {
 
     public static final String TASKNAME_IRON_CHART = "iron_chart";
 
-    public static final String TASKNAME_IRON_LEGEND = "iron_legend";
-
     //L2定时拉取
     public static final String TASKNAME_IRON_L2 = "iron_l2";
 
     //诊断定时拉取
     public static final String TASKNAME_IRON_TEST = "iron_test";
+    //其他
+    public static final String TASKNAME_IRON_OTHER = "iron_other";
 
 }

+ 1 - 1
taphole-iron/src/main/java/com/sckj/iron/controller/TIronVisualScreenController.java

@@ -239,7 +239,7 @@ public class TIronVisualScreenController {
     @PostMapping("/getIronLegend")
     @ApiOperation(value = "实时数据图图例")
     public AjaxResult getIronLegend() {
-        Map<String, Object> result = tIronVisualScreenService.getIronLegend(new HashMap<>());
+        Map<String, Object> result = tIronVisualScreenService.getIronLegend(new HashMap<>(),0);
         //生产随机数据
 //        result.put("ironCosttime",  RealtimeData.builder().desc("出铁时间").value((Math.random() * 100) + 200).unit("min").build());
 //        result.put("elementS", RealtimeData.builder().desc("铁水成分-硫").value((Math.random() * 1)).build());

+ 41 - 0
taphole-iron/src/main/java/com/sckj/iron/dto/IronTestItem.java

@@ -0,0 +1,41 @@
+package com.sckj.iron.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.*;
+import org.springframework.stereotype.Component;
+
+/***
+ * 实时数据
+ * 铁水温度、铁水流速、铁水成分、铁水流量
+ *
+ */
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Component
+@ToString
+@ApiOperation("诊断项属性")
+public class IronTestItem {
+
+    @ApiModelProperty("数据值")
+    private Object value;
+
+    @ApiModelProperty("描述")
+    private String desc;
+
+    @ApiModelProperty("状态")
+    private Integer status;
+
+    @ApiModelProperty("类型名称")
+    private String typeName;
+
+    @ApiModelProperty("单位")
+    private String unit;
+
+
+
+
+
+}

+ 31 - 16
taphole-iron/src/main/java/com/sckj/iron/dto/WarnData.java

@@ -1,10 +1,6 @@
 package com.sckj.iron.dto;
 
 import com.sckj.iron.constant.TaskNameConstants;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
 
 
 /***
@@ -12,10 +8,6 @@ import lombok.NoArgsConstructor;
  * 铁水温度、铁水流速、铁水成分、铁水流量
  *
  */
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
 public class WarnData {
 
     //open
@@ -29,32 +21,55 @@ public class WarnData {
 
     private String alarmUrl;
 
-    public static WarnData of(String type, String desc, String alarmUrl) {
-        return WarnData.builder().type(type).desc(desc).build();
+    public WarnData() {
     }
 
-    public static WarnData of(String type) {
-        return WarnData.builder().type(type).build();
+    public WarnData(String type, String typeName, String desc, String alarmUrl) {
+        this.type = type;
+        this.typeName = typeName;
+        this.desc = desc;
+        this.alarmUrl = alarmUrl;
     }
 
+
 //    开口预警
     public static WarnData warnOpen(String desc, String alarmUrl) {
-        return WarnData.builder().type(TaskNameConstants.TASKNAME_OPEN_WARN).typeName("开口报警").desc(desc).alarmUrl(alarmUrl).build();
+        WarnData warnData = new WarnData();
+        warnData.type = TaskNameConstants.TASKNAME_OPEN_WARN;
+        warnData.typeName = "开口报警";
+        warnData.desc = desc;
+        warnData.alarmUrl = alarmUrl;
+        return warnData;
     }
 
     //出铁预警
     public static WarnData warnTapping(String desc, String alarmUrl) {
-        return WarnData.builder().type(TaskNameConstants.TASKNAME_TAPPING_WARN).typeName("急需出铁告警").desc(desc).alarmUrl(alarmUrl).build();
+        WarnData warnData = new WarnData();
+        warnData.type = TaskNameConstants.TASKNAME_TAPPING_WARN;
+        warnData.typeName = "急需出铁告警";
+        warnData.desc = desc;
+        warnData.alarmUrl = alarmUrl;
+        return warnData;
     }
 
     //堵口预警
     public static WarnData warnClose(String desc, String alarmUrl) {
-        return WarnData.builder().type(TaskNameConstants.TASKNAME_CLOSURE_WARN).typeName("急需堵口告警").desc(desc).alarmUrl(alarmUrl).build();
+        WarnData warnData = new WarnData();
+        warnData.type = TaskNameConstants.TASKNAME_CLOSURE_WARN;
+        warnData.typeName = "急需堵口告警";
+        warnData.desc = desc;
+        warnData.alarmUrl = alarmUrl;
+        return warnData;
     }
 
     //炉前出铁超时报警
     public static WarnData warnTappingTimeout(String desc, String alarmUrl) {
-        return WarnData.builder().type(TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN).typeName("炉前出铁超时报警").desc(desc).alarmUrl(alarmUrl).build();
+        WarnData warnData = new WarnData();
+        warnData.type = TaskNameConstants.TASKNAME_TAPPING_TIMEOUT_WARN;
+        warnData.typeName = "炉前出铁超时报警";
+        warnData.desc = desc;
+        warnData.alarmUrl = alarmUrl;
+        return warnData;
     }
 
 }

+ 3 - 0
taphole-iron/src/main/java/com/sckj/iron/entity/TCamera.java

@@ -51,6 +51,9 @@ public class TCamera implements Serializable {
     @ApiModelProperty(value = "ip地址")
     private String ip;
 
+    @ApiModelProperty(value = "ip内网地址")
+    private String ipLocal;
+
     @ApiModelProperty(value = "端口号")
     private String port;
 

+ 3 - 0
taphole-iron/src/main/java/com/sckj/iron/entity/TIronTest.java

@@ -51,4 +51,7 @@ public class TIronTest implements Serializable {
     @ApiModelProperty(value = "出铁次数编号")
     private String ironNo;
 
+    @ApiModelProperty(value = "出铁详情")
+    private String ironDetail;
+
 }

+ 2 - 1
taphole-iron/src/main/java/com/sckj/iron/manager/hik/HCNetTools.java

@@ -1,5 +1,6 @@
 package com.sckj.iron.manager.hik;
 
+import com.alibaba.fastjson2.JSON;
 import com.sun.jna.Pointer;
 import com.sun.jna.ptr.ByteByReference;
 import com.sun.jna.ptr.IntByReference;
@@ -165,7 +166,7 @@ public class HCNetTools {
 				}
 			}
 		}
-
+		System.out.println("channelList>>>" + JSON.toJSONString(channelList));
 		return channelList;
 	}
 

+ 3 - 4
taphole-iron/src/main/java/com/sckj/iron/service/impl/TCameraServiceImpl.java

@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.aop.CameraLogin;
-import com.sckj.common.config.GlobalConfig;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.core.PageResult;
 import com.sckj.common.exception.OperateException;
@@ -178,7 +177,7 @@ public class TCameraServiceImpl extends ServiceImpl<TCameraMapper, TCamera> {
                             vo.setOnlineStatus("1");
 
                             DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
-                            String name = dtf.format(LocalDateTime.now()) + ".jpg";
+                            String name = dtf.format(LocalDateTime.now()) + UUID.randomUUID().toString().replace("-","") + ".jpg";
                             String path = "/catchpic/" + item.getIp().replace(".", "") + "/";
                             String filePath = YmlUtils.get("like.upload-directory") + path + name;
                             try {
@@ -555,9 +554,9 @@ public class TCameraServiceImpl extends ServiceImpl<TCameraMapper, TCamera> {
         String channelNumberStr = cameraDTO.getChannelNumber() + "01"; //回放流只有主码流
         String rtspName = "rtsp://";
         if (endTime != null) {
-            rtspName += cameraDTO.getVcr().getAccount() + ":" + cameraDTO.getVcr().getPassword() + "@" + cameraDTO.getVcr().getIp() + ":" + cameraDTO.getPortRtsp() + "/Streaming/tracks/" + channelNumberStr + "?starttime=" + startTime + "&endtime=" + endTime;
+            rtspName += cameraDTO.getVcr().getAccount() + ":" + cameraDTO.getVcr().getPassword() + "@" + cameraDTO.getVcr().getIp() + ":" + cameraDTO.getVcr().getPortRtsp() + "/Streaming/tracks/" + channelNumberStr + "?starttime=" + startTime + "&endtime=" + endTime;
         } else {
-            rtspName += cameraDTO.getVcr().getAccount() + ":" + cameraDTO.getVcr().getPassword() + "@" + cameraDTO.getVcr().getIp() + ":" + cameraDTO.getPortRtsp() + "/Streaming/tracks/" + channelNumberStr + "?starttime=" + startTime;
+            rtspName += cameraDTO.getVcr().getAccount() + ":" + cameraDTO.getVcr().getPassword() + "@" + cameraDTO.getVcr().getIp() + ":" + cameraDTO.getVcr().getPortRtsp() + "/Streaming/tracks/" + channelNumberStr + "?starttime=" + startTime;
         }
         resultDTO.setRtspUrl(rtspName);
         TIronParam webrtc = ironParamService.lambdaQuery().eq(TIronParam::getParamName, "webrtc_url").one();

+ 2 - 1
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronModelServiceImpl.java

@@ -9,6 +9,7 @@ import com.google.common.eventbus.AsyncEventBus;
 import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.PageResult;
 import com.sckj.common.enums.RefreshItemEnum;
+import com.sckj.common.eventbus.RefreshItem;
 import com.sckj.common.util.UrlUtils;
 import com.sckj.common.util.YmlUtils;
 import com.sckj.common.validate.commons.PageValidate;
@@ -270,7 +271,7 @@ public class TIronModelServiceImpl extends ServiceImpl<TIronModelMapper, TIronMo
     }
 
     public void refreshModel() {
-        asyncEventBus.post(RefreshItemEnum.PARAM);
+        asyncEventBus.post(RefreshItem.builder().refreshItemEnum(RefreshItemEnum.MODEL).build());
     }
 
 

+ 2 - 1
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronParamServiceImpl.java

@@ -10,6 +10,7 @@ import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.core.PageResult;
 import com.sckj.common.enums.RefreshItemEnum;
+import com.sckj.common.eventbus.RefreshItem;
 import com.sckj.common.exception.OperateException;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.iron.dto.IronParamDTO;
@@ -240,7 +241,7 @@ public class TIronParamServiceImpl extends ServiceImpl<TIronParamMapper, TIronPa
     }
 
     public void refreshParams() {
-        asyncEventBus.post(RefreshItemEnum.PARAM);
+        asyncEventBus.post(RefreshItem.builder().refreshItemEnum( RefreshItemEnum.PARAM).build());
     }
 
 }

+ 7 - 5
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronScheduleServiceImpl.java

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.eventbus.AsyncEventBus;
 import com.sckj.common.core.PageResult;
 import com.sckj.common.enums.RefreshItemEnum;
+import com.sckj.common.enums.RefreshModeEnum;
+import com.sckj.common.eventbus.RefreshItem;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.iron.entity.TIronSchedule;
 import com.sckj.iron.mapper.TIronScheduleMapper;
@@ -110,7 +112,7 @@ public class TIronScheduleServiceImpl  extends ServiceImpl<TIronScheduleMapper,
         model.setRemark(createValidate.getRemark());
         model.setDescr(createValidate.getDescr());
         tIronScheduleMapper.insert(model);
-        refreshParams();
+        refreshParams(RefreshModeEnum.INSERT,model);
     }
 
     /**
@@ -136,7 +138,7 @@ public class TIronScheduleServiceImpl  extends ServiceImpl<TIronScheduleMapper,
         model.setRemark(updateValidate.getRemark());
         model.setDescr(updateValidate.getDescr());
         tIronScheduleMapper.updateById(model);
-        refreshParams();
+        refreshParams(RefreshModeEnum.UPDATE,model);
     }
 
     /**
@@ -154,11 +156,11 @@ public class TIronScheduleServiceImpl  extends ServiceImpl<TIronScheduleMapper,
         Assert.notNull(model, "数据不存在!");
 
         tIronScheduleMapper.delete(new QueryWrapper<TIronSchedule>().eq("id", id));
-        refreshParams();
+        refreshParams(RefreshModeEnum.DELETE,model);
     }
 
-    public void refreshParams() {
-        asyncEventBus.post(RefreshItemEnum.SCHEDULE);
+    public void refreshParams(RefreshModeEnum refreshModeEnum,TIronSchedule schedule) {
+        asyncEventBus.post(RefreshItem.builder().refreshItemEnum(RefreshItemEnum.SCHEDULE).refreshModeEnum(refreshModeEnum).object(schedule).build());
     }
 
 

+ 2 - 1
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronStepServiceImpl.java

@@ -8,6 +8,7 @@ import com.google.common.eventbus.AsyncEventBus;
 import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.PageResult;
 import com.sckj.common.enums.RefreshItemEnum;
+import com.sckj.common.eventbus.RefreshItem;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.iron.entity.TIronStep;
 import com.sckj.iron.mapper.TIronStepMapper;
@@ -253,7 +254,7 @@ public class TIronStepServiceImpl extends ServiceImpl<TIronStepMapper, TIronStep
     }
 
     public void refreshTreeSteps() {
-        asyncEventBus.post(RefreshItemEnum.STEP);
+        asyncEventBus.post(RefreshItem.builder().refreshItemEnum(RefreshItemEnum.STEP).build());
     }
 
 }

+ 175 - 360
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronVisualScreenServiceImpl.java

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

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 581 - 259
taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java


+ 37 - 0
taphole-iron/src/main/java/com/sckj/iron/vo/TIronTestBigScreenVo.java

@@ -0,0 +1,37 @@
+package com.sckj.iron.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Map;
+
+@Data
+@ApiModel("出铁诊断详情Vo")
+public class TIronTestBigScreenVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "")
+    private Long id;
+
+    @ApiModelProperty(value = "诊断状态(1正常 0异常)")
+    private String testStatus;
+
+    @ApiModelProperty(value = "鱼雷罐车车号")
+    private String testDesc;
+
+    @ApiModelProperty(value = "铁口区域编号")
+    private String tapholeId;
+
+    @ApiModelProperty(value = "高炉编号")
+    private String boilerId;
+
+    @ApiModelProperty(value = "出铁次数编号")
+    private String ironNo;
+
+    @ApiModelProperty(value = "出铁详情")
+    private Map<String,Object> ironDetail;
+
+}

+ 16 - 5
taphole-l2/src/main/java/com/sckj/l2/service/impl/TL2DataServiceImpl.java

@@ -97,12 +97,12 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
 
 
     /***
-     * 获取4高炉1号铁口最新2条数据
+     * 获取4高炉最新2条数据
      * @return
      */
-    public List<TL2Data> getTappedLatest2Datas() {
+    public List<TL2Data> getLatestTwoDatas() {
         LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(TL2Data::getTapholeId,"1").isNotNull(TL2Data::getIronNo).isNotNull(TL2Data::getIronWeight).isNotNull(TL2Data::getCalcWeight).orderByDesc(TL2Data::getIronNo).last("limit 2");
+        queryWrapper.isNotNull(TL2Data::getIronNo).isNotNull(TL2Data::getIronWeight).isNotNull(TL2Data::getCalcWeight).orderByDesc(TL2Data::getIronNo).last("limit 2");
         List<TL2Data> list = list(queryWrapper);
         return list;
     }
@@ -111,13 +111,24 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
      * 获取4高炉1号铁口最新1条数据
      * @return
      */
-    public TL2Data getLatestData() {
+    public TL2Data getTapped1LatestData() {
         LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(TL2Data::getTapholeId,"1").isNotNull(TL2Data::getIronNo).orderByDesc(TL2Data::getIronNo).last("limit 1");
         List<TL2Data> list = list(queryWrapper);
         return ObjectUtils.isEmpty(list) ? null : list.get(0);
     }
 
+    /***
+     * 获取4高炉最新1条数据
+     * @return
+     */
+    public TL2Data getLatestData() {
+        LambdaQueryWrapper<TL2Data> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.isNotNull(TL2Data::getIronNo).orderByDesc(TL2Data::getIronNo).last("limit 1");
+        List<TL2Data> list = list(queryWrapper);
+        return ObjectUtils.isEmpty(list) ? null : list.get(0);
+    }
+
 
     /***
      * 查询出铁数据
@@ -132,7 +143,7 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
                 .eq(ObjectUtils.isNotEmpty(tl2Data.getIronNo()), TL2Data::getIronNo, tl2Data.getIronNo())
                 .eq(ObjectUtils.isNotEmpty(tl2Data.getTapholeId()), TL2Data::getTapholeId, tl2Data.getTapholeId())
                 .eq(ObjectUtils.isNotEmpty(tl2Data.getBoilerId()), TL2Data::getBoilerId, tl2Data.getBoilerId())
-                .orderByAsc(TL2Data::getIronNo);
+                .orderByDesc(TL2Data::getIronNo);
         if (StringUtils.isNotBlank(tl2Data.getIronStarttime()) && StringUtils.isNotBlank(tl2Data.getIronEndtime())) {
             queryWrapper.lambda().between(TL2Data::getCreateTime, tl2Data.getIronStarttime(), tl2Data.getIronEndtime());
         }

+ 8 - 2
taphole-warn/src/main/java/com/sckj/warn/controller/TExceptionLogController.java

@@ -92,9 +92,15 @@ public class TExceptionLogController {
 
     @GetMapping("/getLatests")
     @ApiOperation(value = "最新N条异常情况记录")
-    public AjaxResult<TExceptionLog> getLatests() {
-        TExceptionLog list = iTExceptionLogService.getLatests();
+    public AjaxResult getLatests() {
+        List<TExceptionLog> list = iTExceptionLogService.getLatests();
         return AjaxResult.success(list);
     }
 
+    @GetMapping("/getRealTimeExceptionLogList")
+    @ApiOperation(value = "获取实时异常数据(只传ironDataId)")
+    public AjaxResult getRealTimeExceptionLogList(TExceptionLog exceptionLog) {
+        return AjaxResult.success(iTExceptionLogService.getRealTimeExceptionLogList(exceptionLog));
+    }
+
 }

+ 3 - 0
taphole-warn/src/main/java/com/sckj/warn/entity/TExceptionLog.java

@@ -57,4 +57,7 @@ public class TExceptionLog implements Serializable {
     @ApiModelProperty(value = "异常描述")
     private String exceptionDesc;
 
+    @ApiModelProperty(value = "实时出铁编号")
+    private String ironDataId;
+
 }

+ 1 - 1
taphole-warn/src/main/java/com/sckj/warn/mapper/TExceptionLogMapper.java

@@ -31,5 +31,5 @@ public interface TExceptionLogMapper extends IBaseMapper<TExceptionLog> {
      * 导出
      * @return
      */
-    List<TExceptionLogBigScreenVo> getExceptionLogList();
+    List<TExceptionLogBigScreenVo> getRealTimeExceptionLogList(TExceptionLog exceptionLog);
 }

+ 14 - 13
taphole-warn/src/main/java/com/sckj/warn/service/impl/TAudioServiceImpl.java

@@ -1,26 +1,26 @@
 package com.sckj.warn.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.github.yulichang.query.MPJQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.eventbus.AsyncEventBus;
 import com.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
 import com.sckj.common.enums.RefreshItemEnum;
-import com.sckj.common.exception.OperateException;
-import com.sckj.common.util.*;
+import com.sckj.common.eventbus.RefreshItem;
+import com.sckj.common.util.AudioUtils;
+import com.sckj.common.util.UrlUtils;
+import com.sckj.common.util.YmlUtils;
 import com.sckj.common.validate.commons.PageValidate;
+import com.sckj.warn.entity.TAudio;
+import com.sckj.warn.mapper.TAudioMapper;
 import com.sckj.warn.validate.TAudioCreateValidate;
-import com.sckj.warn.validate.TAudioUpdateValidate;
 import com.sckj.warn.validate.TAudioSearchValidate;
-import com.sckj.warn.vo.TAudioListedVo;
+import com.sckj.warn.validate.TAudioUpdateValidate;
 import com.sckj.warn.vo.TAudioDetailVo;
-import com.sckj.common.config.GlobalConfig;
-import com.sckj.common.core.PageResult;
-import com.sckj.warn.entity.TAudio;
-import com.sckj.warn.mapper.TAudioMapper;
+import com.sckj.warn.vo.TAudioListedVo;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -28,9 +28,10 @@ import org.springframework.util.Assert;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.io.File;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * 音频实现类
@@ -283,7 +284,7 @@ public class TAudioServiceImpl extends ServiceImpl<TAudioMapper, TAudio> {
     }
 
     public void refreshAudio() {
-        asyncEventBus.post(RefreshItemEnum.AUDIO);
+        asyncEventBus.post(RefreshItem.builder().refreshItemEnum(RefreshItemEnum.AUDIO).build());
     }
 
 }

+ 4 - 4
taphole-warn/src/main/java/com/sckj/warn/service/impl/TExceptionLogServiceImpl.java

@@ -273,13 +273,13 @@ public class TExceptionLogServiceImpl extends ServiceImpl<TExceptionLogMapper, T
     }
 
 
-    public TExceptionLog getLatests() {
-        return this.lambdaQuery().orderByDesc(TExceptionLog::getCreateTime).list().stream().findFirst().orElseThrow(()->new OperateException("未查询到数据"));
+    public List<TExceptionLog> getLatests() {
+        return this.lambdaQuery().orderByDesc(TExceptionLog::getCreateTime).list();
     }
 
 
-    public List<TExceptionLogBigScreenVo> getExceptionLogList() {
-        return tExceptionLogMapper.getExceptionLogList();
+    public List<TExceptionLogBigScreenVo> getRealTimeExceptionLogList(TExceptionLog exceptionLog) {
+        return tExceptionLogMapper.getRealTimeExceptionLogList(exceptionLog);
     }
 
 

+ 3 - 1
taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogCreateValidate.java

@@ -9,7 +9,6 @@ import lombok.NoArgsConstructor;
 
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
-import java.util.Date;
 
 @Data
 @ApiModel("异常情况记录创建参数")
@@ -46,4 +45,7 @@ public class TExceptionLogCreateValidate implements Serializable {
     @ApiModelProperty(value = "铁口区域编号")
     private String tapholeId;
 
+    @ApiModelProperty(value = "实时出铁编号")
+    private String ironDataId;
+
 }

+ 4 - 0
taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogSearchValidate.java

@@ -32,4 +32,8 @@ public class TExceptionLogSearchValidate implements Serializable {
 
     @ApiModelProperty(value = "创建的结束时间")
     private String createTimeEnd;
+
+    @ApiModelProperty(value = "实时出铁编号")
+    private String ironDataId;
+
 }

+ 3 - 0
taphole-warn/src/main/java/com/sckj/warn/validate/TExceptionLogUpdateValidate.java

@@ -21,4 +21,7 @@ public class TExceptionLogUpdateValidate implements Serializable {
     @ApiModelProperty(value = "异常记录Id")
     private Long id;
 
+    @ApiModelProperty(value = "实时出铁编号")
+    private String ironDataId;
+
 }

+ 7 - 1
taphole-warn/src/main/resources/mapper/TExceptionLogMapper.xml

@@ -59,7 +59,7 @@
     </select>
 
 
-    <select id="getExceptionLogList" resultType="com.sckj.warn.vo.TExceptionLogBigScreenVo" >
+    <select id="getRealTimeExceptionLogList" resultType="com.sckj.warn.vo.TExceptionLogBigScreenVo" parameterType="com.sckj.warn.entity.TExceptionLog" >
         SELECT
         DATE_FORMAT(el.create_time, '%Y-%m-%d %H:%i:%s') create_time,
         el.exception_desc,
@@ -100,6 +100,12 @@
             <if test="exceptionLevel != null and exceptionLevel !=''">
                 and exception_Level = #{exceptionLevel}
             </if>
+            <if test="exceptionLevel != null and exceptionLevel !=''">
+                and exception_Level = #{exceptionLevel}
+            </if>
+            <if test="ironDataId != null and ironDataId !=''">
+                and iron_data_id = #{ironDataId}
+            </if>
         </where>
         order by create_time desc
         limit 10

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است