hutongqing
2024-10-25 d85a4b97325020b7efe1a6cdbd55025c6408cec9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#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,
                            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);
                    }
                });
                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;
        }
    }
}