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(); } } }