using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library.Mapper; using Khd.Core.Wcs.Global; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { /// /// 二楼码垛输送线调度 /// public class SecondFloorLine { private readonly IHost _host; private readonly Plc.S7.Plc _plc; int FloorNo { get; set; } public SecondFloorLine(IHost host, Plc.S7.Plc plc, int floor) { this._host = host; this._plc = plc; FloorNo = floor; } /// /// 启动上件扫描监听 /// public void StartPoint() { Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); Console.WriteLine(DateTime.Now + ":二楼码垛输送线调度启动成功"); LogManager.Info("二楼码垛输送线调度启动成功"); } public void MonitorInLocatorPoint() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); var rfidPoint = StaticData.BasePlcpointList.First(t => t.id == 52); var agvGetPoint = StaticData.BasePlcpointList.First(t => t.id == 53); var agvPutPoint = StaticData.BasePlcpointList.First(t => t.id == 54); BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8); BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 36); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var agvGetValue = this._plc.Read(agvGetPoint.plcpointAddress); var agvPutValue = this._plc.Read(agvPutPoint.plcpointAddress); var rfidValue = this._plc.ReadRFID(rfidPoint.plcpointAddress); if (agvGetValue != null && agvPutValue != null && rfidValue != null) { if (Convert.ToInt32(agvPutValue) == 0) { bool canCreate = dbContext.WcsTask.Where(t => t.endPointId == 36 || t.nextPointId == 8 || t.endPointId == endEquip.objid).Any(); if (!canCreate) { BaseEquip? baseEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.emptyCount > 1); if (baseEquip != null) { var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), endPointId = endEquip.objid, endPointNo = endEquip.equipNo, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, currPointId = baseEquip.objid, currPointNo = baseEquip.equipNo, taskStatus = 0, useFlag = 1, containerNo = null, createBy = "WCS", createTime = DateTime.Now, floorNo = 2, fromFloorNo = 2, isEmpty = "1", qty = baseEquip.emptyCount, taskType = 59, }; dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成请求空托盘任务成功:" + wcsTask.objid); LogManager.Info("二楼码垛输送线生成请求空托盘任务成功:" + wcsTask.objid); } else { baseEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.emptyCount == 10 && t.equipStatus == 1); if (baseEquip != null) { BaseEquip ThirdLineEquip = StaticData.BaseEquip.First(t => t.objid == 3); BaseEquip ThirdAgvEquip = StaticData.BaseEquip.First(t => t.objid == 9); if (ThirdLineEquip.equipStatus == 0) { //生成3楼Agv出库任务 WcsTask wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), containerNo = null, createBy = "WCS", createTime = DateTime.Now, floorNo = 2, fromFloorNo = 3, isEmpty = "1", qty = 10, taskType = 101, currPointId = baseEquip.objid, currPointNo = baseEquip.equipNo, nextPointId = ThirdAgvEquip.objid, nextPointNo = ThirdAgvEquip.equipNo, endPointId = endEquip.objid, endPointNo = endEquip.equipNo, taskStatus = 0, useFlag = 1, }; dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成3楼Agv出库任务成功:" + wcsTask.objid); LogManager.Info("二楼码垛输送线生成3楼Agv出库任务成功:" + wcsTask.objid); } } else { BaseEquip startEquip = dbContext.BaseEquip.First(t => t.objid == 40); if (startEquip.emptyCount > 1) { BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "someOut"); BasePlcpoint linesignal01 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "linesignal01"); BasePlcpoint equipstate06 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "equipstate06"); BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == 1); var lineSignal01Value = StaticData.PlcDic[0].Read(linesignal01.plcpointAddress); var equipstate06Value = StaticData.PlcDic[0].Read(equipstate06.plcpointAddress); if (FirstFloor.ReadEmptyLocation() && Convert.ToInt32(lineSignal01Value) == 0 && Convert.ToInt32(equipstate06Value) == 0) { StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); WcsTask wcsTaskManual = new WcsTask() { objid = StaticData.SnowId.NextId(), endPointId = endEquip.objid, endPointNo = endEquip.equipNo, nextPointId = lineEquip.objid, nextPointNo = lineEquip.equipNo, currPointId = lineEquip.objid, currPointNo = lineEquip.equipNo, taskStatus = 0, useFlag = 1, containerNo = null, createBy = "WCS", createTime = DateTime.Now, floorNo = endEquip.floorNo, fromFloorNo = 1, isEmpty = "1", qty = startEquip.emptyCount, taskType = 53, }; dbContext.Add(wcsTaskManual); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTaskManual); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成手动托盘任务成功:" + wcsTaskManual.objid); LogManager.Info("二楼码垛输送线生成手动托盘任务成功:" + wcsTaskManual.objid); } } } } } } if (Convert.ToInt32(agvGetValue) == 1 && !string.IsNullOrEmpty(rfidValue)) { MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == rfidValue); if (mesBasePalletInfo != null) { var wmsBaseLocations = dbContext.WmsBaseLocation .Where(t => t.warehouseFloor == FloorNo) .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") .Where(t => t.instockFlag == "0") .Where(t => t.outstockFlag == "0") .Where(t => t.warehouseId == 231) .ToList(); var wmsProductStocks = dbContext.WmsProductStock .Where(t => t.warehouseId == 231) .ToList(); WmsBaseLocation? wmsBaseLocation = null; if (wmsBaseLocations.Count > 0) { List containerCodes = wmsBaseLocations .Where(t => t.locDeep == 1) .Select(t => t.containerCode).ToList();//深库位的托盘 List mesBasePalletInfos = dbContext.MesBasePalletInfo .Where(t => t.materialId == mesBasePalletInfo.materialId) .Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料 var bill = from a in mesBasePalletInfos join b in wmsBaseLocations.Where(t => t.locDeep == 1) on a.palletInfoCode equals b.containerCode select new { b };//等于当前任务的物料的托盘的库位信息 var outBill = from a in bill from b in wmsBaseLocations where a.b.layerNum == b.layerNum && b.locDeep == 2 && a.b.locRow == b.locRow && a.b.locColumn == b.locColumn && b.locationStatus == "1" && b.outstockFlag == "0" && b.instockFlag == "0" && string.IsNullOrEmpty(b.containerCode) select new { a.b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 wmsBaseLocation ??= outBill.FirstOrDefault()?.b;//先找相同物料的外侧库位 wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 2);//找不到再找深库位 wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位 if (wmsBaseLocation != null) { BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 37); var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), currPointId = startEquip.objid, currPointNo = startEquip.equipNo, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, endPointId = wmsBaseLocation.locationId, endPointNo = wmsBaseLocation.locationCode, taskStatus = 0, useFlag = 1, containerNo = rfidValue, createBy = "WCS", createTime = DateTime.Now, floorNo = 2, fromFloorNo = 2, isEmpty = "0", taskType = 49, qty = 1, }; dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); LogManager.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); } } } } } } catch (Exception ex) { LogManager.Error(ex); } finally { Thread.Sleep(1000); } } } } }