using Khd.Core.Domain.Dto.TaskType; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Library.Mapper; using Khd.Core.Wcs.Global; using Masuit.Tools; using Microsoft.CodeAnalysis; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using SixLabors.ImageSharp; using System.Data; using System.Linq; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { /// /// 根据出入库记录创建出入库任务 /// public class CreateTaskByRecord { private readonly LoggerUtils _logger = new LoggerUtils(); private readonly IHost _host; public CreateTaskByRecord(IHost host) { this._host = host; } /// /// 启动上件扫描监听 /// public void StartPoint() { //var createRemoveThread = new Thread(CreateRemoveLogic); //createRemoveThread.IsBackground = true; //createRemoveThread.Name = "CreateRemoveLogic"; //createRemoveThread.Start(); //背负式Agv返库任务 var createBearAgvReturnThread = new Thread(CreateBearAgvReturnLogic); createBearAgvReturnThread.IsBackground = true; createBearAgvReturnThread.Name = "CreateBearAgvReturnLogic"; createBearAgvReturnThread.Start(); //五楼半成品入库任务 var createFiveProductInTaskThread = new Thread(CreateFiveProductInTaskLogic); createFiveProductInTaskThread.IsBackground = true; createFiveProductInTaskThread.Name = "CreateFiveProductInTaskLogic"; createFiveProductInTaskThread.Start(); //五楼成品出库任务 var createFiveProductTaskThread = new Thread(CreateFiveProductTaskLogic); createFiveProductTaskThread.IsBackground = true; createFiveProductTaskThread.Name = "CreateFiveProductTaskLogic"; createFiveProductTaskThread.Start(); //五楼CTU出库任务以及原材料出库任务 var createRawTaskThread = new Thread(CreateRawTaskLogic); createRawTaskThread.IsBackground = true; createRawTaskThread.Name = "CreateRawTaskLogic"; createRawTaskThread.Start(); //五楼柜体拆分返库任务 var createRawInThread = new Thread(CreateRawInTaskLogic); createRawInThread.IsBackground = true; createRawInThread.Name = "CreateRawInTaskLogic"; createRawInThread.Start(); //三楼去翻转机任务 var createThirdOutTaskThread = new Thread(CreateThirdOutTaskLogic); createThirdOutTaskThread.IsBackground = true; createThirdOutTaskThread.Name = "CreateThirdOutTaskLogic"; createThirdOutTaskThread.Start(); //二楼成品出库任务 var CreateSecondProductTaskThread = new Thread(CreateSecondProductTaskLogic); CreateSecondProductTaskThread.IsBackground = true; CreateSecondProductTaskThread.Name = "CreateSecondProductTaskLogic"; CreateSecondProductTaskThread.Start(); //三楼托盘收集架满5个或10个时出库合盘任务 var createEmptyTrayThread = new Thread(CreateEmptyTrayLogic); createEmptyTrayThread.IsBackground = true; createEmptyTrayThread.Name = "CreateEmptyTrayLogic"; createEmptyTrayThread.Start(); //二楼废品区人工调度任务 var createThirdWasterTaskThread = new Thread(CreateThirdWasterTaskLogic); createThirdWasterTaskThread.IsBackground = true; createThirdWasterTaskThread.Name = "CreateThirdWasterTaskLogic"; createThirdWasterTaskThread.Start(); //背负式退库 var BackReturnTaskThread = new Thread(BackReturnTaskLogic); BackReturnTaskThread.IsBackground = true; BackReturnTaskThread.Name = "BackReturnTaskLogic"; BackReturnTaskThread.Start(); Console.WriteLine(DateTime.Now + ":出库任务监听启动成功"); _logger.Info("出库任务监听启动成功"); } /// /// 主动移库 /// /// private void CreateRemoveLogic(object? obj) { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); List cannotIn = new List(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var CanRemoveWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.locationStatus == "7").ToList(); List locationCodes = CanRemoveWmsBaseLocations.Select(t => t.locationCode).ToList(); List CanRemoveWmsProductStocks = dbContext.WmsProductStock.Where(t => locationCodes.Contains(t.locationCode)).ToList(); foreach (var wmsProductStock in CanRemoveWmsProductStocks) { BaseEquip? agvEquip = null; if (wmsProductStock.warehouseId == 531) { agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); } else if (wmsProductStock.warehouseId == 231) { agvEquip = StaticData.BaseEquip.First(t => t.objid == 8); } if (agvEquip != null) { bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == agvEquip.objid).Any(); if (!hasTask) { WmsBaseLocation fromLocationCode = CanRemoveWmsBaseLocations.First(t => t.locationCode == wmsProductStock.locationCode); if (wmsProductStock.warehouseId == 531 || wmsProductStock.warehouseId == 231)//成品移库 { var wmsBaseLocations = dbContext.WmsBaseLocation .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") .Where(t => t.warehouseId == wmsProductStock.warehouseId) .ToList();//所有可用库位 var wmsProductStocks = dbContext.WmsProductStock .Where(t => t.warehouseId == wmsProductStock.warehouseId) .ToList();//仓库的库存 WmsBaseLocation? wmsBaseLocation = null; if (wmsBaseLocations.Count > 0) { List containerCodes = wmsBaseLocations .Where(t => t.locDeep == 1) .Select(t => t.containerCode).ToList();//深库位的有托盘 List mesBasePalletInfos = dbContext.MesBaseBarcodeInfo .Where(t => t.saleOrderId == (wmsProductStock.saleOrderId == null ? 0 : wmsProductStock.saleOrderId))//销售订单 .Where(t => t.materialId == wmsProductStock.productId)//物料Id .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) //如果是4则找3,如果是1则找2 && a.b.locColumn == b.locColumn//列数相同 && string.IsNullOrEmpty(b.containerCode) select new { a, b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 wmsBaseLocation ??= outBill.Where(t => !cannotIn.Contains(t.b.locationCode)).FirstOrDefault()?.b;//先找相同物料的外侧库位 wmsBaseLocation ??= wmsBaseLocations.Where(t => !cannotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位 wmsBaseLocation ??= wmsBaseLocations.Where(t => !cannotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位 if (wmsBaseLocation != null)//如果找到库位,生成入库任务 { if (wmsBaseLocation.locDeep == 1) { bool hasLocation = wmsBaseLocations .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) .Where(t => t.locColumn == wmsBaseLocation.locColumn) .Any(); if (!hasLocation) { cannotIn.Add(wmsBaseLocation.locationCode); Console.WriteLine(DateTime.Now + $":目标库位{cannotIn.Join(",")}的浅库位库位状态异常,无法移库"); _logger.Info($"目标库位{cannotIn.Join(",")}的浅库位库位状态异常,无法移库"); continue; } } var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), currPointId = fromLocationCode.locationId, currPointNo = fromLocationCode.locationCode, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, endPointId = wmsBaseLocation.locationId, endPointNo = wmsBaseLocation.locationCode, taskStatus = 0, useFlag = 1, containerNo = wmsProductStock.palletInfoCode, createBy = "WCS", createTime = DateTime.Now, isEmpty = "0", taskType = agvEquip.objid == 28 ? StaticTaskType.FiveRemove : StaticTaskType.SecondRemove, qty = 1, }; fromLocationCode.locationStatus = "4"; dbContext.Update(fromLocationCode); wmsBaseLocation.locationStatus = "4"; dbContext.Update(wmsBaseLocation); dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); cannotIn.Clear(); Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); _logger.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); } else { //报警 } } } } } } List wmsRawStocks = dbContext.WmsRawStock.Where(t => locationCodes.Contains(t.locationCode)).ToList(); foreach (var wmsRawStock in wmsRawStocks) { WmsBaseLocation fromLocationCode = CanRemoveWmsBaseLocations.First(t => t.locationCode == wmsRawStock.locationCode); if (wmsRawStock.warehouseId == 511 || wmsRawStock.warehouseId == 311) { BaseEquip? agvEquip = null; if (wmsRawStock.warehouseId == 511) { agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); } else if (wmsRawStock.warehouseId == 311) { agvEquip = StaticData.BaseEquip.First(t => t.objid == 9); } if (agvEquip != null) { bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == agvEquip.objid).Any(); if (!hasTask) { var wmsBaseLocations = dbContext.WmsBaseLocation .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") .Where(t => t.warehouseId == wmsRawStock.warehouseId) .ToList();//所有可用库位 var wmsProductStocks = dbContext.WmsRawStock .Where(t => t.warehouseId == wmsRawStock.warehouseId) .ToList();//仓库的库存 WmsBaseLocation? wmsBaseLocation = null; if (wmsBaseLocations.Count > 0) { List containerCodes = wmsBaseLocations .Where(t => t.locDeep == 1) .Select(t => t.containerCode).ToList();//深库位的有托盘 List mesBasePalletInfos = dbContext.MesBaseBarcodeInfo .Where(t => t.saleOrderId == (wmsRawStock.saleOrderId == null ? 0 : wmsRawStock.saleOrderId))//销售订单 .Where(t => t.materialId == wmsRawStock.materialId)//物料Id .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) //如果是4则找3,如果是1则找2 && a.b.locColumn == b.locColumn//列数相同 && string.IsNullOrEmpty(b.containerCode) select new { a.b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 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();//找不到再找任意库位 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; } } var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), currPointId = fromLocationCode.locationId, currPointNo = fromLocationCode.locationCode, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, endPointId = wmsBaseLocation.locationId, endPointNo = wmsBaseLocation.locationCode, taskStatus = 0, useFlag = 1, containerNo = wmsRawStock.palletInfoCode, createBy = "WCS", createTime = DateTime.Now, isEmpty = "0", taskType = agvEquip.objid == 28 ? StaticTaskType.FiveRemove : StaticTaskType.ThirdRemove, qty = 1, }; fromLocationCode.locationStatus = "4"; dbContext.Update(fromLocationCode); wmsBaseLocation.locationStatus = "4"; dbContext.Update(wmsBaseLocation); dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); _logger.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid); } else { //报警 } } } } } } } catch { } } } /// /// 五楼柜体拆分返库任务 /// private void CreateRawInTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); List cannotIn = new List(); while (true) { try { lock (SystemData.FiveTaskLock) { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 29); if (baseEquip.emptyCount == 1) { WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == 28).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 == wmsRawInstock.palletInfoCode); if (mesBasePalletInfo != null) { MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != null) { 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 && t.returnFlag == "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.Where(t => !cannotIn.Contains(t.b.locationCode)).FirstOrDefault()?.b;//先找相同物料的外侧库位 wmsBaseLocation ??= wmsBaseLocations.Where(t => !cannotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位 wmsBaseLocation ??= wmsBaseLocations.Where(t => !cannotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位 //深浅库位问题?库位入库优先级等 var AgvEquip = StaticData.BaseEquip.First(t => t.objid == 28);//5楼叉车 if (wmsBaseLocation != null) { if (wmsBaseLocation.locDeep == 1) { bool hasLocation = wmsBaseLocations .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) .Where(t => t.locColumn == wmsBaseLocation.locColumn).Any(); if (!hasLocation) { cannotIn.Add(wmsBaseLocation.locationCode); Console.WriteLine(DateTime.Now + $":目标库位{cannotIn.Join(",")}的浅库位库位状态异常,无法入库"); _logger.Info($"目标库位{cannotIn.Join(",")}的浅库位库位状态异常,无法入库"); continue; } } WcsTask newTask = 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 = StaticTaskType.FiveRawSplitReturn; 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, }; SystemData.LockOutLocation(wmsBaseLocation, dbContext); dbContext.Add(wmsRawInstockDetail); dbContext.Update(wmsBaseLocation); dbContext.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); cannotIn.Clear(); } } } } } } } } catch (Exception ex) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } 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) { var equip = dbContext.BaseEquip.Where(t => t.objid == wcsTaskManual.endPointId).FirstOrDefault(); if (equip != null && equip.equipStatus == 0) { 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) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } 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 { bool isCreate = false; dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); bool canCreate = dbContext.WcsTask.Where(t => t.nextPointId == 9) .Where(t => t.useFlag == 1) .Where(t => t.taskStatus <= 6).Any(); if (!canCreate) { BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 35); #region 原逻辑 //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 #endregion 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 = StaticTaskType.ThirdBinToTransit, 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(); isCreate = true; } } if (!isCreate) { var emptyEquip = dbContext.BaseEquip.Where(t => t.equipType == 15).Where(t => t.emptyCount == SystemData.maxTray).ToList(); var secondEmptyEquip = dbContext.BaseEquip.Where(t => t.equipType == 20).Where(t => t.emptyCount == 0).ToList(); if (emptyEquip.Count >= 2 && secondEmptyEquip.Count >= 4)//二楼空库位多余4个,三楼空库位大于4个 { BaseEquip startEquip = emptyEquip.First(); WcsTask wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), serialNo = SystemData.GetSerialNo(dbContext), taskType = StaticTaskType.ThirdTransitToSecond, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, currPointId = startEquip.objid, currPointNo = startEquip.equipNo, endPointId = secondEmptyEquip.First().objid, endPointNo = secondEmptyEquip.First().equipNo, equipmentNo = agvEquip.equipNo, useFlag = 1, qty = startEquip.emptyCount, isEmpty = "1", taskStatus = 0, createBy = "WCS", createTime = DateTime.Now, floorNo = 2, fromFloorNo = 3, masterId = 0, orderId = 0, materialId = 0, }; WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } else if (emptyEquip.Count == 3 && secondEmptyEquip.Count >= 2) { BaseEquip startEquip = emptyEquip.First(); WcsTask wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), serialNo = SystemData.GetSerialNo(dbContext), taskType = StaticTaskType.ThirdTransitToSecond, nextPointId = agvEquip.objid, nextPointNo = agvEquip.equipNo, currPointId = startEquip.objid, currPointNo = startEquip.equipNo, endPointId = secondEmptyEquip.First().objid, endPointNo = secondEmptyEquip.First().equipNo, equipmentNo = agvEquip.equipNo, useFlag = 1, qty = startEquip.emptyCount, isEmpty = "1", taskStatus = 0, createBy = "WCS", createTime = DateTime.Now, floorNo = 2, fromFloorNo = 3, masterId = 0, orderId = 0, materialId = 0, }; WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } else { //报警 } } } } catch (Exception ex) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } Thread.Sleep(5000); } } /// /// 背负式Agv退库 /// private void BackReturnTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10); if (baseEquip.IsOut == 2 && !string.IsNullOrEmpty(baseEquip.endStationCode)) { bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 10).Any(); if (!hasTask) { BaseEquip startEquip = StaticData.BaseEquip.First(t => t.endStationCode == baseEquip.endStationCode); List wmsRawReturns = dbContext.WmsRawReturn.Where(t => t.endStationCode == baseEquip.endStationCode) .Where(t => t.auditStatus == "1") .Where(t => t.executeStatus == "0" || t.executeStatus == "1") .ToList(); wmsRawReturns.ForEach(t => t.executeStatus = "1"); dbContext.UpdateRange(wmsRawReturns); BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 21); var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), serialNo = SystemData.GetSerialNo(dbContext), taskType = 48, nextPointId = baseEquip.objid, nextPointNo = baseEquip.equipNo, currPointId = startEquip.objid, currPointNo = startEquip.equipNo, endPointId = endEquip.objid, endPointNo = endEquip.equipNo, equipmentNo = baseEquip.equipNo, useFlag = 1, qty = 1, taskStatus = 0, containerNo = "", IsDelete = 0, createTime = DateTime.Now, }; baseEquip.IsOut = 0; dbContext.Update(baseEquip); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } } } catch (Exception ex) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } Thread.Sleep(5000); } } /// /// 半成品入库 /// /// 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.useFlag == 1 && t.taskStatus <= 5).Any(); if (!task) { var wmsProductInstock = dbContext.WmsProductInstock .Where(t => t.productType == "2") .Where(t => t.auditStatus == "1" && t.executeStatus == "0") .Where(t => t.warehouseId == 521) .FirstOrDefault(); if (wmsProductInstock != null) { var wmsBaseLocation = dbContext.WmsBaseLocation .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .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) { var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), serialNo = SystemData.GetSerialNo(dbContext), taskType = StaticTaskType.FiveHalfIn, 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.locationStatus = "2"; //dbContext.Add(wmsProductInstockDetail); dbContext.Update(wmsProductInstock); dbContext.Update(wmsBaseLocation); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); } else { //报警 } } } } catch (Exception ex) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } 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 { lock (SystemData.ThirdTaskLock) { 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 == null ? 0 : wmsRawOutstock.saleOrderId)) .Where(t => t.warehouseId == 311) .ToList(); var AllWmsBaseLocations = dbContext.WmsBaseLocation .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.warehouseId == 311).ToList(); var wmsBaseLocations = AllWmsBaseLocations .Where(t => t.warehouseId == 311) .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.Value.Date);//按某个时间段 foreach (var item in bill) { var fistbill = bill.First(); 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)) { WmsRawStock? wmsRawStock1 = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == fromBaseLocation.locationCode); if (wmsRawStock1 != null) { 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) { if (toLocation.locDeep == 1) { bool hasLocation = AllWmsBaseLocations .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) .Where(t => t.locColumn == toLocation.locColumn) .Any(); if (!hasLocation) { Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); continue; } } var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), taskType = StaticTaskType.ThirdRemove, containerNo = wmsRawStock1.palletInfoCode, 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 }; SystemData.LockOutLocation(toLocation, dbContext); SystemData.LockOutLocation(fromBaseLocation, dbContext); toLocation.locationStatus = "4"; toLocation.updateBy = "WCS"; toLocation.updateTime = DateTime.Now; fromBaseLocation.updateBy = "WCS"; fromBaseLocation.updateTime = DateTime.Now; fromBaseLocation.locationStatus = "4"; dbContext.Update(toLocation); dbContext.Update(fromBaseLocation); dbContext.Add(RemoveTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); dbContext.Add(wcsTaskLog); } else { continue; } } else { continue; } } } } } } 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 = StaticTaskType.ThirdRawToFlip, containerNo = wmsRawStock.palletInfoCode, 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 }; SystemData.LockOutLocation(wmsBaseLocation, dbContext); 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) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } finally { Thread.Sleep(5000); } } } /// /// 创建返库任务 /// /// private void CreateBearAgvReturnLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 21); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10); if (!string.IsNullOrEmpty(baseEquip.endStationCode) && baseEquip.ud3 == "1") { var wmsRawReturn = dbContext.WmsRawReturn .Where(t => t.auditStatus == "1") .Where(t => t.executeStatus == "0") .Where(t => t.endStationCode == baseEquip.endStationCode) .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, }; baseEquip.ud3 = null; dbContext.Update(baseEquip); dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); dbContext.Update(wmsRawReturn); dbContext.SaveChanges(); } } } } } catch (Exception ex) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } 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.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") .Where(t => t.warehouseId == item.warehouseId).ToList(); var wmsBaseLocations = AllWmsBaseLocations .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.locationStatus == "1") { WmsProductStock? wmsProductStock = dbContext.WmsProductStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); if (wmsProductStock != null) { 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) { if (toLocation.locDeep == 1) { bool hasLocation = AllWmsBaseLocations .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) .Where(t => t.locColumn == toLocation.locColumn) .Any(); if (!hasLocation) { Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); continue; } } var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.productOutstockId, taskType = StaticTaskType.FiveRemove, containerNo = wmsProductStock.palletInfoCode, 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 }; 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); } else { continue; } } else { continue; } } else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1") { Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库"); _logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库"); 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 = StaticTaskType.FiveProductOut, containerNo = stock.palletInfoCode, 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 }; SystemData.LockOutLocation(location, dbContext); location.locationStatus = "6"; location.updateBy = "WCS"; location.updateTime = DateTime.Now; dbContext.Add(detail); dbContext.Update(location); dbContext.Add(wcsTask); dbContext.Update(stock); break; } } if (item.beginTime == null) { item.beginTime = DateTime.Now; } dbContext.Update(item); dbContext.SaveChanges(); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); _logger.Error(ex.Message + "\n" + ex.StackTrace); } 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) { lock (SystemData.SecondTaskLock) { 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 == null ? 0 : item.saleOrderId) && t.warehouseId == item.warehouseId) .Select(t => t.locationCode) .ToList(); List AllWmsBaseLocations = dbContext.WmsBaseLocation .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") .Where(t => t.warehouseId == item.warehouseId).ToList(); var wmsBaseLocations = AllWmsBaseLocations .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 }; 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; 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 = dbContext.WmsBaseLocation.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") { WmsProductStock? wmsProductStock = dbContext.WmsProductStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); if (wmsProductStock != null) { 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.locationStatus == "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) { if (toLocation.locDeep == 1) { bool hasLocation = AllWmsBaseLocations .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) .Where(t => t.locColumn == toLocation.locColumn) .Any(); if (!hasLocation) { Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); continue; } } var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.productOutstockId, taskType = StaticTaskType.SecondRemove, 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 }; 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); } else { continue; } } else { continue; } } else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1") { Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库"); _logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库"); continue; } } } wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.productOutstockId, taskType = StaticTaskType.SecondStorageToLift, containerNo = stock.palletInfoCode, 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 = 1 }; 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, }; SystemData.LockOutLocation(location, dbContext); 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(); break; } } if (item.beginTime == null) { item.beginTime = DateTime.Now; } dbContext.Update(item); dbContext.SaveChanges(); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); _logger.Error(ex.Message + "\n" + ex.StackTrace); } 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 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) { int taskCount = dbContext.WcsTask.Where(t => t.nextPointId == 11).Count(); //if (taskCount == 0 && wcsOutstockLock.qty == 0 && wcsOutstockLock.boxStatus == 0) if (taskCount == 0) { List list = wcsTaskManuals.Where(t => t.taskType == 100).ToList(); if (list.Count == 0) { list = wcsTaskManuals.Where(t => t.taskType == 30).ToList(); } if (list.Count == 0) { list = wcsTaskManuals.Where(t => t.taskType == 102).ToList(); } foreach (var wcs in list.Take(6)) { WcsTask wcsTask = CoreMapper.Map(wcs); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTask); dbContext.Add(wcsTaskLog); dbContext.WcsTaskManual.Where(t => t.objid == wcs.objid).Delete(); } dbContext.SaveChanges(); } } foreach (var item in rawOutStock) { if (item.endStationCode == "BB_01") { } decimal? RealOutNumber = item.realOutstockAmount; var endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipNo == item.endStationCode); if (endEquip != null && endEquip.floorNo == 5) { #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.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出库到装配区 { lock (SystemData.outStockLock) { //原材料库存 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) { if (item.endStationCode != endStationCodeEquip.endStationCode) { continue; } bool CreateSuccess = false; bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 11).Any(); if (!hasTask) { 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 => new { t.materialId, t.saleOrderId }).Select(t => new { MaterialId = t.Key.materialId, SaleOrderId = t.Key.saleOrderId, TotalAmount = t.Sum(x => x.outstockAmount), realOutstockAmount = t.Sum(x => x.realOutstockAmount) } ).ToList(); int? index = 1; foreach (var order in list) { if (tasks.Count >= 6) { break; } var wmsRawStocks = rawStock .Where(t => t.materialId == order.MaterialId && t.saleOrderId == (order.SaleOrderId == null ? 0 : order.SaleOrderId) && 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.locationStatus == "1") .Where(t => t.warehouseId == 512) .Where(t => t.ContainerStatus == "1") .Where(t => wmsRawStocks.Contains(t.containerCode)) .ToList(); decimal? needNumber = order.TotalAmount - order.realOutstockAmount; // 寻找已经创建任务的料箱中的是否含有当前物料(A物料在料箱A\B中,然后找B物料的时候是否在料箱A\B中) foreach (var task in tasks) { var wmsRawStock = rawStock.Where(t => t.palletInfoCode == task.containerNo && t.materialId == order.MaterialId && t.saleOrderId == order.SaleOrderId).ToList(); decimal? total = wmsRawStock.Sum(t => t.totalAmount)- wmsRawStock.Sum(t => t.frozenAmount); needNumber -= total; WmsBaseLocation wmsBaseLocation = AllWmsBaseLocations.Where(t => t.locationCode == task.currPointNo).First(); index = wmsBaseLocation.locRow; } if (needNumber <= 0) { continue; } var bill = from a in wmsBaseLocations from b in rawStock where a.containerCode == b.palletInfoCode && b.materialId == order.MaterialId && b.saleOrderId == (order.SaleOrderId == null ? 0 : order.SaleOrderId) select new { a, b }; //如果第一列满足需求,则按第一列排序,否则按最后一列排序 if (bill.Where(t => t.a.locRow == index).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() >= needNumber) { if (index == 1) { bill = bill.OrderBy(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList(); index = 2; } else { bill = bill.OrderByDescending(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList(); index = 1; } } else { bill = bill.OrderByDescending(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList(); if (index == 1) { bill = bill.OrderByDescending(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList(); index = 2; } else { bill = bill.OrderBy(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList(); index = 1; } } BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); foreach (var b in bill) { if (needNumber <= 0 || tasks.Count >= 6) { break; } if (tasks.Where(t => t.containerNo == b.a.containerCode).Any())//判读当前料箱是否存在出库任务 { continue; } WmsBaseLocation location = b.a; WmsRawStock stock = b.b; int qty = 0; if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 { needNumber -= (stock.totalAmount - stock.frozenAmount); qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); stock.updateDate = DateTime.Now; } else { qty = Convert.ToInt32(needNumber); needNumber = 0; stock.updateDate = DateTime.Now; } WmsRawOutstock? wmsRawOutstock = orderList.Where(t => t.materialId == order.MaterialId).FirstOrDefault(); if (wmsRawOutstock != null) { var wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = wmsRawOutstock.rawOutstockId, taskType = StaticTaskType.FiveAccessoryOut, 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.locationStatus = "6"; location.updateBy = "WCS"; location.ContainerStatus = "2"; location.updateTime = DateTime.Now; dbContext.Update(location); dbContext.Update(stock); CreateSuccess = true; if (tasks.Count >= 6) { break; } } } } if (CreateSuccess) { endStationCodeEquip.IsOut = 0; 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 == endStationCodeEquip.endStationCode); 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); WcsTaskLog wcsTaskLog = CoreMapper.Map(bearAgvTask); dbContext.Add(wcsTaskLog); } if (item.beginTime == null) { item.beginTime = DateTime.Now; } dbContext.UpdateRange(orderList); dbContext.Update(item); } dbContext.Update(endStationCodeEquip); if (tasks.Count > 0) { dbContext.AddRange(tasks); } dbContext.SaveChanges(); } } } } else { lock (SystemData.FiveTaskLock) { if (endEquip.equipType == 12)//原材料到柜体验收区,背板安装 { var rawStock = dbContext.WmsRawStock .Where(t => t.activeFlag == "1").ToList(); bool hasTask = dbContext.WcsTask.Where(t => t.currPointId == endEquip.objid || t.endPointId == endEquip.objid).Any(); if (!hasTask) { if (endEquip.emptyCount == 0) { var wmsRawStocks = rawStock .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId) .WhereIf(endEquip.equipType == 12, t => t.completeFlag == "1") .Where(t => t.saleOrderId == (item.saleOrderId == null ? 0 : 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.locationStatus == "1") .Where(t => t.warehouseId == item.warehouseId) .OrderByDescending(t => t.locDeep) .Where(t => wmsRawStocks.Contains(t.containerCode)) .ToList(); decimal? needNumber = item.outstockAmount - item.realOutstockAmount; var bill = from a in wmsBaseLocations from b in rawStock where a.locationCode == b.locationCode 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)//该料箱全部出 { qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); stock.updateDate = DateTime.Now; } else { 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;//5 } 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.locationStatus == "1") { WmsRawStock? wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); if (wmsRawStock != null) { 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) { if (toLocation.locDeep == 1) { bool hasLocation = AllWmsBaseLocations .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) .Where(t => t.locColumn == toLocation.locColumn) .Any(); if (!hasLocation) { Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); continue; } } var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.rawOutstockId, taskType = StaticTaskType.FiveRemove, containerNo = wmsRawStock.palletInfoCode, 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.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); } else { continue; } } else { continue; } } else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1") { Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库"); _logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库"); continue; } } } wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.rawOutstockId, taskType = StaticTaskType.FiveRawToSplit,//如果是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 }; //location是出库的库位,mesBaseBarcodeInfo是条码信息表数据,item是出库申请单 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 }; if (item.beginTime == null) { item.beginTime = DateTime.Now; } SystemData.LockOutLocation(location, dbContext); dbContext.Add(wmsProductOutstockDetail); location.locationStatus = "6"; location.updateBy = "WCS"; location.updateTime = DateTime.Now; endEquip.emptyCount = 1; dbContext.Update(endEquip); dbContext.Update(location); dbContext.Add(wcsTask); dbContext.Update(item); dbContext.Update(stock); WcsTaskLog wcsTaskLog1 = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog1); dbContext.SaveChanges(); } break; } } } } else if (endEquip.equipType == 13) //原材料到背板安装 { var stock = dbContext.WmsRawStock.Where(t => t.instockBatch == item.materialBatch).FirstOrDefault(); if (stock != null) { var location = dbContext.WmsBaseLocation .Where(t => t.locationStatus == "1") .Where(t => t.locationCode == stock.locationCode).FirstOrDefault(); if (location != null) { List AllWmsBaseLocations = dbContext.WmsBaseLocation .Where(t => t.warehouseId == item.warehouseId).ToList(); decimal? needNumber = item.outstockAmount - item.realOutstockAmount; BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode); WcsTask wcsTask; int qty = 0; if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 { qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); stock.updateDate = DateTime.Now; } else { 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;//5 } 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.locationStatus == "1") { WmsRawStock? wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); if (wmsRawStock != null) { 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) { if (toLocation.locDeep == 1) { bool hasLocation = AllWmsBaseLocations .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) .Where(t => t.locColumn == toLocation.locColumn) .Any(); if (!hasLocation) { Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); continue; } } var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.rawOutstockId, taskType = StaticTaskType.FiveRemove, containerNo = wmsRawStock.palletInfoCode, 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.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); } else { continue; } } else { continue; } } else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1") { Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库"); _logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库"); continue; } else { Console.WriteLine(DateTime.Now + $":{location.locationCode}浅库位状态异常,无法移库"); _logger.Info($"{location.locationCode}浅库位状态异常,无法移库"); continue; } } wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), orderId = item.rawOutstockId, taskType = StaticTaskType.FiveRawToBack,//如果是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 }; //location是出库的库位,mesBaseBarcodeInfo是条码信息表数据,item是出库申请单 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 }; if (item.beginTime == null) { item.beginTime = DateTime.Now; } SystemData.LockOutLocation(location, dbContext); dbContext.Add(wmsProductOutstockDetail); location.locationStatus = "6"; location.updateBy = "WCS"; location.updateTime = DateTime.Now; endEquip.emptyCount = 1; dbContext.Update(endEquip); dbContext.Update(location); dbContext.Add(wcsTask); dbContext.Update(item); dbContext.Update(stock); WcsTaskLog wcsTaskLog1 = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog1); dbContext.SaveChanges(); } } } } } } } } } catch (Exception ex) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } Thread.Sleep(3000); } } } }