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