DaqEAlarmRecordService.cs 6.55 KB
using CNCFanucDataReading;
using FreeSql;
using FreeSql.Internal;
using System;
using System.Threading.Tasks;

namespace CNCFanucDataReading
{
    public class DaqEAlarmRecordService : IDisposable
    {
        private readonly IFreeSql _fsql;
        private bool _disposed = false;

        public DaqEAlarmRecordService(string connectionString)
        {
            if (string.IsNullOrEmpty(connectionString))
                throw new ArgumentException("数据库连接字符串不能为空", nameof(connectionString));

            _fsql = new FreeSql.FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.SqlServer, connectionString)
                .UseAutoSyncStructure(false) // 自动同步实体结构到数据库
                .Build();

        }

        /// <summary>
        /// 保存报警信息
        /// </summary>
        public async Task SaveAlarmInfo(DaqEAlarmRecord daqEAlarmRecord)
        {
            if (daqEAlarmRecord == null)
                return;

            try
            {
                // 检查是否已存在相同的当前报警
                var existingAlarm = await _fsql.Select<DaqEAlarmRecord>()
                    .Where(a => a.EquipmentCode == daqEAlarmRecord.EquipmentCode)
                    .Where(a => a.AlarmMessage == daqEAlarmRecord.AlarmMessage)
                    .Where(a => a.IsEnd == false) // 当前未解除的报警
                    .FirstAsync();

                if (existingAlarm == null)
                {
                    // 新报警,插入记录
                    daqEAlarmRecord.IsEnd = false;
                    daqEAlarmRecord.ErrorDuration = 5;
                    daqEAlarmRecord.IsHandled = false ;

                    daqEAlarmRecord.CreateTime = DateTime.Now;
                    daqEAlarmRecord.UpdateTime = DateTime.Now;
                    await _fsql.Insert(daqEAlarmRecord).ExecuteAffrowsAsync();

                    Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {daqEAlarmRecord.EquipmentName} 新报警记录: {daqEAlarmRecord.AlarmMessage}");
                }
                else
                {
                    // 已存在的报警,更新记录(更新时间,持续时间)
                    existingAlarm.UpdateTime = DateTime.Now;
                    existingAlarm.ErrorDuration =Convert.ToInt32((DateTime.Now - existingAlarm.CreateTime).TotalSeconds);

                    await _fsql.Update<DaqEAlarmRecord>()
                        .SetSource(existingAlarm)
                        .UpdateColumns(a => new { a.UpdateTime, a.ErrorDuration })
                        .ExecuteAffrowsAsync();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 保存报警信息失败: {ex.Message}");
            }
        }

        /// <summary>
        /// 更新报警状态为已解除
        /// </summary>
        //public async Task UpdateAlarmIsEnd(string equipmentCode, string alarmMessage)
        //{
        //    try
        //    {
        //        await _fsql.Update<DaqEAlarmRecord>()
        //            .Set(a => a.IsEnd, true)
        //            .Set(a => a.UpdateTime, DateTime.Now)
        //            .Where(a => a.EquipmentCode == equipmentCode)
        //            .Where(a => a.AlarmMessage == alarmMessage)
        //            .Where(a => a.IsEnd == false) // 只更新未解除的报警
        //            .ExecuteAffrowsAsync();
        //    }
        //    catch (Exception ex)
        //    {
        //        Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 更新报警状态失败: {ex.Message}");
        //    }
        //}

        /// <summary>
        /// 批量保存报警信息
        /// </summary>
        public async Task SaveBatchAlarms(List<DaqEAlarmRecord> alarmInfos)
        {
            if (alarmInfos == null || alarmInfos.Count == 0)
                return;

            try
            {
                foreach (var alarm in alarmInfos)
                {
                    await SaveAlarmInfo(alarm);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 批量保存报警信息失败: {ex.Message}");
            }
        }

        /// <summary>
        /// 更新单条报警为已解除
        /// </summary>
        public async Task<bool> UpdateAlarmIsEnd(string equipmentCode, string alarmMessage)
        {
            try
            {
                var result = await _fsql.Update<DaqEAlarmRecord>()
                    .Set(a => a.IsEnd, true)
                    .Set(a => a.UpdateTime, DateTime.Now)
                    .Where(a => a.EquipmentCode == equipmentCode)
                    .Where(a => a.AlarmMessage == alarmMessage)
                    .Where(a => a.IsEnd == false) // 只更新未解除的报警
                    .ExecuteAffrowsAsync();

                return result > 0;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 更新报警状态失败: {ex.Message}");
                return false;
            }
        }

        /// <summary>
        /// 批量更新报警为已解除
        /// </summary>
        public async Task<int> BatchResolveAlarmsAsync(string equipmentCode, List<string> alarmMessages)
        {
            try
            {
                var result = await _fsql.Update<DaqEAlarmRecord>()
                    .Set(a => a.IsEnd, true)
                    .Set(a => a.UpdateTime, DateTime.Now)
                    .Where(a => a.EquipmentCode == equipmentCode)
                    .Where(a => alarmMessages.Contains(a.AlarmMessage))
                    .Where(a => a.IsEnd == false)
                    .ExecuteAffrowsAsync();

                return result;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 批量更新报警状态失败: {ex.Message}");
                return 0;
            }
        }

        /// <summary>
        /// 获取设备未解除的报警列表
        /// </summary>
        public async Task<List<DaqEAlarmRecord>> GetUnresolvedAlarmsByEquipmentAsync(string equipmentCode)
        {
            return await _fsql.Select<DaqEAlarmRecord>()
                .Where(a => a.EquipmentCode == equipmentCode)
                .Where(a => a.IsEnd == false)
                .ToListAsync();
        }

        public void Dispose()
        {
            if (!_disposed)
            {
                _fsql?.Dispose();
                _disposed = true;
            }
        }
    }
}