using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library.Mapper; using Khd.Core.Wcs.Global; using Masuit.Tools; using Masuit.Tools.Logging; using Microsoft.CodeAnalysis; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using SixLabors.ImageSharp; using System.Data; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { /// /// 根据出入库记录创建出入库任务 /// public class CreateTaskByRecord { private readonly IHost _host; public CreateTaskByRecord(IHost host) { this._host = host; } /// /// 启动上件扫描监听 /// public void StartPoint() { ////背负式Agv返库任务 //var createBearAgvReturnThread = new Thread(CreateBearAgvReturnLogic); //createBearAgvReturnThread.Start(); ////五楼半成品入库任务 //var createFiveProductInTaskThread = new Thread(CreateFiveProductInTaskLogic); //createFiveProductInTaskThread.Start(); ////五楼成品出库任务 //var createFiveProductTaskThread = new Thread(CreateFiveProductTaskLogic); //createFiveProductTaskThread.Start(); ////五楼CTU出库任务以及原材料出库任务 //var createRawTaskThread = new Thread(CreateRawTaskLogic); //createRawTaskThread.Start(); ////五楼柜体拆分返库任务 //var createRawInThread = new Thread(CreateRawInTaskLogic); //createRawInThread.Start(); ////三楼去翻转机任务 //var createThirdOutTaskThread = new Thread(CreateThirdOutTaskLogic); //createThirdOutTaskThread.Start(); //二楼成品出库任务 var CreateSecondProductTaskThread = new Thread(CreateSecondProductTaskLogic); CreateSecondProductTaskThread.Start(); ////三楼托盘收集架满5个或10个时出库合盘任务 //var createEmptyTrayThread = new Thread(CreateEmptyTrayLogic); //createEmptyTrayThread.Start(); ////二楼废品区人工调度任务 //var createThirdWasterTaskThread = new Thread(CreateThirdWasterTaskLogic); //createThirdWasterTaskThread.Start(); Console.WriteLine(DateTime.Now + ":出库任务监听启动成功"); LogManager.Info("出库任务监听启动成功"); } private void CreateRawInTaskLogic(object? obj) { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { 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) { WmsRawInstock? wmsRawInstock = dbContext.WmsRawInstock.Where(t => t.warehouseId == 511 && t.instockType == "2" && t.executeStatus == "0").FirstOrDefault(); if (wmsRawInstock != null) { MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wcsTask.containerNo); if (mesBasePalletInfo != null) { MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != null) { 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 = 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(); } } } } } catch (Exception ex) { LogManager.Error(ex); } Thread.Sleep(5000); } } /// /// 根据人工任务生成可执行任务 /// /// private void CreateThirdWasterTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 9).Any(); if (!hasTask) { WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.nextPointId == 9 || t.nextPointId == 8).OrderBy(t => t.createBy).FirstOrDefault(); if (wcsTaskManual != null) { WcsTask wcsTask = CoreMapper.Map(wcsTaskManual); wcsTask.createTime = DateTime.Now; WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.Remove(wcsTaskManual); dbContext.SaveChanges(); } } } catch (Exception ex) { LogManager.Error(ex); } Thread.Sleep(5000); } } /// /// 3楼托盘库 /// /// private void CreateEmptyTrayLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 9); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); bool canCreate = dbContext.WcsTask.Where(t => t.nextPointId == 9).Where(t=>t.taskStatus<5).Any(); if (!canCreate) { BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 35); //if (baseEquip.emptyCount == (SystemData.maxTray / 2)) //{ // var endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 1 && t.emptyCount == (SystemData.maxTray / 2)); // if (endEquip != null) // { // var wcsTask = new WcsTask() // { // objid = StaticData.SnowId.NextId(), // serialNo = SystemData.GetSerialNo(dbContext), // taskType = 40, // nextPointId = agvEquip.objid, // nextPointNo = agvEquip.equipNo, // endPointId = baseEquip.objid, // endPointNo = baseEquip.equipNo, // currPointId = endEquip.objid, // currPointNo = endEquip.equipNo, // equipmentNo = agvEquip.equipNo, // useFlag = 1, // qty = 5, // isEmpty = "1", // taskStatus = 0, // createBy = "WCS", // createTime = DateTime.Now, // floorNo = 3, // fromFloorNo = 3, // masterId = 0, // orderId = 0, // materialId = 0, // }; // WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); // dbContext.Add(wcsTask); // dbContext.Add(wcsTaskLog); // dbContext.SaveChanges(); // } // else // { // endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 0 && t.emptyCount == 0); // if (endEquip != null) // { // var wcsTask = new WcsTask() // { // objid = StaticData.SnowId.NextId(), // serialNo = SystemData.GetSerialNo(dbContext), // taskType = 43, // nextPointId = agvEquip.objid, // nextPointNo = agvEquip.equipNo, // endPointId = endEquip.objid, // endPointNo = endEquip.equipNo, // currPointId = baseEquip.objid, // currPointNo = baseEquip.equipNo, // equipmentNo = agvEquip.equipNo, // useFlag = 1, // qty = 5, // isEmpty = "1", // taskStatus = 0, // createBy = "WCS", // createTime = DateTime.Now, // floorNo = 3, // fromFloorNo = 3, // masterId = 0, // orderId = 0, // materialId = 0, // }; // WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); // dbContext.Add(wcsTask); // dbContext.Add(wcsTaskLog); // dbContext.SaveChanges(); // } // } //} //else if (baseEquip.emptyCount == SystemData.maxTray) { var endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 0 && t.emptyCount == 0); if (endEquip != null) { var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), serialNo = SystemData.GetSerialNo(dbContext), taskType = 43, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, endPointId = endEquip.objid, endPointNo = endEquip.equipNo, currPointId = baseEquip.objid, currPointNo = baseEquip.equipNo, equipmentNo = agvEquip.equipNo, useFlag = 1, qty = SystemData.maxTray, isEmpty = "1", taskStatus = 0, createBy = "WCS", createTime = DateTime.Now, floorNo = 3, fromFloorNo = 3, masterId = 0, orderId = 0, materialId = 0, }; WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } } } } catch (Exception ex) { LogManager.Error(ex); } Thread.Sleep(5000); } } /// /// 背负式Agv退库 /// private void BackReturnTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.taskType == 28).FirstOrDefault(); if (wcsTask != null) { WmsRawInstock? wmsRawInstock = dbContext.WmsRawInstock.Where(t => t.instockType == "2" && t.warehouseId == 511 && t.executeStatus == "0").FirstOrDefault(); if (wmsRawInstock != null) { wcsTask.useFlag = 1; wcsTask.createTime = DateTime.Now; wmsRawInstock.executeStatus = "1"; wmsRawInstock.beginTime = DateTime.Now; WmsRawInstockDetail wmsRawInstockDetail = new WmsRawInstockDetail() { rawInstockDetailId = StaticData.SnowId.NextId(), rawInstockId = wmsRawInstock.rawInstockId, instockWay = "2", activeFlag = "1", stackAmount = 1, createBy = "WCS", createDate = DateTime.Now, materialId = wmsRawInstock.materialId, instockAmount = 1, executeStatus = "0", }; dbContext.Update(wmsRawInstock); dbContext.Update(wcsTask); dbContext.SaveChanges(); } } } catch { } } /// /// 半成品入库 /// /// private void CreateFiveProductInTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 30); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); bool task = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any(); if (!task) { var wmsProductInstock = dbContext.WmsProductInstock .Where(t => t.productType == "2") .Where(t => t.auditStatus == "1") .Where(t => t.warehouseId == 521) .FirstOrDefault(); if (wmsProductInstock != null && wmsProductInstock.executeStatus == "0") { var wmsBaseLocation = dbContext.WmsBaseLocation .Where(t => t.warehouseId == 521) .Where(t => t.activeFlag == "1") .Where(t => t.instockFlag == "0") .Where(t => t.outstockFlag == "0") .Where(t => t.locationStatus == "1") .Where(t => t.containerCode == null) .OrderByDescending(t => t.locColumn) .FirstOrDefault(); if (wmsBaseLocation != null) { var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), serialNo = SystemData.GetSerialNo(dbContext), taskType = 34, endPointId = wmsBaseLocation.locationId, endPointNo = wmsBaseLocation.locationCode, currPointId = endEquip.objid, currPointNo = endEquip.equipNo, equipmentNo = agvEquip.equipNo, useFlag = 1, qty = 1, containerNo = wmsProductInstock.palletInfoCode, taskStatus = 0, createBy = "WCS", createTime = DateTime.Now, floorNo = 5, fromFloorNo = 5, isEmpty = "0", masterId = wmsProductInstock.productId, orderId = wmsProductInstock.productInstockId, materialId = wmsProductInstock.productId, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, materialBarcode = wmsProductInstock.productBatch, }; WmsProductInstockDetail wmsProductInstockDetail = new WmsProductInstockDetail() { erpAmount = 0, productId = wmsProductInstock.productId, executeStatus = "1", productInstockDetailId = StaticData.SnowId.NextId(), instockAmount = 1, instockBy = "WCS", instockDate = DateTime.Now, instockWay = "2", locationCode = wmsBaseLocation.locationCode, planAmount = 1, productBarcode = wmsProductInstock.productBatch, productBatch = wmsProductInstock.productBatch, productInstockId = wmsProductInstock.productInstockId, }; WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); wmsProductInstock.executeStatus = "1"; wmsBaseLocation.instockFlag = "1"; wmsBaseLocation.locationStatus = "4"; dbContext.Add(wmsProductInstockDetail); dbContext.Update(wmsProductInstock); dbContext.Update(wmsBaseLocation); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } } } } catch (Exception ex) { LogManager.Error(ex); } Thread.Sleep(5000); } } /// /// 创建去翻转机的任务 /// /// /// private void CreateThirdOutTaskLogic() { BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 31); BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == 9); using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); bool task = dbContext.WcsTask.Where(t => t.nextPointId == 9 && t.taskStatus <= 5).Any(); if (!task) { endEquip = dbContext.BaseEquip.First(t => t.objid == 31); if (endEquip.emptyCount == 0) { WcsTask? wcsTask = dbContext.WcsTask.FirstOrDefault(t => t.endPointId == endEquip.objid); if (wcsTask == null) { WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.taskType == 999).FirstOrDefault(); if (wcsTaskManual != null) { var wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.rawOutstockId == wcsTaskManual.orderId); if (wmsRawOutstock != null) { var wmsRawStocks = dbContext.WmsRawStock .Where(t => t.saleOrderId == wmsRawOutstock.saleOrderId) .Where(t => t.warehouseId == 311) .ToList(); var AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == 311).ToList(); var wmsBaseLocations = AllWmsBaseLocations .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.instockFlag == "0") .Where(t => t.outstockFlag == "0") .Where(t => t.warehouseId == 311) .OrderByDescending(t=>t.locRow) .ThenByDescending(t=>t.locColumn) .ToList(); var bill = from a in wmsBaseLocations from b in wmsRawStocks where a.locationCode == b.locationCode select new { a, b }; WmsBaseLocation? wmsBaseLocation = null; WmsRawStock? wmsRawStock = null; bill = bill.OrderBy(t => t.b.instockDate); var fistbill = bill.FirstOrDefault(); if (fistbill != null) { int? locRow = 0; if (fistbill.a.locRow % 2 == 1) { locRow = fistbill.a.locRow + 1; } else { locRow = fistbill.a.locRow - 1; } var lastbill = bill.Where(t => t.a.locRow == locRow) .Where(t => t.a.locColumn == fistbill.a.locColumn) .Where(t => t.a.locDeep == 2) .FirstOrDefault(); wmsBaseLocation = fistbill.a; if (lastbill != null) { if (lastbill.b.instockDate != null && fistbill.b.instockDate != null) { if (wmsBaseLocation.locDeep == 1) { int? row = 0; if (wmsBaseLocation.locRow % 2 == 1) { row = wmsBaseLocation.locRow + 1; } else { row = wmsBaseLocation.locRow - 1; } var lowLocationBill = bill.Where(t => t.a.locRow == locRow).Where(t => t.a.locColumn == wmsBaseLocation.locColumn).Where(t => t.a.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault(); if (lowLocationBill != null) { wmsBaseLocation = lowLocationBill.a; } else { WmsBaseLocation? fromBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == row) .Where(t => t.locColumn == wmsBaseLocation.locColumn) .Where(t => t.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault(); if (fromBaseLocation != null && !string.IsNullOrEmpty(fromBaseLocation.containerCode)) { WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId) .Where(t => t.locDeep == 1) .Where(t => string.IsNullOrEmpty(t.containerCode)) .Where(t=>t.locColumn>wmsBaseLocation.locColumn) .OrderBy(t => t.locColumn) .FirstOrDefault(); toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId) .Where(t => t.locDeep == 1) .Where(t => string.IsNullOrEmpty(t.containerCode)) .Where(t => t.locColumn < wmsBaseLocation.locColumn) .OrderByDescending(t => t.locColumn) .FirstOrDefault(); toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId) .Where(t => t.warehouseId != wmsBaseLocation.locationId) .Where(t => string.IsNullOrEmpty(t.containerCode)) .FirstOrDefault(); if (toLocation != null) { var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), taskType = 67, containerNo = fromBaseLocation.containerCode, createBy = "WCS", createTime = DateTime.Now.AddSeconds(-10), taskStatus = 0, currPointId = fromBaseLocation.locationId, currPointNo = fromBaseLocation.locationCode, nextPointId = baseEquip.objid, nextPointNo = baseEquip.equipNo, endPointId = toLocation.locationId, endPointNo = toLocation.locationCode, equipmentNo = baseEquip.equipNo, useFlag = 1, qty = 1 }; toLocation.locationStatus = "4"; toLocation.instockFlag = "1"; toLocation.updateBy = "WCS"; toLocation.updateTime = DateTime.Now; fromBaseLocation.updateBy = "WCS"; fromBaseLocation.updateTime = DateTime.Now; fromBaseLocation.outstockFlag = "1"; fromBaseLocation.locationStatus = "4"; dbContext.Update(toLocation); dbContext.Update(fromBaseLocation); dbContext.Add(RemoveTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); dbContext.Add(wcsTaskLog); } } } } } } if (wmsBaseLocation != null) { wmsRawStock = wmsRawStocks.Where(t => t.locationCode == wmsBaseLocation.locationCode).First(); MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsRawStock.palletInfoCode); if (mesBasePalletInfo != null) { MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != null) { WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail() { rawOutstockDetailId = StaticData.SnowId.NextId(), createBy = "WCS", createDate = DateTime.Now, executeStatus = "0", erpAmount = 0, erpStatus = "0", instockBatch = mesBaseBarcodeInfo.batchCode, stackAmount = 1, locationCode = wmsBaseLocation.locationCode, rawOutstockId = wmsRawOutstock.rawOutstockId, planAmount = 1, outstockWay = "2", outstockPerson = "WCS", outstockTime = DateTime.Now, materialProductionDate = mesBaseBarcodeInfo.productionDate, materialBarcode = mesBasePalletInfo.materialBarcode, materialId = wmsRawOutstock.materialId, machineName = mesBaseBarcodeInfo.machineName, outstockAmount = 1, taskCode = wmsRawOutstock.taskCode }; wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = wmsRawOutstock.rawOutstockId, taskType = 41, containerNo = wmsBaseLocation.containerCode, createBy = "WCS", createTime = DateTime.Now, taskStatus = 0, materialId = wmsRawOutstock.materialId, currPointId = wmsBaseLocation.locationId, currPointNo = wmsBaseLocation.locationCode, nextPointId = baseEquip.objid, nextPointNo = baseEquip.equipNo, endPointId = endEquip.objid, endPointNo = endEquip.equipNo, equipmentNo = endEquip.equipNo, useFlag = 1, qty = 1 }; wmsBaseLocation.outstockFlag = "1"; wmsBaseLocation.locationStatus = "6"; dbContext.Update(wmsBaseLocation); dbContext.Add(wmsRawOutstockDetail); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Remove(wcsTaskManual); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } } } } } } } } } } catch (Exception ex) { LogManager.Error(ex); } } } /// /// 创建返库任务 /// /// private void CreateBearAgvReturnLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 21); BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == 10); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var wmsRawReturn = dbContext.WmsRawReturn .Where(t => t.auditStatus == "1") .Where(t => t.executeStatus == "0") .FirstOrDefault(); if (wmsRawReturn != null) { bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == baseEquip.objid).Any(); if (!hasTask) { //任务未开始Status=0 BaseEquip? startEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == wmsRawReturn.endStationCode); if (startEquip != null) { WcsTask wcsTask = new() { objid = StaticData.SnowId.NextId(), orderId = wmsRawReturn.rawReturnId, taskType = 48, containerNo = null, currPointId = startEquip.objid, currPointNo = startEquip.equipNo, nextPointId = baseEquip.objid, nextPointNo = baseEquip.equipNo, endPointId = endEquip.objid, endPointNo = endEquip.equipNo, serialNo = SystemData.GetSerialNo(dbContext), taskStatus = 0, createTime = DateTime.Now, createBy = "WCS", materialId = wmsRawReturn.materialId, qty = 1, useFlag = 1, equipmentNo = startEquip.equipNo, remark = "装配区返库", floorNo = 5, masterId = wmsRawReturn.materialId, fromFloorNo = 5, //materialNo = wmsRawReturn.materialBatch, }; wmsRawReturn.executeStatus = "1"; dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.Update(wmsRawReturn); dbContext.SaveChanges(); } } } } catch (Exception ex) { LogManager.Error(ex); } Thread.Sleep(5000); } } /// /// 成品出库 /// private void CreateFiveProductTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == 5); if (lineEquip.equipStatus == 0) { bool task = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any(); if (!task) { var proStock = dbContext.WmsProductStock .Where(t => t.warehouseId == 531) .Where(t => t.activeFlag == "1").ToList(); var proOutStock = dbContext.WmsProductOutstock .Where(t => t.outstockQty < t.applyQty) .Where(t => t.auditStatus == "1") .Where(t => t.warehouseId == 531) .Where(t => t.productType == "3") .Where(t => t.executeStatus == "0" || t.executeStatus == "1").ToList(); //获取最早入库时间 foreach (var item in proOutStock) { task = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any(); if (!task) { BaseEquip endEquip = dbContext.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1); var wmsproStocks = proStock .Where(t => t.productId == item.productId && t.warehouseId == item.warehouseId) .Where(t => t.totalAmount > t.frozenAmount) .Select(t => t.locationCode) .ToList(); List AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == item.warehouseId).ToList(); var wmsBaseLocations = AllWmsBaseLocations .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.instockFlag == "0") .Where(t => t.outstockFlag == "0") .Where(t => t.locationStatus == "1") .Where(t => t.warehouseId == item.warehouseId) .Where(t => wmsproStocks.Contains(t.locationCode)) .ToList(); decimal needNumber = Convert.ToDecimal(item.applyQty - item.outstockQty); if (needNumber <= 0) { item.executeStatus = "2"; dbContext.Update(item); dbContext.SaveChanges(); continue; } var bill = from a in wmsBaseLocations from b in proStock where a.locationCode == b.locationCode select new { a, b }; BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); foreach (var b in bill) { item.executeStatus = "1"; WmsBaseLocation location = b.a; WmsProductStock stock = b.b; WcsTask wcsTask; stock.updateDate = DateTime.Now; MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == stock.palletInfoCode); if (mesBasePalletInfo != null) { if (location.locDeep == 1) { int? row = 0; if (location.locRow % 2 == 1) { row = location.locRow + 1; } else { row = location.locRow - 1; } var lowLocationBill = bill.Where(t => t.a.locRow == row).Where(t => t.a.locColumn == location.locColumn).Where(t => t.a.warehouseId == location.warehouseId).FirstOrDefault(); if (lowLocationBill != null) { location = lowLocationBill.a; stock = lowLocationBill.b; } else { 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? 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) { var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.productOutstockId, taskType = 38, containerNo = wmsBaseLocation.containerCode, createBy = "WCS", createTime = DateTime.Now.AddSeconds(-10), taskStatus = 0, materialId = item.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 }; toLocation.locationStatus = "4"; toLocation.instockFlag = "1"; toLocation.updateBy = "WCS"; toLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.outstockFlag = "1"; wmsBaseLocation.locationStatus = "4"; dbContext.Update(toLocation); dbContext.Update(wmsBaseLocation); dbContext.Add(RemoveTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); dbContext.Add(wcsTaskLog); } else { continue; } } } } WmsProductOutstockDetail detail = new() { productId = item.productId, productOutstockId = item.productOutstockId, locationCode = location.locationCode, executeStatus = "1", beginTime = DateTime.Now, warehouseId = item.warehouseId, erpAmount = 0, confirmAmount = 0, outstockAmount = 1, planAmount = 1, productBatch = item.productBatch, productOutstockDetailId = StaticData.SnowId.NextId(), productBarcode = mesBasePalletInfo.materialBarcode }; wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.productOutstockId, taskType = 38, containerNo = location.containerCode, createBy = "WCS", createTime = DateTime.Now, taskStatus = 0, materialId = item.productId, currPointId = location.locationId, currPointNo = location.locationCode, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, endPointId = lineEquip.objid, endPointNo = lineEquip.equipNo, equipmentNo = agvEquip.equipNo, useFlag = 1, qty = 1 }; location.outstockFlag = "1"; location.locationStatus = "6"; location.updateBy = "WCS"; location.updateTime = DateTime.Now; dbContext.Add(detail); dbContext.Update(location); dbContext.Add(wcsTask); dbContext.Update(stock); dbContext.SaveChanges(); break; } } if (item.beginTime == null) { item.beginTime = DateTime.Now; } dbContext.Update(item); dbContext.SaveChanges(); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); LogManager.Error(ex); } Thread.Sleep(5000); } } /// /// 成品出库 /// private void CreateSecondProductTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == 2); if (lineEquip.equipStatus == 0) { bool task = dbContext.WcsTask.Where(t => t.nextPointId == 8 && t.taskStatus <= 7).Any(); if (!task) { var proStock = dbContext.WmsProductStock .Where(t => t.warehouseId == 231) .Where(t => t.activeFlag == "1") .Where(t => t.totalAmount > t.frozenAmount) .ToList(); var proOutStock = dbContext.WmsProductOutstock .Where(t => t.outstockQty < t.applyQty) .Where(t => t.auditStatus == "1") .Where(t => t.warehouseId == 231) .Where(t => t.productType == "3") .Where(t => t.executeStatus == "0" || t.executeStatus == "1").ToList(); //获取最早入库时间 foreach (var item in proOutStock) { var wmsproStocks = proStock .Where(t => t.productId == item.productId && t.saleOrderId == item.saleOrderId && t.warehouseId == item.warehouseId) .Select(t => t.palletInfoCode) .ToList(); List AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == item.warehouseId).ToList(); var wmsBaseLocations = AllWmsBaseLocations .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.instockFlag == "0") .Where(t => t.locationStatus == "1") .Where(t => t.outstockFlag == "0") .Where(t => t.warehouseId == item.warehouseId) .Where(t => wmsproStocks.Contains(t.containerCode)) .ToList(); decimal needNumber = Convert.ToDecimal(item.applyQty - item.outstockQty); if (needNumber <= 0) { item.executeStatus = "2"; dbContext.Update(item); dbContext.SaveChanges(); continue; } var bill = from a in wmsBaseLocations from b in proStock where a.containerCode == b.palletInfoCode select new { a, b }; WmsBaseLocation? location = null; WmsProductStock? stock = null; BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8); BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 1); foreach (var b in bill) { item.executeStatus = "1"; location = b.a; stock = b.b; WcsTask wcsTask; int qty = 0; if (stock.totalAmount - stock.frozenAmount <= needNumber) { item.outstockQty += stock.totalAmount - stock.frozenAmount; qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); stock.updateDate = DateTime.Now; } else { item.outstockQty += needNumber; qty = Convert.ToInt32(needNumber); stock.updateDate = DateTime.Now; } MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == location.containerCode); if (mesBasePalletInfo != null) { WmsProductOutstockDetail detail = new() { productId = item.productId, productOutstockId = item.productOutstockId, locationCode = location.locationCode, executeStatus = "1", beginTime = DateTime.Now, warehouseId = item.warehouseId, erpAmount = 0, confirmAmount = 0, outstockAmount = 1, planAmount = 1, productBatch = item.productBatch, productOutstockDetailId = StaticData.SnowId.NextId(), productBarcode = mesBasePalletInfo.materialBarcode, }; if (location.locDeep == 1)//如果是深库位 { int? row = 0; if (location.locRow % 2 == 1) { row = location.locRow + 1; } else { row = location.locRow - 1; } var lowLocationBill = bill.Where(t => t.a.locRow == row).Where(t => t.a.locColumn == location.locColumn).Where(t => t.a.warehouseId == location.warehouseId).FirstOrDefault(); if (lowLocationBill != null) { location = lowLocationBill.a; stock = lowLocationBill.b; } else { 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? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) .Where(t => t.locDeep == 1) .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.instockFlag == "0") .Where(t => t.locationStatus == "1") .Where(t => t.outstockFlag == "0") .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) { var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.productOutstockId, taskType = 55, containerNo = wmsBaseLocation.containerCode, createBy = "WCS", createTime = DateTime.Now.AddSeconds(-10), taskStatus = 0, materialId = item.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 = qty }; toLocation.locationStatus = "4"; toLocation.instockFlag = "1"; toLocation.updateBy = "WCS"; toLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.outstockFlag = "1"; wmsBaseLocation.locationStatus = "4"; dbContext.Update(toLocation); dbContext.Update(wmsBaseLocation); dbContext.Add(RemoveTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); dbContext.Add(wcsTaskLog); } else { continue; } } } } wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.productOutstockId, taskType = 50, containerNo = location.containerCode, createBy = "WCS", createTime = DateTime.Now, taskStatus = 0, materialId = item.productId, currPointId = location.locationId, currPointNo = location.locationCode, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, endPointId = endEquip.objid, endPointNo = endEquip.equipNo, equipmentNo = agvEquip.equipNo, useFlag = 1, qty = qty }; location.outstockFlag = "1"; location.locationStatus = "6"; location.updateBy = "WCS"; location.updateTime = DateTime.Now; dbContext.Add(detail); dbContext.Update(location); dbContext.Add(wcsTask); dbContext.Update(stock); WcsTaskLog wcsTaskLog1 = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog1); dbContext.SaveChanges(); if (qty >= needNumber) { break; } break; } } if (item.beginTime == null) { item.beginTime = DateTime.Now; } dbContext.Update(item); dbContext.SaveChanges(); } } } } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); LogManager.Error(ex); } Thread.Sleep(5000); } } /// /// 原材料出库 /// private void CreateRawTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //原材料库存 var rawStock = dbContext.WmsRawStock .Where(t => t.activeFlag == "1").ToList(); //原材料出库记录 var rawOutStock = dbContext.WmsRawOutstock .Where(t => t.executeStatus == "0" || t.executeStatus == "1") .Where(t => t.outstockAmount > t.realOutstockAmount) .Where(t => t.auditStatus == "1") .ToList(); List wcsTaskManuals = dbContext.WcsTaskManual.Where(t => t.nextPointId == 11).OrderBy(t => t.createBy).ToList(); if (wcsTaskManuals.Count > 0) { WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First(); int taskCount = dbContext.WcsTask.Where(t => t.nextPointId == 11).Count(); if (taskCount == 0 && wcsOutstockLock.qty == 0 && wcsOutstockLock.boxStatus == 0) { foreach (var wcs in wcsTaskManuals.Take(6)) { WcsTask wcsTask = CoreMapper.Map(wcs); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); wcsOutstockLock.qty += 1; wcsOutstockLock.boxStatus = 1; dbContext.Update(wcsOutstockLock); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.WcsTaskManual.Where(t => t.objid == wcs.objid).Delete(); } dbContext.SaveChanges(); } } foreach (var item in rawOutStock) { decimal? RealOutNumber = item.realOutstockAmount; var endEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == item.endStationCode); if (endEquip != null && endEquip.floorNo == 5) { lock (SystemData.outStockLock) { #region CTU出库,没用背负Agv的逻辑 //if (endEquip.equipType == 8)//CTU出库 //{ // var wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First(); // if (wcsOutstockLock.qty == 0 && wcsOutstockLock.boxStatus == 0) // { // var wmsRawStocks = rawStock // .Where(t => t.materialId == item.materialId) // .Where(t => t.warehouseId == item.warehouseId) // .Select(t => t.locationCode) // .ToList(); // var wmsBaseLocations = dbContext.WmsBaseLocation // .Where(t => t.activeFlag == "1") // .Where(t => t.delFlag == "0") // .Where(t => t.locationScrapType == "1") // .Where(t => t.instockFlag == "0") // .Where(t => t.outstockFlag == "0") // .Where(t => t.ContainerStatus == "1") // .Where(t => t.warehouseId == item.warehouseId) // .Where(t => wmsRawStocks.Contains(t.locationCode)) // .ToList(); // decimal? needNumber = item.outstockAmount - RealOutNumber; // var bill = from a in wmsBaseLocations // from b in rawStock // where a.locationCode == b.locationCode // select new { a, b }; // //如果第一列满足需求,则按第一列排序,否则按最后一列排序 // if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() > needNumber) // { // bill = bill.OrderBy(t => t.a.locColumn).ToList(); // } // else // { // bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); // } // //做数量限制 // //bill = bill.Take(5 - dbContext.WcsCmd.Where(t => t.cmdStatus < 3 && t.nextPointId == 20).Count()); // bill = bill.Take(6); // BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); // BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); // foreach (var b in bill) // { // needNumber = item.outstockAmount - RealOutNumber; // item.executeStatus = "1"; // WmsBaseLocation location = b.a; // WmsRawStock stock = b.b; // WcsTask wcsTask; // int qty = 0; // if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 // { // RealOutNumber += stock.totalAmount - stock.frozenAmount; // qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); // stock.updateDate = DateTime.Now; // } // else // { // RealOutNumber += needNumber; // qty = Convert.ToInt32(needNumber); // stock.updateDate = DateTime.Now; // } // wcsTask = new WcsTask() // { // objid = StaticData.SnowId.NextId(), // orderId = item.rawOutstockId, // taskType = 38, // containerNo = location.containerCode, // createBy = "WCS", // createTime = DateTime.Now, // taskStatus = -1, // materialId = item.materialId, // currPointId = location.locationId, // currPointNo = location.locationCode, // nextPointId = ctuEquip.objid, // nextPointNo = ctuEquip.equipNo, // endPointId = lineEquip.objid, // endPointNo = lineEquip.equipNo, // equipmentNo = ctuEquip.equipNo, // ud1 = location.locColumn, // useFlag = 1, // qty = qty // }; // MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault(); // if (mesBaseBarcodeInfo != null) // { // 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 // }; // location.outstockFlag = "1"; // location.locationStatus = "6"; // location.updateBy = "WCS"; // location.updateTime = DateTime.Now; // wcsOutstockLock.boxStatus = 1; // dbContext.Add(wmsProductOutstockDetail); // dbContext.Update(location); // dbContext.Add(wcsTask); // dbContext.Update(stock); // if (qty >= needNumber) // { // break; // } // } // } // if (item.beginTime == null) // { // item.beginTime = DateTime.Now; // } // dbContext.Update(wcsOutstockLock); // dbContext.Update(item); // dbContext.SaveChanges(); // } //}//CTU出库 #endregion if (endEquip.equipType == 10)//CTU出库到装配区 { BaseEquip endStationCodeEquip = dbContext.BaseEquip.First(t => t.objid == 10); if (!string.IsNullOrEmpty(endStationCodeEquip.endStationCode)) { bool CreateSuccess = false; var wcsOutstockLock = dbContext.WcsOutstockLock .Where(t => t.warehouseId == 512) .First(); if (wcsOutstockLock.qty == 0 && wcsOutstockLock.boxStatus == 0) { var orderList = rawOutStock.Where(t => t.endStationCode == endStationCodeEquip.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(); //对物料和数量进行分组 var list = orderList.GroupBy(t => t.materialId).Select(t => new { MaterialId = t.Key, TotalAmount = t.Sum(x => x.outstockAmount), realOutstockAmount = t.Sum(x => x.realOutstockAmount) } ).ToList(); foreach (var order in list) { if (tasks.Count >= 6) { break; } var wmsRawStocks = rawStock .Where(t => t.materialId == order.MaterialId && t.warehouseId == 512) .Select(t => t.palletInfoCode) .ToList(); var AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == 512).ToList(); var wmsBaseLocations = AllWmsBaseLocations .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.instockFlag == "0") .Where(t => t.outstockFlag == "0") .Where(t => t.locationStatus == "1") .Where(t => t.warehouseId == 512) .Where(t => wmsRawStocks.Contains(t.containerCode)) .ToList(); decimal? needNumber = order.TotalAmount - order.realOutstockAmount; var bill = from a in wmsBaseLocations from b in rawStock where a.containerCode == b.palletInfoCode select new { a, b }; //如果第一列满足需求,则按第一列排序,否则按最后一列排序 if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() >= needNumber) { bill = bill.OrderBy(t => t.a.locColumn).ToList(); } else { bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); } BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); foreach (var b in bill) { if (tasks.Where(t => t.containerNo == b.a.containerCode).Any() || tasks.Count >= 6) { continue; } WmsBaseLocation location = b.a; WmsRawStock stock = b.b; int qty = 0; if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 { RealOutNumber += stock.totalAmount - stock.frozenAmount; qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); stock.updateDate = DateTime.Now; } else { RealOutNumber += needNumber; qty = Convert.ToInt32(needNumber); stock.updateDate = DateTime.Now; } WmsRawOutstock? wmsRawOutstock = orderList.Where(t => t.materialId == order.MaterialId).FirstOrDefault(); if (wmsRawOutstock != null) { WcsTask wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = wmsRawOutstock.rawOutstockId, taskType = 30, containerNo = location.containerCode, createBy = "WCS", createTime = DateTime.Now, taskStatus = 0, materialId = wmsRawOutstock.materialId, currPointId = location.locationId, currPointNo = location.locationCode, nextPointId = ctuEquip.objid, nextPointNo = ctuEquip.equipNo, endPointId = lineEquip.objid, endPointNo = lineEquip.equipNo, equipmentNo = ctuEquip.equipNo, ud1 = location.locColumn, useFlag = 1, qty = qty }; tasks.Add(wcsTask); location.outstockFlag = "1"; location.locationStatus = "6"; location.updateBy = "WCS"; location.ContainerStatus = "2"; location.updateTime = DateTime.Now; wcsOutstockLock.qty += 1; wcsOutstockLock.boxStatus = 1; dbContext.Update(location); dbContext.Update(stock); CreateSuccess = true; if (tasks.Count >= 6) { break; } } } #region 原逻辑 //foreach (var order in orderList) //{ // if(tasks.Count >= 6) // { // break; // } // WcsTask? task = dbContext.WcsTask.FirstOrDefault(t => t.taskType == 32); // if (task == null) // { // var wmsRawStocks = rawStock // .Where(t => t.materialId == order.materialId && t.warehouseId == order.warehouseId) // .Select(t => t.palletInfoCode) // .ToList(); // var wmsBaseLocations = dbContext.WmsBaseLocation // .Where(t => t.activeFlag == "1") // .Where(t => t.delFlag == "0") // .Where(t => t.locationScrapType == "1") // .Where(t => t.instockFlag == "0") // .Where(t => t.outstockFlag == "0") // .Where(t => t.warehouseId == order.warehouseId) // .Where(t => wmsRawStocks.Contains(t.containerCode)) // .ToList(); // decimal? needNumber = order.outstockAmount - RealOutNumber; // var bill = from a in wmsBaseLocations // from b in rawStock // where a.containerCode == b.palletInfoCode // select new { a, b }; // //如果第一列满足需求,则按第一列排序,否则按最后一列排序 // if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() > needNumber) // { // bill = bill.OrderBy(t => t.a.locColumn).ToList(); // } // else // { // bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); // } // //做数量限制 // bill = bill.Take(5 - dbContext.WcsCmd.Where(t => t.cmdStatus < 3 && t.nextPointId == 20).Count()); // BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); // BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); // foreach (var b in bill) // { // if (tasks.Where(t => t.containerNo == b.a.containerCode).Any()) // { // continue; // } // item.executeStatus = "1"; // WmsBaseLocation location = b.a; // WmsRawStock stock = b.b; // int qty = 0; // if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 // { // RealOutNumber += stock.totalAmount - stock.frozenAmount; // qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); // stock.updateDate = DateTime.Now; // } // else // { // RealOutNumber += needNumber; // qty = Convert.ToInt32(needNumber); // stock.updateDate = DateTime.Now; // } // WcsTask wcsTask = new WcsTask() // { // objid = StaticData.SnowId.NextId(), // orderId = item.rawOutstockId, // taskType = 30, // containerNo = location.containerCode, // createBy = "WCS", // createTime = DateTime.Now, // taskStatus = 0, // materialId = item.materialId, // currPointId = location.locationId, // currPointNo = location.locationCode, // nextPointId = ctuEquip.objid, // nextPointNo = ctuEquip.equipNo, // endPointId = lineEquip.objid, // endPointNo = lineEquip.equipNo, // equipmentNo = ctuEquip.equipNo, // ud1 = location.locColumn, // useFlag = 0, // qty = qty // }; // tasks.Add(wcsTask); // MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault(); // if (mesBaseBarcodeInfo != null) // { // 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 // }; // details.Add(wmsProductOutstockDetail); // location.outstockFlag = "1"; // location.locationStatus = "6"; // location.updateBy = "WCS"; // location.updateTime = DateTime.Now; // wcsOutstockLock.qty += 1; // wcsOutstockLock.boxStatus = 1; // dbContext.Update(wcsOutstockLock); // dbContext.Update(location); // dbContext.Add(wcsTask); // dbContext.Update(stock); // CreateSuccess = true; // if (tasks.Count >= 6) // { // break; // } // } // } // } //} #endregion } if (CreateSuccess) { foreach (var orderItem in orderList) { if (orderItem.beginTime == null) { orderItem.beginTime = DateTime.Now; } orderItem.executeStatus = "1"; } BaseEquip startStationEquip = StaticData.BaseEquip.First(t => t.objid == 21); BaseEquip bearAgvEquip = StaticData.BaseEquip.First(t => t.objid == 10); BaseEquip endStationEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode); bool hasTask = dbContext.WcsTask.Where(t => t.taskType == 32).Any(); if (!hasTask) { WcsTask bearAgvTask = new() { objid = StaticData.SnowId.NextId(), orderId = item.rawOutstockId, taskType = 32, containerNo = null, currPointId = startStationEquip.objid, currPointNo = startStationEquip.equipNo, nextPointId = bearAgvEquip.objid, nextPointNo = bearAgvEquip.equipNo, endPointId = endStationEquip.objid, endPointNo = endStationEquip.equipNo, serialNo = SystemData.GetSerialNo(dbContext), taskStatus = 0, createTime = DateTime.Now, createBy = "WCS", materialId = item.materialId, qty = 1, useFlag = 1, equipmentNo = startStationEquip.equipNo, remark = "组装出库", floorNo = 5, masterId = item.materialId, fromFloorNo = 5, }; dbContext.Add(bearAgvTask); } if (item.beginTime == null) { item.beginTime = DateTime.Now; } dbContext.UpdateRange(orderList); dbContext.Update(item); } endStationCodeEquip.endStationCode = null; dbContext.Update(endStationCodeEquip); if (tasks.Count > 0) { dbContext.AddRange(tasks); dbContext.Update(wcsOutstockLock); } dbContext.SaveChanges(); } } } if (endEquip.equipType == 12 || endEquip.equipType == 13)//原材料到柜体验收区 { bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.useFlag == 1 && t.taskStatus <= 5).Any(); if (!hasTask) { if (endEquip.emptyCount == 0) { 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) .Where(t => t.totalAmount > t.frozenAmount) .Select(t => t.palletInfoCode) .ToList(); List AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == item.warehouseId).ToList(); var wmsBaseLocations = AllWmsBaseLocations .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.instockFlag == "0") .Where(t => t.outstockFlag == "0") .Where(t => t.locationStatus == "1") .Where(t => t.warehouseId == item.warehouseId) .Where(t => wmsRawStocks.Contains(t.containerCode)) .ToList(); decimal? needNumber = item.outstockAmount - item.realOutstockAmount; if (needNumber <= 0) { item.executeStatus = "2"; dbContext.Update(item); dbContext.SaveChanges(); continue; } var bill = from a in wmsBaseLocations from b in rawStock where a.containerCode == b.palletInfoCode select new { a, b }; BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode); foreach (var b in bill) { item.executeStatus = "1"; WmsBaseLocation location = b.a; WmsRawStock stock = b.b; WcsTask wcsTask; int qty = 0; if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 { item.realOutstockAmount += stock.totalAmount - stock.frozenAmount; qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); stock.updateDate = DateTime.Now; } else { item.realOutstockAmount += needNumber; 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; } var lowLocationBill = bill.Where(t => t.a.locRow == row).Where(t => t.a.locColumn == location.locColumn).Where(t => t.a.warehouseId == location.warehouseId).FirstOrDefault(); if (lowLocationBill != null) { location = lowLocationBill.a; stock = lowLocationBill.b; } else { 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? 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) { var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.rawOutstockId, taskType = 38, containerNo = wmsBaseLocation.containerCode, 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.instockFlag = "1"; toLocation.updateBy = "WCS"; toLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.outstockFlag = "1"; wmsBaseLocation.locationStatus = "4"; dbContext.Update(toLocation); dbContext.Update(wmsBaseLocation); dbContext.Add(RemoveTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); dbContext.Add(wcsTaskLog); } else { 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 }; 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 }; dbContext.Add(wmsProductOutstockDetail); location.outstockFlag = "1"; location.locationStatus = "6"; location.updateBy = "WCS"; location.updateTime = DateTime.Now; endEquip.emptyCount = 1; dbContext.Update(endEquip); dbContext.Update(location); dbContext.Add(wcsTask); dbContext.Update(stock); dbContext.SaveChanges(); } if (item.beginTime == null) { item.beginTime = DateTime.Now; } dbContext.Update(item); dbContext.SaveChanges(); break; } } } } } } } } catch (Exception ex) { LogManager.Error(ex); } Thread.Sleep(1000); } } } }