using System.Reflection; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Service; namespace WIDESEAWCS_QuartzJob.QuartzNet { /// /// 启动程序自动开启调度服务 /// public class QuartzNetExtension { private readonly ISchedulerCenter _schedulerCenter; private readonly IDeviceInfoService _deviceInfoService; private readonly IDispatchInfoService _dispatchInfoService; private readonly IDeviceProtocolDetailService _deviceProtocolDetailService; private readonly Storage _storage; /// /// 启动程序自动开启调度服务 /// /// public QuartzNetExtension(IDeviceInfoService deviceInfoService, IDispatchInfoService dispatchInfoService, ISchedulerCenter schedulerCenter, IDeviceProtocolDetailService deviceProtocolDetailService, Storage storage) { _deviceInfoService = deviceInfoService; _dispatchInfoService = dispatchInfoService; _schedulerCenter = schedulerCenter; _deviceProtocolDetailService = deviceProtocolDetailService; _storage = storage; } /// /// 启动程序自动开启调度服务 /// /// public virtual async Task StartAsync() { try { List dispatches = _dispatchInfoService.QueryDispatchInfos(); List deviceInfos = await _deviceInfoService.QueryDeviceProInfos(); deviceInfos.ForEach(delegate (DeviceInfoDTO x) { DeviceInfoDTO x2 = x; if (!Storage.Devices.Exists((IDevice d) => d.DeviceCode == x2.DeviceCode) && !x.DeviceName.Contains("堆垛机")) { try { 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()) { (type.Name + x2.DeviceCode + "连接成功").WriteSuccessLine(); } else { (type.Name + x2.DeviceCode + "连接失败").WriteErrorLine(); } List 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 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 ex2) { Console.WriteLine("调度服务开启异常" + ex2.ToString()); } } else { 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); // 使用模式匹配 dispatches[i].JobParams = targetDevice switch { { DeviceName: var name } when name.Contains("堆垛机") => new StackerCraneDevice { DeviceCode = targetDevice.DeviceCode, DeviceName = targetDevice.DeviceName, IPAddress = targetDevice.DeviceIp + ":" + targetDevice.DevicePort }, _ => targetDevice.Device }; WebResponseContent responseContent = await _schedulerCenter.AddScheduleJobAsync(dispatches[i]); if (responseContent.Status) ConsoleHelper.WriteSuccessLine(dispatches[i].Name + "调度服务添加成功"); else ConsoleHelper.WriteErrorLine(dispatches[i].Name + "调度服务添加失败"); } //await _schedulerCenter.StartScheduleAsync(); } catch (Exception ex) { Console.WriteLine("调度服务开启异常" + ex.ToString()); throw; } } } }