#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using HslCommunication; using Newtonsoft.Json; using Quartz; using System.Reflection; using WIDESEAWCS_Common; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Caches; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.HttpContextUser; using WIDESEAWCS_DTO.Enum; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_ISystemServices; 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.Repository; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_SignalR; using WIDESEAWCS_Tasks.ConveyorLineJob; using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public partial class CommonConveyorLineJob : JobBase, IJob { private readonly ITaskService _taskService; private readonly ITaskRepository _taskRepository; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly IRouterService _routerService; private readonly ISys_ConfigService _sys_ConfigService; private readonly IDt_StationManagerService _stationManagerService; private readonly IDt_StationManagerRepository _stationManagerRepository; private readonly IMapper _mapper; private readonly ICacheService _cacheService; private readonly IDeviceInfoRepository _deviceInfoRepository; 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, IDt_StationManagerRepository stationManagerRepository, IDeviceInfoRepository deviceInfoRepository) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _routerService = routerService; _stationManagerService = stationManagerService; _mapper = mapper; _cacheService = cacheService; _noticeService = noticeService; _taskRepository = taskRepository; _stationManagerRepository = stationManagerRepository; _deviceInfoRepository = deviceInfoRepository; } 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); //var Barcode = conveyorLine.GetValue(ConveyorLineDBName.ConveyorLineBarcode, 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).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[] { command, conveyorLine, station }); } } } } } } catch (Exception ex) { WriteInfo(conveyorLine.DeviceName, ex.Message); } return Task.CompletedTask; } /// /// 生成取货任务,放至上料位 /// /// 输送线实例对象 /// 读取的请求信息Request outbound /// 子设备编号 public async Task RequestTask(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager station) { try { // 输出信息,表示站台请求取货 var log = $"【{conveyorLine._deviceName}】站台【{station.stationChildCode}】请求取货"; await LogAndWarn(conveyorLine.DeviceName, log); var task = _taskService.QueryConveyorLineTask(station.stationChildCode, command.TaskNum); await HandleNewTaskAsync(conveyorLine, command, station.stationChildCode, task); } catch (Exception ex) { WriteInfo(conveyorLine.DeviceName, ex.Message); } } /// /// 输送线出库完成 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 public async Task ConveyorLineFinish(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager stationManager) { try { // 输出信息,表示站台请求取货 var log = $"【{conveyorLine._deviceName}】站台【{stationManager.stationChildCode}】,任务号:【{command.TaskNum}】完成"; await LogAndWarn(conveyorLine.DeviceName, log); var task = _taskService.QueryConveyorLineFinishTask(stationManager.stationChildCode, command.TaskNum); //改查询方法 if(stationManager.stationType==5||stationManager.stationType==4) { // 如果任务存在 if (task != null) { Thread.Sleep(1000); _taskService.UpdateTaskStatusToNext(task); } } } catch (Exception ex) { WriteInfo(conveyorLine.DeviceName, ex.Message); } } /// /// 输送线请求出信息 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 /// 线体当前bool读取偏移地址 public void RequestNextAddress(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager station, Dt_Task task) { if (task != null) { ConveyorLineTaskCommandWrite taskCommand = new ConveyorLineTaskCommandWrite() { TaskNum = Convert.ToInt16(task.TaskNum), TargetAddress = Convert.ToInt16(task.NextAddress), WriteInteractiveSignal = task.TaskType == (int)TaskOutboundTypeEnum.Outbound ? (byte)Convert.ToSByte(2) : (byte)Convert.ToSByte(1) }; var log = $"【{conveyorLine._deviceName}】任务号:【{task.TaskNum}】,托盘条码:【{task.PalletCode}】已到达【{station.stationChildCode}】下一目标地址【{taskCommand.TargetAddress}】输送线,task{task.ToJsonString()}"; ConsoleHelper.WriteSuccessLine(log); _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); WriteInfo(conveyorLine.DeviceName, log); var result = SendCommand(taskCommand, conveyorLine, station.stationChildCode); if (result) { Thread.Sleep(1000); _taskService.UpdateTaskStatusToNext(task); } } } /// /// 输送线报警 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 /// 线体当前bool读取偏移地址 public void ConveyorLineAlarm(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager station) { var task = _taskRepository.QueryFirst(x => x.TaskNum == command.TaskNum); //conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal,Convert.ToSByte(3), station.stationChildCode); } 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); } public bool SendCommand(ConveyorLineTaskCommandWrite taskCommand, CommonConveyorLine conveyorLine, string childDeviceCode) { conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTargetAddress, Convert.ToInt16(taskCommand.TargetAddress), childDeviceCode); Thread.Sleep(100); conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTaskNum, Convert.ToInt16(taskCommand.TaskNum), childDeviceCode); Thread.Sleep(100); conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(taskCommand.WriteInteractiveSignal), childDeviceCode); return true; } } }