From b76444e1fc661f5bbc55b7cd57b4d21f239bca25 Mon Sep 17 00:00:00 2001 From: liuwf Date: Tue, 10 Sep 2024 13:49:23 +0800 Subject: [PATCH] change. --- .../Models/MesSaleOrderRelate.cs | 37 +++ .../Models/WmsInventoryCheck.cs | 6 + .../DefaultDbContext.cs | 3 + src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs | 9 +- src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs | 60 ++-- src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs | 196 +++++++------ src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs | 126 ++++++--- src/Khd.Core.Wpf/Form/FormBoardT.xaml | 12 +- src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs | 260 ++++++++++-------- .../TaskForm/Inventory/InventoryDetails.xaml | 117 ++++++++ .../Inventory/InventoryDetails.xaml.cs | 85 ++++++ 11 files changed, 639 insertions(+), 272 deletions(-) create mode 100644 src/Khd.Core.Domain/Models/MesSaleOrderRelate.cs create mode 100644 src/Khd.Core.Wpf/TaskForm/Inventory/InventoryDetails.xaml create mode 100644 src/Khd.Core.Wpf/TaskForm/Inventory/InventoryDetails.xaml.cs diff --git a/src/Khd.Core.Domain/Models/MesSaleOrderRelate.cs b/src/Khd.Core.Domain/Models/MesSaleOrderRelate.cs new file mode 100644 index 0000000..9f6dc73 --- /dev/null +++ b/src/Khd.Core.Domain/Models/MesSaleOrderRelate.cs @@ -0,0 +1,37 @@ + +//----------------------------------------------------------------------- +// +// * Copyright (C) 2021 KEHAIDASOFT All Rights Reserved +// * version : 4.0.30319.42000 +// * author : khd by t4-2 +// +//----------------------------------------------------------------------- + +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + + [Table("mes_sale_order_relate")] + public class MesSaleOrderRelate + { + [Key] + [Column("sale_order_relate_id")] + public long SaleOrderRelateId { get; set; } + + [Column("sale_order_id")] + public long SaleOrderId { get; set; } + + [Column("relate_sale_order_id")] + public long RelateSaleOrderId { get; set; } + + [Column("purchase_order_id")] + public long PurchaseOrderId { get; set; } + + [Column("relate_sale_order_amout")] + public decimal RelateSaleOrderAmount { get; set; } + } +} + diff --git a/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs b/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs index 4558961..490f66c 100644 --- a/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs +++ b/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs @@ -36,5 +36,11 @@ namespace Khd.Core.Domain.Models public string UpdateBy { get; set; } [Column("update_date")] public DateTime? UpdateTime { get; set; } + + /// + /// 物料类型id,如果为null盘所有库,不为null盘该物料的库 + /// + [Column("material_id")] + public long? MaterialId { get; set; } } } diff --git a/src/Khd.Core.EntityFramework/DefaultDbContext.cs b/src/Khd.Core.EntityFramework/DefaultDbContext.cs index 6051089..3d6edff 100644 --- a/src/Khd.Core.EntityFramework/DefaultDbContext.cs +++ b/src/Khd.Core.EntityFramework/DefaultDbContext.cs @@ -32,6 +32,9 @@ namespace Khd.Core.EntityFramework public DbSet BasePlc { get; set; } public DbSet MesBasePalletInfo { get; set; } + + public DbSet MesSaleOrderRelate { get; set; } + public DbSet MesProductPlanDetail { get; set; } public DbSet WcsCmd { get; set; } diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index acb4cfa..d34d2fe 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -2415,7 +2415,8 @@ namespace Khd.Core.Wcs.Wcs { // TODO : 没有找到可以移库的目标库位,添加报警 Console.WriteLine("5F原材料前往背板安装需要先移库,没有找到可以移库的目标库位,添加报警"); - return; + Thread.Sleep(1000 * 5); + continue; } var RemoveTask = new WcsTask() { @@ -2565,7 +2566,7 @@ namespace Khd.Core.Wcs.Wcs { Console.WriteLine(DateTime.Now + $":{location.locationCode}库位状态异常,无法出库"); _logger.Info($"{location.locationCode}库位状态异常,无法出库"); - return; + continue; } if (location.locDeep == 1) { @@ -2634,7 +2635,7 @@ namespace Khd.Core.Wcs.Wcs { // TODO : 没有找到可以移库的目标库位,添加报警 Console.WriteLine("5F原材料前往背板安装需要先移库,没有找到可以移库的目标库位,添加报警"); - return; + continue; } var RemoveTask = new WcsTask() { @@ -2672,7 +2673,7 @@ namespace Khd.Core.Wcs.Wcs else if (wmsBaseLocation.locationStatus != "1") { Console.WriteLine("浅库位状态异常,禁止出库,请检查浅库位状态"); - return; + continue; } } diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index 57bb027..f836a3a 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -808,6 +808,41 @@ namespace Khd.Core.Wcs.Wcs var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != null) { + + if (mesBaseBarcodeInfo.PurchaseOrderId == -1) + { // 合并的物料 + // List mesSaleOrderRelates = dbContext.MesSaleOrderRelate.Where(x=>x.SaleOrderId==mesBaseBarcodeInfo.saleOrderId) + + } + else + { + WmsRawInstock wmsRawInstock = new WmsRawInstock() + { + taskCode = item.taskCode, + materialBarCode = mesBaseBarcodeInfo.barcodeInfo, + materialBatchCode = mesBaseBarcodeInfo.batchCode, + applyBy = "wcs", + applyDate = System.DateTime.Now, + purchaseOrderId = mesBaseBarcodeInfo.PurchaseOrderId, + + + beginTime = DateTime.Now, + endTime = DateTime.Now, + locationCode = wmsBaseLocation.locationCode, + executeStatus = "2", + instockAmount = 1, + instockType = "1", + + materialId = mesBaseBarcodeInfo.materialId, + operationType = "3", + palletInfoCode = mesBaseBarcodeInfo.palletInfoCode, + poNo = mesBaseBarcodeInfo.poNo, + warehouseId = 511 + }; + dbContext.Add(wmsRawInstock); + + } + WmsRawStock wmsRawStock = new() { palletInfoCode = mesBasePalletInfo.palletInfoCode, @@ -833,31 +868,8 @@ namespace Khd.Core.Wcs.Wcs updateDate = DateTime.Now, warehouseId = 511, }; - WmsRawInstock wmsRawInstock = new WmsRawInstock() - { - taskCode = item.taskCode, - materialBarCode = mesBaseBarcodeInfo.barcodeInfo, - materialBatchCode = mesBaseBarcodeInfo.batchCode, - applyBy = "wcs", - applyDate = System.DateTime.Now, - purchaseOrderId = mesBaseBarcodeInfo.PurchaseOrderId, - - - beginTime = DateTime.Now, - endTime = DateTime.Now, - locationCode = wmsBaseLocation.locationCode, - executeStatus = "2", - instockAmount = 1, - instockType = "1", - - materialId = mesBaseBarcodeInfo.materialId, - operationType = "3", - palletInfoCode = mesBaseBarcodeInfo.palletInfoCode, - poNo = mesBaseBarcodeInfo.poNo, - warehouseId = 511 - }; SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); - dbContext.Add(wmsRawInstock); + wmsBaseLocation.returnFlag = "0"; BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == 5); lineEquip.equipStatus = 0; diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs index 1fb1cc6..1a8d83f 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs @@ -65,13 +65,13 @@ namespace Khd.Core.Wcs.Wcs var PalletInIsHas2F = StaticData.PlcDic[2].Read(PalletInIsHas2FPoint.plcpointAddress);//2F托盘库入口上料光电 var agvGetValue = StaticData.PlcDic[2].Read(agvGetPoint.plcpointAddress);//小包出口的到位 - var rfidValue = StaticData.PlcDic[2].ReadRFID(rfidPoint.plcpointAddress,15);//小包出口的RFID - if (agvGetValue != null && agvPutValue != null && rfidValue != null && ConnectStatus2F!=null && PalletInIsHas2F!=null)//读Plc + var rfidValue = StaticData.PlcDic[2].ReadRFID(rfidPoint.plcpointAddress, 15);//小包出口的RFID + if (agvGetValue != null && agvPutValue != null && rfidValue != null && ConnectStatus2F != null && PalletInIsHas2F != null)//读Plc { - // 托盘库叫料信号,并且通讯正常,并且小包入口无料才可叫料 + // 托盘库叫料信号,并且通讯正常,并且小包入口无料才可叫料 if (Convert.ToInt32(agvPutValue) == 1 && Convert.ToInt32(ConnectStatus2F) == 1 && Convert.ToInt32(PalletInIsHas2F) == 0)//小包入口叫料 { - + bool canCreate = dbContext.WcsTask.Where(t => t.nextPointId == 8 || t.endPointId == endEquip.objid).Any();//有没有生成任务 //36 是小包入口的设备信息,8是二楼Agv设备 if (!canCreate)//没有任务 @@ -232,7 +232,7 @@ namespace Khd.Core.Wcs.Wcs //todo:没有空托盘超过十次预警报警 Console.WriteLine(DateTime.Now + ":二楼码垛输送线没有空托盘,叫托盘失败!"); _logger.Info("二楼码垛输送线没有空托盘,叫托盘失败!"); - Thread.Sleep(1000*60); + Thread.Sleep(1000 * 5); } } } @@ -251,6 +251,8 @@ namespace Khd.Core.Wcs.Wcs MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != null) { + // 目标库位 + WmsBaseLocation? wmsBaseLocation = null; var wmsBaseLocations = dbContext.WmsBaseLocation .Where(t => t.warehouseFloor == FloorNo) .Where(t => t.activeFlag == "1") @@ -258,96 +260,124 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") .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();//深库位的有托盘 - containerCodes.RemoveAll(t => string.IsNullOrEmpty(t)); + .ToList();//所有未锁定的库位 - List productStocks = wmsProductStocks.Where(t => t.productId == mesBaseBarcodeInfo.materialId) - .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) - .Where(t => t.palletInfoCode != null) - .Where(t => containerCodes.Contains(t.palletInfoCode)).ToList(); + //深库位有库存的库位 + List DeepContainerCodes = wmsBaseLocations + .Where(t => t.locDeep == 1) + .Where(t => !string.IsNullOrEmpty(t.containerCode)) + .Select(t => t.containerCode).ToList(); - var bill = from a in productStocks - join b in wmsBaseLocations.Where(t => t.locDeep == 1) on a.palletInfoCode equals b.containerCode - select new { b };//等于当前任务的物料的托盘的库位信息 + //相同型号及销售订单的深库位库存 + List productStocks = dbContext.WmsProductStock.Where(t => t.productId == mesBaseBarcodeInfo.materialId) + .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) + .Where(t => t.warehouseId== 231) + .Where(t => DeepContainerCodes.Contains(t.palletInfoCode)).ToList(); - var outBill = from a in bill//深库位托盘和当前任务绑定物料一致的托盘库位 - from b in wmsBaseLocations//所有库位 - where b.locDeep == 2//浅库位 - && b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1) - //如果是4则找3,如果是1则找2 - && a.b.locColumn == b.locColumn//列数相同 - && string.IsNullOrEmpty(b.containerCode) - select new { a.b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 - - wmsBaseLocation ??= outBill.Where(t => !canNotIn.Contains(t.b.locationCode)).FirstOrDefault()?.b;//先找相同物料的外侧库位 - wmsBaseLocation ??= wmsBaseLocations.Where(t => !canNotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位 - wmsBaseLocation ??= wmsBaseLocations.Where(t => !canNotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位 - if (wmsBaseLocation != null)//如果找到库位,生成入库任务 + if(productStocks.Count > 0) + { //优先找同销售订单的有库存的深库位对应的浅库位 + foreach(var productStock in productStocks) { - if (wmsBaseLocation.locDeep == 1) + // 深库位库存对用的Location信息 + var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == productStock.palletInfoCode).FirstOrDefault(); + wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus=="1") + .Where(t=> t.locDeep == 2 && t.locColumn ==deepStockLocation.locColumn) + .Where(t=> t.locRow == (deepStockLocation.locRow % 2 == 0 ? (deepStockLocation.locRow - 1) :(deepStockLocation.locRow + 1)) ) + .FirstOrDefault(); + if (wmsBaseLocation != null) { - var hasLocation = wmsBaseLocations - .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Where(t => !string.IsNullOrEmpty(t.containerCode) || t.locationStatus != "1") - .Any(); - if (hasLocation) - { - canNotIn.Add(wmsBaseLocation.locationCode); - Console.WriteLine(DateTime.Now + $":目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - _logger.Info($"目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - continue; - } + break; } - 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 = StaticTaskType.SecondSmallPackageToStorage, - qty = 1, - }; - SystemData.LockOutLocation(wmsBaseLocation, dbContext); - dbContext.Add(wcsTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); - dbContext.Add(wcsTaskLog); - dbContext.SaveChanges(); - canNotIn.Clear(); - Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); - _logger.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); - } - else - { - //报警 } } + if(wmsBaseLocation == null) + { // 找深库位有库存的库位对应的浅库位 + var stockLocations = wmsBaseLocations.Where(x => !string.IsNullOrEmpty(x.containerCode) && x.locDeep==1).ToList(); + foreach (var item in stockLocations) + { + wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1") + .Where(t => t.locDeep == 2 && t.locColumn == item.locColumn) + .Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1))) + .FirstOrDefault(); + if (wmsBaseLocation != null) + { + break; + } + } + } + if(wmsBaseLocation == null) + { // 在所有符合条件的库位里,找一个库位,优先深库位,但是如果是深库位,需要判断浅库位状态是否正常 + var searchLocations = wmsBaseLocations.Where(x => string.IsNullOrEmpty(x.containerCode) && x.locationStatus == "1").OrderBy(x=>x.locDeep).ToList(); + foreach (var item in searchLocations) + { + if(item.locDeep == 1) + { + //浅库位能否使用 + var shallowLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1") + .Where(t => t.locDeep == 2 && t.locColumn == item.locColumn) + .Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1))) + .FirstOrDefault(); + if (shallowLocation != null) + { + wmsBaseLocation = item; + break; + } + } + else + { + wmsBaseLocation = item; + break; + } + + } + } + + 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 = StaticTaskType.SecondSmallPackageToStorage, + qty = 1, + }; + SystemData.LockOutLocation(wmsBaseLocation, dbContext); + dbContext.Add(wcsTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); + dbContext.Add(wcsTaskLog); + dbContext.SaveChanges(); + canNotIn.Clear(); + Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); + _logger.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); + } + else + { + Console.WriteLine(DateTime.Now + ":2楼调度入库任务,未找到库位"); + _logger.Info("2楼调度入库任务,未找到库位"); + // TODO: 没有找到库位,添加报警处理 + Thread.Sleep(1000 * 5); + } + } } } } - + } } } diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs index b22963a..7bd35fd 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs @@ -76,57 +76,90 @@ namespace Khd.Core.Wcs.Wcs MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != 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") - .OrderByDescending(t => t.locRow) - .ThenByDescending(t => t.locColumn) - .ToList(); + // 目标库位 + WmsBaseLocation? wmsBaseLocation = 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.warehouseId == 311) + .ToList();//所有未锁定的库位 - List containerCodes = wmsBaseLocations.Where(t => t.locDeep == 1).Select(t => t.containerCode).ToList();//深库位的托盘 - containerCodes.RemoveAll(t => string.IsNullOrEmpty(t)); + //深库位有库存的库位 + List DeepContainerCodes = wmsBaseLocations + .Where(t => t.locDeep == 1) + .Where(t => !string.IsNullOrEmpty(t.containerCode)) + .Select(t => t.containerCode).ToList(); + + //相同型号及销售订单的深库位库存 + List wmsRawStocks = dbContext.WmsRawStock.Where(t => t.materialId == mesBaseBarcodeInfo.materialId) - .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) - .Where(t => t.palletInfoCode != null) - .Where(t => t.warehouseId == 311) - .Where(t => containerCodes.Contains(t.palletInfoCode)).ToList(); - - var bill = from a in wmsRawStocks - join b in wmsBaseLocations.Where(t => t.locDeep == 1 && !string.IsNullOrEmpty(t.containerCode)) on a.palletInfoCode equals b.containerCode - select new { b };//等于当前任务的物料的托盘的库位信息 - - - var outBill = from b in wmsBaseLocations - from a in bill - where b.locDeep == 2 - && b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1) - && a.b.locColumn == b.locColumn - && b.locationStatus == "1" - && string.IsNullOrEmpty(b.containerCode) - select new { b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 - WmsBaseLocation? wmsBaseLocation = outBill.Where(t => !canNotIn.Contains(t.b.locationCode)).FirstOrDefault()?.b;//先找相同物料的外侧库位 - wmsBaseLocation ??= wmsBaseLocations.Where(t => !canNotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位 - wmsBaseLocation ??= wmsBaseLocations.Where(t => !canNotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位 - - if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null) - { - if (wmsBaseLocation.locDeep == 1) + .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) + .Where(t => DeepContainerCodes.Contains(t.palletInfoCode)) + .Where(t => t.warehouseId == 311).ToList(); + if (wmsRawStocks.Count > 0) + { //优先找同销售订单的有库存的深库位对应的浅库位 + foreach (var wmsRawStock in wmsRawStocks) { - bool hasLocation = wmsBaseLocations - .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Where(t => !string.IsNullOrEmpty(t.containerCode) || t.locationStatus != "1") - .Any(); - if (hasLocation) + // 深库位库存对用的Location信息 + var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == wmsRawStock.palletInfoCode).FirstOrDefault(); + wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1") + .Where(t => t.locDeep == 2 && t.locColumn == deepStockLocation.locColumn) + .Where(t => t.locRow == (deepStockLocation.locRow % 2 == 0 ? (deepStockLocation.locRow - 1) : (deepStockLocation.locRow + 1))) + .FirstOrDefault(); + if (wmsBaseLocation != null) { - canNotIn.Add(wmsBaseLocation.locationCode); - Console.WriteLine(DateTime.Now + $":目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - _logger.Info($"目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - continue; + break; } } + } + if (wmsBaseLocation == null) + { // 找深库位有库存的库位对应的浅库位 + var stockLocations = wmsBaseLocations.Where(x => !string.IsNullOrEmpty(x.containerCode) && x.locDeep == 1).ToList(); + foreach (var item in stockLocations) + { + wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1") + .Where(t => t.locDeep == 2 && t.locColumn == item.locColumn) + .Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1))) + .FirstOrDefault(); + if (wmsBaseLocation != null) + { + break; + } + } + } + if (wmsBaseLocation == null) + { // 在所有符合条件的库位里,找一个库位,优先深库位,但是如果是深库位,需要判断浅库位状态是否正常 + var searchLocations = wmsBaseLocations.Where(x => string.IsNullOrEmpty(x.containerCode) && x.locationStatus == "1").OrderBy(x => x.locDeep).ToList(); + foreach (var item in searchLocations) + { + if (item.locDeep == 1) + { + //浅库位能否使用 + var shallowLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1") + .Where(t => t.locDeep == 2 && t.locColumn == item.locColumn) + .Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1))) + .FirstOrDefault(); + if (shallowLocation != null) + { + wmsBaseLocation = item; + break; + } + } + else + { + wmsBaseLocation = item; + break; + } + + } + } + + if ( wmsBaseLocation != null) + { + dbContext.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.objid = StaticData.SnowId.NextId(); @@ -155,6 +188,9 @@ namespace Khd.Core.Wcs.Wcs { Console.WriteLine(DateTime.Now + ":三楼楼接驳位调度入库任务,未找到库位"); _logger.Info("三楼接驳位调度入库任务,未找到库位"); + // TODO: 没有找到库位,添加报警处理 + Thread.Sleep(1000 * 5); + } } } diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml b/src/Khd.Core.Wpf/Form/FormBoardT.xaml index 040b7da..9a99d3d 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml @@ -1980,7 +1980,7 @@ + IsReadOnly="True" Visibility="Collapsed" /> -