From a05bbc36d31b8745fad325aa677c29f03d176718 Mon Sep 17 00:00:00 2001 From: 肖洋 <cathay_xy@163.com> Date: 星期四, 16 一月 2025 10:20:56 +0800 Subject: [PATCH] 更新 --- Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/ExceptionPortStationHandler.cs | 41 ++++++ Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs | 183 +++++++++++++++++++----------- Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/IStationHandler.cs | 15 ++ Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs | 2 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/StationHandlerFactory.cs | 27 ++++ Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/EmptyTrayStationHandler.cs | 33 +++++ Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs | 2 7 files changed, 236 insertions(+), 67 deletions(-) diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs index 3666ec1..043d29a 100644 --- a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs @@ -17,6 +17,7 @@ using WIDESEAWCS_QuartzJob.QuartzExtensions; using WIDESEAWCS_QuartzJob.Seed; using WIDESEAWCS_SignalR; +using WIDESEAWCS_Tasks; using WIDESEAWCS_WCSServer.Filter; var builder = WebApplication.CreateBuilder(args); @@ -81,6 +82,7 @@ builder.Services.AddIpPolicyRateLimitSetup(builder.Configuration);//IPLimit限流 启动服务 builder.Services.AddScoped<UseServiceDIAttribute>(); +builder.Services.AddScoped<CommonConveyorLineJob>(); builder.Services.AddSession(); diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs index 5104d55..099a9bb 100644 --- a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs @@ -77,79 +77,115 @@ CommonConveyorLine conveyorLine = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams"); if (conveyorLine != null) { + ConsoleHelper.WriteColorLine("寮�濮嬶細" + DateTime.Now, ConsoleColor.Cyan); // 鏌ヨ鎵�鏈夊瓙璁惧鐨勪綅缃� List<string> childDeviceCodes = _routerService.QueryAllPositions(conveyorLine.DeviceCode); + // 鑾峰彇鎵�鏈夌珯鐐圭鐞嗗櫒 + List<Dt_StationManager> stationManagers = _stationManagerService.GetAllStationByDeviceCode(conveyorLine.DeviceCode); // 骞惰澶勭悊姣忎釜瀛愯澶� var tasks = childDeviceCodes.Select(childDeviceCode => ProcessDeviceAsync(conveyorLine, childDeviceCode)).ToList(); + + // 骞惰澶勭悊姣忎釜绔欑偣绠$悊鍣� + tasks = stationManagers.Select(station => Task.Run(async () => + { + var (command, commandWrite) = ReadCommands(station, conveyorLine); + if (command == null || commandWrite == null) + { + return; + } + + IStationHandler handler = StationHandlerFactory.GetHandler(station.stationType, this); + await handler.HandleStationAsync(conveyorLine, station, command, commandWrite); + })).ToList(); + + #region + //foreach (var station in stationManagers) + //{ + // #region + // //tasks.Add(Task.Run(async () => + // //{ + // // if (station.stationType == 11) + // // { + // // // 璇诲彇浠诲姟鍛戒护鍜岃澶囧懡浠� + // // ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(station.stationChildCode); + // // ConveyorLineTaskCommandWrite commandWrite = conveyorLine.ReadCustomer<ConveyorLineTaskCommandWrite>(station.stationChildCode, "DeviceCommand"); + // // if (command != null && commandWrite != null) + // // { + // // // 灏嗕氦浜掍俊鍙疯浆鎹负甯冨皵鏁扮粍 + // // var structs = BitConverter.GetBytes(commandWrite.WriteInteractiveSignal).Reverse().ToArray().ToBoolArray(); + // // if (structs[0] == true) + // // { + // // // 杈撳嚭璀﹀憡淇℃伅 + // // var log = $"銆恵conveyorLine.DeviceName}銆戜换鍔″彿锛氥�恵command.TaskNum}銆�,鎵樼洏鏉$爜锛氥�恵command.Barcode}銆戝凡鍒拌揪銆恵station.stationChildCode}銆戠┖鎵樼洏璇锋眰鎵爜鍏ュ簱"; + // // ConsoleHelper.WriteWarningLine(log); + + // // await _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); + // // WriteInfo(conveyorLine.DeviceName, log); + + // // // 澶勭悊鍏ュ簱璇锋眰 + // // NGRequestTaskInbound(conveyorLine, command, station, 0); + // // } + // // else + // // { + // // // 鍙戦�佸畬鎴愪俊鍙� + // // ConveyorLineSendFinish(conveyorLine, station.stationChildCode, 0, false); + // // } + // // } + // // } + // // else if (station.stationType == 5) + // // { + // // // 璇诲彇浠诲姟鍛戒护鍜岃澶囧懡浠� + // // ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(station.stationChildCode); + // // ConveyorLineTaskCommandWrite commandWrite = conveyorLine.ReadCustomer<ConveyorLineTaskCommandWrite>(station.stationChildCode, "DeviceCommand"); + // // if (command != null && commandWrite != null) + // // { + // // // 灏嗕氦浜掍俊鍙疯浆鎹负甯冨皵鏁扮粍 + // // var structs = BitConverter.GetBytes(commandWrite.WriteInteractiveSignal).Reverse().ToArray().ToBoolArray(); + // // if (structs[0] == true) + // // { + // // // 妫�鏌ユ槸鍚﹀瓨鍦ㄤ换鍔� + // // if (_taskRepository.QueryData(x => x.SourceAddress == station.stationChildCode).Count() > 0) + // // { + // // return; + // // } + // // // 杈撳嚭璀﹀憡淇℃伅 + // // var log = $"銆恵conveyorLine.DeviceName}銆戜换鍔″彿锛氥�恵command.TaskNum}銆�,鎵樼洏鏉$爜锛氥�恵command.Barcode}銆戝凡鍒拌揪銆恵station.stationChildCode}銆戝紓甯稿彛璇锋眰鎵爜鍏ュ簱"; + // // ConsoleHelper.WriteWarningLine(log); + + // // await _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); + // // WriteInfo(conveyorLine.DeviceName, log); + + // // // 澶勭悊鏂颁换鍔� + // // await HandleNewTaskAsync(conveyorLine, command, station.stationChildCode, 0); + // // } + // // else + // // { + // // // 鍙戦�佸畬鎴愪俊鍙� + // // ConveyorLineSendFinish(conveyorLine, station.stationChildCode, 0, false); + // // } + // // } + // // } + // //})); + // #endregion + + // tasks.Add(Task.Run(async () => + // { + // var (command, commandWrite) = ReadCommands(station, conveyorLine); + // if (command == null || commandWrite == null) + // { + // return; + // } + + // IStationHandler handler = StationHandlerFactory.GetHandler(station.stationType, this); + // await handler.HandleStationAsync(conveyorLine, station, command, commandWrite); + // })); + //} + #endregion + await Task.WhenAll(tasks); - // 鑾峰彇鎵�鏈夌珯鐐圭鐞嗗櫒 - List<Dt_StationManager> stationManagers = _stationManagerService.GetAllStationByDeviceCode(conveyorLine.DeviceCode); - foreach (var station in stationManagers) - { - if (station.stationType == 11) - { - // 璇诲彇浠诲姟鍛戒护鍜岃澶囧懡浠� - ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(station.stationChildCode); - ConveyorLineTaskCommandWrite commandWrite = conveyorLine.ReadCustomer<ConveyorLineTaskCommandWrite>(station.stationChildCode, "DeviceCommand"); - if (command != null && commandWrite != null) - { - // 灏嗕氦浜掍俊鍙疯浆鎹负甯冨皵鏁扮粍 - var structs = BitConverter.GetBytes(commandWrite.WriteInteractiveSignal).Reverse().ToArray().ToBoolArray(); - if (structs[0] == true) - { - // 杈撳嚭璀﹀憡淇℃伅 - var log = $"銆恵conveyorLine.DeviceName}銆戜换鍔″彿锛氥�恵command.TaskNum}銆�,鎵樼洏鏉$爜锛氥�恵command.Barcode}銆戝凡鍒拌揪銆恵station.stationChildCode}銆戠┖鎵樼洏璇锋眰鎵爜鍏ュ簱"; - ConsoleHelper.WriteWarningLine(log); - - await _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); - WriteInfo(conveyorLine.DeviceName, log); - - // 澶勭悊鍏ュ簱璇锋眰 - NGRequestTaskInbound(conveyorLine, command, station, 0); - } - else - { - // 鍙戦�佸畬鎴愪俊鍙� - ConveyorLineSendFinish(conveyorLine, station.stationChildCode, 0, false); - } - } - } - else if (station.stationType == 5) - { - // 璇诲彇浠诲姟鍛戒护鍜岃澶囧懡浠� - ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(station.stationChildCode); - ConveyorLineTaskCommandWrite commandWrite = conveyorLine.ReadCustomer<ConveyorLineTaskCommandWrite>(station.stationChildCode, "DeviceCommand"); - if (command != null && commandWrite != null) - { - // 灏嗕氦浜掍俊鍙疯浆鎹负甯冨皵鏁扮粍 - var structs = BitConverter.GetBytes(commandWrite.WriteInteractiveSignal).Reverse().ToArray().ToBoolArray(); - if (structs[0] == true) - { - // 妫�鏌ユ槸鍚﹀瓨鍦ㄤ换鍔� - if (_taskRepository.QueryData(x => x.SourceAddress == station.stationChildCode).Count() > 0) - { - return; - } - // 杈撳嚭璀﹀憡淇℃伅 - var log = $"銆恵conveyorLine.DeviceName}銆戜换鍔″彿锛氥�恵command.TaskNum}銆�,鎵樼洏鏉$爜锛氥�恵command.Barcode}銆戝凡鍒拌揪銆恵station.stationChildCode}銆戝紓甯稿彛璇锋眰鎵爜鍏ュ簱"; - ConsoleHelper.WriteWarningLine(log); - - await _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); - WriteInfo(conveyorLine.DeviceName, log); - - // 澶勭悊鏂颁换鍔� - await HandleNewTaskAsync(conveyorLine, command, station.stationChildCode, 0); - } - else - { - // 鍙戦�佸畬鎴愪俊鍙� - ConveyorLineSendFinish(conveyorLine, station.stationChildCode, 0, false); - } - } - } - } + ConsoleHelper.WriteColorLine("缁撴潫锛�" + DateTime.Now, ConsoleColor.Cyan); } } catch (Exception ex) @@ -853,5 +889,20 @@ } #endregion 璁惧NG鍙e叆搴� + + public async Task LogAndWarn(string deviceName, string log, string color = "red") + { + ConsoleHelper.WriteWarningLine(log); + await _noticeService.Logs(userTokenIds, new { deviceName, log = log, time = DateTime.Now.ToString("G"), color = color }); + WriteInfo(deviceName, log); + } + + private (ConveyorLineTaskCommand, ConveyorLineTaskCommandWrite) ReadCommands(Dt_StationManager station, CommonConveyorLine conveyorLine) + { + ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(station.stationChildCode); + ConveyorLineTaskCommandWrite commandWrite = conveyorLine.ReadCustomer<ConveyorLineTaskCommandWrite>(station.stationChildCode, "DeviceCommand"); + return (command, commandWrite); + } + } } \ No newline at end of file diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/EmptyTrayStationHandler.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/EmptyTrayStationHandler.cs new file mode 100644 index 0000000..4eb5892 --- /dev/null +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/EmptyTrayStationHandler.cs @@ -0,0 +1,33 @@ +锘縰sing HslCommunication; +using MoYu; +using WIDESEAWCS_ITaskInfoRepository; +using WIDESEAWCS_Model.Models; +using WIDESEAWCS_QuartzJob; + +namespace WIDESEAWCS_Tasks.ConveyorLineJob +{ + public class EmptyTrayStationHandler : IStationHandler + { + private readonly CommonConveyorLineJob _commonConveyorLineJob; + + public EmptyTrayStationHandler(CommonConveyorLineJob commonConveyorLineJob) + { + _commonConveyorLineJob = commonConveyorLineJob; + } + + public async Task HandleStationAsync(CommonConveyorLine conveyorLine, Dt_StationManager station, ConveyorLineTaskCommand command, ConveyorLineTaskCommandWrite commandWrite) + { + var structs = BitConverter.GetBytes(commandWrite.WriteInteractiveSignal).Reverse().ToArray().ToBoolArray(); + if (structs[0]) + { + var log = $"銆恵conveyorLine.DeviceName}銆戜换鍔″彿锛氥�恵command.TaskNum}銆�,鎵樼洏鏉$爜锛氥�恵command.Barcode}銆戝凡鍒拌揪銆恵station.stationChildCode}銆戠┖鎵樼洏璇锋眰鎵爜鍏ュ簱"; + await _commonConveyorLineJob.LogAndWarn(conveyorLine.DeviceName, log); + _commonConveyorLineJob.NGRequestTaskInbound(conveyorLine, command, station, 0); + } + else + { + _commonConveyorLineJob.ConveyorLineSendFinish(conveyorLine, station.stationChildCode, 0, false); + } + } + } +} \ No newline at end of file diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/ExceptionPortStationHandler.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/ExceptionPortStationHandler.cs new file mode 100644 index 0000000..64565bc --- /dev/null +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/ExceptionPortStationHandler.cs @@ -0,0 +1,41 @@ +锘縰sing HslCommunication; +using MoYu; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WIDESEAWCS_ITaskInfoRepository; +using WIDESEAWCS_Model.Models; +using WIDESEAWCS_QuartzJob; + +namespace WIDESEAWCS_Tasks.ConveyorLineJob.StationHandler +{ + public class ExceptionPortStationHandler : IStationHandler + { + private readonly CommonConveyorLineJob _commonConveyorLineJob; + private readonly ITaskRepository _taskRepository = App.GetService<ITaskRepository>(); + public ExceptionPortStationHandler(CommonConveyorLineJob commonConveyorLineJob) + { + _commonConveyorLineJob = commonConveyorLineJob; + } + public async Task HandleStationAsync(CommonConveyorLine conveyorLine, Dt_StationManager station, ConveyorLineTaskCommand command, ConveyorLineTaskCommandWrite commandWrite) + { + var structs = BitConverter.GetBytes(commandWrite.WriteInteractiveSignal).Reverse().ToArray().ToBoolArray(); + if (structs[0]) + { + if (_taskRepository.QueryData(x => x.SourceAddress == station.stationChildCode).Count() > 0) + { + return; + } + var log = $"銆恵conveyorLine.DeviceName}銆戜换鍔″彿锛氥�恵command.TaskNum}銆�,鎵樼洏鏉$爜锛氥�恵command.Barcode}銆戝凡鍒拌揪銆恵station.stationChildCode}銆戝紓甯稿彛璇锋眰鎵爜鍏ュ簱"; + await _commonConveyorLineJob.LogAndWarn(conveyorLine.DeviceName, log); + await _commonConveyorLineJob.HandleNewTaskAsync(conveyorLine, command, station.stationChildCode, 0); + } + else + { + _commonConveyorLineJob.ConveyorLineSendFinish(conveyorLine, station.stationChildCode, 0, false); + } + } + } +} diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/IStationHandler.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/IStationHandler.cs new file mode 100644 index 0000000..408ce8e --- /dev/null +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/IStationHandler.cs @@ -0,0 +1,15 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WIDESEAWCS_Model.Models; +using WIDESEAWCS_QuartzJob; + +namespace WIDESEAWCS_Tasks.ConveyorLineJob +{ + public interface IStationHandler + { + Task HandleStationAsync(CommonConveyorLine conveyorLine, Dt_StationManager station, ConveyorLineTaskCommand command, ConveyorLineTaskCommandWrite commandWrite); + } +} \ No newline at end of file diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/StationHandlerFactory.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/StationHandlerFactory.cs new file mode 100644 index 0000000..877bb8c --- /dev/null +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/StationHandler/StationHandlerFactory.cs @@ -0,0 +1,27 @@ +锘縰sing MoYu; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WIDESEAWCS_Tasks.ConveyorLineJob.StationHandler; + +namespace WIDESEAWCS_Tasks.ConveyorLineJob +{ + public class StationHandlerFactory + { + public static IStationHandler GetHandler(int stationType, CommonConveyorLineJob commonConveyorLineJob) + { + switch (stationType) + { + case 11: + return new EmptyTrayStationHandler(commonConveyorLineJob); + case 5: + return new ExceptionPortStationHandler(commonConveyorLineJob); + default: + throw new ArgumentException($"Unsupported station type: {stationType}"); + } + } + } + +} diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs index 1c5028a..f90762f 100644 --- a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs @@ -55,7 +55,7 @@ /// <summary> /// 澶勭悊鏂颁换鍔� /// </summary> - private async Task HandleNewTaskAsync(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) + public async Task HandleNewTaskAsync(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) { var stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode); -- Gitblit v1.9.3