wangxinhui
2026-02-27 804051e9e3013a3ad6b3e47757050e32893cf4fb
´úÂë¹ÜÀí/WCS/WCSServers/WIDESEAWCS_QuartzJob/QuartzNet/QuartzNetExtension.cs
@@ -2,6 +2,7 @@
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
namespace WIDESEAWCS_QuartzJob.QuartzNet
@@ -41,95 +42,62 @@
                List<DispatchInfoDTO> dispatches = _dispatchInfoService.QueryDispatchInfos();
                List<DeviceInfoDTO> deviceInfos = await _deviceInfoService.QueryDeviceProInfos();
                deviceInfos.ForEach(x =>
                deviceInfos.ForEach(delegate (DeviceInfoDTO x)
                {
                    if (!Storage.Devices.Exists(d => d.DeviceCode == x.DeviceCode))
                    DeviceInfoDTO x2 = x;
                    if (!Storage.Devices.Exists((IDevice d) => d.DeviceCode == x2.DeviceCode) && !x.DeviceName.Contains("堆垛机"))
                    {
                        try
                        {
                            if (!x.DeviceName.Contains("堆垛机"))
                            Type type = Assembly.Load("WIDESEAWCS_Communicator").GetType("WIDESEAWCS_Communicator." + x2.DevicePlcType);
                            object obj = Activator.CreateInstance(type, x2.DeviceIp, x2.DevicePort, x2.DeviceName);
                            if (new bool?((bool)type.InvokeMember("Connect", BindingFlags.InvokeMethod, null, obj, new object[0])).GetValueOrDefault())
                            {
                                #region è¿žæŽ¥PLC
                                // åŠ è½½ç¨‹åºé›†
                                Assembly assembly = Assembly.Load($"WIDESEAWCS_Communicator");
                                // èŽ·å–ç±»åž‹
                                Type? type = assembly.GetType($"WIDESEAWCS_Communicator.{x.DevicePlcType}");
                                // åˆ›å»ºå®žä¾‹
                                object? obj = Activator.CreateInstance(type, new object[] { x.DeviceIp, x.DevicePort, x.DeviceName });
                                // è°ƒç”¨è¿žæŽ¥æ–¹æ³•
                                bool? connectResult = (bool)type.InvokeMember("Connect", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, new object[] { });
                                // åˆ¤æ–­è¿žæŽ¥ç»“æžœ
                                if (connectResult ?? false) ConsoleHelper.WriteSuccessLine(type.Name + x.DeviceCode + "连接成功"); else ConsoleHelper.WriteErrorLine(type.Name + x.DeviceCode + "连接失败");
                                #endregion è¿žæŽ¥PLC
                                #region å®žä¾‹åŒ–设备对象
                                List<DeviceProDTO> devicePros = x.ProtocolList.Select(d => new DeviceProDTO
                                {
                                    // è®¾å¤‡å­ç¼–码
                                    DeviceChildCode = d.DeviceChildCode,
                                    // è®¾å¤‡æ•°æ®ç±»åž‹
                                    DeviceDataType = d.DeviceProDataType,
                                    // è®¾å¤‡ID
                                    DeviceId = d.DeviceId,
                                    // è®¾å¤‡åè®®ID
                                    DeviceProId = d.Id,
                                    // è®¾å¤‡åè®®æ•°æ®å—
                                    DeviceProDataBlock = d.DeviceProDataBlock,
                                    // è®¾å¤‡åè®®æ•°æ®é•¿åº¦
                                    DeviceProDataLength = d.DeviceProDataLength,
                                    // è®¾å¤‡åè®®åç§»é‡
                                    DeviceProOffset = d.DeviceProOffset,
                                    // è®¾å¤‡åè®®å‚数描述
                                    DeviceProParamDes = d.DeviceProParamDes,
                                    // è®¾å¤‡åè®®å‚数名称
                                    DeviceProParamName = d.DeviceProParamName,
                                    // è®¾å¤‡åè®®å‚数类型
                                    DeviceProParamType = d.DeviceProParamType,
                                    // è®¾å¤‡PLC类型
                                    DevicePlcType = x.DevicePlcType
                                }).ToList();
                                // æ ¹æ®è®¾å¤‡ç±»åž‹èŽ·å–è®¾å¤‡åè®®è¯¦æƒ…
                                List<DeviceProtocolDetailDTO> deviceProtocolDetails = _deviceProtocolDetailService.GetDeviceProtocolDetailsByDeviceType(x.DeviceType);
                                // åŠ è½½è®¾å¤‡ç¨‹åºé›†
                                Assembly assemblyDevice = Assembly.Load($"WIDESEAWCS_QuartzJob");
                                // èŽ·å–è®¾å¤‡ç±»åž‹å¯¹åº”çš„ç±»åž‹
                                Type typeDevice = assemblyDevice.GetType($"WIDESEAWCS_QuartzJob.{x.DeviceType}");
                                // åˆ›å»ºè®¾å¤‡å®žä¾‹
                                object deviceInstance = Activator.CreateInstance(typeDevice, new object[] { obj, devicePros, deviceProtocolDetails, x.DeviceCode, x.DeviceName });
                                #endregion å®žä¾‹åŒ–设备对象
                                x.Device = (IDevice)deviceInstance;
                                Storage.Devices.Add((IDevice)deviceInstance);
                                (type.Name + x2.DeviceCode + "连接成功").WriteSuccessLine();
                            }
                            else
                            {
                                (type.Name + x2.DeviceCode + "连接失败").WriteErrorLine();
                            }
                            List<DeviceProDTO> list = x2.ProtocolList.Select((Dt_DeviceProtocol d) => new DeviceProDTO
                            {
                                DeviceChildCode = d.DeviceChildCode,
                                DeviceDataType = d.DeviceProDataType,
                                DeviceId = d.DeviceId,
                                DeviceProId = d.Id,
                                DeviceProDataBlock = d.DeviceProDataBlock,
                                DeviceProDataLength = d.DeviceProDataLength,
                                DeviceProOffset = d.DeviceProOffset,
                                DeviceProParamDes = d.DeviceProParamDes,
                                DeviceProParamName = d.DeviceProParamName,
                                DeviceProParamType = d.DeviceProParamType,
                                DevicePlcType = x2.DevicePlcType
                            }).ToList();
                            List<DeviceProtocolDetailDTO> deviceProtocolDetailsByDeviceType = _deviceProtocolDetailService.GetDeviceProtocolDetailsByDeviceType(x2.DeviceType);
                            object obj2 = Activator.CreateInstance(Assembly.Load("WIDESEAWCS_QuartzJob").GetType("WIDESEAWCS_QuartzJob." + x2.DeviceType), obj, list, deviceProtocolDetailsByDeviceType, x2.DeviceCode, x2.DeviceName);
                            x2.Device = (IDevice)obj2;
                            Storage.Devices.Add((IDevice)obj2);
                        }
                        catch (Exception ex)
                        catch (Exception ex2)
                        {
                            Console.WriteLine("调度服务开启异常" + ex.ToString());
                            Console.WriteLine("调度服务开启异常" + ex2.ToString());
                        }
                    }
                    else
                    {
                        x.Device = Storage.Devices.FirstOrDefault(d => d.DeviceCode == x.DeviceCode);
                        x2.Device = Storage.Devices.FirstOrDefault((IDevice d) => d.DeviceCode == x2.DeviceCode);
                    }
                });
                for (int i = 0; i < dispatches.Count; i++)
                {
                    var targetDevice = deviceInfos.FirstOrDefault(x => x.Id == dispatches[i].Id);
                    if (targetDevice is null) continue;
                    // ä½¿ç”¨æ¨¡å¼åŒ¹é…
                    dispatches[i].JobParams = targetDevice switch
                    {
                        { DeviceName: var name } when name.Contains("堆垛机")
                            => new RobotCraneDevice { DeviceCode = targetDevice.DeviceCode, DeviceName = targetDevice.DeviceName, IPAddress = targetDevice.DeviceIp + ":" + targetDevice.DevicePort },
                            => new StackerCraneDevice { DeviceCode = targetDevice.DeviceCode, DeviceName = targetDevice.DeviceName, IPAddress = targetDevice.DeviceIp + ":" + targetDevice.DevicePort },
                        _ => targetDevice.Device
                    };
                    WebResponseContent responseContent = await _schedulerCenter.AddScheduleJobAsync(dispatches[i]);