From 5e851678cc02257bbbd179446de36082430ca5bc Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期一, 13 四月 2026 15:12:04 +0800
Subject: [PATCH] feat(MES): 添加Mes_Log扩展逻辑
---
Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesLogService.cs | 298 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 298 insertions(+), 0 deletions(-)
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesLogService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesLogService.cs
new file mode 100644
index 0000000..35f73cb
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesLogService.cs
@@ -0,0 +1,298 @@
+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
+{
+ /// <summary>
+ /// MES鎺ュ彛鏃ュ織鏈嶅姟瀹炵幇
+ /// </summary>
+ public class MesLogService : ServiceBase<Dt_MesApiLog, IRepository<Dt_MesApiLog>>, IMesLogService
+ {
+ private readonly ISqlSugarClient _db;
+
+ /// <summary>
+ /// 鏋勯�犲嚱鏁�
+ /// </summary>
+ /// <param name="db">鏁版嵁搴撳鎴风</param>
+ public MesLogService(ISqlSugarClient db, IRepository<Dt_MesApiLog> repository) : base(repository)
+ {
+ _db = db;
+ }
+
+ /// <summary>
+ /// 璁板綍MES鎺ュ彛璋冪敤鏃ュ織
+ /// </summary>
+ /// <param name="log">鏃ュ織DTO</param>
+ /// <returns>鏄惁璁板綍鎴愬姛</returns>
+ public async Task<bool> 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;
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇鏈�杩戠殑MES鎺ュ彛璋冪敤璁板綍
+ /// </summary>
+ /// <param name="apiType">鎺ュ彛绫诲瀷</param>
+ /// <param name="count">璁板綍鏁伴噺</param>
+ /// <returns>鏃ュ織鍒楄〃</returns>
+ public async Task<List<MesApiLogDto>> GetRecentLogsAsync(string apiType, int count = 50)
+ {
+ try
+ {
+ var entities = await _db.Queryable<Dt_MesApiLog>()
+ .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<MesApiLogDto>();
+ }
+ }
+
+ /// <summary>
+ /// 鍒嗛〉鏌ヨMES鏃ュ織
+ /// </summary>
+ public async Task<(List<MesLogListItemDto> items, int total)> GetPageAsync(MesLogQueryDto query, int page, int pageSize)
+ {
+ var dbQuery = _db.Queryable<Dt_MesApiLog>();
+
+ // 搴旂敤绛涢�夋潯浠�
+ 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);
+ }
+
+ /// <summary>
+ /// 鑾峰彇鍗曟潯鏃ュ織璇︽儏
+ /// </summary>
+ public async Task<MesLogDetailDto?> GetDetailAsync(long id)
+ {
+ var entity = await _db.Queryable<Dt_MesApiLog>()
+ .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
+ };
+ }
+
+ /// <summary>
+ /// 鑾峰彇缁熻鏁版嵁
+ /// </summary>
+ public async Task<MesLogStatisticsDto> GetStatisticsAsync(MesLogQueryDto query)
+ {
+ var dbQuery = _db.Queryable<Dt_MesApiLog>();
+
+ // 搴旂敤绛涢�夋潯浠�
+ 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
+ };
+ }
+
+ /// <summary>
+ /// 瀵煎嚭鏃ュ織鏁版嵁
+ /// </summary>
+ public async Task<byte[]> 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();
+ }
+ }
+}
--
Gitblit v1.9.3