diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index 10990ca..54e064d 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -32,10 +32,10 @@ namespace Khd.Core.Wcs.Wcs /// public void StartPoint() { - var createRemoveThread = new Thread(CreateRemoveLogic); - createRemoveThread.IsBackground = true; - createRemoveThread.Name = "CreateRemoveLogic"; - createRemoveThread.Start(); + //var createRemoveThread = new Thread(CreateRemoveLogic); + //createRemoveThread.IsBackground = true; + //createRemoveThread.Name = "CreateRemoveLogic"; + //createRemoveThread.Start(); //背负式Agv返库任务 var createBearAgvReturnThread = new Thread(CreateBearAgvReturnLogic); @@ -99,7 +99,7 @@ namespace Khd.Core.Wcs.Wcs { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); - List cannotIn=new List(); + List cannotIn = new List(); while (true) { try @@ -155,14 +155,13 @@ namespace Khd.Core.Wcs.Wcs var outBill = from a in bill//深库位托盘和当前任务绑定物料一致的托盘库位 from b in wmsBaseLocations//所有库位 - where a.b.layerNum == b.layerNum//层数相同 - && b.locDeep == 2//浅库位 + 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;//先找相同物料的外侧库位 + 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)//如果找到库位,生成入库任务 @@ -270,8 +269,7 @@ namespace Khd.Core.Wcs.Wcs var outBill = from a in bill//深库位托盘和当前任务绑定物料一致的托盘库位 from b in wmsBaseLocations//所有库位 - where a.b.layerNum == b.layerNum//层数相同 - && b.locDeep == 2//浅库位 + 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//列数相同 @@ -354,49 +352,122 @@ namespace Khd.Core.Wcs.Wcs try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); - WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.useFlag == 0 && t.currPointId == 29).FirstOrDefault(); - if (wcsTask != null) + BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 29); + if (baseEquip.emptyCount == 1) { - WmsRawInstock? wmsRawInstock = dbContext.WmsRawInstock.Where(t => t.warehouseId == 511 && t.instockType == "2" && t.executeStatus == "0").FirstOrDefault(); - if (wmsRawInstock != null) + WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == 28).FirstOrDefault(); + if (wcsTask == null) { - MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wcsTask.containerNo); - if (mesBasePalletInfo != null) + WmsRawInstock? wmsRawInstock = dbContext.WmsRawInstock.Where(t => t.warehouseId == 511 && t.instockType == "2" && t.executeStatus == "0").FirstOrDefault(); + if (wmsRawInstock != null) { - MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); - if (mesBaseBarcodeInfo != null) + MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsRawInstock.palletInfoCode); + if (mesBasePalletInfo != null) { - WmsRawInstockDetail wmsRawInstockDetail = new WmsRawInstockDetail + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); + if (mesBaseBarcodeInfo != null) { - rawInstockDetailId = StaticData.SnowId.NextId(), - stackAmount = 1, - erpStatus = "0", - executeStatus = "1", - qualityStatus = "0", - activeFlag = "1", - createBy = "WCS", - createDate = DateTime.Now, - erpAmount = 0, - instockAmount = 1, - instockBatch = mesBasePalletInfo.materialBarcode, - instockTime = DateTime.Now, - instockWay = "2", - locationCode = wcsTask.endPointNo, - machineName = mesBaseBarcodeInfo.machineName, - materialBarcode = mesBasePalletInfo.materialBarcode, - materialId = mesBaseBarcodeInfo.materialId, - materialProductionDate = mesBaseBarcodeInfo.productionDate, - planAmount = 1, - poNo = mesBaseBarcodeInfo.poNo, - rawInstockId = wmsRawInstock.rawInstockId, - taskCode = wmsRawInstock.taskCode, - }; - dbContext.Add(wmsRawInstockDetail); - wmsRawInstock.executeStatus = "1"; - wcsTask.useFlag = 1; - dbContext.Update(wmsRawInstock); - dbContext.Update(wcsTask); - dbContext.SaveChanges(); + var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == 5) + .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") + .OrderByDescending(t => t.locColumn) + .ToList(); + + 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 == mesBasePalletInfo.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) 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.FirstOrDefault()?.b;//先找相同物料的外侧库位 + wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位 + wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位 + //深浅库位问题?库位入库优先级等 + + var AgvEquip = StaticData.BaseEquip.First(t => t.objid == 28);//5楼叉车 + if (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) + { + Console.WriteLine(DateTime.Now + $":目标库位{wmsBaseLocation.locationCode}的浅库位库位状态异常,无法入库"); + _logger.Info($"目标库位{wmsBaseLocation.locationCode}的浅库位库位状态异常,无法入库"); + continue; + } + } + WcsTask newTask = new 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.containerNo = mesBasePalletInfo.palletInfoCode; + newTask.materialId = mesBasePalletInfo.materialId; + newTask.objid = StaticData.SnowId.NextId(); + newTask.createTime = DateTime.Now; + newTask.taskType = 28; + newTask.useFlag = 1; + wmsBaseLocation.locationStatus = "2"; + WmsRawInstockDetail wmsRawInstockDetail = new WmsRawInstockDetail + { + rawInstockDetailId = StaticData.SnowId.NextId(), + stackAmount = 1, + erpStatus = "0", + executeStatus = "1", + qualityStatus = "0", + activeFlag = "1", + createBy = "WCS", + createDate = DateTime.Now, + erpAmount = 0, + instockAmount = 1, + instockBatch = mesBasePalletInfo.materialBarcode, + instockTime = DateTime.Now, + instockWay = "2", + locationCode = newTask.endPointNo, + machineName = mesBaseBarcodeInfo.machineName, + materialBarcode = mesBasePalletInfo.materialBarcode, + materialId = mesBaseBarcodeInfo.materialId, + materialProductionDate = mesBaseBarcodeInfo.productionDate, + planAmount = 1, + poNo = mesBaseBarcodeInfo.poNo, + rawInstockId = wmsRawInstock.rawInstockId, + taskCode = wmsRawInstock.taskCode, + }; + dbContext.Add(wmsRawInstockDetail); + dbContext.Update(wmsBaseLocation); + dbContext.Add(newTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); + dbContext.Add(wcsTaskLog); + dbContext.SaveChanges(); + } + } } } } @@ -661,6 +732,7 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") .Where(t => t.containerCode == null) + .Where(t=>t.warehouseId==521) .OrderByDescending(t => t.locColumn) .FirstOrDefault(); if (wmsBaseLocation != null) @@ -1167,7 +1239,7 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.warehouseId != location.locationId) .Where(t => string.IsNullOrEmpty(t.containerCode)) .FirstOrDefault(); - + if (toLocation != null) { if (toLocation.locDeep == 1) @@ -2025,7 +2097,7 @@ namespace Khd.Core.Wcs.Wcs .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") + if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") { WmsRawStock? wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); if (wmsRawStock != null) diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index 52c8dae..4324d27 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -37,7 +37,6 @@ namespace Khd.Core.Wcs.Wcs /// public void StartPoint() { - Thread FlowPointThread = new(MonitorInLocatorPoint); FlowPointThread.IsBackground = true; FlowPointThread.Name = "FiveFloorAGV"; @@ -59,7 +58,7 @@ namespace Khd.Core.Wcs.Wcs dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var taskList = dbContext.WcsTask .Where(t => t.useFlag == 1) - .Where(t=>t.IsDelete==0||t.IsDelete==null) + .Where(t => t.IsDelete == 0 || t.IsDelete == null) .Where(t => t.nextPointId == agvID).OrderBy(t => t.createTime).ToList(); foreach (var item in taskList) { @@ -68,6 +67,7 @@ namespace Khd.Core.Wcs.Wcs _logger.Info($"5楼AGV线程:有其他任务正在执行,跳过当前任务{item.objid}"); continue; } + item.updateTime = DateTime.Now; if (item.taskStatus == 0)//下发任务 { BaseDictionary baseDictionary = StaticData.BaseDictionary.First(t => t.objid == item.taskType); @@ -88,7 +88,7 @@ namespace Khd.Core.Wcs.Wcs continue; } BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1); - RequestAGVTaskDto agvTask = new () + RequestAGVTaskDto agvTask = new() { reqCode = StaticData.SnowId.NextId().ToString(), positionCodePath = new List @@ -416,7 +416,7 @@ namespace Khd.Core.Wcs.Wcs } else if (item.taskStatus == 5) { - + if (item.taskType == 66)//移库 { Console.WriteLine(DateTime.Now + ":五楼AGV线程完成任务" + item.currPointNo + "," + item.endPointNo); @@ -466,7 +466,7 @@ namespace Khd.Core.Wcs.Wcs { Console.WriteLine(DateTime.Now + ":五楼AGV线程完成任务" + item.currPointNo + "," + item.endPointNo); _logger.Info("五楼Agv完成任务成功:" + item.ToJsonString()); - var wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(t => t.productOutstockId == item.orderId&&t.executeStatus == "1" && t.locationCode == item.currPointNo); + var wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(t => t.productOutstockId == item.orderId && t.executeStatus == "1" && t.locationCode == item.currPointNo); var wmsProductOutstock = dbContext.WmsProductOutstock.FirstOrDefault(t => t.productOutstockId == item.orderId); if (wmsProductOutstockDetail != null && wmsProductOutstock != null) { @@ -519,6 +519,7 @@ namespace Khd.Core.Wcs.Wcs WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.containerCode = null; + wmsBaseLocation.returnFlag = "0"; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; dbContext.Update(wmsRawOutstock); @@ -590,7 +591,7 @@ namespace Khd.Core.Wcs.Wcs } } - else if (item.taskType == 46)//该任务结束后,立刻生成一个新的返库任务,但是是否使用标志未0,等待mes通知 + else if (item.taskType == 46)//原材料到柜体拆分 { Console.WriteLine(DateTime.Now + ":五楼AGV线程完成任务" + item.currPointNo + "," + item.endPointNo); _logger.Info("五楼Agv完成任务成功:" + item.ToJsonString()); @@ -604,55 +605,16 @@ namespace Khd.Core.Wcs.Wcs dbContext.Update(wmsRawOutStock); dbContext.Update(wmsRawOutstockDetail); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); - wmsBaseLocation.locationStatus = "2"; + wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.containerCode = null; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; WmsRawStock? wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).FirstOrDefault(); if (wmsRawStock != null) { - wmsRawStock.completeFlag = "0"; - wmsRawStock.updateDate = DateTime.Now; - wmsRawStock.updateBy = "WCS"; - dbContext.Update(wmsRawStock); + dbContext.Remove(wmsRawStock); dbContext.Update(wmsBaseLocation); - if (wmsBaseLocation.locDeep == 1) - { - int? locRow = 0; - if (wmsBaseLocation.locRow % 2 == 1) - { - locRow = wmsBaseLocation.locRow + 1; - } - else - { - locRow = wmsBaseLocation.locRow - 1; - } - WmsBaseLocation? deepWmsLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == locRow) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Where(t => t.warehouseId == wmsBaseLocation.warehouseId) - .FirstOrDefault(); - if (deepWmsLocation != null) - { - deepWmsLocation.locationStatus = "2"; - dbContext.Update(deepWmsLocation); - } - } - WcsTask newTask = CoreMapper.Map(item); - newTask.objid = StaticData.SnowId.NextId(); - var currPointId = item.currPointId; - var currPointNo = item.currPointNo; - newTask.currPointId = item.endPointId; - newTask.currPointNo = item.endPointNo; - newTask.endPointId = item.currPointId; - newTask.endPointNo = item.currPointNo; - newTask.createTime = DateTime.Now; - newTask.taskType = 28; - newTask.taskStatus = 0; - newTask.useFlag = 0; dbContext.Remove(item); - WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); - dbContext.Add(newTask); - dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); } @@ -668,42 +630,48 @@ namespace Khd.Core.Wcs.Wcs wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; wmsBaseLocation.returnFlag = "1"; - var wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); - if (wmsRawStock != null) + MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == item.containerNo); + if (mesBasePalletInfo != null) { - wmsRawStock.completeFlag = "0"; - wmsRawStock.updateDate = DateTime.Now; - wmsRawStock.updateBy = "WCS"; - BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); - startEquip.emptyCount = 0; - dbContext.Update(startEquip); - dbContext.Update(wmsRawStock); - dbContext.Update(wmsBaseLocation); - if (wmsBaseLocation.locDeep == 1) + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); + if (mesBaseBarcodeInfo != null) { - int? locRow = 0; - if (wmsBaseLocation.locRow % 2 == 1) + WmsRawStock wmsRawStock = new() { - locRow = wmsBaseLocation.locRow + 1; - } - else - { - locRow = wmsBaseLocation.locRow - 1; - } - WmsBaseLocation? deepWmsLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == locRow) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Where(t => t.warehouseId == wmsBaseLocation.warehouseId) - .FirstOrDefault(); - if (deepWmsLocation != null) - { - deepWmsLocation.locationStatus = "1"; - dbContext.Update(deepWmsLocation); - } + palletInfoCode = mesBasePalletInfo.palletInfoCode, + activeFlag = "1", + createBy = "WCS", + createDate = DateTime.Now, + frozenAmount = 0, + instockDate = DateTime.Now, + locationCode = wmsBaseLocation.locationCode, + occupyAmount = 0, + warehouseFloor = 5, + stockType = "1", + totalAmount = 1, + saleOrderId = mesBaseBarcodeInfo.saleOrderId == null ? 0 : mesBaseBarcodeInfo.saleOrderId, + safeFlag = mesBaseBarcodeInfo.safeFlag, + supplierId = mesBaseBarcodeInfo.manufacturerId, + materialId = mesBasePalletInfo.materialId, + qualityStatus = "0", + rawStockId = StaticData.SnowId.NextId(), + completeFlag = "0", + instockBatch = mesBaseBarcodeInfo.barcodeInfo, + updateBy = "WCS", + updateDate = DateTime.Now, + warehouseId = 511, + }; + dbContext.Add(wmsRawStock); + BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); + startEquip.emptyCount = 0; + dbContext.Update(startEquip); + dbContext.Update(wmsBaseLocation); + dbContext.Remove(item); + dbContext.SaveChanges(); + dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); } - dbContext.Remove(item); - dbContext.SaveChanges(); - dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); } + } else if (item.taskType == 47) { @@ -764,7 +732,7 @@ namespace Khd.Core.Wcs.Wcs { if (ex is PlcException) { - + } else { diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs index 977d0b9..6661910 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs @@ -59,6 +59,7 @@ namespace Khd.Core.Wcs.Wcs foreach (var item in taskList)//出库 { + item.updateTime = DateTime.Now; if (item.taskStatus == 0)//下发任务 { BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs index 1e608be..3a6bb9c 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs @@ -367,6 +367,7 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.nextPointId == CTUID).OrderByDescending(t => t.ud1).ToList(); foreach (var item in taskList) { + item.updateTime = DateTime.Now; if (item.taskStatus == 0)//CTU会同时生成多个任务,生成就下发? { if (item.taskType == 30)//出库任务 diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs index a018e12..3a8b8cd 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs @@ -106,8 +106,7 @@ namespace Khd.Core.Wcs.Wcs var outBill = from a in bill from b in wmsBaseLocations - where a.b.layerNum == b.layerNum - && b.locDeep == 2 + 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" diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs index b170c65..42983ef 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs @@ -65,6 +65,7 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.nextPointId == EquipID).OrderBy(t => t.createTime).ToList(); foreach (var item in taskList) { + item.updateTime = DateTime.Now; if (item.taskStatus == 0)//下发任务 { BaseDictionary baseDictionary = StaticData.BaseDictionary.First(t => t.objid == item.taskType); diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs index 3805604..943dc16 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs @@ -261,8 +261,7 @@ namespace Khd.Core.Wcs.Wcs var outBill = from a in bill//深库位托盘和当前任务绑定物料一致的托盘库位 from b in wmsBaseLocations//所有库位 - where a.b.layerNum == b.layerNum//层数相同 - && b.locDeep == 2//浅库位 + 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//列数相同 @@ -276,10 +275,9 @@ namespace Khd.Core.Wcs.Wcs { if (wmsBaseLocation.locDeep == 1) { - bool hasLocation = wmsBaseLocations + var hasLocation = wmsBaseLocations .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Any(); + .Where(t => t.locColumn == wmsBaseLocation.locColumn).Any(); if (!hasLocation) { Console.WriteLine(DateTime.Now + $":目标库位{wmsBaseLocation.locationCode}的浅库位库位状态异常,无法入库"); diff --git a/src/Khd.Core.Wcs/Wcs/SystemTimer.cs b/src/Khd.Core.Wcs/Wcs/SystemTimer.cs index c45b246..f2f5af0 100644 --- a/src/Khd.Core.Wcs/Wcs/SystemTimer.cs +++ b/src/Khd.Core.Wcs/Wcs/SystemTimer.cs @@ -6,6 +6,7 @@ using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; using Masuit.Tools; using Masuit.Tools.Logging; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.IdentityModel.Tokens; @@ -252,14 +253,15 @@ namespace Khd.Core.Wcs.Wcs { try { + FiveAgvStatusLogic(); + SecondAgvLogic(); + ThirdAgvLogic(); + SendTrayMessage(); HositerLogic(); CtuLineLogic(); - ThirdAgvLogic(); FiveAgvLogic(); FiveBearAgvLogic(); CtuCmdLogic(); - SecondAgvLogic(); - SendTrayMessage(); UpdatePlcPointValue(); } catch (Exception ex) @@ -277,6 +279,40 @@ namespace Khd.Core.Wcs.Wcs } } + private void FiveAgvStatusLogic() + { + try + { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + var baseEquip = StaticData.BaseEquip.First(t => t.objid == 10); + var data = new + { + reqCode = StaticData.SnowId.NextId(), + mapCode = "EE" + }; + string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString()); + var reponse = JsonConvert.DeserializeObject(result); + if (reponse != null && reponse.code == "0") + { + var AgvCardStatus = reponse.data.First(t => t.RobotCode == "2034"); + AgvCardStatus.DateNow = DateTime.Now; + dbContext.Update(AgvCardStatus); + var BearCardStatus = reponse.data.First(t => t.RobotCode == "6011"); + BearCardStatus.DateNow = DateTime.Now; + dbContext.Update(BearCardStatus); + var CtuCardStatus = reponse.data.First(t => t.RobotCode == "8161"); + CtuCardStatus.DateNow = DateTime.Now; + dbContext.Update(CtuCardStatus); + dbContext.SaveChanges(); + } + } + catch + { + + } + } + private void SendTrayMessage() { using var scope = host.Services.CreateScope(); @@ -334,30 +370,37 @@ namespace Khd.Core.Wcs.Wcs /// private void ThirdAgvLogic() { - using var scope = host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - var baseEquip = StaticData.BaseEquip.First(t => t.objid == 9); - dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); - var basePlcs = StaticData.basePlcs.Where(t => t.Station == "3楼AGV").ToList(); - var data = new + try { - reqCode = StaticData.SnowId.NextId(), - mapCode = "BB" - }; - string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString()); - var reponse = JsonConvert.DeserializeObject(result); - if (reponse != null && reponse.code == "0") + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + var baseEquip = StaticData.BaseEquip.First(t => t.objid == 9); + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var basePlcs = StaticData.basePlcs.Where(t => t.Station == "3楼AGV").ToList(); + var data = new + { + reqCode = StaticData.SnowId.NextId(), + mapCode = "BB" + }; + string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString()); + var reponse = JsonConvert.DeserializeObject(result); + if (reponse != null && reponse.code == "0") + { + var cardStatus = reponse.data.First(t => t.RobotCode == "2032"); + cardStatus.DateNow = DateTime.Now; + dbContext.Update(cardStatus); + dbContext.SaveChanges(); + var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); + this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); + var XPlc = basePlcs.First(t => t.Name.Contains('X')); + var Ylc = basePlcs.First(t => t.Name.Contains('Y')); + this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosY.ToString(), XPlc.type); + this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); + } + } + catch { - var cardStatus = reponse.data.First(t => t.RobotCode == "2032"); - cardStatus.DateNow = DateTime.Now; - dbContext.Update(cardStatus); - dbContext.SaveChanges(); - var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); - this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); - var XPlc = basePlcs.First(t => t.Name.Contains('X')); - var Ylc = basePlcs.First(t => t.Name.Contains('Y')); - this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosY.ToString(), XPlc.type); - this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); + } } @@ -367,30 +410,37 @@ namespace Khd.Core.Wcs.Wcs /// private void SecondAgvLogic() { - using var scope = host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - var baseEquip = StaticData.BaseEquip.First(t => t.objid == 8); - dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); - var basePlcs = StaticData.basePlcs.Where(t => t.Station == "2楼AGV").ToList(); - var data = new + try { - reqCode = StaticData.SnowId.NextId(), - mapCode = "CC" - }; - string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString()); - var reponse = JsonConvert.DeserializeObject(result); - if (reponse != null && reponse.code == "0") + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + var baseEquip = StaticData.BaseEquip.First(t => t.objid == 8); + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var basePlcs = StaticData.basePlcs.Where(t => t.Station == "2楼AGV").ToList(); + var data = new + { + reqCode = StaticData.SnowId.NextId(), + mapCode = "CC" + }; + string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString()); + var reponse = JsonConvert.DeserializeObject(result); + if (reponse != null && reponse.code == "0") + { + var cardStatus = reponse.data.First(t => t.RobotCode == "2033"); + cardStatus.DateNow = DateTime.Now; + dbContext.Update(cardStatus); + dbContext.SaveChanges(); + var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); + this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); + var XPlc = basePlcs.First(t => t.Name.Contains('X')); + var Ylc = basePlcs.First(t => t.Name.Contains('Y')); + this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); + this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); + } + } + catch { - var cardStatus = reponse.data.First(t => t.RobotCode == "2033"); - cardStatus.DateNow = DateTime.Now; - dbContext.Update(cardStatus); - dbContext.SaveChanges(); - var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); - this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); - var XPlc = basePlcs.First(t => t.Name.Contains('X')); - var Ylc = basePlcs.First(t => t.Name.Contains('Y')); - this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); - this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); + } } @@ -437,8 +487,6 @@ namespace Khd.Core.Wcs.Wcs if (reponse != null && reponse.code == "0") { var cardStatus = reponse.data.First(t => t.RobotCode == "2034"); - cardStatus.DateNow = DateTime.Now; - dbContext.Update(cardStatus); var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); var XPlc = basePlcs.First(t => t.Name.Contains('X')); @@ -449,27 +497,22 @@ namespace Khd.Core.Wcs.Wcs basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼背负式").ToList(); cardStatus = reponse.data.First(t => t.RobotCode == "6011"); - cardStatus.DateNow = DateTime.Now; quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); XPlc = basePlcs.First(t => t.Name.Contains('X')); Ylc = basePlcs.First(t => t.Name.Contains('Y')); this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); - dbContext.Update(cardStatus); basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼CTU").ToList(); cardStatus = reponse.data.First(t => t.RobotCode == "8161"); - cardStatus.DateNow = DateTime.Now; quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); XPlc = basePlcs.First(t => t.Name.Contains("X")); Ylc = basePlcs.First(t => t.Name.Contains("Y")); this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); - dbContext.Update(cardStatus); - dbContext.SaveChanges(); } } diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs index 5aae2a5..24b9ac2 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs @@ -123,6 +123,7 @@ namespace Khd.Core.Wcs.Wcs var taskList = dbContext.WcsTask.Where(t => t.nextPointId == baseEquip.objid).Where(t => t.useFlag == 1).OrderBy(t => t.createTime).ToList(); foreach (var item in taskList) { + item.updateTime = DateTime.Now; if (item.taskStatus == 0) { BaseDictionary baseDictionary = StaticData.BaseDictionary.First(t => t.objid == item.taskType); diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs index a9e4684..0a51109 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs @@ -96,8 +96,7 @@ namespace Khd.Core.Wcs.Wcs var outBill = from b in wmsBaseLocations from a in bill - where a.b.layerNum == b.layerNum - && b.locDeep == 2 + 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" diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml b/src/Khd.Core.Wpf/Form/FormBoardT.xaml index 1ddc0ea..f27845f 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml @@ -1981,8 +1981,8 @@ x:Name="OutTaskNumber"> @@ -1990,7 +1990,7 @@ Header="销售订单" Binding="{Binding saleOrderId}" ElementStyle="{StaticResource dgCell}" - Width="*" + Width="2*" /> x.totalAmount) - t.Sum(x => x.frozenAmount) }); List endStationCodeOutRaw = wmsRawOutstocks.Where(t => t.endStationCode == baseEquip.endStationCode).ToList(); + List materialIds = endStationCodeOutRaw.Select(t => t.materialId).ToList(); + List mesBaseMaterialInfos = dbContext.MesBaseMaterialInfo.Where(t => materialIds.Contains(t.MaterialId)).ToList(); var bill = endStationCodeOutRaw.GroupBy(t => new { t.materialId, t.materialBatch, t.saleOrderId }) .Select(t => new { @@ -312,28 +314,30 @@ namespace Khd.Core.Wpf.Form }); var orderNumber = from a in bill from b in thisOutList + from c in mesBaseMaterialInfos where a.materialId == b.materialId && a.saleOrderId == b.saleOrderId select new { materialBatch = a.materialBatch, saleOrderId = b.saleOrderId, outstockAmount = a.outstockAmount, + materialSpec = c.MaterialSpec, realOutstockAmount = a.realOutstockAmount, thisOutAmount = b.thisOutAmount, - isSendOver = outstockAmount <= (realOutstockAmount + thisOutAmount) ? "已出完" : "未出完" + isSendOver = a.outstockAmount <= (a.realOutstockAmount + b.thisOutAmount) ? "已出完" : "未出完" }; Dispatcher.Invoke(() => { - OutTaskNumber.ItemsSource = orderNumber; - OutTaskNumber.Items.Refresh(); + this.OutTaskNumber.ItemsSource = orderNumber; + this.OutTaskNumber.Items.Refresh(); }); } else { Dispatcher.Invoke(() => { - OutTaskNumber.ItemsSource = null; - OutTaskNumber.Items.Refresh(); + this.OutTaskNumber.ItemsSource = null; + this.OutTaskNumber.Items.Refresh(); }); } }