diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index 10b0974..0adfe0b 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -41,6 +41,13 @@ namespace Khd.Core.Wcs.Wcs //createRemoveThread.Name = "CreateRemoveLogic"; //createRemoveThread.Start(); + //二楼、五楼人工指定库位成品出库任务 + var CreateProductTaskByLocationCodeThread = new Thread(CreateProductTaskByLocationCodeLogic); + CreateProductTaskByLocationCodeThread.IsBackground = true; + CreateProductTaskByLocationCodeThread.Name = "CreateFiveProductTaskLogic"; + CreateProductTaskByLocationCodeThread.Start(); + + //创建退库任务 var stockReturnThread = new Thread(StockReturnLogic); stockReturnThread.IsBackground = true; @@ -134,7 +141,7 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.executeStatus == "0") .Where(t => t.outstockAmount > t.realOutstockAmount) .Where(t => t.taskType == "5") - .Where(t => t.operationType =="0") + .Where(t => t.operationType == "0") .Where(t => t.auditStatus == "1") .ToList(); @@ -143,7 +150,7 @@ namespace Khd.Core.Wcs.Wcs { var locations = dbContext.WmsBaseLocation .Where(t => rawOutStock.Select(x => x.locationCode).Contains(t.locationCode)) - .AsEnumerable() + .AsEnumerable() .OrderBy(x => x.locDeep == 2 ? 0 : 99) .Select((loc, index) => new { loc.locationCode, Index = index }) .ToDictionary(item => item.locationCode, item => item.Index); @@ -1358,7 +1365,7 @@ namespace Khd.Core.Wcs.Wcs .Where(t => wmsRawStockLocations.Contains(t.locationCode)) .WhereIf(!string.IsNullOrEmpty(wcsTaskManual.startPointNo), t => t.locationCode == wcsTaskManual.startPointNo) .ToList(); - + //手动模式 if (!string.IsNullOrEmpty(wcsTaskManual.startPointNo)) { @@ -1388,7 +1395,7 @@ namespace Khd.Core.Wcs.Wcs } } bill = bill.OrderBy(t => list.Contains(t.a.locationCode) ? 0 : 1).OrderBy(t => t.b.instockDate.Value.Date);//按某个时间段 - //#endregion + //#endregion foreach (var item in bill) { @@ -1442,7 +1449,7 @@ namespace Khd.Core.Wcs.Wcs WmsBaseLocation? toLocation = null; var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == fromBaseLocation.warehouseId) - .Where(t => t.warehouseId != fromBaseLocation.locationId) + .Where(t => t.locationId != fromBaseLocation.locationId) .Where(t => string.IsNullOrEmpty(t.containerCode)).OrderBy(t => t.locDeep).ToList(); foreach (WmsBaseLocation itemLocation in moveLocationList) @@ -1608,7 +1615,7 @@ namespace Khd.Core.Wcs.Wcs useFlag = 1, qty = 1 }; - + SystemData.LockOutLocation(wmsBaseLocation, dbContext); wmsBaseLocation.locationStatus = "6"; dbContext.Update(wmsBaseLocation); @@ -1727,6 +1734,278 @@ namespace Khd.Core.Wcs.Wcs } } + + #region 2楼、3楼指定库位成品出库 + /// + /// 人工指定库位成品出库 + /// 二楼、五楼指定库位成品出库任务 + /// + private void CreateProductTaskByLocationCodeLogic() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + dbContext.ChangeTracker.Clear(); + + bool fiveTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any(); + if (!fiveTask) + { + var fiveProOutStock = dbContext.WmsProductOutstock + .Where(t => t.outstockQty < t.applyQty) + .Where(t => t.auditStatus == "1") + .Where(t => t.warehouseId == 531) + .Where(t => t.operationType == "1") //不指定库位0,指定库位1 + .Where(t => t.productType == "3") + .Where(t => t.executeStatus == "0" || t.executeStatus == "1").FirstOrDefault(); + //创建任务 + if (fiveProOutStock != null) + { + CreateTask(fiveProOutStock); + } + } + bool twoTask = dbContext.WcsTask.Where(t => t.nextPointId == 8 && t.taskStatus <= 7).Any(); + if (!twoTask) + { + var twoProOutStock = dbContext.WmsProductOutstock + .Where(t => t.outstockQty < t.applyQty) + .Where(t => t.auditStatus == "1") + .Where(t => t.warehouseId == 231) + .Where(t => t.operationType == "1") //不指定库位0,指定库位1 + .Where(t => t.productType == "3") + .Where(t => t.executeStatus == "0" || t.executeStatus == "1").FirstOrDefault(); + + //创建任务 + if (twoProOutStock != null) + { + CreateTask(twoProOutStock); + } + } + + + } + catch (Exception ex) + { + Console.WriteLine(ex.Message + ex.StackTrace); + _logger.Error(ex.Message + "\n" + ex.StackTrace); + } + Thread.Sleep(5000); + } + } + + /// + /// 二楼、五楼指定库位根据申请单成品出库任务 + /// + /// + private void CreateTask(WmsProductOutstock wmsProductOutstock) + { + try + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + + BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == (wmsProductOutstock.warehouseId == 531 ? 28 : 8)); + + BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == (wmsProductOutstock.warehouseId == 531 ? 5 : 1)); + List AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == wmsProductOutstock.warehouseId).ToList(); + List details = dbContext.WmsProductOutstockDetail.Where(t => t.productOutstockId == wmsProductOutstock.productOutstockId).ToList(); + if (details.Count == 0) return; + var locationCodes = details.Select(t => t.locationCode).Distinct().ToList(); + //待出库列表 + List baseLocations = AllWmsBaseLocations.Where(t => locationCodes.Contains(t.locationCode) && t.warehouseId == wmsProductOutstock.warehouseId).ToList(); + + baseLocations = baseLocations.OrderByDescending(t => t.locDeep).ToList(); // 浅库位优先 + //目标出库库位 + WmsBaseLocation targetLocation = null; + foreach (var item in baseLocations) + { + //二次校验任务 + bool hasTask = false; + if (wmsProductOutstock.warehouseId == 531) + { + hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any(); + } + else + { + hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 8 && t.taskStatus <= 7).Any(); + } + if (hasTask) + { + continue; + } + + if (item.locDeep == 2 && item.locationStatus == "1" && !string.IsNullOrEmpty(item.containerCode)) + { // 浅库位满足条件直接出 + targetLocation = item; + break; + } + if (item.locDeep == 1 && item.locationStatus == "1" && !string.IsNullOrEmpty(item.containerCode)) //深库位出库 ,若浅库位有东西需要移库 + { + // 计算对应浅库位坐标 + int? locRow = item.locRow % 2 == 0 ? item.locRow - 1 : item.locRow + 1; + // 外侧浅库位 + WmsBaseLocation? wmsBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == locRow) + .Where(t => t.locColumn == item.locColumn) + .Where(t => t.warehouseId == item.warehouseId).FirstOrDefault(); + if (wmsBaseLocation.locationStatus == "1" && !string.IsNullOrEmpty(wmsBaseLocation.containerCode)) + { //移库 + + #region 找寻移库目标库位 + + WmsBaseLocation? toLocation = null; + + var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == item.warehouseId) + .Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList(); + + foreach (WmsBaseLocation itemLocation in moveLocationList) + { + + if (itemLocation.locDeep == 1) + { + bool hasLocation = AllWmsBaseLocations + .Where(t => t.locRow == (itemLocation.locRow % 2 == 1 ? (itemLocation.locRow + 1) : (itemLocation.locRow - 1))) + .Where(t => t.locColumn == itemLocation.locColumn) + .Where(t => t.locationStatus == "1" && string.IsNullOrEmpty(t.containerCode)) + .Any(); + if (!hasLocation) + { + Console.WriteLine(DateTime.Now + $":目标库位的浅库位库位状态异常,无法移库"); + _logger.Info($"目标库位的浅库位库位状态异常,无法移库"); + continue; + } + else + { + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } + + } + else + { + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } + + } + if (toLocation == null) + { + // 找寻下一个移库库位 + continue; + } + + var RemoveTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = wmsProductOutstock.productOutstockId, + taskType = wmsProductOutstock.warehouseId == 231 ? StaticTaskType.SecondRemove : StaticTaskType.FiveRemove, + containerNo = wmsBaseLocation.containerCode, + createBy = "WCS", + createTime = DateTime.Now.AddSeconds(-10), + taskStatus = 0, + materialId = wmsProductOutstock.productId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = toLocation.locationId, + endPointNo = toLocation.locationCode, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = 1 + }; + SystemData.LockOutLocation(toLocation, dbContext); + SystemData.LockOutLocation(wmsBaseLocation, dbContext); + 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); + targetLocation = item; + break; + #endregion + + } + else if(wmsBaseLocation.locationStatus == "1" && string.IsNullOrEmpty(wmsBaseLocation.containerCode)) + { + targetLocation = item; + break; + } + else if(wmsBaseLocation.locationStatus != "1") + { + //浅库位状态异常 + continue; + } + } + + } + + + WcsTask wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = wmsProductOutstock.productOutstockId, + taskType = wmsProductOutstock.warehouseId == 231 ? StaticTaskType.SecondStorageToLift : StaticTaskType.FiveProductOut, + containerNo = targetLocation.containerCode, + createBy = "WCS", + createTime = DateTime.Now, + taskStatus = 0, + materialId = wmsProductOutstock.productId, + currPointId = targetLocation.locationId, + currPointNo = targetLocation.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = endEquip.objid, + endPointNo = endEquip.equipNo, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = 1 + }; + SystemData.LockOutLocation(targetLocation, dbContext); + targetLocation.locationStatus = "6"; + targetLocation.updateBy = "WCS"; + targetLocation.updateTime = DateTime.Now; + dbContext.Update(targetLocation); + dbContext.Add(wcsTask); + + wmsProductOutstock.updateBy = "WCS"; + wmsProductOutstock.updateDate = DateTime.Now; + if (wmsProductOutstock.executeStatus == "0") + { + wmsProductOutstock.executeStatus = "1"; + wmsProductOutstock.beginTime = DateTime.Now; + } + dbContext.Update(wmsProductOutstock); + WmsProductOutstockDetail? wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(x => x.productOutstockId == wmsProductOutstock.productOutstockId && x.locationCode == targetLocation.locationCode); + if (wmsProductOutstockDetail != null) + { + wmsProductOutstockDetail.executeStatus = "1"; + wmsProductOutstockDetail.updateBy = "WCS"; + wmsProductOutstockDetail.updateDate = DateTime.Now; + wmsProductOutstockDetail.beginTime = DateTime.Now; + dbContext.Update(wmsProductOutstockDetail); + } + dbContext.SaveChanges(); + + }catch (Exception ex) + { + Console.WriteLine(ex.Message + ex.StackTrace); + _logger.Error(ex.Message + "\n" + ex.StackTrace); + } + + } + + #endregion + /// /// 成品出库 /// @@ -1851,9 +2130,9 @@ namespace Khd.Core.Wcs.Wcs WmsBaseLocation? toLocation = null; - + var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.warehouseId != location.locationId) + .Where(t => t.locationId != location.locationId) .Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList(); foreach (WmsBaseLocation itemLocation in moveLocationList) @@ -2083,7 +2362,7 @@ namespace Khd.Core.Wcs.Wcs Console.WriteLine(ex.Message + ex.StackTrace); _logger.Error(ex.Message + "\n" + ex.StackTrace); } - + Thread.Sleep(5000); } } @@ -2570,7 +2849,7 @@ namespace Khd.Core.Wcs.Wcs { //原材料库存 var rawStock = dbContext.WmsRawStock - + .Where(t => t.activeFlag == "1").ToList(); BaseEquip endStationCodeEquip = dbContext.BaseEquip.First(t => t.objid == 10); if (!string.IsNullOrEmpty(endStationCodeEquip.endStationCode) && endStationCodeEquip.IsOut == 1) @@ -2583,9 +2862,9 @@ namespace Khd.Core.Wcs.Wcs bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 11).Any(); if (!hasTask) { - + var orderList = rawOutStock.Where(t => endStationCodeEquip.endStationCode.Contains(t.endStationCode)).ToList(); - + List tasks = new(); List canOut = orderList.Select(t => t.saleOrderId).ToList(); rawStock = rawStock.Where(t => canOut.Contains(t.saleOrderId)).OrderByDescending(t => t.saleOrderId).ToList(); @@ -2946,9 +3225,9 @@ namespace Khd.Core.Wcs.Wcs // 寻找移库目的库位 WmsBaseLocation? toLocation = null; - + var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.warehouseId != location.locationId) + .Where(t => t.locationId != location.locationId) .Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList(); foreach (WmsBaseLocation itemLocation in moveLocationList) diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index 7bab694..36b5864 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -614,24 +614,33 @@ namespace Khd.Core.Wcs.Wcs wmsProductOutstock.endTime = DateTime.Now; wmsProductOutstock.executeStatus = "2"; } - - - WmsProductOutstockDetail newWmsProductOutstockDetail = new WmsProductOutstockDetail(); - newWmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId; - newWmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId; - newWmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode; - newWmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch; - newWmsProductOutstockDetail.productId = wmsProductStock.productId; - newWmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty; - newWmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty; - newWmsProductOutstockDetail.executeStatus = "2"; - newWmsProductOutstockDetail.updateBy = "WCS"; - newWmsProductOutstockDetail.updateDate = DateTime.Now; - newWmsProductOutstockDetail.beginTime = DateTime.Now; - newWmsProductOutstockDetail.endTime = DateTime.Now; - - - + + WmsProductOutstockDetail? wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(x => x.productOutstockId == wmsProductOutstock.productOutstockId && x.locationCode == item.currPointId.ToString()); + if (wmsProductOutstockDetail != null) + { //人工出库,mes会自动插入,wcs只需要更新即可 + wmsProductOutstockDetail.outstockAmount = 1; + wmsProductOutstockDetail.executeStatus = "2"; + wmsProductOutstockDetail.updateDate = DateTime.Now; + wmsProductOutstockDetail.endTime = DateTime.Now; + dbContext.Update(wmsProductOutstockDetail); + } + else + { + wmsProductOutstockDetail = new WmsProductOutstockDetail(); + wmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId; + wmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId; + wmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode; + wmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch; + wmsProductOutstockDetail.productId = wmsProductStock.productId; + wmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty; + wmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty; + wmsProductOutstockDetail.executeStatus = "2"; + wmsProductOutstockDetail.updateBy = "WCS"; + wmsProductOutstockDetail.updateDate = DateTime.Now; + wmsProductOutstockDetail.beginTime = DateTime.Now; + wmsProductOutstockDetail.endTime = DateTime.Now; + dbContext.Add(wmsProductOutstockDetail); + } wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.containerCode = null; wmsBaseLocation.updateTime = DateTime.Now; @@ -648,8 +657,7 @@ namespace Khd.Core.Wcs.Wcs newTask.fromFloorNo = 5; newTask.floorNo = 1; newTask.taskStatus = 6; - newTask.objid = StaticData.SnowId.NextId(); - dbContext.Add(newWmsProductOutstockDetail); + newTask.objid = StaticData.SnowId.NextId(); dbContext.Remove(item); dbContext.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs index 1029814..9947cd3 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs @@ -857,23 +857,33 @@ namespace Khd.Core.Wcs.Wcs wmsProductOutstock.endTime = DateTime.Now; wmsProductOutstock.executeStatus = "2"; } - - - WmsProductOutstockDetail newWmsProductOutstockDetail = new WmsProductOutstockDetail(); - newWmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId; - newWmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId; - newWmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode; - newWmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch; - newWmsProductOutstockDetail.productId = wmsProductStock.productId; - newWmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty; - newWmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty; - newWmsProductOutstockDetail.executeStatus = "2"; - newWmsProductOutstockDetail.updateBy = "WCS"; - newWmsProductOutstockDetail.updateDate = DateTime.Now; - newWmsProductOutstockDetail.beginTime = DateTime.Now; - newWmsProductOutstockDetail.endTime = DateTime.Now; - - + WmsProductOutstockDetail? wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(x=>x.productOutstockId== wmsProductOutstock.productOutstockId && x.locationCode== item.currPointId.ToString()); + if (wmsProductOutstockDetail != null) + { //人工出库,mes会自动插入,wcs只需要更新即可 + wmsProductOutstockDetail.outstockAmount = 1; + wmsProductOutstockDetail.executeStatus = "2"; + wmsProductOutstockDetail.updateDate = DateTime.Now; + wmsProductOutstockDetail.endTime = DateTime.Now; + dbContext.Update(wmsProductOutstockDetail); + } + else + { + wmsProductOutstockDetail = new WmsProductOutstockDetail(); + wmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId; + wmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId; + wmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode; + wmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch; + wmsProductOutstockDetail.productId = wmsProductStock.productId; + wmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty; + wmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty; + wmsProductOutstockDetail.executeStatus = "2"; + wmsProductOutstockDetail.updateBy = "WCS"; + wmsProductOutstockDetail.updateDate = DateTime.Now; + wmsProductOutstockDetail.beginTime = DateTime.Now; + wmsProductOutstockDetail.endTime = DateTime.Now; + dbContext.Add(wmsProductOutstockDetail); + } + wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.containerCode = null; item.nextPointId = 2; @@ -881,7 +891,7 @@ namespace Khd.Core.Wcs.Wcs SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); dbContext.Remove(wmsProductStock); dbContext.Update(wmsBaseLocation); - dbContext.Add(newWmsProductOutstockDetail); + dbContext.Update(wmsProductOutstock); dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 }); diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml b/src/Khd.Core.Wpf/Form/FormBoardT.xaml index 949af06..71d679f 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml @@ -2172,7 +2172,7 @@ - + @@ -2182,7 +2182,7 @@ - + @@ -2194,9 +2194,9 @@ - - - + + +