using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.MES;
using WIDESEA_IBasicService;
using WIDESEA_Model.Models;
namespace WIDESEA_BasicService
{
///
/// MES接口日志服务实现
///
public class MesLogService : ServiceBase>, IMesLogService
{
private readonly ISqlSugarClient _db;
///
/// 构造函数
///
/// 数据库客户端
public MesLogService(ISqlSugarClient db, IRepository repository) : base(repository)
{
_db = db;
}
///
/// 记录MES接口调用日志
///
/// 日志DTO
/// 是否记录成功
public async Task LogAsync(MesApiLogDto log)
{
try
{
var entity = new Dt_MesApiLog
{
ApiType = log.ApiType,
RequestJson = log.RequestJson,
ResponseJson = log.ResponseJson,
IsSuccess = log.IsSuccess,
ErrorMessage = log.ErrorMessage,
ElapsedMs = log.ElapsedMs,
CreateDate = DateTime.Now,
Creator = log.Creator
};
var result = await _db.Insertable(entity).ExecuteCommandAsync();
return result > 0;
}
catch (Exception ex)
{
// TODO: 使用项目日志框架记录错误
Console.WriteLine($"记录MES日志失败: {ex.Message}");
return false;
}
}
///
/// 获取最近的MES接口调用记录
///
/// 接口类型
/// 记录数量
/// 日志列表
public async Task> GetRecentLogsAsync(string apiType, int count = 50)
{
try
{
var entities = await _db.Queryable()
.Where(x => x.ApiType == apiType)
.OrderByDescending(x => x.CreateDate)
.Take(count)
.ToListAsync();
return entities.Select(e => new MesApiLogDto
{
ApiType = e.ApiType,
RequestJson = e.RequestJson,
ResponseJson = e.ResponseJson,
IsSuccess = e.IsSuccess,
ErrorMessage = e.ErrorMessage,
ElapsedMs = e.ElapsedMs,
Creator = e.Creator
}).ToList();
}
catch (Exception ex)
{
// TODO: 使用项目日志框架记录错误
Console.WriteLine($"获取MES日志失败: {ex.Message}");
return new List();
}
}
///
/// 分页查询MES日志
///
public async Task<(List items, int total)> GetPageAsync(MesLogQueryDto query, int page, int pageSize)
{
var dbQuery = _db.Queryable();
// 应用筛选条件
if (!string.IsNullOrEmpty(query.ApiType))
{
dbQuery = dbQuery.Where(x => x.ApiType == query.ApiType);
}
if (query.IsSuccess.HasValue)
{
dbQuery = dbQuery.Where(x => x.IsSuccess == query.IsSuccess.Value);
}
if (query.StartTime.HasValue)
{
dbQuery = dbQuery.Where(x => x.CreateDate >= query.StartTime.Value);
}
if (query.EndTime.HasValue)
{
dbQuery = dbQuery.Where(x => x.CreateDate <= query.EndTime.Value);
}
if (!string.IsNullOrEmpty(query.Creator))
{
dbQuery = dbQuery.Where(x => x.Creator != null && x.Creator.Contains(query.Creator));
}
if (query.MinElapsedMs.HasValue)
{
dbQuery = dbQuery.Where(x => x.ElapsedMs >= query.MinElapsedMs.Value);
}
if (query.MaxElapsedMs.HasValue)
{
dbQuery = dbQuery.Where(x => x.ElapsedMs <= query.MaxElapsedMs.Value);
}
if (!string.IsNullOrEmpty(query.ErrorKeyword))
{
dbQuery = dbQuery.Where(x => x.ErrorMessage != null && x.ErrorMessage.Contains(query.ErrorKeyword));
}
if (!string.IsNullOrEmpty(query.JsonRequestKeyword))
{
dbQuery = dbQuery.Where(x => x.RequestJson != null && x.RequestJson.Contains(query.JsonRequestKeyword));
}
if (!string.IsNullOrEmpty(query.JsonResponseKeyword))
{
dbQuery = dbQuery.Where(x => x.ResponseJson != null && x.ResponseJson.Contains(query.JsonResponseKeyword));
}
// 获取总数
var total = await dbQuery.CountAsync();
// 分页查询
var entities = await dbQuery
.OrderByDescending(x => x.CreateDate)
.ToPageListAsync(page, pageSize);
var items = entities.Select(e => new MesLogListItemDto
{
Id = e.Id,
ApiType = e.ApiType,
IsSuccess = e.IsSuccess,
RequestJson = e.RequestJson?.Length > 200 ? e.RequestJson.Substring(0, 200) + "..." : e.RequestJson,
ResponseJson = e.ResponseJson?.Length > 200 ? e.ResponseJson.Substring(0, 200) + "..." : e.ResponseJson,
ErrorMessage = e.ErrorMessage,
ElapsedMs = e.ElapsedMs,
CreateDate = e.CreateDate,
Creator = e.Creator
}).ToList();
return (items, total);
}
///
/// 获取单条日志详情
///
public async Task GetDetailAsync(long id)
{
var entity = await _db.Queryable()
.Where(x => x.Id == id)
.FirstAsync();
if (entity == null)
{
return null;
}
return new MesLogDetailDto
{
Id = entity.Id,
ApiType = entity.ApiType,
IsSuccess = entity.IsSuccess,
RequestJson = entity.RequestJson,
ResponseJson = entity.ResponseJson,
RequestJsonPreview = entity.RequestJson?.Length > 200 ? entity.RequestJson.Substring(0, 200) + "..." : entity.RequestJson,
ResponseJsonPreview = entity.ResponseJson?.Length > 200 ? entity.ResponseJson.Substring(0, 200) + "..." : entity.ResponseJson,
ErrorMessage = entity.ErrorMessage,
ElapsedMs = entity.ElapsedMs,
CreateDate = entity.CreateDate,
Creator = entity.Creator,
ModifyDate = entity.ModifyDate,
Modifier = entity.Modifier
};
}
///
/// 获取统计数据
///
public async Task GetStatisticsAsync(MesLogQueryDto query)
{
var dbQuery = _db.Queryable();
// 应用筛选条件
if (!string.IsNullOrEmpty(query.ApiType))
{
dbQuery = dbQuery.Where(x => x.ApiType == query.ApiType);
}
if (query.IsSuccess.HasValue)
{
dbQuery = dbQuery.Where(x => x.IsSuccess == query.IsSuccess.Value);
}
if (query.StartTime.HasValue)
{
dbQuery = dbQuery.Where(x => x.CreateDate >= query.StartTime.Value);
}
if (query.EndTime.HasValue)
{
dbQuery = dbQuery.Where(x => x.CreateDate <= query.EndTime.Value);
}
// 使用数据库聚合计算统计数据
var totalCount = await dbQuery.CountAsync();
var successCount = await dbQuery.Where(x => x.IsSuccess).CountAsync();
var failedCount = totalCount - successCount;
var successRate = totalCount > 0 ? (successCount * 100.0 / totalCount) : 0;
// 获取所有数据来计算平均值和最大值(SqlSugar 限制)
var allData = await dbQuery.Select(x => x.ElapsedMs).ToListAsync();
var avgElapsed = allData.Count > 0 ? allData.Average() : 0;
var maxElapsed = allData.Count > 0 ? allData.Max() : 0;
// 今日数据
var today = DateTime.Today;
var todayCount = await dbQuery.Where(x => x.CreateDate >= today).CountAsync();
return new MesLogStatisticsDto
{
TotalCount = totalCount,
SuccessCount = successCount,
FailedCount = failedCount,
SuccessRate = Math.Round(successRate, 2),
AvgElapsedMs = avgElapsed,
MaxElapsedMs = maxElapsed,
TodayCount = todayCount
};
}
///
/// 导出日志数据
///
public async Task ExportAsync(MesLogQueryDto query)
{
// 获取所有符合条件的数据(限制50000行)
var (items, _) = await GetPageAsync(query, 1, 50000);
using var memoryStream = new MemoryStream();
using var writer = new StreamWriter(memoryStream, Encoding.UTF8);
// 写入 UTF-8 BOM,使 Excel 能正确识别中文
writer.Write('\uFEFF');
// CSV 头部
writer.WriteLine("ID,接口类型,状态,耗时(ms),错误信息,创建时间,创建人");
// CSV 数据行
foreach (var item in items)
{
var error = item.ErrorMessage?.Replace("\"", "\"\"") ?? "";
var status = item.IsSuccess ? "成功" : "失败";
writer.WriteLine($"{item.Id},{item.ApiType},{status},{item.ElapsedMs},\"{error}\",{item.CreateDate:yyyy-MM-dd HH:mm:ss},{item.Creator ?? ""}");
}
writer.Flush();
return memoryStream.ToArray();
}
}
}