#region << 版 本 注 释 >>
|
/*----------------------------------------------------------------
|
* 命名空间:WIDESEAWCS_QuartzJob
|
* 创建者:胡童庆
|
* 创建时间:2024/8/2 16:13:36
|
* 版本:V1.0.0
|
* 描述:调度服务自动开启
|
*
|
* ----------------------------------------------------------------
|
* 修改人:
|
* 修改时间:
|
* 版本:V1.0.1
|
* 修改说明:
|
*
|
*----------------------------------------------------------------*/
|
#endregion << 版 本 注 释 >>
|
|
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Logging;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_QuartzJob.DeviceBase;
|
using WIDESEAWCS_QuartzJob.DTO;
|
using WIDESEAWCS_QuartzJob.Models;
|
using WIDESEAWCS_QuartzJob.Service;
|
|
namespace WIDESEAWCS_QuartzJob.QuartzExtensions
|
{
|
public class QuartzJobHostedService : IHostedService
|
{
|
private readonly ISchedulerCenter _schedulerCenter;
|
private readonly ILogger<QuartzJobHostedService> _logger;
|
private readonly IDeviceInfoService _deviceInfoService;
|
private readonly IDispatchInfoService _dispatchInfoService;
|
private readonly IDeviceProtocolDetailService _deviceProtocolDetailService;
|
|
public QuartzJobHostedService(ILogger<QuartzJobHostedService> logger, IDeviceInfoService deviceInfoService, IDispatchInfoService dispatchInfoService, ISchedulerCenter schedulerCenter, IDeviceProtocolDetailService deviceProtocolDetailService)
|
{
|
_logger = logger;
|
_deviceInfoService = deviceInfoService;
|
_dispatchInfoService = dispatchInfoService;
|
_schedulerCenter = schedulerCenter;
|
_deviceProtocolDetailService = deviceProtocolDetailService;
|
}
|
|
/// <summary>
|
/// 启动程序自动开启调度服务
|
/// </summary>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task StartAsync(CancellationToken cancellationToken)
|
{
|
try
|
{
|
List<DispatchInfoDTO> dispatches = _dispatchInfoService.QueryDispatchInfos();
|
List<DeviceInfoDTO> deviceInfos = await _deviceInfoService.QueryDeviceProInfos();
|
|
deviceInfos.ForEach(x =>
|
{
|
if (dispatches.Exists(d => d.JobGroup == x.DeviceType))
|
{
|
#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(x.DeviceCode + "连接成功"); else ConsoleHelper.WriteErrorLine(x.DeviceCode + "连接失败");
|
|
#endregion
|
|
#region 实例化设备对象
|
|
List<DeviceProDTO> devicePros = x.ProtocolList.Select(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,
|
}).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);
|
}
|
});
|
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].JobGroup + "调度服务添加成功"); else ConsoleHelper.WriteErrorLine(dispatches[i].JobGroup + "调度服务添加失败");
|
}
|
await _schedulerCenter.StartScheduleAsync();
|
}
|
catch (Exception ex)
|
{
|
_logger.LogError(ex, "调度服务开启异常");
|
Console.WriteLine("调度服务开启异常" + ex.ToString());
|
throw;
|
}
|
}
|
|
public Task StopAsync(CancellationToken cancellationToken)
|
{
|
_logger.LogInformation("Stop QuartzJob Service!");
|
return Task.CompletedTask;
|
}
|
}
|
}
|