Эх сурвалжийг харах

实时大屏代码预警优化

wangxiaofei 1 сар өмнө
parent
commit
5d668f3ef2

+ 7 - 8
taphole-common/src/main/java/com/sckj/common/manager/ScheduledTaskManager.java

@@ -2,23 +2,22 @@ package com.sckj.common.manager;
 
 import org.springframework.stereotype.Component;
 
-import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
 
 @Component
 public class ScheduledTaskManager {
 
     private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
-    private final Map<String, ScheduledFuture<?>> tasks = new HashMap<>();
+    private final Map<String, ScheduledFuture<?>> tasks = new ConcurrentHashMap<>();
 
     // 添加定时任务
     public void addTask(String taskName, long initialDelay, long period, TimeUnit unit, Runnable task) {
-        ScheduledFuture<?> future = executorService.scheduleAtFixedRate(task, initialDelay, period, unit);
-        tasks.put(taskName, future);
+        ScheduledFuture<?> future = tasks.get(taskName);
+        if (future == null) {
+            future = executorService.scheduleAtFixedRate(task, initialDelay, period, unit);
+            tasks.put(taskName, future);
+        }
     }
 
     // 取消定时任务

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

@@ -6,11 +6,8 @@ import com.sckj.common.core.PageResult;
 import com.sckj.common.validate.commons.IdValidate;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.common.validator.annotation.IDMust;
-import com.sckj.iron.entity.TL2Data;
 import com.sckj.iron.service.impl.TIronDataServiceImpl;
 import com.sckj.iron.service.impl.TL2DataServiceImpl;
-import com.sckj.iron.validate.TIronDataCreateValidate;
-import com.sckj.iron.validate.TIronDataSearchScreenValidate;
 import com.sckj.iron.validate.TIronDataSearchValidate;
 import com.sckj.iron.vo.TIronDataDetailVo;
 import com.sckj.iron.vo.TIronDataListedVo;
@@ -30,9 +27,6 @@ public class TIronDataController {
     @Resource
     TIronDataServiceImpl iTIronDataService;
 
-    @Resource
-    TL2DataServiceImpl tl2DataService;
-
     @GetMapping("/list")
     @ApiOperation(value = "出铁数据列表")
     public AjaxResult<PageResult<TIronDataListedVo>> list(@Validated PageValidate pageValidate,
@@ -48,13 +42,7 @@ public class TIronDataController {
         return AjaxResult.success(detail);
     }
 
-    @Log(title = "出铁数据新增")
-    @PostMapping("/add")
-    @ApiOperation(value = "出铁数据新增")
-    public AjaxResult<Object> add(@Validated @RequestBody TIronDataCreateValidate createValidate) {
-        iTIronDataService.add(createValidate);
-        return AjaxResult.success();
-    }
+
 
     @Log(title = "出铁数据删除")
     @PostMapping("/del")

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

@@ -7,15 +7,14 @@ import com.sckj.common.aop.NotPower;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.util.RedisUtils;
 import com.sckj.common.validate.commons.PageValidate;
-import com.sckj.device.entity.TCamera;
 import com.sckj.device.service.impl.TCameraServiceImpl;
 import com.sckj.device.validate.TCameraUpdateDTO;
 import com.sckj.iron.dto.IronParamDTO;
+import com.sckj.iron.entity.TIronData;
 import com.sckj.iron.entity.TIronParam;
-import com.sckj.iron.entity.TL2Data;
 import com.sckj.iron.service.impl.IronLoginServiceImpl;
+import com.sckj.iron.service.impl.TIronDataServiceImpl;
 import com.sckj.iron.service.impl.TIronParamServiceImpl;
-import com.sckj.iron.service.impl.TL2DataServiceImpl;
 import com.sckj.iron.socketio.DeviceEventListener;
 import com.sckj.iron.validate.IronLoginValidate;
 import com.sckj.iron.validate.TIronDataSearchScreenValidate;
@@ -34,7 +33,6 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -54,7 +52,7 @@ public class TIronVisualScreenController {
     IronLoginServiceImpl ironLoginService;
 
     @Resource
-    TL2DataServiceImpl tl2DataService;
+    TIronDataServiceImpl tl2DataService;
 
     @Resource
     private TCameraServiceImpl cameraService;
@@ -129,7 +127,7 @@ public class TIronVisualScreenController {
     @ApiOperation(value = "查询出铁数据")
     public AjaxResult queryIronData(@Validated PageValidate pageValidate, TIronDataSearchScreenValidate ironDataSearchScreenValidate) {
         //出铁操作
-        TL2Data tl2Data = new TL2Data();
+        TIronData tl2Data = new TIronData();
         BeanUtils.copyProperties(ironDataSearchScreenValidate, tl2Data);
         PageHelper.startPage(pageValidate.getPageNo(), pageValidate.getPageSize());
         return AjaxResult.success(tl2DataService.queryIronData(tl2Data));
@@ -140,7 +138,7 @@ public class TIronVisualScreenController {
     @ApiOperation(value = "导出出铁数据")
     public void exportIronData(TIronDataSearchScreenValidate ironDataSearchScreenValidate, HttpServletResponse response) throws IOException {
         //出铁操作
-        TL2Data tl2Data = new TL2Data();
+        TIronData tl2Data = new TIronData();
         BeanUtils.copyProperties(ironDataSearchScreenValidate, tl2Data);
         tl2DataService.exportIronData(tl2Data, response);
     }

+ 14 - 5
taphole-iron/src/main/java/com/sckj/iron/dto/WarnData.java

@@ -3,6 +3,9 @@ package com.sckj.iron.dto;
 import lombok.Builder;
 import lombok.Data;
 
+import static com.sckj.iron.socketio.DeviceEventListener.*;
+
+
 /***
  * 实时数据
  * 铁水温度、铁水流速、铁水成分、铁水流量
@@ -12,8 +15,9 @@ import lombok.Data;
 @Builder
 public class WarnData {
 
-//    private String key;
-
+    //open
+    //close
+    //
     private String type;
 
     private String desc;
@@ -22,14 +26,19 @@ public class WarnData {
         return WarnData.builder().type(type).desc(desc).build();
     }
 
-    //出铁预警
+    //开口预警
     public static WarnData warnOpen(String desc) {
-        return WarnData.builder().type("open").desc(desc).build();
+        return WarnData.builder().type(TASKNAME_OPEN_WARN).desc(desc).build();
+    }
+
+    //出铁预警
+    public static WarnData warnTapping(String desc) {
+        return WarnData.builder().type(TASKNAME_TAPPING_WARN).desc(desc).build();
     }
 
     //堵口预警
     public static WarnData warnClose(String desc) {
-        return WarnData.builder().type("close").desc(desc).build();
+        return WarnData.builder().type(TASKNAME_CLOSE_WARN).desc(desc).build();
     }
 
 }

+ 90 - 25
taphole-iron/src/main/java/com/sckj/iron/entity/TIronData.java

@@ -1,5 +1,12 @@
 package com.sckj.iron.entity;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadStyle;
+import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -10,6 +17,9 @@ import lombok.Data;
 import java.io.Serializable;
 import java.util.Date;
 
+@HeadStyle(fillPatternType = FillPatternTypeEnum.NO_FILL,fillForegroundColor = -1)
+@HeadFontStyle(fontHeightInPoints = 16)
+@HeadRowHeight(40)
 @Data
 @ApiModel("出铁数据实体")
 @TableName("t_iron_data")
@@ -17,41 +27,96 @@ public class TIronData implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "创建人")
-    private String createBy;
-
     @ApiModelProperty(value = "创建时间")
+    @ExcelIgnore
     private Date createTime;
 
-    @ApiModelProperty(value = "更新人")
-    private String updateBy;
-
-    @ApiModelProperty(value = "更新时间")
-    private Date updateTime;
-
     @TableId(value="id", type= IdType.AUTO)
     @ApiModelProperty(value = "id")
+    @ExcelIgnore
     private Long id;
 
-    @ApiModelProperty(value = "铁口编号")
-    private Integer tkbh;
+    @ApiModelProperty(value = "锅炉编号")
+    @ExcelIgnore
+    private Long boilerId;
+
+    @ApiModelProperty(value = "铁口区域编号")
+    @ExcelProperty("铁口区域编号")
+    @ColumnWidth(25)
+    private Long tapholeId;
 
     @ApiModelProperty(value = "出铁次数编号")
-    private Integer ctcsbh;
+    @ExcelProperty("出铁次数编号")
+    @ColumnWidth(25)
+    private String ironNo;
 
     @ApiModelProperty(value = "出铁时间")
-    private String ctsj;
-
-    @ApiModelProperty(value = "出铁量")
-    private String ctl;
-
-    @ApiModelProperty(value = "渣量")
-    private String zl;
-
-    @ApiModelProperty(value = "危害程度")
-    private String whcd;
-
-    @ApiModelProperty(value = "时间")
-    private String sj;
+    @ExcelProperty("出铁时间")
+    @ColumnWidth(25)
+    private String ironCosttime;
+
+    @ApiModelProperty(value = "实际出铁量")
+    @ExcelProperty("实际出铁量")
+    @ColumnWidth(25)
+    private Double ironWeight;
+
+    @ApiModelProperty(value = "实际渣量")
+    @ExcelProperty("实际渣量")
+    @ColumnWidth(25)
+    private String slagWeight;
+
+    @ApiModelProperty(value = "铁水平均温度")
+    @ExcelIgnore
+    private String avgTemp;
+
+    @ApiModelProperty(value = "泥炮量")
+    @ExcelIgnore
+    private String mudWeight;
+
+    @ApiModelProperty(value = "钻杆直径")
+    @ExcelIgnore
+    private String pollMm;
+
+    @ApiModelProperty(value = "开口深度")
+    @ExcelIgnore
+    private String openDepth;
+
+    @ApiModelProperty(value = "上料总干量")
+    @ExcelIgnore
+    private Double totalDry;
+
+    @ApiModelProperty(value = "开始时间")
+    @ExcelProperty("开始时间")
+    @ColumnWidth(25)
+    private String ironStarttime;
+
+    @ExcelProperty("结束时间")
+    @ColumnWidth(25)
+    @ApiModelProperty(value = "结束时间")
+    private String ironEndtime;
+
+    @ApiModelProperty(value = "碳")
+    @ExcelIgnore
+    private String elementC;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "硅")
+    private String elementSi;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "锰")
+    private String elementMn;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "磷")
+    private String elementP;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "硫")
+    private String elementS;
+
+    @ExcelIgnore
+    @ApiModelProperty(value = "钛")
+    private String elementTi;
 
 }

+ 39 - 26
taphole-iron/src/main/java/com/sckj/iron/service/impl/TIronDataServiceImpl.java

@@ -4,23 +4,25 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.sckj.common.TapholeAdminThreadLocal;
 import com.sckj.common.core.AjaxResult;
 import com.sckj.common.core.PageResult;
+import com.sckj.common.exception.OperateException;
+import com.sckj.common.util.ExcelUtils;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.iron.entity.TIronData;
 import com.sckj.iron.mapper.TIronDataMapper;
-import com.sckj.iron.validate.TIronDataCreateValidate;
 import com.sckj.iron.validate.TIronDataSearchValidate;
 import com.sckj.iron.vo.TIronDataDetailVo;
 import com.sckj.iron.vo.TIronDataListedVo;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.util.Date;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -94,26 +96,6 @@ public class TIronDataServiceImpl extends ServiceImpl<TIronDataMapper, TIronData
         return vo;
     }
 
-    /**
-     * 出铁数据新增
-     *
-     * @param createValidate 参数
-     * @author zhnaghao
-     */
-    public void add(TIronDataCreateValidate createValidate) {
-        TIronData model = new TIronData();
-        model.setCreateBy(String.valueOf(TapholeAdminThreadLocal.getAdminUsername()));
-        model.setCreateTime(new Date(System.currentTimeMillis()));
-        model.setTkbh(createValidate.getTkbh());
-        model.setCtcsbh(createValidate.getCtcsbh());
-        model.setCtsj(createValidate.getCtsj());
-        model.setCtl(createValidate.getCtl());
-        model.setZl(createValidate.getZl());
-        model.setWhcd(createValidate.getWhcd());
-        //model.setSbqy(createValidate.getSbqy());
-        model.setSj(createValidate.getSj());
-        tIronDataMapper.insert(model);
-    }
 
     /**
      * 出铁数据删除
@@ -135,19 +117,50 @@ public class TIronDataServiceImpl extends ServiceImpl<TIronDataMapper, TIronData
     /**
      * 出铁数据批量删除
      *
-     * @author zhanghao
      * @param ids 主键数组
+     * @author zhanghao
      */
-    public AjaxResult<Object> del_ex(List<Long> ids){
+    public AjaxResult<Object> del_ex(List<Long> ids) {
         List<TIronData> models = tIronDataMapper.selectList(
                 new QueryWrapper<TIronData>()
                         .in("id", ids));
 
-        if (CollectionUtils.isEmpty(models)){
+        if (CollectionUtils.isEmpty(models)) {
             return AjaxResult.failed("数据不存在");
         }
         tIronDataMapper.delete(new QueryWrapper<TIronData>().in("id", ids));
         return AjaxResult.success();
     }
 
+    /***
+     * 获取最新6条数据
+     * @return
+     */
+    public List<TIronData> queryIronData(TIronData ironData) {
+        QueryWrapper<TIronData> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda()
+                .eq(ObjectUtils.isNotEmpty(ironData.getSlagWeight()), TIronData::getSlagWeight, ironData.getSlagWeight())
+                .eq(ObjectUtils.isNotEmpty(ironData.getIronWeight()), TIronData::getIronWeight, ironData.getIronWeight())
+                .eq(ObjectUtils.isNotEmpty(ironData.getIronCosttime()), TIronData::getIronCosttime, ironData.getIronCosttime())
+                .eq(ObjectUtils.isNotEmpty(ironData.getIronNo()), TIronData::getIronNo, ironData.getIronNo())
+                .between(TIronData::getCreateTime, ironData.getIronStarttime(), ironData.getIronEndtime())
+                .eq(ObjectUtils.isNotEmpty(ironData.getTapholeId()), TIronData::getTapholeId, ironData.getTapholeId())
+        ;
+        return list(queryWrapper);
+    }
+
+    /***
+     * 导出数据
+     * @param ironData
+     * @param response
+     * @throws IOException
+     */
+    public void exportIronData(TIronData ironData, HttpServletResponse response) throws IOException {
+        if (ObjectUtils.isNotEmpty(ironData.getIronStarttime()) && ObjectUtils.isNotEmpty(ironData.getIronEndtime())) {
+            throw new OperateException("导出请选择开始时间和结束时间!");
+        }
+        List<TIronData> tl2DataList = queryIronData(ironData);
+        ExcelUtils.exportExcel(tl2DataList, TIronData.class, "出铁数据", "出铁数据", response);
+    }
+
 }

+ 167 - 132
taphole-iron/src/main/java/com/sckj/iron/socketio/DeviceEventListener.java

@@ -21,7 +21,6 @@ import com.sckj.opc.dto.L2Data;
 import com.sckj.opc.dto.L2Material;
 import com.sckj.opc.entity.OPCData;
 import com.sckj.opc.opcua.L2DataServiceImpl;
-import com.sckj.opc.opcua.OPCDAServiceImpl;
 import com.sckj.opc.service.OPCDataServiceImpl;
 import com.sckj.opc.utils.CustomUtil;
 import com.sckj.warn.service.ITExceptionLogService;
@@ -40,6 +39,8 @@ import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -88,9 +89,6 @@ public class DeviceEventListener extends EventListener {
     @Resource
     ITExceptionLogService iTExceptionLogService;
 
-    @Resource
-    OPCDAServiceImpl opcdaService;
-
     //1号出铁状态标记
     private static final String TAG_TAPHOLE1_STATUS = "AOD25606.PV";
     //2号出铁状态标记
@@ -111,10 +109,10 @@ public class DeviceEventListener extends EventListener {
     private static final String TAG_IRON_WEIGHT12 = "WI5402.PV";
 
     //预判和确认出铁
-    private static final String ypqrct = "lnct";
+    private static final String STEP_YPQRCT = "lnct";
 
     //铁量差计算
-    private static final String tlc = "tlc";
+    private static final String STEP_TLC = "tlc";
 
     //铁水成分
     public static final String IRON_ELEMENT = "ironElement";
@@ -137,14 +135,6 @@ public class DeviceEventListener extends EventListener {
     private static final String MOUTH_STATUS = "bdlz";
     //冲渣状态
     private static final String FLUSH_STATUS = "AOD25607.PV";
-    //预计出铁结束时间
-    private static final String PLAN_END_TIME = "planEndTime";
-
-    //实时数据
-    Map<String, Object> mRealtimeData = new ConcurrentHashMap<>();
-
-    //实时状态
-    Map<String, Object> mRealtimeStatus = new ConcurrentHashMap<>();
 
     // 1.创建表达式解析器
     private SpelExpressionParser parser = new SpelExpressionParser();
@@ -152,51 +142,72 @@ public class DeviceEventListener extends EventListener {
     // 2.创建变量上下文,设置变量
     private StandardEvaluationContext mContext = new StandardEvaluationContext();
 
+    //定时器
+    @Resource
+    private ScheduledTaskManager scheduledTaskManager;
+
+    //多任务
+    @Resource(name = "taskExecutor")
+    ThreadPoolTaskExecutor taskExecutor;
+
+    //开口预警
+    public static final String TASKNAME_OPEN_WARN = "open_warn";
+    //堵口预警,出铁xxx分钟开始
+    public static final String TASKNAME_CLOSE_WARN = "close_warn";
+    //出铁预警
+    public static final String TASKNAME_TAPPING_WARN = "tapping_warn";
+    //出铁诊断,出铁结束后xxx分钟开始
+    private static final String TASKNAME_TAPPING_TEST = "tapping_test";
+    //打泥量预计
+    private static final String TASKNAME_HIT_MUD = "hit_mud";
+    //出铁计时
+    private static final String TASKNAME_TAPPING_CONSTTIME = "tapping_consttime";
+
+    //铁口出铁状态
+    //1 出铁中    0 出铁结束
+    private AtomicBoolean ironLoading1 = new AtomicBoolean(false);
+    //
+    private AtomicBoolean ironLoading2 = new AtomicBoolean(false);
+    //
+    private AtomicBoolean ironLoading3 = new AtomicBoolean(false);
+    //
+    private AtomicBoolean ironLoading4 = new AtomicBoolean(false);
+
     //出铁步骤
     private List<IronStepVO> mSteps;
 
     //出铁参数
     private Map<String, TIronParam> mIronParamMap;
 
+    //节点标记
     private static final String NODE = "node";
 
-    //定时器
-    @Resource
-    private ScheduledTaskManager scheduledTaskManager;
-
-    //开口预警
-    private static final String TASKNAME_OPEN_WARN = "TASKNAME_OPEN_WARN";
-    //堵口预警
-    private static final String TASKNAME_CLOSE_WARN = "TASKNAME_CLOSE_WARN";
-    //出铁预警
-    private static final String TASKNAME_IRON_WARN = "TASKNAME_IRON_WARN";
-    //出铁诊断
-    private static final String TASKNAME_IRON_TEST = "TASKNAME_IRON_TEST";
+    //实时数据
+    Map<String, Object> mRealtimeData = new ConcurrentHashMap<>();
 
-    //打泥量预计
-    private static final String TASKNAME_MUD = "TASKNAME_DRY";
+    //实时状态
+    Map<String, Object> mRealtimeStatus = new ConcurrentHashMap<>();
 
-    //是否出铁中
-    //1 出铁中    0 出铁结束
-    private boolean ironLoading1 = false;
-    private boolean ironLoading2 = false;
-    private boolean ironLoading3 = false;
-    private boolean ironLoading4 = false;
 
     //最近任一铁口出铁结束时间
     private Date mIronEndTimeRecently;
 
-    @Resource(name = "taskExecutor")
-    ThreadPoolTaskExecutor taskExecutor;
+    private BigDecimal speed1 = BigDecimal.ZERO;
 
-    private float speed1, speed2;
+    private BigDecimal speed2 = BigDecimal.ZERO;
 
     //标准流速
-    private float STANDARD_SPEED;
-    //开口耗时
-    private int OPEND_HOUR;
-    private int PRESSURE_DIFF_VALUE;
+    private BigDecimal STANDARD_SPEED;
 
+    //压差阈值
+    private BigDecimal PRESSURE_DIFF_VALUE;
+
+    //实时出铁总重量/总流量
+    private BigDecimal mTotalWeight = BigDecimal.ZERO;
+    //总干量
+    private BigDecimal mTotalDry = BigDecimal.ZERO;
+    //耗时(单位:s)
+    private AtomicInteger mSecondsElapsed = new AtomicInteger(0);
 
     //redis保存最多数量数据
     private static final int MAX_REDIS_COUNT = 50;
@@ -215,9 +226,8 @@ public class DeviceEventListener extends EventListener {
         if (ObjectUtils.isNotEmpty(mIronParams)) {
             mIronParamMap = mIronParams.stream()
                     .collect(Collectors.toMap(TIronParam::getParamName, ironParam -> ironParam, (existing, replacement) -> existing));
-            STANDARD_SPEED = Float.parseFloat(mIronParamMap.get("iron_speed").getParamValue());
-            OPEND_HOUR = Integer.parseInt(mIronParamMap.get("open_hours").getParamValue());
-            PRESSURE_DIFF_VALUE = Integer.parseInt(mIronParamMap.get("pressure_diff_value").getParamValue());
+            STANDARD_SPEED = new BigDecimal(mIronParamMap.get("iron_speed").getParamValue());
+            PRESSURE_DIFF_VALUE = new BigDecimal(mIronParamMap.get("pressure_diff_value").getParamValue());
         }
 
     }
@@ -271,7 +281,7 @@ public class DeviceEventListener extends EventListener {
                 if (NODE.equalsIgnoreCase(stepDTO.getNodeType())) {
                     //处理子项
                     for (IronStepVO child : stepDTO.getChilds()) {
-                        if (tlc.equals(child.getIdentifier())) {
+                        if (STEP_TLC.equals(child.getIdentifier())) {
                             List<TL2Data> latest2Data = tl2DataService.getLatest2Data();
                             if (latest2Data.size() >= 2) {
                                 HashMap[] hashMaps = new HashMap[6];
@@ -321,7 +331,7 @@ public class DeviceEventListener extends EventListener {
                 }
             }
             setStepResult(mSteps);
-            PushData.send2Operation(mSteps, ironLoading1);
+            PushData.send2Operation(mSteps, ironLoading1.get());
         });
 
     }
@@ -337,14 +347,14 @@ public class DeviceEventListener extends EventListener {
             tl2MaterialService.saveOrUpdate(tl2Material);
         });
 
-        if (ironLoading1) {
+        if (ironLoading1.get()) {
             BigDecimal bigDecimalNew = new BigDecimal(l2Material.getDryWeight());
-            totalDry = totalDry.add(bigDecimalNew);
+            mTotalDry = mTotalDry.add(bigDecimalNew);
         } else {
-            totalDry = BigDecimal.ZERO;
+            mTotalDry = BigDecimal.ZERO;
         }
 
-        RedisUtils.addFixedElement(IRON_TOTAL_DRY, totalDry, MAX_REDIS_COUNT);
+        RedisUtils.addFixedElement(IRON_TOTAL_DRY, mTotalDry, MAX_REDIS_COUNT);
 
     }
 
@@ -354,33 +364,29 @@ public class DeviceEventListener extends EventListener {
         boolean isReady = false;
 
         for (IronStepVO stepDTO : mSteps) {
-            if (ypqrct.equalsIgnoreCase(stepDTO.getIdentifier()) && 1 == stepDTO.getPassResult()) {
+            if (STEP_YPQRCT.equalsIgnoreCase(stepDTO.getIdentifier()) && 1 == stepDTO.getPassResult()) {
                 isReady = true;
                 break;
             }
         }
 
         //炉前在接受到炉内出铁要求后,10分钟内打开铁口,未打开系统告警并记录
-        if (isReady) {
-            scheduledTaskManager.addTask(TASKNAME_OPEN_WARN, 0, OPEND_HOUR, TimeUnit.MINUTES, () -> {
-                log.info("堵口预警:{}", TASKNAME_OPEN_WARN);
-
-                System.out.println("倒计时结束!10分钟已到。");
-                // 出铁预警,打开系统告警并记录
-                PushData.send2Warn("请立即打开铁口");
-                log.info("准备出铁但是未及时出铁口,此处数据库记录");
-                scheduledTaskManager.cancelTask(TASKNAME_OPEN_WARN); // 终止定时器
-            });
-        }
+//        if (isReady) {
+//            scheduledTaskManager.addTask(TASKNAME_OPEN_WARN, 0, OPEND_HOUR, TimeUnit.MINUTES, () -> {
+//                log.info("堵口预警:{}", TASKNAME_OPEN_WARN);
+//
+//                System.out.println("倒计时结束!10分钟已到。");
+//                // 出铁预警,打开系统告警并记录
+//                PushData.send2Warn("请立即打开铁口");
+//                log.info("准备出铁但是未及时出铁口,此处数据库记录");
+//                scheduledTaskManager.cancelTask(TASKNAME_OPEN_WARN); // 终止定时器
+//            });
+//        }
 
 
         //由 0 -> 1 表明1号铁口开始出铁
         //
         //根据理论铁量、实时铁水流速,推测距离出铁结束的剩余时间
-        //剩余时间=总时间-已经流去的时间
-//                mContext.lookupVariable("");
-
-
 //      Date ironTime = mOPCData.getServerTime();
 //      lastIronEndTimeRecently
         //获取总干量
@@ -388,70 +394,81 @@ public class DeviceEventListener extends EventListener {
         //计算出理论铁量
         BigDecimal multiply = totalDry.multiply(new BigDecimal(1.0)).multiply(new BigDecimal(1.0));
         //
-        float totalSpeed = speed1 + speed2;
-        if (totalSpeed > 0) {
-            //理论时间
-            BigDecimal divide = multiply.divide(new BigDecimal(totalSpeed), 2, BigDecimal.ROUND_HALF_UP);
-            String plainString = divide.toPlainString();
-            log.info("理论出铁时间:{}min", plainString);
-        }
-
-        //开始计算打泥量,通过打泥量公式
-        //打泥量公式关联因素:铁口深度、钻杆直径、
+//        float totalSpeed = speed1.add(speed2);
+//        if (totalSpeed > 0) {
+//            //理论时间
+//            BigDecimal divide = multiply.divide(new BigDecimal(totalSpeed), 2, BigDecimal.ROUND_HALF_UP);
+//            String plainString = divide.toPlainString();
+//            log.info("理论出铁时间:{}min", plainString);
+//        }
+
+        //堵口预警
         scheduledTaskManager.addTask(TASKNAME_CLOSE_WARN, 0, 1, TimeUnit.MINUTES, () -> {
             //堵口预警
-            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1, speed2, TASKNAME_OPEN_WARN);
-            if (speed1 > STANDARD_SPEED || speed2 > STANDARD_SPEED) {
+            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1, speed2, TASKNAME_CLOSE_WARN);
+            if (speed1.compareTo(STANDARD_SPEED) > 0 || speed2.compareTo(STANDARD_SPEED) > 0) {
                 //流速过大可能是由于铁口深度不足或发生跑大流问题,则提示将当前铁口堵口
-                PushData.send2Warn(WarnData.warnClose("流速过快,请堵口"));
-            } else if ((speed1 < STANDARD_SPEED || speed2 < STANDARD_SPEED) && (ironLoading2 || ironLoading3 || ironLoading4)) {
+                PushData.send2Warn(WarnData.warnClose("流速过快,请将当前铁口堵口"));
+            } else if ((speed1.compareTo(STANDARD_SPEED) < 0 || speed2.compareTo(STANDARD_SPEED) < 0) && (ironLoading2.get() || ironLoading3.get() || ironLoading4.get())) {
                 //若流速过小,但其它铁口正在出铁,则提示将当前铁口堵口
-                PushData.send2Warn(WarnData.warnClose("请堵口"));
-            } else if ((speed1 < STANDARD_SPEED || speed2 < STANDARD_SPEED) && (!ironLoading2 && !ironLoading3 && !ironLoading4)) {
+                PushData.send2Warn(WarnData.warnClose("流速过小,将当前铁口堵口"));
+            } else if ((speed1.compareTo(STANDARD_SPEED) < 0 || speed2.compareTo(STANDARD_SPEED) < 0) && (!ironLoading2.get() && !ironLoading3.get() && !ironLoading4.get())) {
                 //若流速过小且其他铁口均未出铁,则提示先将其它铁口打开,再进行堵口
-                PushData.send2Warn(WarnData.warnClose("请先将其它铁口打开,再堵口"));
+                PushData.send2Warn(WarnData.warnClose("请先打开其它铁口,再堵口"));
             }
         });
 
+        //开始计算打泥量,通过打泥量公式
+        //打泥量公式关联因素:铁口深度、钻杆直径、
         //调用打泥量模型,计算预计使用多少打泥量进行堵口
-        scheduledTaskManager.addTask(TASKNAME_MUD, 0, 30, TimeUnit.SECONDS, () -> {
-            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1, speed2, TASKNAME_OPEN_WARN);
+        scheduledTaskManager.addTask(TASKNAME_HIT_MUD, 0, 30, TimeUnit.SECONDS, () -> {
+            log.info("堵口预警:{},speed1:{},speed2:{},STANDARD_SPEED:{}", speed1, speed2, TASKNAME_HIT_MUD);
             String dryString = totalDry.toPlainString();
             //
             //堵口预警
             //计算理论铁量= 矿批 × 综合品位 × 1.06,其中矿批是指L2中的干量
-
-            scheduledTaskManager.cancelTask(TASKNAME_MUD);
+            scheduledTaskManager.cancelTask(TASKNAME_HIT_MUD);
         });
 
+        //出铁计时
+        scheduledTaskManager.addTask(TASKNAME_TAPPING_CONSTTIME, 0, 1, TimeUnit.SECONDS, () -> {
+            int totalSeconds = mSecondsElapsed.get();
+            int hours = totalSeconds / 3600;
+            int minutes = (totalSeconds % 3600) / 60;
+            int seconds = totalSeconds % 60;
+            String elapsedTime = String.format("%02d:%02d:%02d", hours, minutes, seconds);
+            log.info("elapsedTime:{}", elapsedTime);
+            RedisUtils.addFixedElement(TASKNAME_TAPPING_CONSTTIME, elapsedTime, MAX_REDIS_COUNT);
+            PushData.send2CostTime(elapsedTime);
+            mSecondsElapsed.incrementAndGet();
+        });
 
     }
 
     //1号铁口结束出铁的操作项目
     private void taphole1End() {
         //由 1-> 0 表明1号铁口结束出铁
-        totalWeight = BigDecimal.ZERO;
-        totalDry = BigDecimal.ZERO;
+        mTotalWeight = BigDecimal.ZERO;
+        mTotalDry = BigDecimal.ZERO;
         scheduledTaskManager.cancelTask(TASKNAME_OPEN_WARN);
         scheduledTaskManager.cancelTask(TASKNAME_CLOSE_WARN);
-        scheduledTaskManager.cancelTask(TASKNAME_IRON_WARN);
-        scheduledTaskManager.cancelTask(TASKNAME_MUD);
+        scheduledTaskManager.cancelTask(TASKNAME_TAPPING_WARN);
+        scheduledTaskManager.cancelTask(TASKNAME_HIT_MUD);
+        scheduledTaskManager.cancelTask(TASKNAME_TAPPING_CONSTTIME);
+        mSecondsElapsed.set(0);
+
         recordAfter();
         recordBlock();
 
-        //出铁结束后,查询最近两次的数据
-
         //开始出铁诊断
         //获取开口耗时、出铁时间、实际出铁量、平均铁水流速、平均铁水温度等数据,进行阈值判定,诊断出铁是否正常
-
-        //10分钟延迟
-        scheduledTaskManager.addTask(TASKNAME_IRON_TEST, 0, 3, TimeUnit.SECONDS, () -> {
+        //xxx分钟延迟
+        scheduledTaskManager.addTask(TASKNAME_TAPPING_TEST, 0, 3, TimeUnit.SECONDS, () -> {
             //堵口预警
-            log.info("定时任务:{},出铁诊断", TASKNAME_IRON_TEST);
+            log.info("定时任务:{},出铁诊断", TASKNAME_TAPPING_TEST);
             L2Data fixedLatestElement = (L2Data) RedisUtils.getFixedLatestElement(IRON_ELEMENT);
             //平均温度
             String mudWeight = fixedLatestElement.getAvgTemp();
-
             //出铁时间
             String ironCosttime = fixedLatestElement.getIronCosttime();
             //实际出铁量
@@ -462,8 +479,7 @@ public class DeviceEventListener extends EventListener {
 
             ironDataService.save(ironData);
 
-
-            scheduledTaskManager.cancelTask(TASKNAME_IRON_TEST);
+            scheduledTaskManager.cancelTask(TASKNAME_TAPPING_TEST);
         });
 
     }
@@ -478,13 +494,6 @@ public class DeviceEventListener extends EventListener {
         ironBlockService.add(null);
     }
 
-    //实时出铁总重量/总流量
-    private BigDecimal totalWeight = BigDecimal.ZERO;
-
-    //总干量
-    private BigDecimal totalDry = BigDecimal.ZERO;
-
-
     /***
      * 设置实时数据值和状态
      */
@@ -527,11 +536,11 @@ public class DeviceEventListener extends EventListener {
                 if (opcData.getPointName().contains(TAG_CAR11)) {
                     realtimeData.setDesc("1号车");
                     speeds[0] = realtimeData;
-                    speed1 = Float.parseFloat(opcData.getData().toString());
+                    speed1 = new BigDecimal(opcData.getData().toString());
                 } else {
                     realtimeData.setDesc("2号车");
                     speeds[1] = realtimeData;
-                    speed2 = Float.parseFloat(opcData.getData().toString());
+                    speed2 = new BigDecimal(opcData.getData().toString());
                 }
 
                 //只在两个都有数据的时候才添加
@@ -549,27 +558,27 @@ public class DeviceEventListener extends EventListener {
                 realtimeData.setDesc("出铁状态");
                 mRealtimeStatus.put(IRON_STATUS, realtimeData);
 
-                ironLoading1 = "1".equals(opcData.getData().toString());
+                ironLoading1.set("1".equals(opcData.getData().toString()));
 
-                if (ironLoading1) {
+                if (ironLoading1.get()) {
                     taphole1Start(l2Data);
                 } else {
                     taphole1End();
                 }
 
             } else if (opcData.getPointName().contains(TAG_TAPHOLE2_STATUS)) {
-                ironLoading2 = "1".equals(opcData.getData().toString());
-                if (!ironLoading2) {
+                ironLoading2.set("1".equals(opcData.getData().toString()));
+                if (ironLoading2.get()) {
                     mIronEndTimeRecently = opcData.getServerTime();
                 }
             } else if (opcData.getPointName().contains(TAG_TAPHOLE3_STATUS)) {
-                ironLoading3 = "1".equals(opcData.getData().toString());
-                if (!ironLoading3) {
+                ironLoading3.set("1".equals(opcData.getData().toString()));
+                if (ironLoading3.get()) {
                     mIronEndTimeRecently = opcData.getServerTime();
                 }
             } else if (opcData.getPointName().contains(TAG_TAPHOLE4_STATUS)) {
-                ironLoading4 = "1".equals(opcData.getData().toString());
-                if (!ironLoading4) {
+                ironLoading4.set("1".equals(opcData.getData().toString()));
+                if (!ironLoading4.get()) {
                     mIronEndTimeRecently = opcData.getServerTime();
                 }
             } else if (opcData.getPointName().contains(TAG_IRON_WEIGHT11) || opcData.getPointName().contains(TAG_IRON_WEIGHT12)) {
@@ -578,8 +587,8 @@ public class DeviceEventListener extends EventListener {
                 ironWeight.setDesc("铁水流量");
                 ironWeight.setUnit("t");
                 BigDecimal bigDecimalNew = new BigDecimal(opcData.getData().toString());
-                totalWeight = totalWeight.add(bigDecimalNew);
-                ironWeight.setValue(totalWeight);
+                mTotalWeight = mTotalWeight.add(bigDecimalNew);
+                ironWeight.setValue(mTotalWeight);
                 mRealtimeData.put(IRON_WEIGHT, ironWeight);
 //                log.info(">>>>>>>>>>>>>{}:{},total:{}", opcData.getPointName(), opcData.getData(), totalWeight.toPlainString());
 
@@ -593,17 +602,18 @@ public class DeviceEventListener extends EventListener {
                 realtimeData.setDesc("冲渣状态");
                 mRealtimeStatus.put(FLUSH_STATUS, realtimeData);
             }
-//            else if (opcData.getPointName().contains(PLAN_END_TIME)) {
-//                RealtimeData realtimeData = new RealtimeData();
-//                realtimeData.setValue(opcData.getData());
-//                realtimeData.setDesc("预计出铁结束时间");
-//                mRealtimeData.put(PLAN_END_TIME, realtimeData);
-//            }
 
 
-            float yc = Float.valueOf(ObjectUtils.defaultIfNull(mContext.lookupVariable("yc"), "0").toString());
-            if (yc > PRESSURE_DIFF_VALUE) {
-                PushData.send2Warn(WarnData.warnOpen("预警出铁"));
+            BigDecimal yc = new BigDecimal(ObjectUtils.defaultIfNull(mContext.lookupVariable("yc"), "0").toString());
+            if (PRESSURE_DIFF_VALUE.compareTo(yc) < 0) {
+                //xxx分钟延迟
+                scheduledTaskManager.addTask(TASKNAME_TAPPING_WARN, 0, 3, TimeUnit.SECONDS, () -> {
+                    //堵口预警
+                    log.info("出铁预警:{}", TASKNAME_TAPPING_WARN);
+                    PushData.send2Warn(WarnData.warnTapping("压差超过阈值,请出铁"));
+                });
+            } else {
+                scheduledTaskManager.cancelTask(TASKNAME_TAPPING_WARN);
             }
 
 
@@ -631,7 +641,7 @@ public class DeviceEventListener extends EventListener {
 
             RealtimeData realtimeData3 = new RealtimeData();
             realtimeData3.setValue(realtimeDataList);
-            realtimeData3.setDesc("铁水成分");
+            realtimeData3.setDesc("铁水成分(最近批次)");
 
             mRealtimeData.put(IRON_ELEMENT, realtimeData3);
         }
@@ -681,7 +691,7 @@ public class DeviceEventListener extends EventListener {
         setStepResult(mSteps);
 
 
-        PushData.send2Operation(mSteps, ironLoading1);
+        PushData.send2Operation(mSteps, ironLoading1.get());
 
     }
 
@@ -745,7 +755,7 @@ public class DeviceEventListener extends EventListener {
 
         //非流程必须项,直接放行
         //正在出铁中,直接发行
-        if ("0".equals(stepVO.getRequired()) || ironLoading1) {
+        if ("0".equals(stepVO.getRequired()) || ironLoading1.get()) {
             stepVO.setPassResult(1);
             return;
         }
@@ -801,7 +811,7 @@ public class DeviceEventListener extends EventListener {
         if (Objects.equals(stepDTO.getStepId(), message.getStepId()) && Objects.equals(stepDTO.getIdentifier(), message.getIdentifier()) && Objects.equals("2", stepDTO.getConfirmMode())) {
             stepDTO.setData(message.getData());
             setStepResult(mSteps);
-            PushData.send2Operation(mSteps, ironLoading1);
+            PushData.send2Operation(mSteps, ironLoading1.get());
             //这里手动记录时间
             log.info("userId:{},stepId:{},identifier:{},data:{},pass:{}", userId, message.getStepId(), message.getIdentifier(), message.getData(), message.isPass());
 
@@ -837,6 +847,31 @@ public class DeviceEventListener extends EventListener {
 
 
     /***
+     * 用户端点击触发,取消预警
+     * @param client
+     * @param message
+     */
+    @OnEvent(value = PushData.IRON_CANCEL_WARN)
+    public void cancelWarn(SocketIOClient client, WarnData message) {
+        if (ObjectUtils.isNotEmpty(message)) {
+            switch (message.getType()) {
+                case TASKNAME_OPEN_WARN:
+                    scheduledTaskManager.cancelTask(TASKNAME_OPEN_WARN);
+                    break;
+                case TASKNAME_TAPPING_WARN:
+                    scheduledTaskManager.cancelTask(TASKNAME_TAPPING_WARN);
+                    break;
+                case TASKNAME_CLOSE_WARN:
+                    scheduledTaskManager.cancelTask(TASKNAME_CLOSE_WARN);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+
+    /***
      * 数据库更改后调用接口刷新步骤
      */
     @Subscribe

+ 28 - 0
taphole-iron/src/main/java/com/sckj/iron/socketio/PushData.java

@@ -65,6 +65,18 @@ public class PushData {
     public static final String IRON_WARN = "IRON_WARN";
 
 
+    /***
+     * 开始出铁计时
+     */
+    public static final String IRON_COSTTIME = "IRON_COSTTIME";
+
+
+    /***
+     * 取消预警
+     */
+    public static final String IRON_CANCEL_WARN = "IRON_CANCEL_WARN";
+
+
     /**
      * 出铁操作
      *
@@ -233,5 +245,21 @@ public class PushData {
         }
     }
 
+    /**
+     * 开始出铁计时
+     *
+     * @return
+     * @Param
+     **/
+    public static void send2CostTime(Object message) {
+        if (SocketUtil.connectMap.isEmpty()) {
+            return;
+        }
+        //
+        for (Map.Entry<String, SocketIOClient> entry : SocketUtil.connectMap.entrySet()) {
+            entry.getValue().sendEvent(PushData.IRON_COSTTIME, AjaxResult.success(message));
+        }
+    }
+
 
 }