| | |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | |
| | | |
| | | |
| | | public WMSCruJob(ILogger<WMSCruJob> logger, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, ILocationInfoService locationInfoService, |
| | | ITaskService taskService) |
| | | { |
| | | _logger = logger; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _stockInfoService = stockInfoService; |
| | | _locationInfoService = locationInfoService; |
| | | _taskService=taskService; |
| | | } |
| | | private static readonly object _taskProcessLock = new object(); |
| | | private const int TASK_PROCESS_TIMEOUT = 3000; // 3ç§è¶
æ¶ |
| | | |
| | | public Task StartAsync(CancellationToken cancellationToken) |
| | | { |
| | | _timer = new Timer(DoWorkWheel, null, TimeSpan.Zero, TimeSpan.FromSeconds(3)); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | public static List<string> InStationareaList = new List<string>() { "1113", "1114", "1115", "1116", "1117", "1118", "1119", "1120", "1121", "1122" }; |
| | | |
| | | private void DoWorkWheel(object state) |
| | | { |
| | | // å®ä¹ç¶æå¸¸éï¼é¿å
éæ³æ°å |
| | | const int PLC_IN_FINISH = (int)InTaskStatusEnum.PLC_InFinish; |
| | | const int OUT_NEW = (int)OutTaskStatusEnum.OutNew; |
| | | const int SC_OUT_FINISH = (int)OutTaskStatusEnum.SC_OutFinish; |
| | | const int SC_IN_EXECUTING = (int)InTaskStatusEnum.SC_IntExecuting; |
| | | const int SC_OUT_EXECUTING = (int)OutTaskStatusEnum.SC_OutExecuting; |
| | | const int RELOCATION_EXECUTING = (int)RelocationTaskStatusEnum.RelocationExecuting; |
| | | const int PLC_OUT_EXECUTING = (int)OutTaskStatusEnum.PLC_OutExecuting; |
| | | if (!Monitor.TryEnter(_taskProcessLock, TASK_PROCESS_TIMEOUT)) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | // è·åå½å任塿°æ® |
| | | List<Dt_Task> allTasks = _taskService.Repository.QueryData(); |
| | | try |
| | | { |
| | | // å®ä¹ç¶æå¸¸éï¼é¿å
éæ³æ°å |
| | | const int PLC_IN_FINISH = (int)InTaskStatusEnum.PLC_InFinish; |
| | | const int PLC_IN_InNew = (int)InTaskStatusEnum.InNew; |
| | | const int OUT_NEW = (int)OutTaskStatusEnum.OutNew; |
| | | const int SC_OUT_FINISH = (int)OutTaskStatusEnum.SC_OutFinish; |
| | | const int SC_IN_EXECUTING = (int)InTaskStatusEnum.SC_IntExecuting; |
| | | const int SC_OUT_EXECUTING = (int)OutTaskStatusEnum.SC_OutExecuting; |
| | | const int RELOCATION_EXECUTING = (int)RelocationTaskStatusEnum.RelocationExecuting; |
| | | const int PLC_OUT_EXECUTING = (int)OutTaskStatusEnum.PLC_OutExecuting; |
| | | |
| | | // è·åå··éè¶
è¿3个任å¡ç路段 |
| | | HashSet<string> excludedRoadways = allTasks |
| | | .Where(x => x.NumberSsuances > 3) |
| | | .Select(x => x.Roadway) |
| | | .Distinct() |
| | | .ToHashSet(); |
| | | // è·åå½å任塿°æ® |
| | | List<Dt_Task> allTasks = _taskService.Repository.QueryData(); |
| | | |
| | | // è¿æ»¤éè¦å¤ççä»»å¡ |
| | | List<Dt_Task> tasksToProcess = allTasks |
| | | .Where(x => |
| | | (x.TaskStatus == PLC_IN_FINISH || |
| | | x.TaskStatus == OUT_NEW || |
| | | x.TaskStatus == SC_OUT_FINISH) && |
| | | !excludedRoadways.Contains(x.Roadway)) |
| | | .ToList(); |
| | | // è·åå··éè¶
è¿3个任å¡ç路段 |
| | | HashSet<string> excludedRoadways = allTasks |
| | | .Where(x => x.NumberSsuances > 3) |
| | | .Select(x => x.Roadway) |
| | | .Distinct() |
| | | .ToHashSet(); |
| | | |
| | | // æç¶æåç»å¤çï¼åå°é夿¥è¯¢ |
| | | ProcessInAndNewTasks(tasksToProcess, allTasks, excludedRoadways); //ä¸åå åæº |
| | | ProcessOutFinishTasks(tasksToProcess, allTasks); //ä¸åè¾éçº¿ä»»å¡ |
| | | // è¿æ»¤éè¦å¤ççä»»å¡ |
| | | List<Dt_Task> tasksToProcess = allTasks |
| | | .Where(x => |
| | | (x.TaskStatus == PLC_IN_FINISH || |
| | | x.TaskStatus == OUT_NEW || |
| | | x.TaskStatus == SC_OUT_FINISH || (x.TaskStatus == PLC_IN_InNew && InStationareaList.Contains(x.SourceAddress))) && |
| | | !excludedRoadways.Contains(x.Roadway)) |
| | | .ToList(); |
| | | |
| | | // æç¶æåç»å¤çï¼åå°é夿¥è¯¢ |
| | | ProcessInAndNewTasks(tasksToProcess, allTasks, excludedRoadways); //ä¸åå åæº |
| | | ProcessOutFinishTasks(tasksToProcess, allTasks); //ä¸åè¾éçº¿ä»»å¡ |
| | | ProcessInPalltask(tasksToProcess, allTasks); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"ä»»å¡å¤çå¼å¸¸ï¼{ex.Message}"); |
| | | } |
| | | finally |
| | | { |
| | | // å¿
须鿾éï¼å¦åä¼å¯¼è´æ»é |
| | | Monitor.Exit(_taskProcessLock); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | private void ProcessInAndNewTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks, HashSet<string> excludedRoadways) |
| | |
| | | var inAndNewTasks = tasksToProcess |
| | | .Where(x => x.TaskStatus == PLC_IN_FINISH || x.TaskStatus == OUT_NEW).OrderBy(x=>x.CreateDate) |
| | | .ToList(); |
| | | |
| | | foreach (var task in inAndNewTasks) |
| | | if(inAndNewTasks.Count > 0) |
| | | { |
| | | // æ£æ¥åä¸å··éæ¯å¦ææ£å¨æ§è¡çä»»å¡ |
| | | bool hasExecutingTask = allTasks.Any(x => |
| | | x.TaskId != task.TaskId && |
| | | x.Roadway == task.Roadway && |
| | | (x.TaskStatus == SC_IN_EXECUTING || |
| | | x.TaskStatus == SC_OUT_EXECUTING || |
| | | x.TaskStatus == RELOCATION_EXECUTING)); |
| | | foreach (var task in inAndNewTasks) |
| | | { |
| | | // æ£æ¥åä¸å··éæ¯å¦ææ£å¨æ§è¡çä»»å¡ |
| | | bool hasExecutingTask = allTasks.Any(x => |
| | | x.TaskId != task.TaskId && |
| | | x.Roadway == task.Roadway && |
| | | (x.TaskStatus == SC_IN_EXECUTING || |
| | | x.TaskStatus == SC_OUT_EXECUTING || |
| | | x.TaskStatus == RELOCATION_EXECUTING)); |
| | | |
| | | if (hasExecutingTask) |
| | | continue; |
| | | if (hasExecutingTask) |
| | | continue; |
| | | |
| | | //夿æ¯å¦éè¦ç§»åº |
| | | WebResponseContent webResponse=JudgmentIsRelocations(task); |
| | | if (!webResponse.Status) continue; |
| | | if (task.TaskStatus == OUT_NEW) |
| | | { |
| | | bool SCNewTasks = allTasks.Any(x => x.TaskStatus != OUT_NEW && x.TargetAddress == task.TargetAddress); |
| | | if (SCNewTasks) |
| | | continue; |
| | | } |
| | | |
| | | // ä¸åå åæºä»»å¡ |
| | | WCSginseng result = _taskService.SC_IssueTasks( |
| | | task.TaskId, |
| | | int.Parse(task.Roadway), |
| | | task.TaskNum, |
| | | task.PalletCode, |
| | | int.Parse(task.PalletType), |
| | | task.CurrentAddress, |
| | | task.NextAddress, |
| | | task.TargetAddress); |
| | | //夿æ¯å¦éè¦ç§»åº |
| | | WebResponseContent webResponse = JudgmentIsRelocations(task); |
| | | if (!webResponse.Status) continue; |
| | | |
| | | UpdateTaskStatus(task, result, |
| | | successStatus: task.TaskStatus == PLC_IN_FINISH ? SC_IN_EXECUTING : SC_OUT_EXECUTING,1); |
| | | |
| | | // ä¸åå åæºä»»å¡ |
| | | WCSginseng result = _taskService.SC_IssueTasks( |
| | | task.TaskId, |
| | | int.Parse(task.Roadway), |
| | | task.TaskNum, |
| | | task.PalletCode, |
| | | int.Parse(task.PalletType), |
| | | task.CurrentAddress, |
| | | task.NextAddress, |
| | | task.TargetAddress); |
| | | |
| | | UpdateTaskStatus(task, result, |
| | | successStatus: task.TaskStatus == PLC_IN_FINISH ? SC_IN_EXECUTING : SC_OUT_EXECUTING, 1); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | private void ProcessOutFinishTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks) |
| | |
| | | var outFinishTasks = tasksToProcess |
| | | .Where(x => x.TaskStatus == SC_OUT_FINISH) |
| | | .ToList(); |
| | | |
| | | foreach (var task in outFinishTasks) |
| | | if(outFinishTasks.Count > 0) |
| | | { |
| | | // æ£æ¥åä¸å··éæ¯å¦æå
¶ä»å·²å®æçä»»å¡ |
| | | bool hasOtherFinishTask = allTasks.Any(x => |
| | | x.Roadway == task.Roadway && |
| | | x.TaskStatus == SC_OUT_FINISH && |
| | | x.TaskId != task.TaskId); |
| | | foreach (var task in outFinishTasks) |
| | | { |
| | | // æ£æ¥åä¸å··éæ¯å¦æå
¶ä»å·²å®æçä»»å¡ |
| | | bool hasOtherFinishTask = allTasks.Any(x => |
| | | x.Roadway == task.Roadway && |
| | | x.TaskStatus == SC_OUT_FINISH && |
| | | x.TaskId != task.TaskId); |
| | | |
| | | if (hasOtherFinishTask) |
| | | continue; |
| | | if (hasOtherFinishTask) |
| | | continue; |
| | | |
| | | // ä¸åPLCä»»å¡ |
| | | WCSginseng result = _taskService.PLC_IssueTasks( |
| | | task.TaskId, |
| | | int.Parse(task.Roadway), |
| | | task.TaskNum, |
| | | task.PalletCode, |
| | | int.Parse(task.PalletType), |
| | | task.CurrentAddress, |
| | | task.NextAddress, |
| | | ""); |
| | | // ä¸åPLCä»»å¡ |
| | | WCSginseng result = _taskService.PLC_IssueTasks( |
| | | task.TaskId, |
| | | int.Parse(task.Roadway), |
| | | task.TaskNum, |
| | | task.PalletCode, |
| | | int.Parse(task.PalletType), |
| | | task.CurrentAddress, |
| | | task.NextAddress, |
| | | ""); |
| | | |
| | | UpdateTaskStatus(task, result, PLC_OUT_EXECUTING,2); |
| | | UpdateTaskStatus(task, result, PLC_OUT_EXECUTING, 2); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | private void ProcessInPalltask(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks) |
| | | { |
| | | const int PLC_IN_InNew = (int)InTaskStatusEnum.InNew; |
| | | const int PLC_PLC_INEXECUTING = (int)InTaskStatusEnum.PLC_InExecuting; |
| | | var outFinishTasks = tasksToProcess |
| | | .Where(x => x.TaskStatus == PLC_IN_InNew && InStationareaList.Contains(x.SourceAddress)) |
| | | .ToList(); |
| | | if(outFinishTasks.Count > 0) |
| | | { |
| | | foreach (var task in outFinishTasks) |
| | | { |
| | | // ä¸åPLCä»»å¡ |
| | | WCSginseng result = _taskService.PLC_IssueTasks( |
| | | task.TaskId, |
| | | int.Parse(task.Roadway), |
| | | task.TaskNum, |
| | | task.PalletCode, |
| | | int.Parse(task.PalletType), |
| | | task.CurrentAddress, |
| | | task.NextAddress, |
| | | ""); |
| | | |
| | | UpdateTaskStatus(task, result, PLC_PLC_INEXECUTING, 2); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | task.TaskStatus = successStatus; |
| | | if(task.TaskStatus== (int)OutTaskStatusEnum.SC_OutExecuting) |
| | | { |
| | | string Result = MesOutTaskStatusEnum.åºåºå¼å§.GetDescription(); |
| | | string Result = MesOutTaskStatusEnum.Start.GetDescription(); |
| | | //è°å䏿¸¸ç³»ç»åé¦å¼å§ä»»å¡ |
| | | _taskService.OutStoreDocCallback(task.TaskNum,Result, "æä½æå"); |
| | | }else if(task.TaskStatus == (int)InTaskStatusEnum.PLC_InExecuting) |
| | | { |
| | | string Result = MesInTaskStatusEnum.Start.GetDescription(); |
| | | //è°å䏿¸¸ç³»ç»åé¦å¼å§ä»»å¡ |
| | | _taskService.InStoreDocCallback(task.TaskNum, Result, "æä½æå",task.PalletCode,""); |
| | | } |
| | | } |
| | | else |
| | |
| | | /// <returns></returns> |
| | | public WebResponseContent JudgmentIsRelocations(Dt_Task dt_Task) |
| | | { |
| | | const int PLC_IN_FINISH = (int)InTaskStatusEnum.PLC_InFinish; |
| | | const int SC_IN_EXECUTING = (int)InTaskStatusEnum.SC_IntExecuting; |
| | | const int SC_OUT_EXECUTING = (int)OutTaskStatusEnum.SC_OutExecuting; |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | string Locationcodeadd = dt_Task.TaskType == (int)TaskTypeEnum.Inbound ? dt_Task.NextAddress : dt_Task.CurrentAddress; |
| | | string Locationcodeadd = dt_Task.TaskType == (int)TaskTypeEnum.Inbound ? dt_Task.NextAddress: dt_Task.CurrentAddress ; |
| | | |
| | | Dt_LocationInfo dt_Location = _locationInfoService.Repository.QueryData(x => x.LocationCode == Locationcodeadd).FirstOrDefault(); |
| | | if (dt_Location.Depth == 1 || dt_Location.RoadwayNo == "5") return content.OK(); |
| | | int locrow = judgmentRow(dt_Location.RoadwayNo, dt_Location.Row); |
| | | Dt_LocationInfo shallowLocation = _locationInfoService.Repository.QueryData(x => x.RoadwayNo == dt_Location.RoadwayNo && x.Row == locrow && x.Layer == dt_Location.Layer && x.Column == dt_Location.Column).FirstOrDefault(); |
| | | if (shallowLocation.LocationStatus == (int)LocationStatusEnum.Free) return content.OK(); |
| | | if (shallowLocation.LocationStatus != (int)(int)LocationStatusEnum.InStock) return content.Error(); |
| | | |
| | | |
| | | //夿æ¯å¦æç§»åºä»»å¡ |
| | | var TransferTask = _taskService.Repository.QueryData(x=>x.TaskStatus== (int)RelocationTaskStatusEnum.RelocationNew && x.CurrentAddress== shallowLocation.LocationCode).FirstOrDefault(); |
| | |
| | | int.Parse(TransferTask.PalletType), |
| | | TransferTask.CurrentAddress, |
| | | TransferTask.NextAddress, |
| | | TransferTask.TargetAddress); |
| | | dt_Task.TargetAddress); |
| | | if (result.IsSuccess) |
| | | { |
| | | TransferTask.TaskStatus = (int)RelocationTaskStatusEnum.RelocationExecuting; |
| | | _taskService.UpdateData(TransferTask); |
| | | return content.OK(); |
| | | } |
| | | else |
| | | { |
| | | UpdateTaskStatus(dt_Task, result, |
| | | successStatus: dt_Task.TaskStatus == PLC_IN_FINISH ? SC_IN_EXECUTING : SC_OUT_EXECUTING, 1); |
| | | |
| | | WriteLog.GetLog("夿巷éå
ç§»åº").Write($"ä¸åå åæºä»»å¡å¤±è´¥ï¼åå ï¼{result.Message}", $"çæç§»åºä»»å¡:GenerateTransferTask"); |
| | | return content.Error(); |
| | | } |
| | | } |
| | | |
| | | var CuttTransferTask = _taskService.Repository.QueryData(x => x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationNew).FirstOrDefault(); |
| | | //夿å½åæ¯å¦æç§»åºä»»å¡ |
| | | if (CuttTransferTask!=null) return content.Error(); |
| | | |
| | | |
| | | if (shallowLocation.LocationStatus != (int)LocationStatusEnum.InStock) return content.Error(); |
| | | |
| | | //çæç§»åºä»»å¡ï¼è¿è¡ä¸å |
| | | return content =GenerateTransferTask(shallowLocation.LocationCode); |
| | |
| | | _taskService.AddData(task); |
| | | _locationInfoService.UpdateData(dt_Locations); |
| | | _stockInfoService.UpdateData(dt_StockInfo); |
| | | //_stockInfoService.Repository.AddData(dt_StockInfo); |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | |
| | | return webResponse.Error("å·²çæç§»åºä»»å¡"); |
| | | //è¿è¡ä¸åç»å åæºä»»å¡ |
| | | WCSginseng result = _taskService.SC_IssueTasks( |
| | | /*WCSginseng result = _taskService.SC_IssueTasks( |
| | | task.TaskId, |
| | | int.Parse(task.Roadway), |
| | | task.TaskNum, |
| | |
| | | task.TargetAddress); |
| | | if (result.IsSuccess) |
| | | { |
| | | task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationExecuting; |
| | | _taskService.UpdateData(task); |
| | | return webResponse.OK(); |
| | | } |
| | | else |
| | | { |
| | | WriteLog.GetLog("夿巷éå
ç§»åº").Write($"ä¸åå åæºä»»å¡å¤±è´¥ï¼åå ï¼{result.Message}", $"çæç§»åºä»»å¡:GenerateTransferTask"); |
| | | return webResponse.Error(); |
| | | } |
| | | }*/ |
| | | } |
| | | else |
| | | { |