.gitignore
@@ -434,3 +434,8 @@ Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json /Code/WMS/WIDESEA_WMSClient/.omc # Local IDE and assistant environment files **/.claude/settings.local.json **/.vs/**/DocumentLayout.json **/.vs/**/DocumentLayout.backup.json Code/WCS/WIDESEAWCS_Server/.claude/settings.local.json
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/QuartzLogger.cs
@@ -1,85 +1,345 @@ using System; using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using WIDESEAWCS_Core.Helper; namespace WIDESEAWCS_Core.LogHelper { public class QuartzLogger /// <summary> /// æ¥å¿ç级æä¸¾ /// </summary> public enum LogLevel { static ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim(); static string folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Log\\{DateTime.Now.ToString("yyyy-MM-dd")}"); DEBUG = 0, INFO = 1, WARN = 2, ERROR = 3, FATAL = 4 } public static void WriteLogToFile(string fileName, string log) /// <summary> /// æ¥å¿æ¡ç®ï¼å°è£ åæ¡æ¥å¿ç宿´ä¿¡æ¯ /// </summary> public class LogEntry { /// <summary> /// æ¥å¿æ¶é´ /// </summary> public DateTime Time { get; set; } /// <summary> /// æ¥å¿ç级 /// </summary> public LogLevel Level { get; set; } /// <summary> /// æ¥å¿æ¶æ¯å 容 /// </summary> public string Message { get; set; } = string.Empty; /// <summary> /// æ¥å¿æ¥æº/æä»¶å /// </summary> public string? Source { get; set; } /// <summary> /// å¼å¸¸ä¿¡æ¯ï¼å¯éï¼ /// </summary> public string? Exception { get; set; } /// <summary> /// æ ¼å¼å为æ 忥å¿å符串 /// </summary> public string ToFormattedString() { var sb = new StringBuilder(); sb.Append($"ã{Time:HH:mm:ss}ãã{Level}ãï¼ã{Message}ã"); if (!string.IsNullOrEmpty(Exception)) { sb.AppendLine(); sb.Append($"ãå¼å¸¸ãï¼{Exception}"); } return sb.ToString(); } } /// <summary> /// éååé䏿¥å¿åå ¥å¨ /// 使ç¨ç产è -æ¶è´¹è 模å¼ï¼åå°çº¿ç¨æ¹éåå ¥æä»¶ï¼æé«æ§è½ /// </summary> public class QueuedLogWriter : IDisposable { private static readonly Lazy<QueuedLogWriter> _instance = new Lazy<QueuedLogWriter>(() => new QueuedLogWriter()); public static QueuedLogWriter Instance => _instance.Value; private readonly BlockingCollection<LogEntry> _logQueue; private readonly CancellationTokenSource _cts; private readonly Task _writeTask; private readonly ReaderWriterLockSlim _fileLock = new ReaderWriterLockSlim(); private readonly string _logFolder; private readonly int _maxFileSize; private readonly string _fileExt; private bool _disposed; /// <summary> /// æ¥å¿éååå ¥å¨åä¾ /// </summary> private QueuedLogWriter() { _logFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Log{Path.DirectorySeparatorChar}{DateTime.Now:yyyy-MM-dd}"); _maxFileSize = 10 * 1024 * 1024; // 10MB _fileExt = ".log"; _logQueue = new BlockingCollection<LogEntry>(new ConcurrentQueue<LogEntry>()); _cts = new CancellationTokenSource(); // ç¡®ä¿æ¥å¿ç®å½åå¨ if (!Directory.Exists(_logFolder)) { Directory.CreateDirectory(_logFolder); } // å¯å¨åå°åå ¥çº¿ç¨ _writeTask = Task.Run(WriteLoop, _cts.Token); } /// <summary> /// åå°åå ¥å¾ªç¯ /// </summary> private void WriteLoop() { var batch = new List<LogEntry>(); while (!_cts.Token.IsCancellationRequested) { try { // æ¹éååºæ¥å¿ï¼æå¤100æ¡æçå¾ 500ms batch.Clear(); if (_logQueue.TryTake(out var entry, 500)) { batch.Add(entry); while (batch.Count < 100 && _logQueue.TryTake(out entry, 50)) { batch.Add(entry); } WriteBatch(batch); } } catch (OperationCanceledException) { break; } catch (Exception) { // 忽ç¥åå ¥å¼å¸¸ï¼é²æ¢åå°çº¿ç¨å´©æº } } // åæ¶åå°å©ä½æ¥å¿ååº while (_logQueue.TryTake(out var remainingEntry, 100)) { batch.Add(remainingEntry); } if (batch.Count > 0) { WriteBatch(batch); } } /// <summary> /// æ¹éåå ¥æ¥å¿å°æä»¶ /// </summary> private void WriteBatch(List<LogEntry> entries) { if (entries.Count == 0) return; try { // è¿å ¥åé LogWriteLock.EnterWriteLock(); // 妿æä»¶å¤¹ä¸åå¨ï¼åå建æä»¶å¤¹ if (!Directory.Exists(folderPath)) _fileLock.EnterWriteLock(); foreach (var entry in entries) { Directory.CreateDirectory(folderPath); string fileName = GetLogFileName(entry.Source); string filePath = Path.Combine(_logFolder, fileName); string content = entry.ToFormattedString() + Environment.NewLine; ConsoleHelper.WriteInfoLine(content); File.AppendAllText(filePath, content); } // è·åæ¥å¿æä»¶è·¯å¾ string logFilePath = Path.Combine(folderPath, GetLastAccessFileName(fileName)); // è·åå½åæ¶é´ DateTime now = DateTime.Now; // æé æ¥å¿å 容 string logContent = $"ã{now}ã{Environment.NewLine}{log}"; // å°æ¥å¿å 容追å å°æ¥å¿æä»¶ä¸ File.AppendAllText(logFilePath, logContent); } catch { } catch (Exception) { // éé»å¤çï¼é²æ¢æä»¶IOå¼å¸¸å½±åä¸»çº¿ç¨ } finally { // éåºåé LogWriteLock.ExitWriteLock(); _fileLock.ExitWriteLock(); } } static int size = 10 * 1024 * 1024; static string ext = ".log"; private static string GetLogFilePath(string folderPath, string fileName) { // è·åæå®æä»¶å¤¹ä¸çæææä»¶ var allFiles = new DirectoryInfo(folderPath); // è·åç¬¦åæ¡ä»¶çæä»¶ï¼ææä»¶åéåºæå var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(fileName.ToLower()) && fi.Extension.ToLower() == ext.ToLower() && fi.Length < size).OrderByDescending(d => d.Name).ToList(); FileInfo? file = selectFiles.FirstOrDefault(); // 妿æç¬¦åæ¡ä»¶çæä»¶ï¼è¿å第ä¸ä¸ªæä»¶ç宿´è·¯å¾ if (file != null) /// <summary> /// è·åæå建ä¸ä¸ªæ¥å¿æä»¶è·¯å¾ï¼æå¤§å°åæä»¶ï¼ /// </summary> private string GetLogFileName(string? source) { string prefix = string.IsNullOrEmpty(source) ? "WCS" : source; string searchPattern = $"{prefix}*.log"; if (!Directory.Exists(_logFolder)) { return file.FullName; Directory.CreateDirectory(_logFolder); } // å¦ææ²¡æç¬¦åæ¡ä»¶çæä»¶ï¼è¿åä¸ä¸ªæ°çæä»¶è·¯å¾ï¼æä»¶å为åæä»¶åå ä¸å½åæ¶é´ return Path.Combine(folderPath, $@"{fileName}_{DateTime.Now.ToString("HH-mm-ss")}.log"); } var files = Directory.GetFiles(_logFolder, searchPattern) .Select(f => new FileInfo(f)) .Where(f => f.Extension.Equals(_fileExt, StringComparison.OrdinalIgnoreCase)) .OrderByDescending(f => f.Name) .ToList(); private static string GetLastAccessFileName(string fileName) { foreach (var m in GetExistLogFileNames(fileName)) // æ¥æ¾æç©ºé´çç°ææä»¶ foreach (var file in files) { FileInfo fileInfo = new FileInfo(m); if (fileInfo.Length < size) if (file.Length < _maxFileSize) { return m; return file.Name; } } // è¿åä¸ä¸ªæ°çé»è®¤å½åæ¶é´çæ¥å¿åç§° return $@"{fileName}_{DateTime.Now.ToString("HH-mm-ss")}.log"; // åå»ºæ°æä»¶ return $"{prefix}_{DateTime.Now:HH-mm-ss}{_fileExt}"; } public static string[] GetExistLogFileNames(string fileName) /// <summary> /// åå ¥æ¥å¿ï¼çäº§ç«¯ï¼ /// </summary> public void Enqueue(LogEntry entry) { string[] fileNames = Directory.GetFiles(folderPath, fileName + "*.log"); return fileNames; if (_disposed) return; _logQueue.Add(entry); } /// <summary> /// åå ¥æ¥å¿çä¾¿æ·æ¹æ³ /// </summary> public void Log(LogLevel level, string message, string? source = null, string? exception = null) { if (_disposed) return; var entry = new LogEntry { Time = DateTime.Now, Level = level, Message = message, Source = source, Exception = exception }; _logQueue.Add(entry); } /// <summary> /// å ³éæ¥å¿åå ¥å¨ /// </summary> public void Dispose() { if (_disposed) return; _disposed = true; _cts.Cancel(); try { _writeTask.Wait(3000); } catch (AggregateException) { } _cts.Dispose(); _logQueue.Dispose(); _fileLock.Dispose(); } } /// <summary> /// éææ¥å¿å·¥å ·ç±»ï¼å ¼å®¹åææ¥å£ï¼ /// æä¾å¤ç§æ ¼å¼åæ¹æ³åéåååå ¥ /// </summary> public class QuartzLogger { private static readonly QueuedLogWriter _writer = QueuedLogWriter.Instance; /// <summary> /// å ¼å®¹æ§æ¥å£ï¼å°æ¥å¿åå ¥æä»¶ /// </summary> /// <param name="fileName">æ¥å¿æä»¶åï¼ä½ä¸ºSourceï¼</param> /// <param name="log">æ¥å¿å 容</param> public static void WriteLogToFile(string fileName, string log) { _writer.Log(LogLevel.INFO, log, fileName); } /// <summary> /// åå ¥è°è¯æ¥å¿ /// </summary> public static void Debug(string message, string? source = null) { _writer.Log(LogLevel.DEBUG, message, source); } /// <summary> /// åå ¥ä¿¡æ¯æ¥å¿ /// </summary> public static void Info(string message, string? source = null) { _writer.Log(LogLevel.INFO, message, source); } /// <summary> /// åå ¥è¦åæ¥å¿ /// </summary> public static void Warn(string message, string? source = null) { _writer.Log(LogLevel.WARN, message, source); } /// <summary> /// åå ¥é误æ¥å¿ /// </summary> public static void Error(string message, string? source = null, Exception? exception = null) { _writer.Log(LogLevel.ERROR, message, source, exception?.ToString()); } /// <summary> /// åå ¥è´å½é误æ¥å¿ /// </summary> public static void Fatal(string message, string? source = null, Exception? exception = null) { _writer.Log(LogLevel.FATAL, message, source, exception?.ToString()); } /// <summary> /// ä½¿ç¨æå®æ ¼å¼åå ¥æ¥å¿ /// </summary> /// <param name="format">æ ¼å¼åå符串</param> /// <param name="args">æ ¼å¼ååæ°</param> public static void WriteFormatted(string format, params object[] args) { string message = string.Format(format, args); _writer.Log(LogLevel.INFO, message); } /// <summary> /// ç´æ¥åå ¥ä¸ä¸ªæ¥å¿æ¡ç®ï¼æçµæ´»ï¼ /// </summary> public static void WriteLogEntry(LogEntry entry) { _writer.Enqueue(entry); } /// <summary> /// éæ¾èµæºï¼åºç¨å ³éæ¶è°ç¨ï¼ /// </summary> public static void Shutdown() { _writer.Dispose(); } } } Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
@@ -62,6 +62,9 @@ <PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.3.8" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="OfficeOpenXml.Core.ExcelPackage" Version="1.0.0" /> <PackageReference Include="Serilog" Version="4.3.1" /> <PackageReference Include="Serilog.AspNetCore" Version="6.0.0" /> <PackageReference Include="Serilog.Sinks.Seq" Version="9.0.0" /> <PackageReference Include="SkiaSharp" Version="2.88.8" /> <PackageReference Include="SqlSugarCore" Version="5.1.4.152" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/QuartzNet/QuartzNetExtension.cs
@@ -3,6 +3,7 @@ using WIDESEAWCS_Core; using WIDESEAWCS_Core.Caches; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.LogHelper; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Service; @@ -118,7 +119,7 @@ } catch (Exception ex) { Console.WriteLine("è°åº¦æå¡å¼å¯å¼å¸¸" + ex.ToString()); QuartzLogger.Error($"è°åº¦æå¡å¼å¯å¼å¸¸", "QuartzNetExtension", ex); } } else @@ -141,13 +142,22 @@ _ => targetDevice.Device }; WebResponseContent responseContent = await _schedulerCenter.AddScheduleJobAsync(dispatches[i]); if (responseContent.Status) ConsoleHelper.WriteSuccessLine(dispatches[i].Name + "è°åº¦æå¡æ·»å æå"); else ConsoleHelper.WriteErrorLine(dispatches[i].Name + "è°åº¦æå¡æ·»å 失败"); if (responseContent.Status) { QuartzLogger.Info($"{dispatches[i].Name}è°åº¦æå¡æ·»å æå", "QuartzNetExtension"); ConsoleHelper.WriteSuccessLine(dispatches[i].Name + "è°åº¦æå¡æ·»å æå"); } else { QuartzLogger.Error($"{dispatches[i].Name}è°åº¦æå¡æ·»å 失败", "QuartzNetExtension"); ConsoleHelper.WriteErrorLine(dispatches[i].Name + "è°åº¦æå¡æ·»å 失败"); } } //await _schedulerCenter.StartScheduleAsync(); } catch (Exception ex) { Console.WriteLine("è°åº¦æå¡å¼å¯å¼å¸¸" + ex.ToString()); QuartzLogger.Error($"è°åº¦æå¡å¼å¯å¼å¸¸", "QuartzNetExtension", ex); throw; } } Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/QuartzNet/SchedulerCenterServer.cs
@@ -31,6 +31,7 @@ using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.CustomException; using Quartz.Impl.Matchers; using WIDESEAWCS_Core.LogHelper; namespace WIDESEAWCS_QuartzJob { @@ -103,7 +104,7 @@ { //çå¾ ä»»å¡è¿è¡å®æ await this._scheduler.Start(); await Console.Out.WriteLineAsync(QuartzJobInfoMessage.StartJobSuccess); QuartzLogger.Info(QuartzJobInfoMessage.StartJobSuccess); result = WebResponseContent.Instance.OK(QuartzJobInfoMessage.StartJobSuccess); return result; } Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_RedisService/Connection/RedisConnectionManager.cs
@@ -3,6 +3,7 @@ using StackExchange.Redis; using System.Linq; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.LogHelper; using WIDESEAWCS_RedisService.Options; namespace WIDESEAWCS_RedisService.Connection @@ -59,16 +60,16 @@ var connection = ConnectionMultiplexer.Connect(configOptions); connection.ConnectionFailed += (_, e) => ConsoleHelper.WriteErrorLine($"Redisè¿æ¥å¤±è´¥: {e.FailureType}"); QuartzLogger.Info($"Redisè¿æ¥å¤±è´¥: {e.FailureType}"); connection.ConnectionRestored += (_, e) => ConsoleHelper.WriteSuccessLine($"Redisè¿æ¥æ¢å¤: {e.EndPoint}"); QuartzLogger.Info($"Redisè¿æ¥æ¢å¤: {e.EndPoint}"); ConsoleHelper.WriteSuccessLine($"Redisè¿æ¥æå: {string.Join(",", configOptions.EndPoints)}"); QuartzLogger.Info($"Redisè¿æ¥æå: {string.Join(",", configOptions.EndPoints)}"); return connection; } catch (Exception ex) { ConsoleHelper.WriteErrorLine($"Redisè¿æ¥å建失败:{ex.Message}"); QuartzLogger.Error($"Redisè¿æ¥å建失败:{ex.Message}",null, ex); throw; } } Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs
@@ -46,7 +46,7 @@ .ReadFrom.Configuration(context.Configuration) // ä»åºç¨ç¨åºé ç½®ä¸è¯»åSerilogç¸å ³è®¾ç½®ï¼å¦appsettings.jsonï¼ .ReadFrom.Services(services) // ä»ä¾èµæ³¨å ¥å®¹å¨ä¸è¯»åæå¡é ç½®ï¼å 许å¨é ç½®ä¸ä½¿ç¨å·²æ³¨åçæå¡ .Enrich.FromLogContext() // å¯ç¨æ¥å¿ä¸ä¸æï¼å¯ä»¥å¨æ¥å¿ä¸å å«å¦è¯·æ±IDãç¨æ·IDç卿屿§ .Enrich.WithProperty("Application", "WCS") // 设置Microsoftå½å空é´çæ¥å¿çº§å«ä¸ºInformation // è¿æ ·å¯ä»¥åå°Microsoftæ¡æ¶æ¬èº«çè¯¦ç»æ¥å¿ï¼é¿å è¿å¤çDebugæ¥å¿ .MinimumLevel.Override("Microsoft", LogEventLevel.Information) Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
@@ -65,11 +65,6 @@ </ItemGroup> <ItemGroup> <PackageReference Include="Serilog.AspNetCore" Version="8.0.3" /> <PackageReference Include="Serilog.Settings.Configuration" Version="8.0.4" /> <PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" /> <PackageReference Include="Serilog.Sinks.File" Version="6.0.0" /> <PackageReference Include="Serilog.Sinks.Seq" Version="9.0.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> </ItemGroup> Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotClientManager.cs
@@ -102,7 +102,7 @@ // ç»å®å®¢æ·ç«¯æå¼è¿æ¥çäºä»¶å¤ç _tcpSocket.RobotReceived += OnRobotReceived; // è®°å½æ¥å¿ï¼æ³¨æï¼æ¥å¿å 容为"客æ·ç«¯å·²æå¼è¿æ¥"ï¼å¯è½æ¯éççå 使æ¬ï¼ QuartzLogger.Error($"客æ·ç«¯å·²æå¼è¿æ¥", robotCrane.DeviceName); QuartzLogger.Warn($"客æ·ç«¯å·²æå¼è¿æ¥", robotCrane.DeviceName); } // ä» TCP æå¡å¨ç客æ·ç«¯åå ¸ä¸è·å TcpClient 对象 @@ -124,7 +124,7 @@ if (!alreadyStarted) { // è®°å½æ¥å¿ QuartzLogger.Error($"å¯å¨å®¢æ·ç«¯æ¶æ¯å¤ç", robotCrane.DeviceName); QuartzLogger.Info($"å¯å¨å®¢æ·ç«¯æ¶æ¯å¤ç", robotCrane.DeviceName); // è·åææ°çç¶æå¯¹è±¡ var latestStateForSubscribe = _stateManager.GetState(ipAddress); @@ -142,7 +142,7 @@ if (t.IsFaulted) { // è®°å½é误æ¥å¿ QuartzLogger.Error($"çå¬å®¢æ·ç«¯æ¶æ¯äºä»¶å¼å¸¸", robotCrane.DeviceName); QuartzLogger.Info($"çå¬å®¢æ·ç«¯æ¶æ¯äºä»¶å¼å¸¸", robotCrane.DeviceName); Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] HandleClientAsync error: {t.Exception?.GetBaseException().Message}"); // åçé误æ¶ï¼ç§»é¤å¯å¨æ å¿ï¼å è®¸ä¸æ¬¡éè¯ _handleClientStarted.TryRemove(ipAddress, out _); Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
@@ -117,7 +117,7 @@ { // è®°å½æ¥æ¶å°çæ¶æ¯æ¥å¿ _logger.LogInformation($"æ¥æ¶å°å®¢æ·ç«¯ã{state.RobotCrane.DeviceName}ãåéæ¶æ¯ã{message}ã"); QuartzLogger.Error($"æ¥æ¶å°å®¢æ·ç«¯æ¶æ¯ã{message}ã", state.RobotCrane.DeviceName); QuartzLogger.Info($"æ¥æ¶å°å®¢æ·ç«¯æ¶æ¯ã{message}ã", state.RobotCrane.DeviceName); // æå»ºç¼åé®ï¼æ£æ¥ Redis 䏿¯å¦åå¨è¯¥è®¾å¤çç¶æ var cacheKey = $"{RedisPrefix.Code}:{RedisName.SocketDevices}:{client.Client.RemoteEndPoint}"; @@ -141,7 +141,7 @@ // å¤çæååï¼å°åæ¶æ¯ååå°å®¢æ·ç«¯ï¼ä¿æåæè¡ä¸ºï¼ await _socketClientGateway.SendMessageAsync(client, message); _logger.LogInformation($"åéæ¶æ¯ã{message}ã"); QuartzLogger.Error($"åéæ¶æ¯ï¼ã{message}ã", state.RobotCrane.DeviceName); QuartzLogger.Info($"åéæ¶æ¯ï¼ã{message}ã", state.RobotCrane.DeviceName); // å®å ¨æ´æ°ç¶æå° Redis _stateManager.TryUpdateStateSafely(activeState.IPAddress, activeState); Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
@@ -156,7 +156,7 @@ if (result) { // åéæåï¼è®°å½æ¥å¿ QuartzLogger.Error($"ä¸åæ¾è´§æä»¤ï¼æï¿½?: {taskString}", task.RobotRoadway); QuartzLogger.Info($"ä¸åæ¾è´§æä»¤ï¼æï¿½?: {taskString}", task.RobotRoadway); // æ´æ°ä»»å¡ç¶æä¸º"æºå¨äººæ§è¡ä¸" task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); @@ -232,7 +232,7 @@ stateForUpdate.CellBarcode.Add(trayBarcode2); // è®°å½æ¥å¿ QuartzLogger.Error($"ȡ�������о�ţ���о: {trayBarcode1}+{trayBarcode2}", stateForUpdate.RobotCrane.DeviceName); QuartzLogger.Info($"ȡ�������о�ţ���о: {trayBarcode1}+{trayBarcode2}", stateForUpdate.RobotCrane.DeviceName); // åéåè´§æä»¤ await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate); Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.backup.json
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.json
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -381,7 +381,7 @@ }; var taskDtos = task.Adapt<WMSTaskDTO>(); var addResult = await BaseDal.AddDataAsync(task); var addResult = await BaseDal.AddDataAsync(task) > 0; if (!addResult) return WebResponseContent.Instance.Error("ä»»å¡å建失败"); return WebResponseContent.Instance.OK("ä»»å¡å建æå", taskDtos); Code/²âÊÔ¹¤¾ß/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.backup.json
ÎļþÒÑɾ³ý Code/²âÊÔ¹¤¾ß/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.json
ÎļþÒÑɾ³ý Code/²âÊÔ¹¤¾ß/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/src/views/RobotClientsView.vue
@@ -203,7 +203,7 @@ serverId: 'robot-client-1', listenIp: '127.0.0.1', listenPort: 2000, localPort: 2001 localPort: 62212 }) const status = ref<RobotClientStatusResponse | null>(null)