| | |
| | | |
| | | 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_QuartzJob.Service; |
| | | using WIDESEAWCS_SignalR; |
| | | using WIDESEAWCS_Tasks.ConveyorLineJob; |
| | | using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; |
| | | |
| | | namespace WIDESEAWCS_Tasks |
| | | { |
| | | [DisallowConcurrentExecution] |
| | | public class CommonConveyorLineJob : JobBase, IJob |
| | | public partial class CommonConveyorLineJob : JobBase, IJob |
| | | { |
| | | private readonly ITaskService _taskService; |
| | | private readonly IRGVTaskService _rgvtaskService; |
| | | private readonly IRGVTask_HtyService _rgvtask_HtyService; |
| | | 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 INoticeService _noticeService; |
| | | private static List<string>? userTokenIds; |
| | | private static List<int>? userIds; |
| | | |
| | | public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IDt_StationManagerService stationManagerService, IMapper mapper, ICacheService cacheService, INoticeService noticeService, ITaskRepository taskRepository) |
| | | public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IDt_StationManagerService stationManagerService, IMapper mapper, ICacheService cacheService, INoticeService noticeService, ITaskRepository taskRepository, IRGVTaskService rgvtaskService, IRGVTask_HtyService rgvtask_HtyService, |
| | | IDt_StationManagerRepository stationManagerRepository) |
| | | { |
| | | _taskService = taskService; |
| | | _taskExecuteDetailService = taskExecuteDetailService; |
| | |
| | | _cacheService = cacheService; |
| | | _noticeService = noticeService; |
| | | _taskRepository = taskRepository; |
| | | _rgvtaskService = rgvtaskService; |
| | | _rgvtask_HtyService = rgvtask_HtyService; |
| | | _stationManagerRepository = stationManagerRepository; |
| | | } |
| | | |
| | | public async Task Execute(IJobExecutionContext context) |
| | |
| | | try |
| | | { |
| | | ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(station.stationChildCode); |
| | | //var Barcode = conveyorLine.GetValue<ConveyorLineDBName, string>(ConveyorLineDBName.ConveyorLineBarcode, station.stationChildCode); |
| | | if (command != null) |
| | | { |
| | | #region è°ç¨äºä»¶æ»çº¿éç¥å端 |
| | |
| | | #endregion è°ç¨äºä»¶æ»çº¿éç¥å端 |
| | | |
| | | // å°äº¤äºä¿¡å·è½¬æ¢ä¸ºå¸å°æ°ç» |
| | | var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray(); |
| | | var structs = BitConverter.GetBytes(command.InteractiveSignal).ToArray().ToBoolArray(); |
| | | // è·å设å¤å议详æ
|
| | | List<DeviceProtocolDetailDTO>? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.Where(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand.InteractiveSignal)).ToList(); |
| | | |
| | |
| | | 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 }); |
| | | method.Invoke(this, new object[] { command, conveyorLine, station }); |
| | | } |
| | | } |
| | | } |
| | |
| | | /// <param name="conveyorLine">è¾é线å®ä¾å¯¹è±¡</param> |
| | | /// <param name="command">读åç请æ±ä¿¡æ¯</param>Request outbound |
| | | /// <param name="childDeviceCode">å设å¤ç¼å·</param> |
| | | public async Task RequestInbound(CommonConveyorLine conveyorLine, Dt_StationManager station) |
| | | 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); |
| | | //if (task != null) |
| | | //{ |
| | | // RequestInOrOutbound(command, conveyorLine, station, task); |
| | | //} |
| | | //else |
| | | //{ |
| | | await HandleNewTaskAsync(conveyorLine, command, station.stationChildCode, task); |
| | | //} |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// RGVæ¬è¿å®æ |
| | | /// è¾é线åºåºå®æ |
| | | /// </summary> |
| | | /// <param name="conveyorLine">è¾é线å®ä¾å¯¹è±¡</param> |
| | | /// <param name="command">读åç请æ±ä¿¡æ¯</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼å·</param> |
| | | public async Task ConveyorLineFinish(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager station) |
| | | { |
| | | try |
| | | { |
| | | // è¾åºä¿¡æ¯ï¼è¡¨ç¤ºç«å°è¯·æ±åè´§ |
| | | var log = $"ã{conveyorLine._deviceName}ãç«å°ã{station.stationChildCode}ã,ä»»å¡å·:ã{command.TaskNum}ã宿"; |
| | | await LogAndWarn(conveyorLine.DeviceName, log); |
| | | |
| | | var task = _taskService.QueryConveyorLineFinishTask(station.stationChildCode); |
| | | //æ¹æ¥è¯¢æ¹æ³ |
| | | |
| | | HandleFinishTaskAsync(conveyorLine, command, station.stationChildCode, task); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | WriteInfo(conveyorLine.DeviceName, ex.Message); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// è¾é线请æ±åºä¿¡æ¯ |
| | | /// </summary> |
| | | /// <param name="conveyorLine">è¾é线å®ä¾å¯¹è±¡</param> |
| | | /// <param name="command">读åç请æ±ä¿¡æ¯</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼å·</param> |
| | | /// <param name="ProtocalDetailValue">线ä½å½åbool读ååç§»å°å</param> |
| | | public void RGVFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) |
| | | public void RequestInOrOutbound(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager station,Dt_Task task) |
| | | { |
| | | try |
| | | { |
| | | // è¾åºæåä¿¡æ¯ï¼å
æ¬è¾é线åç§°ãä»»å¡å·ãæçæ¡ç åå设å¤ä»£ç ï¼ä»¥åä»»å¡ä¿¡æ¯ |
| | | var logs = $"ã{conveyorLine._deviceName}ãä»»å¡å·ï¼ã{task.TaskNum}ã,æçæ¡ç ï¼ã{task.PalletCode}ãå·²å°è¾¾ã{station.stationChildCode}ãè¾é线,task{task.ToJsonString()}"; |
| | | ConsoleHelper.WriteSuccessLine(logs); |
| | | |
| | | _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = logs, time = DateTime.Now.ToString("G"), color = "red" }); |
| | | WriteInfo(conveyorLine.DeviceName, logs); |
| | | |
| | | // 妿任å¡ä¸ä¸ºç©ºï¼åæ§è¡ä»¥ä¸æä½ |
| | | 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}ãä»»å¡å·ï¼ã{command.TaskNum}ã,æçæ¡ç ï¼ã{command.Barcode}ãå·²å°è¾¾ã{station.stationChildCode}ãè¾é线请æ±åºåº,ä¸ä¸ç®æ å°åã{taskCommand.TargetAddress}ã"; |
| | | 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) |
| | | { |
| | | _taskService.UpdateTaskStatusToNext(task); |
| | | } |
| | | |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¾é线å
¥åºå®æ |
| | | /// è¾é线请æ±åºåºä¸ä¸å°å |
| | | /// </summary> |
| | | /// <param name="conveyorLine">è¾é线å®ä¾å¯¹è±¡</param> |
| | | /// <param name="command">读åç请æ±ä¿¡æ¯</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼å·</param> |
| | | public void ConveyorLineFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) |
| | | public void ConveyorLineInOrOutFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager station, Dt_Task task) |
| | | { |
| | | // æå°æåæ¥å¿ï¼æ¾ç¤ºå½å设å¤åç§°ãä»»å¡å·ãæçæ¡ç 以å请æ±åºåºä¸ä¸å°åçå设å¤ä»£ç |
| | | var log = $"ã{conveyorLine._deviceName}ãä»»å¡å·ï¼ã{command.TaskNum}ã,æçæ¡ç ï¼ã{command.Barcode}ãå·²å°è¾¾ã{station.stationChildCode}ãè¾é线请æ±åºåºå®æ"; |
| | | ConsoleHelper.WriteSuccessLine(log); |
| | | |
| | | _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); |
| | | WriteInfo(conveyorLine.DeviceName, log); |
| | | |
| | | // 妿任å¡åå¨ |
| | | if (task != null) |
| | | { |
| | | _taskService.UpdateTaskStatusToNext(task); |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// è¾é线请æ±åºåºä¸ä¸å°å |
| | | /// </summary> |
| | | /// <param name="conveyorLine">è¾é线å®ä¾å¯¹è±¡</param> |
| | | /// <param name="command">读åç请æ±ä¿¡æ¯</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼å·</param> |
| | | public void RequestNextAddress(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager station, Dt_Task task) |
| | | { |
| | | // æå°æåæ¥å¿ï¼æ¾ç¤ºå½å设å¤åç§°ãä»»å¡å·ãæçæ¡ç 以å请æ±åºåºä¸ä¸å°åçå设å¤ä»£ç |
| | | var log = $"ã{conveyorLine._deviceName}ãä»»å¡å·ï¼ã{command.TaskNum}ã,æçæ¡ç ï¼ã{command.Barcode}ãå·²å°è¾¾ã{station.stationChildCode}ãè¾é线请æ±åºåºä¸ä¸å°å"; |
| | | ConsoleHelper.WriteSuccessLine(log); |
| | | |
| | | _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); |
| | | WriteInfo(conveyorLine.DeviceName, log); |
| | | |
| | | // 妿任å¡åå¨ |
| | | 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 logs = $"ã{conveyorLine._deviceName}ãä»»å¡å·ï¼ã{command.TaskNum}ã,æçæ¡ç ï¼ã{command.Barcode}ãå·²å°è¾¾ã{station.stationChildCode}ãè¾é线请æ±åºåºä¸ä¸å°å,ä¸ä¸ç®æ å°åã{taskCommand.TargetAddress}ã"; |
| | | ConsoleHelper.WriteSuccessLine(logs); |
| | | |
| | | _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = logs, time = DateTime.Now.ToString("G"), color = "red" }); |
| | | WriteInfo(conveyorLine.DeviceName, logs); |
| | | |
| | | |
| | | var result = SendCommand(taskCommand, conveyorLine, station.stationChildCode); |
| | | if (result) |
| | | { |
| | | _taskService.UpdateTaskStatusToNext(task); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// è¾é线åºåºå®æ |
| | | /// </summary> |
| | | /// <param name="conveyorLine">è¾é线å®ä¾å¯¹è±¡</param> |
| | | /// <param name="command">读åç请æ±ä¿¡æ¯</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼å·</param> |
| | | public void ConveyorLineOutFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager station,Dt_Task task) |
| | | { |
| | | try |
| | | { |
| | | // æå°æåä¿¡æ¯ï¼è¡¨ç¤ºæçå·²å°è¾¾æå®è¾éçº¿å¹¶å®æåºåº |
| | | var logs = $"ã{conveyorLine.DeviceName}ãä»»å¡å·ï¼ã{command.TaskNum}ã,æçæ¡ç ï¼ã{command.Barcode}ãå·²å°è¾¾ã{station.stationChildCode}ãè¾é线åºåºå®æ"; |
| | | ConsoleHelper.WriteSuccessLine(logs); |
| | | |
| | | _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = logs, time = DateTime.Now.ToString("G"), color = "red" }); |
| | | WriteInfo(conveyorLine.DeviceName, logs); |
| | | ConveyorLineTaskCommandWrite taskCommand = new ConveyorLineTaskCommandWrite() |
| | | { |
| | | TaskNum = 100, |
| | | TargetAddress = Convert.ToInt16(station.stationNextChildCode), |
| | | WriteInteractiveSignal = (byte)Convert.ToSByte(3) |
| | | }; |
| | | var result = SendCommand(taskCommand, conveyorLine, station.stationChildCode); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// è¾é线æ¥è¦ |
| | | /// </summary> |
| | | /// <param name="conveyorLine">è¾é线å®ä¾å¯¹è±¡</param> |
| | | /// <param name="command">读åç请æ±ä¿¡æ¯</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼å·</param> |
| | | /// <param name="ProtocalDetailValue">线ä½å½åbool读ååç§»å°å</param> |
| | | 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") |
| | |
| | | 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.ConveyorLineTargetAddress, Convert.ToInt16(taskCommand.TargetAddress), childDeviceCode); |
| | | Thread.Sleep(100); |
| | | conveyorLine.SetValue(ConveyorLineDBName.ConveyorLineTaskNum, Convert.ToInt16(taskCommand.TaskNum), childDeviceCode); |
| | | Thread.Sleep(100); |
| | | conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(taskCommand.WriteInteractiveSignal), childDeviceCode); |
| | | for (int i = 0; i < 6; i++) |
| | | { |
| | | ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(childDeviceCode); |
| | | if (command != null) |
| | | { |
| | | if (command.TaskNum == taskCommand.TaskNum && command.TargetAddress == taskCommand.TargetAddress) |
| | | { |
| | | WriteInfo(conveyorLine.DeviceName, $"åå
¥ä»»å¡æååå
¥æ¬¡æ°{i}åå
¥ä»»å¡ã{JsonConvert.SerializeObject(taskCommand)}ã"); |
| | | return true; |
| | | } |
| | | if (command.TargetAddress != taskCommand.TargetAddress) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBName.ConveyorLineTargetAddress, Convert.ToInt16(taskCommand.TargetAddress), childDeviceCode); |
| | | Thread.Sleep(100); |
| | | } |
| | | if (command.TaskNum != taskCommand.TaskNum) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBName.ConveyorLineTaskNum, taskCommand.TaskNum, childDeviceCode); Thread.Sleep(100); |
| | | } |
| | | |
| | | } |
| | | } |
| | | WriteInfo(conveyorLine.DeviceName, $"åå
¥ä»»å¡å¤±è´¥ä»»å¡å·ã{taskCommand.TaskNum}ãæçå·ã{taskCommand.Barcode}ãç®æ å°åã{taskCommand.TargetAddress}ãå½åèç¹ã{childDeviceCode}ã"); |
| | | return false; |
| | | } |
| | | } |
| | | } |