diff --git a/src/Khd.Core.Domain/Models/MesBaseBarcodeInfo.cs b/src/Khd.Core.Domain/Models/MesBaseBarcodeInfo.cs index 6baf793..f6d57b9 100644 --- a/src/Khd.Core.Domain/Models/MesBaseBarcodeInfo.cs +++ b/src/Khd.Core.Domain/Models/MesBaseBarcodeInfo.cs @@ -17,6 +17,8 @@ namespace Khd.Core.Domain.Models [Table("mes_base_barcode_info")] public class MesBaseBarcodeInfo { + [Column("complete_flag")] + public string completeFlag { get; set; } [Column("purchase_order_id")] public int? PurchaseOrderId { get; set; } [Key] diff --git a/src/Khd.Core.Wcs/Global/StaticData.cs b/src/Khd.Core.Wcs/Global/StaticData.cs index faab248..76f3d43 100644 --- a/src/Khd.Core.Wcs/Global/StaticData.cs +++ b/src/Khd.Core.Wcs/Global/StaticData.cs @@ -64,6 +64,7 @@ namespace Khd.Core.Wcs.Global public static List basePlcs = new List(); public static List PlcConfigs { get; set; } public static int DeleteLogDay { get; internal set; } + public static List BigContainerCodes = new List(){ "JYHB01020001", "JYHB01020002", "JYHB01020003", "JYHB01020004" }; public static Dictionary> PlcPoints = new Dictionary>(); public static Dictionary PlcDic = new Dictionary(); diff --git a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs index d2ffd26..bcee665 100644 --- a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs +++ b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs @@ -272,7 +272,6 @@ namespace Khd.Core.Wcs.Wcs /// private void FirstFloorLine() { - List BigContainerCodes = new() { "JYHB01020001", "JYHB01020002", "JYHB01020003", "JYHB01020004" }; List Outtpyes = new() { 2, 4, 8, 6 }; using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); @@ -304,7 +303,7 @@ namespace Khd.Core.Wcs.Wcs if (task == null) { - if (BigContainerCodes.Contains(RFID001Value)) + if (StaticData.BigContainerCodes.Contains(RFID001Value)) { var newTask = new WcsTask() { diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index 871decd..49da482 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -716,7 +716,7 @@ namespace Khd.Core.Wcs.Wcs materialId = mesBasePalletInfo.materialId, qualityStatus = "0", rawStockId = StaticData.SnowId.NextId(), - completeFlag = item.fromFloorNo==4?"0":"1", + completeFlag = mesBaseBarcodeInfo.completeFlag, instockBatch = mesBaseBarcodeInfo.barcodeInfo, updateBy = "WCS", updateDate = DateTime.Now, diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs index 91e082f..e78a00a 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs @@ -8,6 +8,7 @@ using Masuit.Tools; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using System.Threading.Tasks; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs @@ -47,7 +48,6 @@ namespace Khd.Core.Wcs.Wcs public void MonitorInLocatorPoint() { - List BigContainerCodes = new() { "JYHB01020001", "JYHB01020002", "JYHB01020003", "JYHB01020004" }; List ITypes = new() { 1, 3, 5, 7 }; using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); @@ -60,143 +60,178 @@ namespace Khd.Core.Wcs.Wcs //入库任务 var rfid = StaticData.PlcDic[0].ReadRFID(LineRFID.plcpointAddress); var isSignal = StaticData.PlcDic[0].Read(LineSignal.plcpointAddress); + BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == FloorNo); if (rfid != null && isSignal != null) { - if (BigContainerCodes.Contains(rfid)) - { - Thread.Sleep(1000); - continue; - } + //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息 if (Convert.ToInt32(isSignal) == 1)//五楼接驳位 { //获取条码信息 - BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == FloorNo); var wcsTask = dbContext.WcsTask.OrderBy(t => t.createTime) .FirstOrDefault(t => t.containerNo == rfid && t.nextPointId == baseEquip.objid); if (wcsTask != null) { - if (wcsTask.taskStatus == 5)//入库,提升机任务是完成状态 + if (StaticData.BigContainerCodes.Contains(rfid)) { - 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.warehouseId == 511) - .Where(t => t.locationStatus == "1") - .ToList(); - if (wmsBaseLocations.Count > 0) + MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == rfid); + if (mesBasePalletInfo != null) { - MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == rfid).FirstOrDefault(); - if (mesBasePalletInfo != null) + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.palletInfoCode == rfid).FirstOrDefault(); + if (mesBaseBarcodeInfo != null) { - MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); - if (mesBaseBarcodeInfo != null) + mesBaseBarcodeInfo.palletInfoCode = null; + dbContext.Update(mesBaseBarcodeInfo); + } + mesBasePalletInfo.bindAmount = null; + mesBasePalletInfo.bindAmount = null; + mesBasePalletInfo.materialBarcode = null; + mesBasePalletInfo.materialCode = null; + mesBasePalletInfo.materialId = null; + mesBasePalletInfo.materialName = null; + mesBasePalletInfo.updateBy = "WCS"; + mesBasePalletInfo.updateTime = DateTime.Now; + dbContext.Update(mesBasePalletInfo); + dbContext.Remove(wcsTask); + dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); + dbContext.SaveChanges(); + } + continue; + } + else + { + if (wcsTask.taskStatus == 5)//入库,提升机任务是完成状态 + { + 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.warehouseId == 511) + .Where(t => t.locationStatus == "1") + .ToList(); + if (wmsBaseLocations.Count > 0) + { + MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == rfid).FirstOrDefault(); + if (mesBasePalletInfo != null) { - List containerCodes = wmsBaseLocations - .Where(t => t.locDeep == 1) - .Select(t => t.containerCode).ToList();//深库位的托盘 - containerCodes.RemoveAll(t => string.IsNullOrEmpty(t)); - List mesBasePalletInfos = dbContext.MesBaseBarcodeInfo - .Where(t => t.materialId == wcsTask.materialId) - .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) - .Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料 - - var bill = from a in mesBasePalletInfos - join b in wmsBaseLocations.Where(t => t.locDeep == 1 && wcsTask.fromFloorNo == 4 ? t.returnFlag == "1" : t.returnFlag == "0") on a.palletInfoCode equals b.containerCode - select new { b };//等于当前任务的物料的托盘的库位信息 - 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) - && a.b.locColumn == b.locColumn - && b.locationStatus == "1" - && string.IsNullOrEmpty(b.containerCode) - select new { a, b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 - - WmsBaseLocation? wmsBaseLocation = null; - 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();//找不到再找任意库位 - //深浅库位问题?库位入库优先级等 - - var AgvEquip = StaticData.BaseEquip.First(t => t.objid == 28);//5楼叉车 - if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null) + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); + if (mesBaseBarcodeInfo != null) { - if (wmsBaseLocation.locDeep == 1) + List containerCodes = wmsBaseLocations + .Where(t => t.locDeep == 1) + .Select(t => t.containerCode).ToList();//深库位的托盘 + containerCodes.RemoveAll(t => string.IsNullOrEmpty(t)); + List mesBasePalletInfos = dbContext.MesBaseBarcodeInfo + .Where(t => t.materialId == wcsTask.materialId) + .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) + .Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料 + + var bill = from a in mesBasePalletInfos + join b in wmsBaseLocations + .Where(t => t.locDeep == 1 && mesBaseBarcodeInfo.completeFlag == "0" ? t.returnFlag == "1" : t.returnFlag == "0") on a.palletInfoCode equals b.containerCode + select new { b };//等于当前任务的物料的托盘的库位信息 + 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) + && a.b.locColumn == b.locColumn + && b.locationStatus == "1" + && string.IsNullOrEmpty(b.containerCode) + select new { a, b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 + if(mesBaseBarcodeInfo.completeFlag == "0") { - bool hasLocation = wmsBaseLocations - .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Any(); - if (!hasLocation) - { - canNotIn.Add(wmsBaseLocation.locationCode); - Console.WriteLine(DateTime.Now + $":目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - _logger.Info($"目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - continue; - } - } - WcsTask newTask = CoreMapper.Map(wcsTask); - newTask.taskStatus = 0;//创建状态 - newTask.updateTime = DateTime.Now; - newTask.currPointId = baseEquip.objid; - newTask.currPointNo = baseEquip.equipNo; - newTask.nextPointId = AgvEquip.objid; - newTask.nextPointNo = AgvEquip.equipNo; - newTask.endPointId = wmsBaseLocation.locationId; - newTask.endPointNo = wmsBaseLocation.locationCode; - newTask.objid = StaticData.SnowId.NextId(); - newTask.createTime = DateTime.Now; - newTask.taskType = 47; - if (newTask.fromFloorNo != 1)//如果不是一楼来的,需要通过接口确认入库(质检通过后,点击继续入库) - { - newTask.useFlag = 0; + outBill = outBill.OrderByDescending(t => t.b.locColumn).ToList(); + wmsBaseLocations= wmsBaseLocations.OrderByDescending(t => t.locColumn).ToList(); } else { - newTask.useFlag = 1; + outBill = outBill.OrderBy(t => t.b.locColumn).ToList(); + wmsBaseLocations = wmsBaseLocations.OrderBy(t => t.locColumn).ToList(); } - wmsBaseLocation.locationStatus = "2"; - dbContext.Update(wmsBaseLocation); - dbContext.Remove(wcsTask); + WmsBaseLocation? wmsBaseLocation = null; + 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();//找不到再找任意库位 + //深浅库位问题?库位入库优先级等 - dbContext.Add(newTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); - dbContext.Add(wcsTaskLog); - dbContext.SaveChanges(); - canNotIn.Clear(); - } - else - { - Console.WriteLine(DateTime.Now + ":五楼接驳位调度入库任务,未找到库位"); - _logger.Info("五楼接驳位调度入库任务,未找到库位"); + var AgvEquip = StaticData.BaseEquip.First(t => t.objid == 28);//5楼叉车 + if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null) + { + if (wmsBaseLocation.locDeep == 1) + { + bool hasLocation = wmsBaseLocations + .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) + .Where(t => t.locColumn == wmsBaseLocation.locColumn) + .Any(); + if (!hasLocation) + { + canNotIn.Add(wmsBaseLocation.locationCode); + Console.WriteLine(DateTime.Now + $":目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); + _logger.Info($"目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); + continue; + } + } + WcsTask newTask = CoreMapper.Map(wcsTask); + newTask.taskStatus = 0;//创建状态 + newTask.updateTime = DateTime.Now; + newTask.currPointId = baseEquip.objid; + newTask.currPointNo = baseEquip.equipNo; + newTask.nextPointId = AgvEquip.objid; + newTask.nextPointNo = AgvEquip.equipNo; + newTask.endPointId = wmsBaseLocation.locationId; + newTask.endPointNo = wmsBaseLocation.locationCode; + newTask.objid = StaticData.SnowId.NextId(); + newTask.createTime = DateTime.Now; + newTask.taskType = 47; + if (newTask.fromFloorNo != 1)//如果不是一楼来的,需要通过接口确认入库(质检通过后,点击继续入库) + { + newTask.useFlag = 0; + } + else + { + newTask.useFlag = 1; + } + wmsBaseLocation.locationStatus = "2"; + dbContext.Update(wmsBaseLocation); + dbContext.Remove(wcsTask); + + dbContext.Add(newTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); + dbContext.Add(wcsTaskLog); + dbContext.SaveChanges(); + canNotIn.Clear(); + } + else + { + Console.WriteLine(DateTime.Now + ":五楼接驳位调度入库任务,未找到库位"); + _logger.Info("五楼接驳位调度入库任务,未找到库位"); + } } } } - } - } - else if (wcsTask.taskStatus == 6) //出库任务,小车任务是完成状态 - { - BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.equipType == 2);//提升机 - dbContext.Remove(wcsTask); - WcsTask newTask = CoreMapper.Map(wcsTask); - newTask.objid = StaticData.SnowId.NextId(); - newTask.serialNo = SystemData.GetSerialNo(dbContext); - newTask.nextPointId = nextEquip.objid; - newTask.nextPointNo = nextEquip.equipNo; - newTask.currPointId = baseEquip.objid; - newTask.currPointNo = baseEquip.equipNo; - newTask.fromFloorNo = FloorNo; - newTask.taskType = 6;//成品出库 - newTask.floorNo = 1;//出库楼层 - newTask.taskStatus = 0; - newTask.createTime = DateTime.Now; - dbContext.Add(newTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); - dbContext.WcsTaskLog.Add(wcsTaskLog); - dbContext.SaveChanges(); + } + else if (wcsTask.taskStatus == 6) //出库任务,小车任务是完成状态 + { + BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.equipType == 2);//提升机 + dbContext.Remove(wcsTask); + WcsTask newTask = CoreMapper.Map(wcsTask); + newTask.objid = StaticData.SnowId.NextId(); + newTask.serialNo = SystemData.GetSerialNo(dbContext); + newTask.nextPointId = nextEquip.objid; + newTask.nextPointNo = nextEquip.equipNo; + newTask.currPointId = baseEquip.objid; + newTask.currPointNo = baseEquip.equipNo; + newTask.fromFloorNo = FloorNo; + newTask.taskType = 6;//成品出库 + newTask.floorNo = 1;//出库楼层 + newTask.taskStatus = 0; + newTask.createTime = DateTime.Now; + dbContext.Add(newTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); + dbContext.WcsTaskLog.Add(wcsTaskLog); + dbContext.SaveChanges(); + } } } } diff --git a/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs index 6bfda69..17180d4 100644 --- a/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs @@ -55,7 +55,7 @@ namespace Khd.Core.Wcs.Wcs if (Convert.ToInt32(isSignal) == 1)//托盘到位 { WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == 4).FirstOrDefault(); - if(wcsTask!= null) + if (wcsTask != null) { if (wcsTask.taskStatus == 5)//提升机上来的 { @@ -65,9 +65,9 @@ namespace Khd.Core.Wcs.Wcs } else { - bool hasTask = dbContext.WcsTask.Where(t => t.currPointId == 4).Any(); + bool hasTask = dbContext.WcsTask.Where(t => t.currPointId == 4 || (t.endPointId == 4 && t.taskStatus > 0)).Any(); BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 4); - BaseEquip nextEquip = StaticData.BaseEquip.First(t=>t.objid==6); + BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.objid == 6); if (!hasTask) { MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == rfid).FirstOrDefault(); @@ -79,6 +79,10 @@ namespace Khd.Core.Wcs.Wcs var TargetFloor = dbContext.WmsBaseWarehouse.Where(t => t.warehouseId == warehouseId).FirstOrDefault(); if (TargetFloor != null) { + if (TargetFloor.warehouseFloor == Floor) + { + continue; + } var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.agvType == "I" && t.dicField == TargetFloor.warehouseInstockType).FirstOrDefault(); if (dic != null) { @@ -121,7 +125,7 @@ namespace Khd.Core.Wcs.Wcs { if (ex is PlcException) { - + } else {