using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core;
using WIDESEAWCS_QuartzJob.DTO;
using Microsoft.Extensions.Logging;
using WIDESEAWCS_QuartzJob.QuartzExtensions;
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(x =>
{
if (!Storage.Devices.Exists(d => d.DeviceCode == x.DeviceCode))
{
try
{
#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
#region 实例化设备对象
List 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 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);
}
catch (Exception ex)
{
Console.WriteLine("调度服务开启异常" + ex.ToString());
}
}
else
{
x.Device = Storage.Devices.FirstOrDefault(d => d.DeviceCode == x.DeviceCode);
}
});
for (int i = 0; i < dispatches.Count; i++)
{
DeviceInfoDTO? deviceProInfo = deviceInfos.FirstOrDefault(x => x.Id == dispatches[i].Id);
dispatches[i].JobParams = deviceProInfo?.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;
}
}
}
}