diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index ec356ee..0e1e790 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -2054,7 +2054,7 @@ namespace Khd.Core.Wcs.Wcs } } } - if (endEquip.equipType == 12 || endEquip.equipType == 13)//原材料到柜体验收区,背板安装 + else if (endEquip.equipType == 12)//原材料到柜体验收区,背板安装 { bool hasTask = dbContext.WcsTask.Where(t => t.currPointId == endEquip.objid || t.endPointId == endEquip.objid).Any(); if (!hasTask) @@ -2063,7 +2063,6 @@ namespace Khd.Core.Wcs.Wcs { var wmsRawStocks = rawStock .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId) - .WhereIf(endEquip.equipType == 13, t => t.completeFlag == "0") .WhereIf(endEquip.equipType == 12, t => t.completeFlag == "1") .Where(t => t.saleOrderId == (item.saleOrderId == null ? 0 : item.saleOrderId)) .Where(t => t.totalAmount > t.frozenAmount) @@ -2276,6 +2275,198 @@ namespace Khd.Core.Wcs.Wcs } } } + else if (endEquip.equipType == 13) + { + var stock = dbContext.WmsRawStock.Where(t => t.instockBatch == item.materialBatch).FirstOrDefault(); + if (stock != null) + { + var location = dbContext.WmsBaseLocation + .Where(t => t.locationStatus == "1") + .Where(t => t.locationCode == stock.locationCode).FirstOrDefault(); + if (location != null) + { + List AllWmsBaseLocations = dbContext.WmsBaseLocation + .Where(t => t.warehouseId == item.warehouseId).ToList(); + decimal? needNumber = item.outstockAmount - item.realOutstockAmount; + BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); + BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode); + WcsTask wcsTask; + int qty = 0; + if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + { + qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); + stock.updateDate = DateTime.Now; + } + else + { + qty = Convert.ToInt32(needNumber); + stock.updateDate = DateTime.Now; + } + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault(); + if (mesBaseBarcodeInfo != null) + { + if (location.locDeep == 1) + { + int? row = 0; + if (location.locRow % 2 == 1)//五楼原材料与其他的深浅库位相反 + { + row = location.locRow + 1; + } + else + { + row = location.locRow - 1;//5 + } + + WmsBaseLocation? wmsBaseLocation = AllWmsBaseLocations + .Where(t => t.locRow == row) + .Where(t => t.locColumn == location.locColumn) + .Where(t => t.warehouseId == location.warehouseId).FirstOrDefault(); + if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") + { + WmsRawStock? wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); + if (wmsRawStock != null) + { + WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) + .Where(t => t.locDeep == 1) + .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); + toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) + .Where(t => t.warehouseId != location.locationId) + .Where(t => string.IsNullOrEmpty(t.containerCode)) + .FirstOrDefault(); + if (toLocation != null) + { + if (toLocation.locDeep == 1) + { + bool hasLocation = AllWmsBaseLocations + .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) + .Where(t => t.locColumn == toLocation.locColumn) + .Any(); + if (!hasLocation) + { + Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + continue; + } + } + var RemoveTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.rawOutstockId, + taskType = 66, + containerNo = wmsRawStock.palletInfoCode, + createBy = "WCS", + createTime = DateTime.Now.AddSeconds(-10), + taskStatus = 0, + materialId = item.materialId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = toLocation.locationId, + endPointNo = toLocation.locationCode, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = qty + }; + toLocation.locationStatus = "4"; + toLocation.updateBy = "WCS"; + toLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "WCS"; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.locationStatus = "4"; + dbContext.Update(toLocation); + dbContext.Update(wmsBaseLocation); + dbContext.Add(RemoveTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); + dbContext.Add(wcsTaskLog); + } + else + { + continue; + } + } + else + { + continue; + } + } + else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1") + { + Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库"); + _logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库"); + continue; + } + else + { + Console.WriteLine(DateTime.Now + $":{location.locationCode}浅库位状态异常,无法移库"); + _logger.Info($"{location.locationCode}浅库位状态异常,无法移库"); + continue; + } + } + wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.rawOutstockId, + taskType = endEquip.equipType == 12 ? 46 : 33,//如果是12那么就是原材料到柜体验收区,如果是13那么就是原材料到背板安装区 + containerNo = location.containerCode, + createBy = "WCS", + createTime = DateTime.Now, + taskStatus = 0, + materialId = item.materialId, + currPointId = location.locationId, + currPointNo = location.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = lineEquip.objid, + endPointNo = lineEquip.equipNo, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = qty + }; + //location是出库的库位,mesBaseBarcodeInfo是条码信息表数据,item是出库申请单 + WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail() + { + rawOutstockDetailId = StaticData.SnowId.NextId(), + rawOutstockId = item.rawOutstockId, + materialId = item.materialId, + createDate = DateTime.Now, + createBy = "WCS", + taskCode = wcsTask.objid.ToString(), + executeStatus = "1", + locationCode = location.locationCode, + outstockAmount = qty, + planAmount = item.outstockAmount, + warehouseId = item.warehouseId, + materialBarcode = mesBaseBarcodeInfo.barcodeInfo, + instockBatch = mesBaseBarcodeInfo.batchCode, + stackAmount = qty, + outstockPerson = "WCS", + outstockTime = DateTime.Now, + outstockWay = "2", + materialProductionDate = mesBaseBarcodeInfo.productionDate + }; + if (item.beginTime == null) + { + item.beginTime = DateTime.Now; + } + SystemData.LockOutLocation(location, dbContext); + dbContext.Add(wmsProductOutstockDetail); + location.locationStatus = "6"; + location.updateBy = "WCS"; + location.updateTime = DateTime.Now; + endEquip.emptyCount = 1; + dbContext.Update(endEquip); + dbContext.Update(location); + dbContext.Add(wcsTask); + dbContext.Update(item); + dbContext.Update(stock); + WcsTaskLog wcsTaskLog1 = CoreMapper.Map(wcsTask); + dbContext.Add(wcsTaskLog1); + dbContext.SaveChanges(); + } + } + } + } } } } diff --git a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs index 577ca09..16cce37 100644 --- a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs +++ b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs @@ -290,11 +290,6 @@ namespace Khd.Core.Wcs.Wcs if (Convert.ToInt32(linesignal01Value) == 1) { var wcsTasks = dbContext.WcsTask.ToList(); - var hasTask = wcsTasks.Where(t => t.nextPointId == 6 && (t.currPointId == 1 || t.endPointId == 1 && t.taskStatus < 5 && t.taskStatus >= 1)).Any(); - if (hasTask) - { - continue; - } //判断task表里没有该rfid的未完成的入库 //信息,未下发去向 var task = wcsTasks.Where(t => t.IsDelete == 0 || t.IsDelete == null) @@ -331,7 +326,7 @@ namespace Khd.Core.Wcs.Wcs } else { - hasTask = wcsTasks.Where(t => t.containerNo == RFID001Value).Any(); + var hasTask = wcsTasks.Where(t => t.containerNo == RFID001Value).Any(); if (!hasTask) { //根据托盘号获取物料码 diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs index 9edb430..d0710ed 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Dto.webapi; +using Castle.Components.DictionaryAdapter.Xml; +using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; @@ -24,6 +25,7 @@ namespace Khd.Core.Wcs.Wcs int FloorNo { get; set; } private readonly BasePlcpoint putTrayPoint; private readonly BasePlcpoint getTrayPoint; + private bool IsTrayGet { get; set; } public ThirdFloorAGV(IHost host, int floor) { this._host = host; @@ -48,10 +50,43 @@ namespace Khd.Core.Wcs.Wcs FZJThread.IsBackground = true; FZJThread.Start(); + Thread MonitorTraySignalThread= new Thread(MonitorTraySignal); + MonitorTraySignalThread.Name = "ThirdFloorAGVTraySignal"; + MonitorTraySignalThread.IsBackground = true; + MonitorTraySignalThread.Start(); + Console.WriteLine(DateTime.Now + ":三楼AGV 启动上件扫描监听"); _logger.Info("三楼AGV 启动上件扫描监听"); } + private void MonitorTraySignal() + { + BasePlcpoint GetTrayPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "getTray"); + BasePlcpoint GetTrayOverPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "GetTrayOver"); + while (true) + { + while (IsTrayGet) + { + try + { + var getTrayValue = StaticData.PlcDic[2].Read(GetTrayPoint.plcpointAddress); + if (getTrayValue != null && !Convert.ToBoolean(getTrayValue)) + { + StaticData.PlcDic[2].WriteToPoint(GetTrayOverPoint.plcpointAddress, false, GetTrayOverPoint.plcpointLength.ToString()); + IsTrayGet = false; + _logger.Info("三楼AGV 托盘已取走"); + } + } + catch + { + + } + Thread.Sleep(3000); + } + Thread.Sleep(3000); + } + } + private void MonitorInFZJPoint(object? obj) { using var scope = _host.Services.CreateScope(); @@ -707,6 +742,9 @@ namespace Khd.Core.Wcs.Wcs MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == item.containerNo); if (mesBasePalletInfo != null) { + BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "GetTrayOver"); + StaticData.PlcDic[2].WriteToPoint(basePlcpoint.plcpointAddress, true, basePlcpoint.plcpointLength.ToString()); + IsTrayGet = true; MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.palletInfoCode == item.containerNo).FirstOrDefault(); if (mesBaseBarcodeInfo != null) {