using JSMachine.WMS.App.Dto; using JSMachine.WMS.App.Dto.Enum; using JSMachine.WMS.App.IService; using JSMachine.WMS.Business.Common.IService; using JSMachine.WMS.Business.Common.Models; using JSMachine.WMS.Business.StockIn.IService; using JSMachine.WMS.Business.StockIn.ServiceImpl.Strategy; using JSMachine.WMS.Common.Cache; using JSMachine.WMS.Infrastructure; using JSMachine.WMS.Infrastructure.Helper; using JSMachine.WMS.Job.Enum; using JSMachine.WMS.Job.JobAttributes; using Newtonsoft.Json; using Quartz; namespace JSMachine.WMS.Job.Job { [DisallowConcurrentExecution] [PersistJobDataAfterExecution] [Job(Name = nameof(StockInSecondFloorJob) , Group = nameof(StockInSecondFloorJob) + "_Group" , Description = "入库二楼任务生成作业" , ScheduleType = ScheduleType.Simple , IntervalMilliSeconds = 2000 , RepeatCount = 0 , StartTimeStr = null)] public class StockInSecondFloorJob : IJob { private static readonly ICommonService CommonService = GlobalServericeProvidor.GetService(); private static readonly IAGVTaskService AgvTaskService = GlobalServericeProvidor.GetService(); private static readonly IStorageRackService StorageRackService = GlobalServericeProvidor.GetService(); private static readonly IERPTaskService ErpTaskService = GlobalServericeProvidor.GetService(); private static readonly IElevatorPlcQueueService ElevatorPlcQueueService = GlobalServericeProvidor.GetService(); public async Task Execute(IJobExecutionContext context) { if (StockInSecondFloorCache.StockInSecondFloorQue.TryDequeue(out AllowPickUpInfo allowPickUpInfo)) { //二楼提升机出口可以取货,生成二楼agv任务 IStockInStrategy stockInStrategy = StrategyFactory.CreateStockInStrategy( TransportEnum.Elevator, FloorEnum.SecondFloor, allowPickUpInfo.AgvTask.MateriaBatch); StorageRackDto destWarehouseSecondFloor = await stockInStrategy.CalCulateWarehouse(); if (destWarehouseSecondFloor == null) { LogHelper.Warn($"二楼暂无可用的库位,AgvTask {allowPickUpInfo.AgvTask.Id} 对应的二楼任务暂无法生成"); //队列再写回去,没有库位的时候队列再写回去,此时整理出空余库位后任务会继续生成(可考虑给pda弹窗报警) StockInSecondFloorCache.StockInSecondFloorQue.Enqueue(allowPickUpInfo); return; } ERPTaskDto erpTask = await ErpTaskService.GetSingalByExpression(p => p.Id == allowPickUpInfo.AgvTask.ErpTaskId); allowPickUpInfo.StartWarehouseSecondFloor.BingdingMaterial(new App.Dto.StorageRackDto.MateriaInfo { BarCode = allowPickUpInfo.AgvTask.BarCode, MateriaBatch = allowPickUpInfo.AgvTask.MateriaBatch, MateriaName = allowPickUpInfo.AgvTask.MateriaName, MateriaType = allowPickUpInfo.AgvTask.MateriaType, MateriaCode = allowPickUpInfo.AgvTask.MateriaCode, MateriaNum = allowPickUpInfo.AgvTask.MateriaNum.ToString(), OrderNo = allowPickUpInfo.AgvTask.OrderNo }); await CommonService.CreateAndInsertAgvTask(new AgvTaskCreationParam() { StartPosition = allowPickUpInfo.StartWarehouseSecondFloor, EndPosition = destWarehouseSecondFloor, ErpTaskId = erpTask.Id, TaskType = destWarehouseSecondFloor.Transport == TransportEnum.NormalArea ? erpTask.TaskType : TaskTypeEnum.TransferStockIn, ErpUploadStatus = (erpTask.TaskType == TaskTypeEnum.TailIn || destWarehouseSecondFloor.Transport != TransportEnum.NormalArea) ? ErpUploadStatusEnum.Unnecessary : ErpUploadStatusEnum.WaittingToUpload }); await ElevatorPlcQueueService.DeleteById(allowPickUpInfo.ElevatorPlcQueue.Id); LogHelper.Info($"入库任务已生成,提升机队列被删除,队列原始信息 {JsonConvert.SerializeObject(allowPickUpInfo.ElevatorPlcQueue)}"); } } } }