#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using HslCommunication; using Quartz; using System.Reflection; using WIDESEAWCS_Core.Caches; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.HttpContextUser; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.BasicInfo; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_SignalR; using WIDESEAWCS_Tasks.ConveyorLineJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonConveyorLineJob : JobBase, IJob { private readonly ITaskService _taskService; private readonly ITaskRepository _taskRepository; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly IRouterService _routerService; private readonly IDt_StationManagerService _stationManagerService; private readonly IMapper _mapper; private readonly ICacheService _cacheService; private readonly INoticeService _noticeService; private static List? userTokenIds; private static List? userIds; public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IDt_StationManagerService stationManagerService, IMapper mapper, ICacheService cacheService, INoticeService noticeService, ITaskRepository taskRepository) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _routerService = routerService; _stationManagerService = stationManagerService; _mapper = mapper; _cacheService = cacheService; _noticeService = noticeService; _taskRepository = taskRepository; } public async Task Execute(IJobExecutionContext context) { try { CommonConveyorLine conveyorLine = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams"); if (conveyorLine != null) { // 获取所有站点管理器 List stationManagers = _stationManagerService.GetAllStationByDeviceCode(conveyorLine.DeviceCode); // 并行处理每个子设备 var tasks = stationManagers.Select(station => ProcessDeviceAsync(conveyorLine, station)).ToList(); await Task.WhenAll(tasks); } } catch (Exception ex) { Console.Out.WriteLine(nameof(RGVJob) + ":" + ex.ToString()); } return; } private Task ProcessDeviceAsync(CommonConveyorLine conveyorLine, Dt_StationManager station) { try { ConveyorLineTaskCommand command = conveyorLine.ReadCustomer(station.stationChildCode); if (command != null) { #region 调用事件总线通知前端 // 获取缓存中的用户信息 var tokenInfos = _cacheService.Get>("Cache_UserToken"); if (tokenInfos != null && tokenInfos.Any()) { userTokenIds = tokenInfos.Select(x => x.Token_ID).ToList(); userIds = tokenInfos.Select(x => x.UserId).ToList(); } #endregion 调用事件总线通知前端 // 将交互信号转换为布尔数组 var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray(); // 获取设备协议详情 List? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.Where(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand.InteractiveSignal)).ToList(); if (deviceProtocolDetails != null) { foreach (var item in deviceProtocolDetails) { int itemValue = Convert.ToInt32(item.ProtocalDetailValue); if (structs[itemValue] == true) { // 获取处理方法 MethodInfo? method = GetType().GetMethod(item.ProtocolDetailType); if (method != null) { method.Invoke(this, new object[] { conveyorLine, station }); } } } } } } catch (Exception ex) { WriteInfo(conveyorLine.DeviceName, ex.Message); } return Task.CompletedTask; } /// /// 生成取货任务,放至上料位 /// /// 输送线实例对象 /// 读取的请求信息Request outbound /// 子设备编号 public async Task RequestInbound(CommonConveyorLine conveyorLine, Dt_StationManager station) { try { // 输出信息,表示站台请求取货 var log = $"【{conveyorLine._deviceName}】站台【{station.stationChildCode}】请求取货"; await LogAndWarn(conveyorLine.DeviceName, log); } catch (Exception ex) { WriteInfo(conveyorLine.DeviceName, ex.Message); } } /// /// RGV搬运完成 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 /// 线体当前bool读取偏移地址 public void RGVFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) { } /// /// 输送线入库完成 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 public void ConveyorLineFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) { } public async Task LogAndWarn(string deviceName, string log, string color = "red") { ConsoleHelper.WriteWarningLine(log); await _noticeService.Logs(userTokenIds, new { deviceName, log = log, time = DateTime.Now.ToString("G"), color = color }); WriteInfo(deviceName, log); } } }