This commit is contained in:
quowingwang
2025-12-21 14:25:17 +08:00
parent 71374b064d
commit 4c7ef6c741
8 changed files with 118 additions and 112 deletions

View File

@@ -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();

View File

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

View File

@@ -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; }
} }
} }

View File

@@ -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; }

View File

@@ -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; }
} }
} }

View File

@@ -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,
}; };
} }

View File

@@ -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();
} }
} }

View File

@@ -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}");