182 lines
6.3 KiB
C#
182 lines
6.3 KiB
C#
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;
|
||
}
|
||
|
||
|
||
|
||
}
|