Files
WCS/Plugins/Driver/Cowain.Driver/Services/AlarmService.cs
2026-03-02 09:08:20 +08:00

182 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Cowain.Base.DBContext;
using Cowain.Base.Models;
using Cowain.Base.Services;
using Cowain.Base.ViewModels;
using Microsoft.EntityFrameworkCore;
using Plugin.Cowain.Driver.IServices;
using Plugin.Cowain.Driver.Models.Dto;
namespace Plugin.Cowain.Driver.Services;
public class AlarmService : BaseService, IAlarmService
{
public AlarmService(IDbContextFactory<SqlDbContext> dbContextFactory) : base(dbContextFactory)
{
}
public async Task<ResultModel> AddAsync(AlarmViewModel model)
{
AlarmHistoryDto alarm = new AlarmHistoryDto
{
TagId = model.TagId,
Status = true,
StartTime = DateTime.Now,
Group = model.Group,
Level = model.Level,
Desc = model.Desc
};
try
{
var result = await InsertAsync<AlarmHistoryDto>(alarm);
if (result > 0)
{
return ResultModel.Success("alarm added successfully");
}
else
{
return ResultModel.Error("failed to add alarm", 500);
}
}
catch (Exception ex)
{
return ResultModel.Error($"An error occurred while adding the alarm: {ex.Message}", 500);
}
}
public async Task<ResultModel> CancelAsync(AlarmViewModel model)
{
var existing = await FindAsync<AlarmHistoryDto>(model.Id);
if (existing == null)
{
return ResultModel.Error("alarm not found", 404);
}
existing.Status = false;
existing.StopTime = DateTime.Now;
try
{
var result = await UpdateAsync<AlarmHistoryDto>(existing);
if (result > 0)
{
return ResultModel.Success("alarm updated successfully");
}
else
{
return ResultModel.Error("failed to update alarm", 500);
}
}
catch (Exception ex)
{
return ResultModel.Error($"An error occurred while updating the alarm: {ex.Message}", 500);
}
}
public async Task<(List<AlarmViewModel>, int totals)> GetAlarmAsync(int pageIndex, int pageSize, DateTime? startTime, DateTime? endTime)
{
// 1. 构造开始时间:有值则取日期+00:00:01无值则取最小时间不限制开始
DateTime startDateTime = startTime.HasValue
? startTime.Value.Date.AddSeconds(1) // 日期部分 + 00:00:01
: DateTime.MinValue;
// 2. 构造结束时间:有值则取日期+23:59:59无值则取最大时间不限制结束
DateTime endDateTime = endTime.HasValue
? endTime.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59) // 日期部分 + 23:59:59
: DateTime.MaxValue;
var query = await QueryAsync<AlarmHistoryDto>(x => x.StartTime >= startDateTime && x.StartTime <= endDateTime);
var result = query.Select(alarm => new AlarmViewModel
{
Id = alarm.Id,
TagId = alarm.TagId,
Group = alarm.Group,
Status = alarm.Status,
StartTime = alarm.StartTime,
StopTime = alarm.StopTime,
Level = alarm.Level,
Desc = alarm.Desc
});
var total = query.Count();
var tagViewModels = result.OrderByDescending(a => a.StartTime).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
return (tagViewModels, total);
}
public async Task<(List<AlarmViewModel>, int totals)> GetAlarmAsync(
int pageIndex,
int pageSize,
DateTime? startTime,
DateTime? endTime,
List<int>? groups = null,
List<int>? levels = null)
{
// 1. 时间范围构造(保留原有逻辑,增加空值注释)
DateTime startDateTime = startTime.HasValue
? startTime.Value.Date.AddSeconds(1) // 开始日期 00:00:01
: DateTime.MinValue; // 无开始时间则不限制
DateTime endDateTime = endTime.HasValue
? endTime.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59) // 结束日期 23:59:59
: DateTime.MaxValue; // 无结束时间则不限制
// 2. 构建核心查询条件(整合时间+分组+级别筛选,查询层面过滤,性能最优)
var query = await QueryAsync<AlarmHistoryDto>(x =>
// 时间范围筛选(原有)
x.StartTime >= startDateTime && x.StartTime <= endDateTime &&
// 分组筛选groups不为null且有元素时才过滤否则不限制
(groups == null || !groups.Any() || groups.Contains(x.Group)) &&
// 级别筛选levels不为null且有元素时才过滤否则不限制
(levels == null || !levels.Any() || levels.Contains(x.Level)));
// 3. 转换为ViewModel保留原有逻辑
var result = query.Select(alarm => new AlarmViewModel
{
Id = alarm.Id,
TagId = alarm.TagId,
Group = alarm.Group,
Status = alarm.Status,
StartTime = alarm.StartTime,
StopTime = alarm.StopTime,
Level = alarm.Level,
Desc = alarm.Desc
});
// 4. 分页优化处理pageIndex<=0的边界情况避免负数Skip
int validPageIndex = Math.Max(pageIndex, 1);
int validPageSize = Math.Max(pageSize, 1); // 避免pageSize<=0导致的异常
// 5. 计算筛选后的总数 + 分页查询(总数必须基于筛选后的结果)
int total = query.Count();
List<AlarmViewModel> tagViewModels = result
.OrderByDescending(a => a.StartTime)
.Skip((validPageIndex - 1) * validPageSize)
.Take(validPageSize)
.ToList();
return (tagViewModels, total);
}
public async Task<AlarmViewModel?> GetInAlarmAsync(int tagId)
{
var query = await QueryAsync<AlarmHistoryDto>(x => x.TagId == tagId && x.StopTime == null);
var result = query.Select(alarm => new AlarmViewModel
{
Id = alarm.Id,
TagId = alarm.TagId,
Group = alarm.Group,
Status = alarm.Status,
StartTime = alarm.StartTime,
StopTime = alarm.StopTime,
Level = alarm.Level,
Desc = alarm.Desc
}).FirstOrDefault();
return result;
}
}