using Aliyun.OSS; using DOAN.ServiceCore.MyMatchPush; using Infrastructure; using Infrastructure.Attribute; using Infrastructure.Helper; using Infrastructure.Model; using JinianNet.JNTemplate.Parsers; using Microsoft.AspNetCore.Server.Kestrel.Core; using SqlSugar; using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using ZR.Model; using ZR.Model.MES.andon; using ZR.Model.MES.andon.Dto; using ZR.Repository; using ZR.Service.mes.andon.Iservice; using ZR.Service.Utils.MyAlarmLigth; namespace ZR.Service.mes.andon { /// /// 报警记录Service业务层处理 /// [AppService(ServiceType = typeof(IAndonAlarmRecordService), ServiceLifetime = LifeTime.Transient)] public class AndonAlarmRecordService : BaseService, IAndonAlarmRecordService { private AndonAlarmLevelService andonAlarmLevelService = new AndonAlarmLevelService(); private AndonAlarmRecordProcessService andonAlarmRecordProcessService = new AndonAlarmRecordProcessService(); private AndonAlarmTypeDictService andonAlarmTypeDictService = new AndonAlarmTypeDictService(); private SocketGatewayServer _socketGateway = null; //private readonly ModbusTcpClientHelper _modbusClient; private readonly ThreeColorLightModbus _modbusClient; private AndonAlarmAreaLightDicService andonAlarmAreaLightDicService = new AndonAlarmAreaLightDicService(); private AndonAlarmReceiverWatchDicService andonAlarmReceiverWatchDicService = new AndonAlarmReceiverWatchDicService(); //public AndonAlarmRecordService(SocketGatewayServer socketGateway, ModbusTcpClientHelper modbusClient) //{ // _socketGateway = socketGateway; // _modbusClient = modbusClient; //} public AndonAlarmRecordService(SocketGatewayServer socketGateway, ThreeColorLightModbus modbusClient) { _socketGateway = socketGateway; _modbusClient = modbusClient; } /// /// 查询报警记录列表 /// /// /// public PagedInfo GetList(AndonAlarmRecordQueryDto parm) { var predicate = Expressionable.Create(); if (parm != null) { if (parm.startTime != null && parm.startTime > DateTime.MinValue) { predicate = predicate.And(it => it.CreatedTime >= parm.startTime); } if (parm.endTime != null && parm.endTime > DateTime.MaxValue) { predicate = predicate.And(it => it.CreatedTime <= parm.endTime); } if (!string.IsNullOrEmpty(parm.AlarmCode)) { predicate = predicate.And(it => it.AlarmCode.Contains(parm.AlarmCode)); } if (!string.IsNullOrEmpty(parm.AlarmTypeCode)) { predicate = predicate.And(it => it.AlarmTypeCode == parm.AlarmTypeCode); } if (!string.IsNullOrEmpty(parm.Area1)) { predicate = predicate.And(it => it.Area1 == parm.Area1); } } var response = Queryable() .Where(predicate.ToExpression()) .ToPage(parm); return response; } public List GetListToWeek() { DateTime now = DateTime.Now; DateTime endTime = now; Calendar calendar = CultureInfo.CurrentCulture.Calendar; // 获取当天是本周的第几天(WeekOfDay:1=周一,7=周日) int dayOfWeek = (int)calendar.GetDayOfWeek(now); DateTime startTime = now.AddDays(-(dayOfWeek - 1)).Date; // 截断时分秒为00:00:00 var queryList = Queryable() .LeftJoin((a, b) => a.AlarmCode == b.AlarmCode && b.Operate == "已响应") .LeftJoin((a, b, c) => a.AlarmCode == c.AlarmCode && c.Operate == "已处理") .Where(a => a.CreatedTime >= startTime && a.CreatedTime <= endTime) .Select((a, b, c) => new AndonAlarmRecordDto { Id = a.Id, AlarmCode = a.AlarmCode, AlarmTypeCode = a.AlarmTypeCode, AlarmType = a.AlarmType, AlarmInfo = a.AlarmInfo, Receiver1 = a.Receiver1, Receiver1Name = a.Receiver1Name, Receiver2 = a.Receiver2, Receiver2Name = a.Receiver2Name, Receiver3 = a.Receiver3, Receiver3Name = a.Receiver3Name, Receiver4 = a.Receiver4, Receiver4Name = a.Receiver4Name, Sequence = a.Sequence, DurationTime = a.DurationTime, Status = a.Status, HandleResult = a.HandleResult, Remarks = a.Remarks, CreatedBy = a.CreatedBy, CreatedTime = a.CreatedTime, UpdatedBy = a.UpdatedBy, UpdatedTime = a.UpdatedTime, Area1 = a.Area1, Area2 = a.Area2, AutoCount = a.AutoCount, ResponseTime = b == null ? null : b.CreatedTime, // 已响应时间 HandleTime = c == null ? null : c.CreatedTime // 已处理时间 }) .ToList(); return queryList; } public ApiResult QueryMonthAlarmCountByType() { //查询本月的报警信息 DateTime now = DateTime.Now; DateTime endTime = now; DateTime startTime = new DateTime(now.Year, now.Month, 1).Date; // 截断时分秒为00:00:00 var predicate = Expressionable.Create(); predicate.And(a => a.CreatedTime >= startTime && a.CreatedTime <= endTime); var queryList = Queryable() .Where(predicate.ToExpression()) .GroupBy(a => a.AlarmType) .Having(a => a.AlarmType != null) .Select(a => new SelectOption { label = a.AlarmType, value = SqlFunc.AggregateCount(1).ToString() }) .ToList(); return new ApiResult(200,"",queryList); } public ApiResult QueryWeekAlarmLineChart() { DateTime now = DateTime.Now; DateTime endTime = now; DateTime startTime = now.AddDays(-14).Date; // 方法1:使用 ToDate 函数(确保按日期分组) var dbStats = Queryable() .Where(a => a.CreatedTime >= startTime && a.CreatedTime <= endTime) .LeftJoin((a, p) => a.AlarmCode == p.AlarmCode && p.Operate == "已处理") .GroupBy((a, p) => SqlFunc.ToDate(a.CreatedTime).ToString("yyyy/MM/dd")) // 直接使用 Date 属性 .Select((a, p) => new { DayDate = SqlFunc.ToDate(a.CreatedTime).ToString("yyyy/MM/dd"), // 存储为 DateTime TotalCount = SqlFunc.AggregateCount(1), HandledCount = SqlFunc.AggregateCount(p.Id) // 更简洁的写法 }) .ToList(); // 生成完整的14天日期序列(包含开始日期) var allDates = Enumerable.Range(0, 14) .Select(days => startTime.AddDays(days+1)) .ToList(); // 转换为字典,使用 ToString("yyyy/MM/dd") 作为 Key var statDict = dbStats.ToDictionary( x => x.DayDate, x => x ); var chartData = new { // X轴:日期格式统一为 yyyy/MM/dd xAxisData = allDates.Select(d => d.ToString("yyyy/MM/dd")).ToList(), // Y轴1:总报警数量 yAxisData1 = allDates.Select(date => { var dateStr = date.ToString("yyyy/MM/dd"); return statDict.ContainsKey(dateStr) ? statDict[dateStr].TotalCount : 0; }).ToList(), // Y轴2:已处理报警数量 yAxisData2 = allDates.Select(date => { var dateStr = date.ToString("yyyy/MM/dd"); return statDict.ContainsKey(dateStr) ? statDict[dateStr].HandledCount : 0; }).ToList(), }; return new ApiResult(200, "查询成功", chartData); } public ApiResult QueryWeekAlarmTJChart() { DateTime now = DateTime.Now; DateTime endTime = now; DateTime startTime = now.AddDays(-7).Date; // 方法1:使用 ToDate 函数(确保按日期分组) var dbStats = Queryable() .Where(a => a.CreatedTime >= startTime && a.CreatedTime <= endTime) .Where(a => a.Area1 != null && a.Area1 != "") .GroupBy(a => a.Area1) .Select(a => new { Area1 = a.Area1, Hours = SqlFunc.Round( SqlFunc.IIF( a.Status == "已处理", a.DurationTime / 60.0, // 已处理:分钟转小时 SqlFunc.DateDiff(DateType.Minute, SqlFunc.ToDate(a.CreatedTime), DateTime.Now) / 60.0 // 未处理:计算等待时间转小时 ), 2), AlarmCount = SqlFunc.AggregateCount(1) }) .OrderBy(a => a.Area1) .ToList(); var chartData = new { // X轴:区域名称 xAxisData = dbStats.Select(a => a.Area1).ToList(), // Y轴1:停机时长(小时) yAxisData1 = dbStats.Select(a => a.Hours).ToList(), // Y轴2:报警数量 yAxisData2 = dbStats.Select(a => a.AlarmCount).ToList(), }; return new ApiResult(200, "查询成功", chartData); } public PagedInfo GetListToday(AndonAlarmRecordQueryDto parm) { var predicate = Expressionable.Create(); DateTime dtNow = DateTime.Now; DateTime startTime = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, 0, 0, 0); DateTime endTime = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, 23, 59, 59); predicate = predicate.And(it => it.CreatedTime >= startTime); predicate = predicate.And(it => it.CreatedTime <= endTime); var response = Queryable() .Where(predicate.ToExpression()) .ToPage(parm); return response; } /// /// 获取详情 /// /// /// public AndonAlarmRecord GetInfo(int Id) { var response = Queryable() .Where(x => x.Id == Id) .First(); return response; } /// /// 添加报警记录 /// /// /// public AndonAlarmRecord AddAndonAlarmRecord(AndonAlarmRecord model) { return Context.Insertable(model).ExecuteReturnEntity(); } /// /// 修改报警记录 /// /// /// public int UpdateAndonAlarmRecord(AndonAlarmRecord model) { if (model != null && !string.IsNullOrEmpty(model.AlarmTypeCode)) { var typeDic = andonAlarmTypeDictService.Queryable() .Where(k => k.TypeCode == model.AlarmTypeCode) .ToList().FirstOrDefault(); if (typeDic != null) { model.Receiver1 = typeDic.Receiver1; model.Receiver1Name = typeDic.Receiver1Name; model.Receiver2 = typeDic.Receiver2; model.Receiver2Name = typeDic.Receiver2Name; model.Receiver3 = typeDic.Receiver3; model.Receiver3Name = typeDic.Receiver3Name; model.Receiver4 = typeDic.Receiver4; model.Receiver4Name = typeDic.Receiver4Name; } else { model.Receiver1 = null; model.Receiver1Name = string.Empty; model.Receiver2 = null; model.Receiver2Name = string.Empty; model.Receiver3 = null; model.Receiver3Name = string.Empty; model.Receiver4 = null; model.Receiver4Name = string.Empty; } } else { model.Receiver1 = null; model.Receiver1Name = string.Empty; model.Receiver2 = null; model.Receiver2Name = string.Empty; model.Receiver3 = null; model.Receiver3Name = string.Empty; model.Receiver4 = null; model.Receiver4Name = string.Empty; } return Update(model, true); } public ApiResult AlarmResponse(AndonAlarmRecordDto parm) { try { var response = new ApiResult(); if (parm != null) { var record = Queryable() .Where(x => x.Id == parm.Id) .First(); if (record != null) { record.Status = "已响应"; record.Remarks = parm.Remarks; record.UpdatedBy = parm.UserId; record.UpdatedTime = DateTime.Now; UpdateAndonAlarmRecord(record); AndonAlarmRecordProcess andonAlarmRecordProcess = new AndonAlarmRecordProcess(); andonAlarmRecordProcess.AlarmCode = record.AlarmCode; andonAlarmRecordProcess.Operate = record.Status; andonAlarmRecordProcess.CreatedBy = parm.UserId; andonAlarmRecordProcess.CreatedName = parm.UserName; andonAlarmRecordProcess.CreatedTime = DateTime.Now; andonAlarmRecordProcess.UpdatedBy = parm.UserId; andonAlarmRecordProcess.UpdatedName = parm.UserName; andonAlarmRecordProcess.UpdatedTime = DateTime.Now; int iResult = andonAlarmRecordProcessService.Insert(andonAlarmRecordProcess); try { //三色灯变黄 byte bLightIp = GetLightIp(parm.Area1, parm.Area2); if (bLightIp != 0) { LightUp.WriteAlarmLightCommand_Yellow(_modbusClient, bLightIp); } } catch (Exception ex) { } AndonAlarmRecordProcessQueryDto parmP = new AndonAlarmRecordProcessQueryDto(); parmP.AlarmCode = andonAlarmRecordProcess.AlarmCode; var processList = andonAlarmRecordProcessService.GetList(parmP); return ApiResult.Success("成功", processList); } } else { response.Code = 500; response.Msg = "参数不能为空"; } return response; } catch (Exception ex) { return ApiResult.Error(500, ex.Message); } } public ApiResult AlarmHandle(AndonAlarmRecordDto parm) { try { if (parm == null) { return ApiResult.Error(500, "参数不能为空"); } if (parm.Status == "已响应") { var record = Queryable() .Where(x => x.Id == parm.Id) .First(); record.Status = "已处理"; record.HandleResult = parm.HandleResult; record.Remarks = parm.Remarks; record.UpdatedBy = parm.UserId; record.UpdatedTime = DateTime.Now; //获取设备停机持续时间 if (record.CreatedTime != null) { record.DurationTime = getDurationTime((DateTime)record.CreatedTime); } else { record.DurationTime = 0; } UpdateAndonAlarmRecord(record); AndonAlarmRecordProcess andonAlarmRecordProcess = new AndonAlarmRecordProcess(); andonAlarmRecordProcess.AlarmCode = record.AlarmCode; andonAlarmRecordProcess.Operate = record.Status; andonAlarmRecordProcess.CreatedBy = parm.UserId; andonAlarmRecordProcess.CreatedName = parm.UserName; andonAlarmRecordProcess.CreatedTime = DateTime.Now; andonAlarmRecordProcess.UpdatedBy = parm.UserId; andonAlarmRecordProcess.UpdatedName = parm.UserName; andonAlarmRecordProcess.UpdatedTime = DateTime.Now; int iResult = andonAlarmRecordProcessService.Insert(andonAlarmRecordProcess); try { //三色灯变绿 byte bLightIp = GetLightIp(parm.Area1, parm.Area2); if (bLightIp != 0) { LightUp.WriteAlarmLightCommand_Normal(_modbusClient, bLightIp); } } catch (Exception ex) { } AndonAlarmRecordProcessQueryDto parmP = new AndonAlarmRecordProcessQueryDto(); parmP.AlarmCode = andonAlarmRecordProcess.AlarmCode; var processList = andonAlarmRecordProcessService.GetList(parmP); return ApiResult.Success("成功", processList); } else { return ApiResult.Error(500, "只能处理响应状态数据"); } } catch (Exception ex) { return ApiResult.Error(500, ex.Message); } } private int getDurationTime(DateTime alarmStartTime) { try { int duration = 0; // 假设 MinDateValue 是 DateTime.MinValue 或某个最小日期 DateTime MinDateValue = DateTime.MinValue; if (alarmStartTime > MinDateValue && alarmStartTime < DateTime.Now) { // 将当前时间减去创建时间,作为报警持续时间(返回分钟数) TimeSpan timeSpan = DateTime.Now - alarmStartTime; duration = (int)timeSpan.TotalMinutes; } return duration; } catch (Exception ex) { return 0; } } public ApiResult AlarmReportHand(AndonAlarmRecordDto parm) { try { if (parm == null) { return ApiResult.Error(500, "参数不能为空"); } if (parm.Status == "待响应" || parm.Status == "已响应") { var record = Queryable() .Where(x => x.Id == parm.Id) .First(); record.Status = "已上报"; record.Remarks = parm.Remarks; record.UpdatedBy = parm.UserId; record.UpdatedTime = DateTime.Now; UpdateAndonAlarmRecord(record); AndonAlarmRecordProcess andonAlarmRecordProcess = new AndonAlarmRecordProcess(); andonAlarmRecordProcess.AlarmCode = record.AlarmCode; andonAlarmRecordProcess.Operate = record.Status; andonAlarmRecordProcess.CreatedBy = parm.UserId; andonAlarmRecordProcess.CreatedName = parm.UserName; andonAlarmRecordProcess.CreatedTime = DateTime.Now; andonAlarmRecordProcess.UpdatedBy = parm.UserId; andonAlarmRecordProcess.UpdatedName = parm.UserName; andonAlarmRecordProcess.UpdatedTime = DateTime.Now; int iResult = andonAlarmRecordProcessService.Insert(andonAlarmRecordProcess); return ApiResult.Success("成功", andonAlarmRecordProcess); } else { return ApiResult.Error(500, "只能处理响应状态数据"); } } catch (Exception ex) { return ApiResult.Error(500, ex.Message); } } private byte GetLightIp(string area1, string area2) { byte bLightIp = 0; if (area2 == null || area2 == "") { area2 = "NA"; } var query = andonAlarmAreaLightDicService.Queryable() .Where(x => x.Area1 == area1 && x.Area2 == area2) .ToList().FirstOrDefault(); if (query != null) { string lightIp = query.Lightip; bLightIp = Convert.ToByte(lightIp); } return bLightIp; } /// /// 创建报警记录(优化版:通讯失败不影响核心数据新增) /// /// /// public AndonAlarmRecord CreateAndonAlarmRecord(AndonAlarmRecord model) { // 1. 核心业务逻辑(新增报警记录)- 优先执行,不受通讯影响 string strDay = DateTime.Now.ToString("yyyyMMdd"); int Sequence = 1; // 兼容无历史记录的情况(避免First()空指针) var lastItem = Queryable() .Where(it => it.AlarmCode.Contains(strDay)) .OrderByDescending(it => it.Sequence) .ToList() .FirstOrDefault(); // 替换First()为FirstOrDefault(),避免无数据时抛异常 if (lastItem != null) { Sequence = (int)lastItem.Sequence + 1; } string formattedSequence = Sequence.ToString("D4"); string strAlarmCode = "Alarm" + strDay + formattedSequence; model.AlarmCode = strAlarmCode; model.Sequence = Sequence; model.Status = "待响应"; // 获取报警类型配置 var typeDic = andonAlarmTypeDictService.Queryable() .Where(k => k.TypeCode == model.AlarmTypeCode) .ToList() .FirstOrDefault(); // 替换ToList().FirstOrDefault(),减少内存占用 if (typeDic != null) { model.Receiver1 = typeDic.Receiver1; model.Receiver1Name = typeDic.Receiver1Name; model.Receiver2 = typeDic.Receiver2; model.Receiver2Name = typeDic.Receiver2Name; model.Receiver3 = typeDic.Receiver3; model.Receiver3Name = typeDic.Receiver3Name; model.Receiver4 = typeDic.Receiver4; model.Receiver4Name = typeDic.Receiver4Name; } string strMessage = $"{model.Area1}{model.Area2}{model.AlarmType}{model.AlarmInfo}"; // 2. 执行核心数据插入(先落库,确保数据不丢失) var resultEntity = Context.Insertable(model).ExecuteReturnEntity(); // 3. 通讯相关操作(手表推送+三色灯)- 独立try-catch try { // 3.1 手表呼叫报警(注释保留,仅做异常隔离) if (!string.IsNullOrEmpty(model.Receiver1)) { List WatchAddressList = GetReceiverWatchAddress(model.Receiver1); if (WatchAddressList.Any()) { foreach (string strWatchAddress in WatchAddressList) { Watchup.StartPush(strMessage, _socketGateway, strWatchAddress); } } } } catch (Exception ex) { } try { // 3.2 三色灯鸣叫报警(核心通讯操作,单独异常捕获) byte bLightIp = GetLightIp(model.Area1, model.Area2); if (bLightIp != 0) { LightUp.WriteAlarmLightCommand_Red(_modbusClient, bLightIp); } } catch (Exception ex) { } // 4. 返回新增的实体(核心业务结果不受通讯影响) return resultEntity; } //根据报警联系人获取对应人的手表地址 private List GetReceiverWatchAddress(string receiverIds) { string[] receiverIdArr = receiverIds.Split(','); List watchAddressList = new List(); foreach (string receiverId in receiverIdArr) { var query = andonAlarmReceiverWatchDicService.Queryable() .Where(a => a.Receiverid == receiverId) .ToList().FirstOrDefault(); if (query != null) { watchAddressList.Add(query.Watchip); } } return watchAddressList; } /// /// 查询三小时内生成的所有未处理报警记录,自动进行超时报警(分批次处理,每批500条) /// /// ApiResult public ApiResult AlarmReportAuto() { // 定义批次大小,可配置化(便于后续调整) const int BatchSize = 500; var currentTime = DateTime.Now; var startTime = currentTime.AddHours(-3); var endTime = currentTime; try { var alarmLevelMap = andonAlarmLevelService.Queryable() .Where(level => !string.IsNullOrWhiteSpace(level.LevelName) && level.LevelTime > 0) .ToDictionary( level => (object)level.LevelName.Trim(), level => (object)level.LevelTime ); var predicate = Expressionable.Create(); 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() .Where(predicate.ToExpression()) .ToList(); if (!queryData.Any()) { return ApiResult.Success("无需要处理的报警数据"); } var totalCount = queryData.Count; var batchCount = (int)Math.Ceiling((double)totalCount / BatchSize); var allProcessRecords = new List(); var batchUpdateList = new List(); for (int batchIndex = 0; batchIndex < batchCount; batchIndex++) { try { var currentBatch = queryData.Skip(batchIndex * BatchSize).Take(BatchSize).ToList(); batchUpdateList.Clear(); foreach (var item in currentBatch) { string strOperate = "超时上报"; int timeoutMinutes = 0; string ReceiveId = ""; string strWatchMessage = item.Area1 + item.Area2 + item.AlarmType + item.AlarmInfo; //超时未响应,接收人1向接收人2上报 if (item.AutoCount == 0 && item.Receiver2Name != null) { timeoutMinutes = (int) alarmLevelMap.GetValueOrDefault("一级", 0); strOperate += ","+item.Receiver1Name+"到"+item.Receiver2Name; ReceiveId = item.Receiver2; } //超时未响应,接收人2向接收人3上报 else if (item.AutoCount == 1 && item.Receiver3Name != null) { timeoutMinutes = (int)alarmLevelMap.GetValueOrDefault("二级", 0); strOperate += ","+item.Receiver2Name+"到"+item.Receiver3Name; ReceiveId = item.Receiver3; } //超时未响应,接收人3向接收人4上报 else if (item.AutoCount == 2 && item.Receiver4Name != null) { timeoutMinutes = (int)alarmLevelMap.GetValueOrDefault("三级", 0); strOperate += ","+item.Receiver3Name+"到"+item.Receiver4Name; ReceiveId = item.Receiver4; } if (timeoutMinutes == 0) continue; var createdTime = item.CreatedTime.ObjToDate(); var timeoutTime = createdTime.AddMinutes(timeoutMinutes); var isTimeout = currentTime > timeoutTime; if (isTimeout) { item.AutoCount += 1; item.UpdatedBy = "admin"; item.UpdatedTime = DateTime.Now; batchUpdateList.Add(item); var processRecord = CreateAlarmProcessRecord(item, strOperate); allProcessRecords.Add(processRecord); try { //手表发送提醒上报领导 if (!string.IsNullOrEmpty(ReceiveId)) { List WatchAddressList = GetReceiverWatchAddress(ReceiveId); if (WatchAddressList.Any()) { foreach (string strWatchAddress in WatchAddressList) { Watchup.StartPush(strWatchMessage, _socketGateway, strWatchAddress); } } } } catch (Exception ex) { } } } if (batchUpdateList.Any()) { UpdateAndonAlarmRecordBatch(batchUpdateList); } Console.WriteLine($"批次 {batchIndex + 1}/{batchCount} 处理完成,本批更新 {batchUpdateList.Count} 条报警记录"); } catch (Exception batchEx) { Console.WriteLine($"批次 {batchIndex + 1} 处理失败:{batchEx.Message}"); continue; } } if (allProcessRecords.Any()) { var processBatchCount = (int)Math.Ceiling((double)allProcessRecords.Count / BatchSize); for (int pBatchIndex = 0; pBatchIndex < processBatchCount; pBatchIndex++) { var processBatch = allProcessRecords.Skip(pBatchIndex * BatchSize).Take(BatchSize).ToList(); andonAlarmRecordProcessService.Insert(processBatch); } } return ApiResult.Success($"成功处理 {totalCount} 条报警记录,其中超时上报 {allProcessRecords.Count} 条"); } catch (Exception ex) { Console.WriteLine($"自动超时报警处理失败:{ex.ToString()}"); // 记录完整异常栈,便于排查 return ApiResult.Error(500, "自动超时报警处理异常,请查看日志"); } } /// /// 创建报警处理记录 /// /// 报警记录 /// 操作时间 /// 处理记录实体 private AndonAlarmRecordProcess CreateAlarmProcessRecord(AndonAlarmRecord alarmItem,string strOperate) { return new AndonAlarmRecordProcess { AlarmCode = alarmItem.AlarmCode, Operate = strOperate, CreatedBy = "admin", CreatedName = "admin", CreatedTime = DateTime.Now, UpdatedBy = "admin", UpdatedName = "admin", UpdatedTime = DateTime.Now, }; } /// /// 批量更新报警记录 /// /// 待更新的报警记录列表 private void UpdateAndonAlarmRecordBatch(List alarmItems) { if (alarmItems == null || !alarmItems.Any()) return; var alarmRepo = new BaseRepository(); alarmRepo.Context.Updateable(alarmItems) .UpdateColumns(t => new { t.AutoCount, t.UpdatedBy, t.UpdatedTime }) .ExecuteCommand(); } public ApiResult InitAlarmLightStates() { var lights = andonAlarmAreaLightDicService.GetList(); if (lights.Any()) { foreach (var item in lights) { if (!string.IsNullOrEmpty(item.Lightip)) { byte bLightIp = Convert.ToByte(item.Lightip); if (bLightIp != 0) { LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, bLightIp); } } } } //LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(14)); //LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(08)); //LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(07)); //LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(13)); //LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(04)); //LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(15)); return ApiResult.Success("处理成功"); } } }