andon
This commit is contained in:
@@ -17,7 +17,7 @@ using ZR.Service.mqtt;
|
|||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
//后台定时任务
|
//后台定时任务
|
||||||
//builder.Services.AddHostedService<ScheduledBackgroundService>();
|
builder.Services.AddHostedService<ScheduledBackgroundService>();
|
||||||
|
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddControllers();
|
builder.Services.AddControllers();
|
||||||
@@ -115,7 +115,7 @@ builder.Services.Configure<ApiBehaviorOptions>((o) =>
|
|||||||
// 注册 SocketGatewayServer 为 Singleton(单例,整个应用生命周期一个实例)
|
// 注册 SocketGatewayServer 为 Singleton(单例,整个应用生命周期一个实例)
|
||||||
builder.Services.AddSingleton<SocketGatewayServer>(provider =>
|
builder.Services.AddSingleton<SocketGatewayServer>(provider =>
|
||||||
{
|
{
|
||||||
var server = new SocketGatewayServer("192.168.1.48", 2325); // 你可以按需修改 IP 和端口
|
var server = new SocketGatewayServer("192.168.1.210", 2325); // 你可以按需修改 IP 和端口
|
||||||
server.Start(); // 项目启动时立即启动监听
|
server.Start(); // 项目启动时立即启动监听
|
||||||
//server.StartReceiving();
|
//server.StartReceiving();
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ namespace ZR.Model.MES.andon
|
|||||||
/// 报警时间
|
/// 报警时间
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnName = "level_time")]
|
[SugarColumn(ColumnName = "level_time")]
|
||||||
public string LevelTime { get; set; }
|
public int LevelTime { get; set; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -146,5 +146,8 @@ namespace ZR.Model.MES.andon
|
|||||||
[SugarColumn(ColumnName = "area2")]
|
[SugarColumn(ColumnName = "area2")]
|
||||||
public string Area2 { get; set; }
|
public string Area2 { get; set; }
|
||||||
|
|
||||||
|
[SugarColumn(ColumnName = "autocount")]
|
||||||
|
public int AutoCount { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,7 @@ namespace ZR.Model.MES.andon.Dto
|
|||||||
|
|
||||||
public string LevelName { get; set; }
|
public string LevelName { get; set; }
|
||||||
|
|
||||||
public string LevelTime { get; set; }
|
public int LevelTime { get; set; }
|
||||||
|
|
||||||
public string CreatedBy { get; set; }
|
public string CreatedBy { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -67,5 +67,7 @@ namespace ZR.Model.MES.andon.Dto
|
|||||||
public string Area1 { get; set; }
|
public string Area1 { get; set; }
|
||||||
public string Area2 { get; set; }
|
public string Area2 { get; set; }
|
||||||
public string[] Area { get; set; }
|
public string[] Area { get; set; }
|
||||||
|
|
||||||
|
public int AutoCount { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -25,13 +25,7 @@ namespace ZR.Service.mes.andon
|
|||||||
private AndonAlarmLevelService andonAlarmLevelService = new AndonAlarmLevelService();
|
private AndonAlarmLevelService andonAlarmLevelService = new AndonAlarmLevelService();
|
||||||
private AndonAlarmRecordProcessService andonAlarmRecordProcessService = new AndonAlarmRecordProcessService();
|
private AndonAlarmRecordProcessService andonAlarmRecordProcessService = new AndonAlarmRecordProcessService();
|
||||||
private AndonAlarmTypeDictService andonAlarmTypeDictService = new AndonAlarmTypeDictService();
|
private AndonAlarmTypeDictService andonAlarmTypeDictService = new AndonAlarmTypeDictService();
|
||||||
private SocketGatewayServer _socketGateway = null;
|
private SocketGatewayServer _socketGateway = new SocketGatewayServer();
|
||||||
public AndonAlarmRecordService(SocketGatewayServer socketGateway)
|
|
||||||
{
|
|
||||||
|
|
||||||
_socketGateway= socketGateway;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查询报警记录列表
|
/// 查询报警记录列表
|
||||||
@@ -376,122 +370,127 @@ namespace ZR.Service.mes.andon
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查询一小时内生成的所有未处理报警记录,自动进行超时报警(分批次处理,每批500条)
|
/// 查询三小时内生成的所有未处理报警记录,自动进行超时报警(分批次处理,每批500条)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>ApiResult</returns>
|
/// <returns>ApiResult</returns>
|
||||||
public ApiResult AlarmReportAuto()
|
public ApiResult AlarmReportAuto()
|
||||||
{
|
{
|
||||||
return null;
|
// 定义批次大小,可配置化(便于后续调整)
|
||||||
//// 定义批次大小,可配置化(便于后续调整)
|
const int BatchSize = 500;
|
||||||
//const int BatchSize = 500;
|
var currentTime = DateTime.Now;
|
||||||
//var currentTime = DateTime.Now;
|
var startTime = currentTime.AddHours(-3);
|
||||||
//var startTime = currentTime.AddHours(-1);
|
var endTime = currentTime;
|
||||||
//var endTime = currentTime;
|
|
||||||
|
|
||||||
//try
|
try
|
||||||
//{
|
{
|
||||||
// var alarmLevelMap = andonAlarmLevelService.Queryable()
|
var alarmLevelMap = andonAlarmLevelService.Queryable()
|
||||||
// .Where(level => !string.IsNullOrWhiteSpace(level.LevelName) && level.HandleTimeout.HasValue)
|
.Where(level => !string.IsNullOrWhiteSpace(level.LevelName) && level.LevelTime > 0)
|
||||||
// .ToDictionary(
|
.ToDictionary(
|
||||||
// level => (object)level.LevelName.Trim(),
|
level => (object)level.LevelName.Trim(),
|
||||||
// level => (object)Convert.ToInt32(level.HandleTimeout.Value)
|
level => (object)level.LevelTime
|
||||||
// );
|
);
|
||||||
|
var predicate = Expressionable.Create<AndonAlarmRecord>();
|
||||||
|
predicate.And(x => x.Status == "待响应");
|
||||||
|
predicate.And(x => x.CreatedTime >= startTime);
|
||||||
|
predicate.And(x => x.CreatedTime <= endTime);
|
||||||
|
predicate.And(x => x.AutoCount < 3);
|
||||||
|
|
||||||
// var queryData = Queryable()
|
var queryData = Queryable()
|
||||||
// .Where(x =>
|
.Where(predicate.ToExpression())
|
||||||
// (x.Status == "待响应" || x.Status == "及时响应" || x.Status == "超时响应")
|
.ToList();
|
||||||
// && x.CreatedTime >= startTime
|
|
||||||
// && x.CreatedTime <= endTime)
|
|
||||||
// .ToList();
|
|
||||||
|
|
||||||
// if (!queryData.Any())
|
if (!queryData.Any())
|
||||||
// {
|
{
|
||||||
// return ApiResult.Success("无需要处理的报警数据");
|
return ApiResult.Success("无需要处理的报警数据");
|
||||||
// }
|
}
|
||||||
|
|
||||||
// var totalCount = queryData.Count;
|
var totalCount = queryData.Count;
|
||||||
// var batchCount = (int)Math.Ceiling((double)totalCount / BatchSize);
|
var batchCount = (int)Math.Ceiling((double)totalCount / BatchSize);
|
||||||
// var allProcessRecords = new List<AndonAlarmRecordProcess>();
|
var allProcessRecords = new List<AndonAlarmRecordProcess>();
|
||||||
// var batchUpdateList = new List<AndonAlarmRecord>();
|
var batchUpdateList = new List<AndonAlarmRecord>();
|
||||||
|
|
||||||
// for (int batchIndex = 0; batchIndex < batchCount; batchIndex++)
|
for (int batchIndex = 0; batchIndex < batchCount; batchIndex++)
|
||||||
// {
|
{
|
||||||
// try
|
try
|
||||||
// {
|
{
|
||||||
// var currentBatch = queryData.Skip(batchIndex * BatchSize).Take(BatchSize).ToList();
|
var currentBatch = queryData.Skip(batchIndex * BatchSize).Take(BatchSize).ToList();
|
||||||
// batchUpdateList.Clear();
|
batchUpdateList.Clear();
|
||||||
|
|
||||||
// foreach (var item in currentBatch)
|
foreach (var item in currentBatch)
|
||||||
// {
|
{
|
||||||
// if (string.IsNullOrWhiteSpace(item.AlarmLevel)) continue;
|
string strOperate = "超时上报";
|
||||||
// var alarmLevelKey = item.AlarmLevel?.Trim() ?? "";
|
int timeoutMinutes = 0;
|
||||||
// int timeoutMinutes = 0;
|
//超时未响应,接收人1向接收人2上报
|
||||||
// if (alarmLevelMap.TryGetValue(alarmLevelKey, out object value))
|
if (item.AutoCount == 0 && item.Receiver2Name != null)
|
||||||
// {
|
{
|
||||||
// timeoutMinutes = (int)value;
|
timeoutMinutes = (int) alarmLevelMap.GetValueOrDefault("一级", 0);
|
||||||
// }
|
strOperate += ","+item.Receiver1Name+"到"+item.Receiver2Name;
|
||||||
|
}
|
||||||
|
//超时未响应,接收人2向接收人3上报
|
||||||
|
else if (item.AutoCount == 1 && item.Receiver3Name != null)
|
||||||
|
{
|
||||||
|
timeoutMinutes = (int)alarmLevelMap.GetValueOrDefault("二级", 0);
|
||||||
|
strOperate += ","+item.Receiver2Name+"到"+item.Receiver3Name;
|
||||||
|
}
|
||||||
|
//超时未响应,接收人3向接收人4上报
|
||||||
|
else if (item.AutoCount == 2 && item.Receiver4Name != null)
|
||||||
|
{
|
||||||
|
timeoutMinutes = (int)alarmLevelMap.GetValueOrDefault("三级", 0);
|
||||||
|
strOperate += ","+item.Receiver3Name+"到"+item.Receiver4Name;
|
||||||
|
}
|
||||||
|
if (timeoutMinutes == 0) continue;
|
||||||
|
var createdTime = item.CreatedTime.ObjToDate();
|
||||||
|
var timeoutTime = createdTime.AddMinutes(timeoutMinutes);
|
||||||
|
var isTimeout = currentTime > timeoutTime;
|
||||||
|
|
||||||
// if (timeoutMinutes <= 0) continue;
|
if (isTimeout)
|
||||||
// var createdTime = item.CreatedTime.ObjToDate();
|
{
|
||||||
// var timeoutTime = createdTime.AddMinutes(timeoutMinutes);
|
|
||||||
// var isTimeout = currentTime > timeoutTime;
|
|
||||||
|
|
||||||
// if (isTimeout)
|
item.AutoCount += 1;
|
||||||
// {
|
item.UpdatedBy = "admin";
|
||||||
// UpdateAlarmItemStatus(item, currentTime);
|
item.UpdatedTime = DateTime.Now;
|
||||||
// batchUpdateList.Add(item);
|
batchUpdateList.Add(item);
|
||||||
|
|
||||||
// var processRecord = CreateAlarmProcessRecord(item, currentTime);
|
var processRecord = CreateAlarmProcessRecord(item, strOperate);
|
||||||
// allProcessRecords.Add(processRecord);
|
allProcessRecords.Add(processRecord);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// if (batchUpdateList.Any())
|
if (batchUpdateList.Any())
|
||||||
// {
|
{
|
||||||
// UpdateAndonAlarmRecordBatch(batchUpdateList);
|
UpdateAndonAlarmRecordBatch(batchUpdateList);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// Console.WriteLine($"批次 {batchIndex + 1}/{batchCount} 处理完成,本批更新 {batchUpdateList.Count} 条报警记录");
|
Console.WriteLine($"批次 {batchIndex + 1}/{batchCount} 处理完成,本批更新 {batchUpdateList.Count} 条报警记录");
|
||||||
// }
|
}
|
||||||
// catch (Exception batchEx)
|
catch (Exception batchEx)
|
||||||
// {
|
{
|
||||||
// Console.WriteLine($"批次 {batchIndex + 1} 处理失败:{batchEx.Message}");
|
Console.WriteLine($"批次 {batchIndex + 1} 处理失败:{batchEx.Message}");
|
||||||
// continue;
|
continue;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// if (allProcessRecords.Any())
|
if (allProcessRecords.Any())
|
||||||
// {
|
{
|
||||||
// var processBatchCount = (int)Math.Ceiling((double)allProcessRecords.Count / BatchSize);
|
var processBatchCount = (int)Math.Ceiling((double)allProcessRecords.Count / BatchSize);
|
||||||
// for (int pBatchIndex = 0; pBatchIndex < processBatchCount; pBatchIndex++)
|
for (int pBatchIndex = 0; pBatchIndex < processBatchCount; pBatchIndex++)
|
||||||
// {
|
{
|
||||||
// var processBatch = allProcessRecords.Skip(pBatchIndex * BatchSize).Take(BatchSize).ToList();
|
var processBatch = allProcessRecords.Skip(pBatchIndex * BatchSize).Take(BatchSize).ToList();
|
||||||
// andonAlarmRecordProcessService.Insert(processBatch);
|
andonAlarmRecordProcessService.Insert(processBatch);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // 报警给领导,手表
|
// 报警给领导,手表
|
||||||
// return ApiResult.Success($"成功处理 {totalCount} 条报警记录,其中超时上报 {allProcessRecords.Count} 条");
|
return ApiResult.Success($"成功处理 {totalCount} 条报警记录,其中超时上报 {allProcessRecords.Count} 条");
|
||||||
//}
|
}
|
||||||
//catch (Exception ex)
|
catch (Exception ex)
|
||||||
//{
|
{
|
||||||
// Console.WriteLine($"自动超时报警处理失败:{ex.ToString()}"); // 记录完整异常栈,便于排查
|
Console.WriteLine($"自动超时报警处理失败:{ex.ToString()}"); // 记录完整异常栈,便于排查
|
||||||
// return ApiResult.Error(500, "自动超时报警处理异常,请查看日志");
|
return ApiResult.Error(500, "自动超时报警处理异常,请查看日志");
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 辅助方法
|
#region 辅助方法
|
||||||
/// <summary>
|
|
||||||
/// 更新报警记录的超时状态
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="alarmItem">报警记录</param>
|
|
||||||
/// <param name="operateTime">操作时间</param>
|
|
||||||
private void UpdateAlarmItemStatus(AndonAlarmRecord alarmItem, DateTime operateTime)
|
|
||||||
{
|
|
||||||
alarmItem.Status = "超时上报";
|
|
||||||
alarmItem.UpdatedBy = "admin";
|
|
||||||
alarmItem.UpdatedTime = operateTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 创建报警处理记录
|
/// 创建报警处理记录
|
||||||
@@ -499,18 +498,18 @@ namespace ZR.Service.mes.andon
|
|||||||
/// <param name="alarmItem">报警记录</param>
|
/// <param name="alarmItem">报警记录</param>
|
||||||
/// <param name="operateTime">操作时间</param>
|
/// <param name="operateTime">操作时间</param>
|
||||||
/// <returns>处理记录实体</returns>
|
/// <returns>处理记录实体</returns>
|
||||||
private AndonAlarmRecordProcess CreateAlarmProcessRecord(AndonAlarmRecord alarmItem, DateTime operateTime)
|
private AndonAlarmRecordProcess CreateAlarmProcessRecord(AndonAlarmRecord alarmItem,string strOperate)
|
||||||
{
|
{
|
||||||
return new AndonAlarmRecordProcess
|
return new AndonAlarmRecordProcess
|
||||||
{
|
{
|
||||||
AlarmCode = alarmItem.AlarmCode,
|
AlarmCode = alarmItem.AlarmCode,
|
||||||
Operate = "超时上报",
|
Operate = strOperate,
|
||||||
CreatedBy = "admin",
|
CreatedBy = "admin",
|
||||||
CreatedName = "admin",
|
CreatedName = "admin",
|
||||||
CreatedTime = operateTime,
|
CreatedTime = DateTime.Now,
|
||||||
UpdatedBy = "admin",
|
UpdatedBy = "admin",
|
||||||
UpdatedName = "admin",
|
UpdatedName = "admin",
|
||||||
UpdatedTime = operateTime
|
UpdatedTime = DateTime.Now,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,5 +25,7 @@ namespace ZR.Service.mes.andon.Iservice
|
|||||||
ApiResult AlarmHandle(AndonAlarmRecordDto parm);
|
ApiResult AlarmHandle(AndonAlarmRecordDto parm);
|
||||||
|
|
||||||
ApiResult AlarmReportHand(AndonAlarmRecordDto parm);
|
ApiResult AlarmReportHand(AndonAlarmRecordDto parm);
|
||||||
|
|
||||||
|
ApiResult AlarmReportAuto();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ namespace ZR.Service.mes.andon
|
|||||||
using (var scope = _scopeFactory.CreateScope())
|
using (var scope = _scopeFactory.CreateScope())
|
||||||
{
|
{
|
||||||
// 获取你的报警业务服务(Scoped生命周期)
|
// 获取你的报警业务服务(Scoped生命周期)
|
||||||
var alarmService = scope.ServiceProvider.GetRequiredService<AndonAlarmRecordService>();
|
var alarmService = scope.ServiceProvider.GetRequiredService<IAndonAlarmRecordService>();
|
||||||
// 执行你的自动超时上报逻辑
|
// 执行你的自动超时上报逻辑
|
||||||
var result = alarmService.AlarmReportAuto();
|
var result = alarmService.AlarmReportAuto();
|
||||||
_logger.LogInformation($"定时任务执行完成,结果:{result.Msg}");
|
_logger.LogInformation($"定时任务执行完成,结果:{result.Msg}");
|
||||||
|
|||||||
Reference in New Issue
Block a user