|
@@ -259,6 +259,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
|
|
|
//建议打泥量
|
|
|
private String mCalcHitMud;
|
|
|
+ private int diffCloseTime;
|
|
|
|
|
|
//铁水高温异常情况次数
|
|
|
private AtomicInteger mIronTempHighCount = new AtomicInteger(0);
|
|
@@ -815,7 +816,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
RealtimeData realtimeData = new RealtimeData();
|
|
|
realtimeData.setDesc("距离堵口预计还剩");
|
|
|
realtimeData.setUnit("分钟");
|
|
|
- int diffCloseTime = 0;
|
|
|
+
|
|
|
|
|
|
if (ironLoading1.get() <= 0) {
|
|
|
log.info("当前铁口状态: 非出铁状态, 跳过计算");
|
|
@@ -842,11 +843,17 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
double stdIronWeightMax = Double.parseDouble(mContext.lookupVariable(ExpressionConstants.stdIronWeightMax).toString());
|
|
|
double stdIronSpeedMin = Double.parseDouble(mContext.lookupVariable(ExpressionConstants.stdSpeedMin).toString());
|
|
|
double stdIronSpeedMax = Double.parseDouble(mContext.lookupVariable(ExpressionConstants.stdSpeedMax).toString());
|
|
|
+ //实时流速
|
|
|
+ double rtIronSpeed = Double.parseDouble(mContext.lookupVariable(ExpressionConstants.rtIronSpeed).toString());
|
|
|
//实时总铁量
|
|
|
// BigDecimal totalWeight = rtTotalWeight;
|
|
|
//平均流速
|
|
|
BigDecimal avgSpeed = totalWeight.divide(BigDecimal.valueOf(ironElapsedMinute), 2, RoundingMode.HALF_UP);
|
|
|
|
|
|
+ if (avgSpeed.doubleValue() < stdIronSpeedMin && rtIronSpeed >= stdIronSpeedMin) {
|
|
|
+ avgSpeed = BigDecimal.valueOf(rtIronSpeed);
|
|
|
+ }
|
|
|
+
|
|
|
if (avgSpeed.doubleValue() < stdIronSpeedMin || avgSpeed.doubleValue() > stdIronSpeedMax) {
|
|
|
log.warn("平均流速{}不在速度阈值范围内({}-{}), 不计算剩余时间", avgSpeed, stdIronSpeedMin, stdIronSpeedMax);
|
|
|
return;
|
|
@@ -1116,6 +1123,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
// 2. 重置前端显示
|
|
|
log.info("🔄 重置前端显示数据...");
|
|
|
PushData.send2CostTime(new RealtimeData());
|
|
|
+ diffCloseTime = 0;
|
|
|
PushData.send2CloseTime(new RealtimeData());
|
|
|
log.info("✅ 前端显示已重置");
|
|
|
|
|
@@ -1520,7 +1528,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
List<Object> warnData = mWarnCountMap.getOrDefault(modelKey, new ArrayList<>());
|
|
|
int count = warnData.isEmpty() ? 0 : ((Number) warnData.get(0)).intValue();
|
|
|
log.info("[急需出铁预警] 当前计数状态 - 当前: {}/{}次, 历史数据: {}",
|
|
|
- count, triggerCount, formatWarnData(warnData,"kPa"));
|
|
|
+ count, triggerCount, formatWarnData(warnData, "kPa"));
|
|
|
|
|
|
// 增加计数并保存当前数据
|
|
|
count++;
|
|
@@ -1542,7 +1550,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
log.warn("触发急需出铁告警,压差超过阈值: {}", mContext.lookupVariable(ExpressionConstants.stdPressureDiff));
|
|
|
|
|
|
// 构建异常消息,包含所有记录的数据
|
|
|
- String msg = String.format("压差:%sk,连续超过阈值%skPa", formatWarnData(warnData,"kPa"), StandardConstans.STANDARD_PRESSURE_DIFF);
|
|
|
+ String msg = String.format("压差:%sk,连续超过阈值%skPa", formatWarnData(warnData, "kPa"), StandardConstans.STANDARD_PRESSURE_DIFF);
|
|
|
log.info("[急需出铁预警] 告警消息内容: {}", msg);
|
|
|
//触发次数超过配置的次数后发出预警
|
|
|
TAudioDTO audioDTO = mAudioMap.get(ExceptionTypeEnum.NEED_TAPHOLE.getCode());
|
|
@@ -1586,8 +1594,8 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- private String formatWarnData(List<Object> warnData,String unit) {
|
|
|
- if(warnData.isEmpty() || warnData.size() <= 1) {
|
|
|
+ private String formatWarnData(List<Object> warnData, String unit) {
|
|
|
+ if (warnData.isEmpty() || warnData.size() <= 1) {
|
|
|
return "";
|
|
|
}
|
|
|
StringBuilder sb = new StringBuilder();
|
|
@@ -2158,7 +2166,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
try {
|
|
|
// 构建包含所有异常数据的消息
|
|
|
String exceptionMsg = String.format("温度连续%d次偏低:%s,低于%d℃",
|
|
|
- StandardConstans.WARN_COUNT,formatWarnData(warnData,"℃"), stdTempMin);
|
|
|
+ StandardConstans.WARN_COUNT, formatWarnData(warnData, "℃"), stdTempMin);
|
|
|
|
|
|
PushData.send2Warn(mAudioMap.get(ExceptionTypeEnum.IRON_TEMP_HIGH.getCode()));
|
|
|
saveException(ExceptionTypeEnum.IRON_TEMP_HIGH, exceptionMsg);
|
|
@@ -2196,7 +2204,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
try {
|
|
|
// 构建包含所有异常数据的消息
|
|
|
String exceptionMsg = String.format("温度连续%d次偏高:%s,高于%d℃",
|
|
|
- StandardConstans.WARN_COUNT, formatWarnData(warnData,"℃"), stdTempMax);
|
|
|
+ StandardConstans.WARN_COUNT, formatWarnData(warnData, "℃"), stdTempMax);
|
|
|
|
|
|
PushData.send2Warn(mAudioMap.get(ExceptionTypeEnum.IRON_TEMP_LOW.getCode()));
|
|
|
saveException(ExceptionTypeEnum.IRON_TEMP_LOW, exceptionMsg);
|
|
@@ -2208,7 +2216,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
} catch (Exception e) {
|
|
|
log.error("处理温度偏高异常时发生错误", e);
|
|
|
}
|
|
|
- mWarnCountMap.put(tempMaxWarn,new ArrayList<>());
|
|
|
+ mWarnCountMap.put(tempMaxWarn, new ArrayList<>());
|
|
|
mIronTempHighCount.incrementAndGet();
|
|
|
log.info("重置温度偏高计数器,高温异常次数+1");
|
|
|
return;
|
|
@@ -2360,14 +2368,14 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
log.info(" ├─ 其他铁口状态: 有铁口正在出铁");
|
|
|
saveException(ExceptionTypeEnum.NEED_CLOSURE,
|
|
|
String.format("铁水流速连续%d次偏低:%st,低于%st/min,但其它铁口正在出铁,请将当前铁口堵口",
|
|
|
- StandardConstans.WARN_COUNT,formatWarnData(warnData,"t/min"), stdSpeedMin));
|
|
|
+ StandardConstans.WARN_COUNT, formatWarnData(warnData, "t/min"), stdSpeedMin));
|
|
|
log.info(" └─ 已保存异常记录: 类型=NEED_CLOSURE");
|
|
|
} else {
|
|
|
//堵口3
|
|
|
log.info(" ├─ 其他铁口状态: 无铁口正在出铁");
|
|
|
saveException(ExceptionTypeEnum.NEED_CLOSURE,
|
|
|
String.format("铁水流速连续%d次偏低:%s,低于%st/min,其他铁口均未出铁,请先将其它铁口打开,再进行堵口",
|
|
|
- StandardConstans.WARN_COUNT, formatWarnData(warnData,"t/min"), stdSpeedMin));
|
|
|
+ StandardConstans.WARN_COUNT, formatWarnData(warnData, "t/min"), stdSpeedMin));
|
|
|
log.info(" └─ 已保存异常记录: 类型=NEED_CLOSURE");
|
|
|
}
|
|
|
}
|
|
@@ -2401,7 +2409,7 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
log.info(" ├─ 已发送流速偏高预警音频");
|
|
|
saveException(ExceptionTypeEnum.NEED_CLOSURE,
|
|
|
String.format("铁水流速连续%d次偏高:%s,高于%st/min,建议将当前铁口堵口",
|
|
|
- StandardConstans.WARN_COUNT, formatWarnData(warnData,"t/min"), stdSpeedMax));
|
|
|
+ StandardConstans.WARN_COUNT, formatWarnData(warnData, "t/min"), stdSpeedMax));
|
|
|
log.info(" ├─ 已保存异常记录: 类型=NEED_CLOSURE");
|
|
|
//推送预警列表
|
|
|
getExceptionList();
|
|
@@ -3149,63 +3157,63 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
*/
|
|
|
@OnEvent(value = PushData.IRON_CONFIRM)
|
|
|
public void confirmIron(SocketIOClient client, IronStepDTO message) {
|
|
|
+ log.info("[confirmIron] 开始处理出铁确认请求");
|
|
|
String userId = validateClientOnline(client);
|
|
|
if (null == userId) {
|
|
|
+ log.info("[confirmIron] 客户端验证失败,用户未在线");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (ObjectUtils.isEmpty(message)) {
|
|
|
- log.info("请求数据为空");
|
|
|
+ log.info("[confirmIron] 请求数据为空");
|
|
|
PushData.send2Operation("请求数据为空", 0);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- log.info("--->userId : {}", userId);
|
|
|
+ log.info("[confirmIron] userId: {}, 接收到的请求数据: stepId={}, identifier={}, data={}",
|
|
|
+ userId, message.getStepId(), message.getIdentifier(), message.getData());
|
|
|
+
|
|
|
+ // 记录当前步骤数量
|
|
|
+ log.info("[confirmIron] 当前步骤总数: {}", mSteps != null ? mSteps.size() : 0);
|
|
|
+
|
|
|
for (IronStepVO stepDTO : mSteps) {
|
|
|
+ log.info("[confirmIron] 处理主步骤: stepId={}, identifier={}", stepDTO.getStepId(), stepDTO.getIdentifier());
|
|
|
for (IronStepVO child : stepDTO.getChilds()) {
|
|
|
- validateManualData(message, userId, child);
|
|
|
+ log.info("[confirmIron] 处理子步骤: stepId={}, identifier={}", child.getStepId(), child.getIdentifier());
|
|
|
+ boolean validated = validateManualData(message, userId, child);
|
|
|
+ log.info("[confirmIron] 子步骤验证结果: stepId={}, result={}", child.getStepId(), validated);
|
|
|
}
|
|
|
- validateManualData(message, userId, stepDTO);
|
|
|
+ boolean validated = validateManualData(message, userId, stepDTO);
|
|
|
+ log.info("[confirmIron] 主步骤验证结果: stepId={}, result={}", stepDTO.getStepId(), validated);
|
|
|
}
|
|
|
|
|
|
setStepResult(mSteps);
|
|
|
+ log.info("[confirmIron] 步骤结果设置完成,推送操作数据");
|
|
|
PushData.send2Operation(mSteps, ironLoading1.get());
|
|
|
|
|
|
+ log.info("[confirmIron] 开始处理特殊步骤逻辑");
|
|
|
for (IronStepVO stepDTO : mSteps) {
|
|
|
if (StepConstans.STEP_LQSQCT.equals(stepDTO.getIdentifier()) && stepDTO.getPassResult() == 1) {
|
|
|
+ log.info("[confirmIron] 触发理论重量计算: LQSQCT步骤通过");
|
|
|
getTheoryWeight2();
|
|
|
} else if (StepConstans.STEP_LNCT.equals(stepDTO.getIdentifier()) && stepDTO.getPassResult() == 1) {
|
|
|
- //炉前出铁操作,10分钟内打开铁口,未打开系统告警并记录
|
|
|
-// if ("1".equals(scheduleMap.get(TaskNameConstants.TASKNAME_OPEN_WARN).getStatus())) {
|
|
|
-// LocalDateTime ldtStartTime = LocalDateTime.now();
|
|
|
-// scheduledTaskManager.addTask(scheduleMap.get(TaskNameConstants.TASKNAME_OPEN_WARN).getName(), StandardConstans.STANDARD_OPEN_HOUR * 60, scheduleMap.get(TaskNameConstants.TASKNAME_OPEN_WARN).getPeriod(), TimeUnit.SECONDS, () -> {
|
|
|
-// LocalDateTime ldtEndTime = LocalDateTime.now();
|
|
|
-// long minutesBetween = Duration.between(ldtStartTime, ldtEndTime).toMinutes();
|
|
|
-// log.info("开口预警");
|
|
|
-// // 出铁预警,打开系统告警并记录
|
|
|
-// PushData.send2Warn(WarnData.warnOpen("急需开口告警", openAlarmUrl));
|
|
|
-// taskExecutor.submit(() -> {
|
|
|
-// exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType(ExceptionTypeEnum.KAI_KOU_CHAO_SHI.getCode()).exceptionDesc(String.format("开口耗时:%s分钟", minutesBetween)).build());
|
|
|
-// //推送预警列表
|
|
|
-// getExceptionList();
|
|
|
-// });
|
|
|
-// });
|
|
|
-// }
|
|
|
-
|
|
|
+ log.info("[confirmIron] 触发炉前出铁操作逻辑: LNCT步骤通过");
|
|
|
+ // 原有的炉前出铁操作逻辑被注释掉
|
|
|
}
|
|
|
|
|
|
for (IronStepVO child : stepDTO.getChilds()) {
|
|
|
if (Objects.equals(child.getIdentifier(), YLGC_STATUS)) {
|
|
|
+ log.info("[confirmIron] 更新鱼雷罐车状态: identifier={}, passResult={}",
|
|
|
+ YLGC_STATUS, child.getPassResult());
|
|
|
RealtimeData realtimeData = new RealtimeData();
|
|
|
realtimeData.setValue(child.getPassResult());
|
|
|
realtimeData.setDesc("鱼雷罐车到位状态");
|
|
|
mRealtimeStatus.put(YLGC_STATUS, realtimeData);
|
|
|
PushData.send2RealtimeStatus(mRealtimeStatus);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
+ log.info("[confirmIron] 出铁确认请求处理完成");
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3270,6 +3278,15 @@ public class DeviceEventListener extends AbstractEventListener { //
|
|
|
PushData.send2IronHitMud(mCalcHitMud);
|
|
|
|
|
|
|
|
|
+ if (ironLoading1.get() <= 0 && diffCloseTime > 0) {
|
|
|
+ RealtimeData realtimeData = new RealtimeData();
|
|
|
+ realtimeData.setDesc("距离堵口预计还剩");
|
|
|
+ realtimeData.setUnit("分钟");
|
|
|
+ realtimeData.setValue(diffCloseTime);
|
|
|
+ PushData.send2CloseTime(realtimeData);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
//异常列表
|
|
|
//预警列表
|
|
|
TIronSchedule getExceptionList = mScheduleMap.get(TaskNameConstants.TASKNAME_EXCEPTION_LIST);
|