using JSMachine.WMS.App.Dto; using JSMachine.WMS.App.Dto.Enum; using JSMachine.WMS.App.IService; using JSMachine.WMS.App.ServiceImpl; using JSMachine.WMS.Business.Common.IService; using JSMachine.WMS.Business.Common.ServiceImpl; using JSMachine.WMS.Business.StockOut.IService; using JSMachine.WMS.Common.Cache; using JSMachine.WMS.Domain.Entity; using JSMachine.WMS.Infrastructure; using JSMachine.WMS.Infrastructure.Helper; using JSMachine.WMS.Job.Enum; using JSMachine.WMS.Job.JobAttributes; using JSMachine.WMS.PLC.ModbusImpl.Elevator.ModbusIO.Read; using JSMachine.WMS.PLC.ModbusImpl.Elevator.Model; using Newtonsoft.Json; using Quartz; namespace JSMachine.WMS.Job.Job { [DisallowConcurrentExecution] [PersistJobDataAfterExecution] [Job(Name = nameof(ElevatorOutJob) , Group = nameof(ElevatorOutJob) + "_Group" , Description = "提升机监控作业" , ScheduleType = ScheduleType.Simple , IntervalMilliSeconds = 500 , RepeatCount = 0 , StartTimeStr = null)] public class ElevatorOutJob : IJob { private static readonly IElevatorPlcQueueService ElevatorPlcQueueService = GlobalServericeProvidor.GetService(); private static readonly ICommonService CommonService = GlobalServericeProvidor.GetService(); private static readonly IERPTaskService ERPTaskService = 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 IStockOutService StockOutService= GlobalServericeProvidor.GetService(); private static readonly IElevatorCountService ElevatorCountService = GlobalServericeProvidor.GetService(); /// /// 1号提升机1号取货通道前一个允许取货状态 /// private static bool PreElevatorOneChannelOneAllowPickUp = false; /// /// 1号提升机2号取货通道前一个允许取货状态 /// private static bool PreElevatorOneChannelTwAollowPickUp = false; /// /// 2号提升机1号取货通道前一个允许取货状态 /// private static bool PreElevatorTwoChannelOneAllowPickUp = false; /// /// 2号提升机2号取货通道前一个允许取货状态 /// private static bool PreElevatorTwoChannelTwoAllowPickUp = false; public async Task Execute(IJobExecutionContext context) { List elevatorPlcStatuses = await ElevatorStatusRead.ReadAllElevatorStatus(); if (elevatorPlcStatuses.IsNullOrEmpty()) { LogHelper.Warn($"出库:读取提升机PLC信号失败"); return; } ElevatorPlcStatus elevatorStatusOne = elevatorPlcStatuses.First(p => p.ElevatorNo == 1); ElevatorPlcStatus elevatorStatusTwo = elevatorPlcStatuses.First(p => p.ElevatorNo == 2); if (!PreElevatorOneChannelOneAllowPickUp && elevatorStatusOne.StockOutPickupChanelOne) { LogHelper.Info($"出库:1号提升机1016出库通道可以取货"); _ = ElevatorCountService.IncrementCount(1, 1016); List elevatorQueue = await ElevatorPlcQueueService .GetListByExpression(p => p.ElevatorNo == 1 && p.ElevatorChannel == 2011, nameof(ElevatorPlcQueueDto.CreationTime), SqlSugar.OrderByType.Asc); if (!elevatorQueue.IsNullOrEmpty()) { ElevatorPlcQueueDto destQueue = elevatorQueue.First(); await HandlePickup(destQueue); } else { LogHelper.Warn($"出库:1号提升机1016出库通道可以取货,但是PLC队列没有信息"); } PreElevatorOneChannelOneAllowPickUp = elevatorStatusOne.StockOutPickupChanelOne; return; } else { PreElevatorOneChannelOneAllowPickUp = elevatorStatusOne.StockOutPickupChanelOne; } if (!PreElevatorOneChannelTwAollowPickUp && elevatorStatusOne.StockOutPickupChanelTwo) { LogHelper.Info($"出库:1号提升机1006号出库通道可以取货"); _ = ElevatorCountService.IncrementCount(1, 1006); List elevatorQueue = await ElevatorPlcQueueService .GetListByExpression(p => p.ElevatorNo == 1 && p.ElevatorChannel == 2001, nameof(ElevatorPlcQueueDto.CreationTime), SqlSugar.OrderByType.Asc); if (!elevatorQueue.IsNullOrEmpty()) { ElevatorPlcQueueDto destQueue = elevatorQueue.First(); await HandlePickup(destQueue); } else { LogHelper.Warn($"出库:一号提升机1006号出库通道可以取货,但是PLC队列没有信息"); } PreElevatorOneChannelTwAollowPickUp = elevatorStatusOne.StockOutPickupChanelTwo; return; } else { PreElevatorOneChannelTwAollowPickUp = elevatorStatusOne.StockOutPickupChanelTwo; } if (!PreElevatorTwoChannelOneAllowPickUp && elevatorStatusTwo.StockOutPickupChanelOne) { LogHelper.Info($"出库:2号提升机1016出库通道可以取货"); _ = ElevatorCountService.IncrementCount(2, 1016); List elevatorQueue = await ElevatorPlcQueueService .GetListByExpression(p => p.ElevatorNo == 2 && p.ElevatorChannel == 2011, nameof(ElevatorPlcQueueDto.CreationTime), SqlSugar.OrderByType.Asc); if (!elevatorQueue.IsNullOrEmpty()) { ElevatorPlcQueueDto destQueue = elevatorQueue.First(); await HandlePickup(destQueue); } else { LogHelper.Warn($"出库:二号提升机1016出库通道可以取货,但是PLC队列没有信息"); } PreElevatorTwoChannelOneAllowPickUp = elevatorStatusTwo.StockOutPickupChanelOne; return; } else { PreElevatorTwoChannelOneAllowPickUp = elevatorStatusTwo.StockOutPickupChanelOne; } if (!PreElevatorTwoChannelTwoAllowPickUp && elevatorStatusTwo.StockOutPickupChanelTwo) { LogHelper.Info($"出库:二号提升机1006出库通道可以取货"); _ = ElevatorCountService.IncrementCount(2, 1006); List elevatorQueue = await ElevatorPlcQueueService .GetListByExpression(p => p.ElevatorNo == 2 && p.ElevatorChannel == 2001, nameof(ElevatorPlcQueueDto.CreationTime), SqlSugar.OrderByType.Asc); if (!elevatorQueue.IsNullOrEmpty()) { ElevatorPlcQueueDto destQueue = elevatorQueue.First(); await HandlePickup(destQueue); } else { LogHelper.Warn($"出库:二号提升机1006出库通道可以取货,但是PLC队列没有信息"); } PreElevatorTwoChannelTwoAllowPickUp = elevatorStatusTwo.StockOutPickupChanelTwo; return; } else { PreElevatorTwoChannelTwoAllowPickUp = elevatorStatusTwo.StockOutPickupChanelTwo; } } /// /// 收到取货完成信号 /// 根据二楼的提升机队列,生成一楼的AgvTask /// 生成一楼的agvTask /// /// /// private async Task HandlePickup(ElevatorPlcQueueDto elevatorQue) { AGVTaskDto agvTaskSecondFloor = await AGVTaskService.GetSingalByExpression(p => p.Id == elevatorQue.AgvTaskId); if (agvTaskSecondFloor == null) { LogHelper.Error($"AgvTask {elevatorQue.AgvTaskId} 不存在"); return; } //获取起点 提升机库位信息 StorageRackDto startWarehouseFirstFloor = await StorageRackService.GetElevatorWareHouse( elevatorQue.ElevatorNo, elevatorQue.ElevatorChannel == 2001 ? 1006 : 1016); //计算终点出库码头 StorageRackDto destWarehouseFirstFloor = await StockOutService.CalculateDestWarehouse_SaleOut(agvTaskSecondFloor.Transport); if (destWarehouseFirstFloor == null) { LogHelper.Warn($"一楼没有可用的库位,AgvTask {agvTaskSecondFloor.Id} 对应的一楼任务无法生成"); _ = ErpTaskService.UpdateTaskMsg(agvTaskSecondFloor.ErpTaskId, "一楼库位不足,请确保码头无货后在pda上点击清空码头按钮"); return; } ERPTaskDto erpTask = await ERPTaskService.GetSingalByExpression(p => p.Id == agvTaskSecondFloor.ErpTaskId); if (erpTask == null) { LogHelper.Error($"出库关联的ERP任务 {agvTaskSecondFloor.ErpTaskId} 不存在"); return; } startWarehouseFirstFloor.BingdingMaterial(new StorageRackDto.MateriaInfo { BarCode = agvTaskSecondFloor.BarCode, MateriaBatch = agvTaskSecondFloor.MateriaBatch, MateriaName = agvTaskSecondFloor.MateriaName, MateriaType = agvTaskSecondFloor.MateriaType, MateriaCode = agvTaskSecondFloor.MateriaCode, MateriaNum = agvTaskSecondFloor.MateriaNum.ToString(), OrderNo = agvTaskSecondFloor.OrderNo }); await CommonService.CreateAndInsertAgvTask(new Business.Common.Models.AgvTaskCreationParam { StartPosition = startWarehouseFirstFloor, EndPosition = destWarehouseFirstFloor, ErpTaskId = erpTask.Id, StockOutWharf = erpTask.Transport, TaskType = erpTask.TaskType }); bool bRetTwo = await ElevatorPlcQueueService.DeleteById(elevatorQue.Id); bool bRetThree = await StorageRackService.Lock(destWarehouseFirstFloor); LogHelper.Info($"出库任务已生成,提升机队列被删除,队列原始信息 {JsonConvert.SerializeObject(elevatorQue)}"); } } }