From e483ac11616ffc9260d8f491fcc0d66f480b5443 Mon Sep 17 00:00:00 2001
From: huangxiaoqiang <huangxiaoqiang@hnkhzn.com>
Date: 星期四, 16 四月 2026 10:12:52 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/LongTu/FangGangAGV

---
 Code Management/WCS/WIDESEA_WCSServer/WIDESEAWCS_SystemServices/Sys_LogService.cs |  274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 274 insertions(+), 0 deletions(-)

diff --git a/Code Management/WCS/WIDESEA_WCSServer/WIDESEAWCS_SystemServices/Sys_LogService.cs b/Code Management/WCS/WIDESEA_WCSServer/WIDESEAWCS_SystemServices/Sys_LogService.cs
index fdb3067..13ed60a 100644
--- a/Code Management/WCS/WIDESEA_WCSServer/WIDESEAWCS_SystemServices/Sys_LogService.cs
+++ b/Code Management/WCS/WIDESEA_WCSServer/WIDESEAWCS_SystemServices/Sys_LogService.cs
@@ -3,6 +3,7 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseServices;
 using WIDESEAWCS_ISystemRepository;
 using WIDESEAWCS_ISystemServices;
@@ -12,8 +13,281 @@
 {
     public class Sys_LogService : ServiceBase<Sys_Log, ISys_LogRepository>, ISys_LogService
     {
+        private readonly string[] LogFolders = new[] { "Log", "Log_PLCReadWrite" };
+        private int fileId = 2020;
         public Sys_LogService(ISys_LogRepository BaseDal) : base(BaseDal)
         {
         }
+
+        public WebResponseContent GetLogName()
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                var data = new List<object>();
+                fileId = 2020; // 閲嶇疆ID
+
+                foreach (string folderName in LogFolders)
+                {
+                    var folderPath = Path.Combine(AppContext.BaseDirectory, folderName);
+                    var folderInfo = new DirectoryInfo(folderPath);
+
+                    if (!folderInfo.Exists)
+                    {
+                        continue;
+                    }
+
+                    var folderData = BuildFolderTree(folderInfo, folderName);
+                    data.Add(folderData);
+                }
+
+                return data.Any()
+                    ? WebResponseContent.Instance.OK(data: data)
+                    : WebResponseContent.Instance.Error("鏈壘鍒版棩蹇楁枃浠跺す");
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+        
+
+        public WebResponseContent GetLog(string fileName)
+        {
+            try
+            {
+                if (string.IsNullOrEmpty(fileName))
+                {
+                    return WebResponseContent.Instance.Error("鏂囦欢鍚嶄笉鑳戒负绌�");
+                }
+
+                FileSearchResult searchResult = null;
+
+                foreach (string folderName in LogFolders)
+                {
+                    var folderPath = Path.Combine(AppContext.BaseDirectory, folderName);
+                    var folderInfo = new DirectoryInfo(folderPath);
+
+                    if (!folderInfo.Exists)
+                    {
+                        continue;
+                    }
+
+                    searchResult = FindFileWithInfo(folderInfo, fileName, folderName);
+                    if (searchResult != null)
+                    {
+                        break;
+                    }
+                }
+
+                if (searchResult == null)
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒版棩蹇楁枃浠�: {fileName}");
+                }
+
+                // 璇诲彇鏂囦欢鍐呭
+                var fileContent = ReadLogFileContent(searchResult.File.FullName);
+
+                // 杩斿洖鍖呭惈鍏冩暟鎹殑缁撴灉
+                var result = new
+                {
+                    fileName = searchResult.File.Name,
+                    fullPath = searchResult.File.FullName,
+                    fatherNode = searchResult.SourceFolder,
+                    fileSize = GetFileSize(searchResult.File.Length),
+                    lastWriteTime = searchResult.File.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"),
+                    content = fileContent,
+                    lineCount = fileContent.Count
+                };
+
+                return WebResponseContent.Instance.OK(data: result);
+            }
+            catch (IOException ex)
+            {
+                if (IsFileLockedException(ex))
+                {
+                    return WebResponseContent.Instance.Error($"鏃ュ織鏂囦欢姝e湪琚郴缁熷啓鍏ワ紝璇风◢鍚庡啀璇�");
+                }
+                return WebResponseContent.Instance.Error($"鎵撳紑鏃ュ織鏂囦欢閿欒,{ex.Message}");
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error($"鎵撳紑鏃ュ織鏂囦欢閿欒,{ex.Message}");
+            }
+        }
+
+        #region MyRegion
+        private object BuildFolderTree(DirectoryInfo folder, string displayName)
+        {
+            var children = new List<object>();
+
+            // 澶勭悊瀛愮洰褰�
+            foreach (var subDir in folder.GetDirectories().Where(x => x.Name != "Info").OrderByDescending(x => x.CreationTime))
+            {
+                var files = subDir.GetFiles()
+                    .Select(file => new
+                    {
+                        label = file.Name,
+                        id = fileId++,
+                        hidden = true,
+                        fatherNode = subDir.Name,
+                        fullPath = file.FullName,
+                        lastWriteTime = file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")
+                    })
+                    .ToList();
+
+                if (files.Any())
+                {
+                    children.Add(new
+                    {
+                        label = subDir.Name,
+                        children = files,
+                        id = subDir.Name.GetHashCode(),
+                        hidden = false
+                    });
+                }
+            }
+
+            // 澶勭悊鏍圭洰褰曟枃浠�
+            var rootFiles = folder.GetFiles()
+                .Select(file => new
+                {
+                    label = file.Name,
+                    id = fileId++,
+                    hidden = true,
+                    fatherNode = folder.Name,
+                    fullPath = file.FullName,
+                    lastWriteTime = file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")
+                })
+                .ToList();
+
+            if (rootFiles.Any())
+            {
+                children.Add(new
+                {
+                    label = folder.Name,
+                    children = rootFiles,
+                    id = folder.Name.GetHashCode(),
+                    hidden = false
+                });
+            }
+
+            return new
+            {
+                label = displayName,
+                children = children,
+                id = displayName.GetHashCode(),
+                hidden = false,
+                fatherNode = folder.Name,
+                isRoot = true
+            };
+        }
+
+        private List<string> ReadLogFileContent(string filePath)
+        {
+            var lines = new List<string>();
+
+            using (FileStream stream = new FileStream(
+                filePath,
+                FileMode.Open,
+                FileAccess.Read,
+                FileShare.ReadWrite))
+            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
+            {
+                // 濡傛灉鏂囦欢澶ぇ锛屽彧璇诲彇鏈�鍚�1000琛岋紙鍙�夛級
+                var fileInfo = new FileInfo(filePath);
+                if (fileInfo.Length > 5 * 1024 * 1024) // 澶т簬5MB
+                {
+                    return ReadLastLines(reader, 1000);
+                }
+
+                // 璇诲彇鍏ㄩ儴鍐呭
+                while (!reader.EndOfStream)
+                {
+                    var line = reader.ReadLine();
+                    lines.Add(line);
+                }
+            }
+
+            return lines;
+        }
+
+        private List<string> ReadLastLines(StreamReader reader, int lineCount)
+        {
+            var lines = new Queue<string>();
+            string line;
+
+            while ((line = reader.ReadLine()) != null)
+            {
+                lines.Enqueue(line);
+                if (lines.Count > lineCount)
+                {
+                    lines.Dequeue();
+                }
+            }
+
+            return lines.ToList();
+        }
+
+        /// <summary>
+        /// 鏂囦欢鏌ユ壘缁撴灉
+        /// </summary>
+        private class FileSearchResult
+        {
+            public FileInfo File { get; set; }
+            public string SourceFolder { get; set; }
+        }
+
+        /// <summary>
+        /// 鏌ユ壘鏂囦欢骞惰繑鍥炶缁嗕俊鎭�
+        /// </summary>
+        private FileSearchResult FindFileWithInfo(DirectoryInfo folder, string fileName, string sourceFolder)
+        {
+            // 鏌ユ壘褰撳墠鐩綍
+            var file = folder.GetFiles().FirstOrDefault(x => x.Name == fileName);
+            if (file != null)
+            {
+                return new FileSearchResult
+                {
+                    File = file,
+                    SourceFolder = sourceFolder
+                };
+            }
+
+            // 閫掑綊鏌ユ壘瀛愮洰褰�
+            foreach (var subDir in folder.GetDirectories().Where(x => x.Name != "Info"))
+            {
+                var result = FindFileWithInfo(subDir, fileName, sourceFolder);
+                if (result != null)
+                {
+                    return result;
+                }
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙鐨勬枃浠跺ぇ灏�
+        /// </summary>
+        private string GetFileSize(long bytes)
+        {
+            string[] sizes = { "B", "KB", "MB", "GB" };
+            double len = bytes;
+            int order = 0;
+            while (len >= 1024 && order < sizes.Length - 1)
+            {
+                order++;
+                len = len / 1024;
+            }
+            return $"{len:0.##} {sizes[order]}";
+        }
+
+        private bool IsFileLockedException(IOException ex)
+        {
+            int errorCode = ex.HResult & 0xFFFF;
+            return errorCode == 32 || errorCode == 33; // ERROR_SHARING_VIOLATION or ERROR_LOCK_VIOLATION
+        } 
+        #endregion
     }
 }

--
Gitblit v1.9.3