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