diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs index 26a4c1d..9ada8db 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs @@ -32,6 +32,7 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread; int FloorNo { get; set; } string EquipNo = ""; + int EquipID = 8; //2楼AGV List taskInType = new List { 1, 3, 5, 7 }; List taskOutType = new List { 2, 4, 6, 8 }; public SecondFloorAGV(IHost host, Plc.S7.Plc plc, int floor, string equipNo) @@ -74,25 +75,24 @@ namespace Khd.Core.Wcs.Wcs { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); - List taskInType = new List { 1, 3, 5, 7 }; - List taskOutType = new List { 2, 4, 6, 8 }; while (true) { try { - var taskList = GetTask(FloorNo, EquipNo); + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var taskList = StaticData.WcsTask.Where(t => t.nextPointId == EquipID && t.currPointId != EquipID && (t.taskType == 11 || t.taskType == 5 || t.taskType == 6)).ToList(); if (taskList.Count == 0) { LogManager.Info(FloorNo + "楼AGV无任务"); } foreach (var item in taskList) { - if (taskInType.Contains(item.taskType.GetValueOrDefault()))//入库 + if (item.taskType == 5 || item.taskType == 11)//入库 { var loc = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList(); - + //2楼成品 - if (item.taskType == 5|| item.taskType==11 )//成品入库||成品移库 + if (item.taskType == 5 || item.taskType == 11)//成品入库||成品移库 { var stock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1").ToList(); //获取有物料的库位 @@ -108,85 +108,88 @@ namespace Khd.Core.Wcs.Wcs //获取空库位 var nullLocList = loc.Where(r => !locStock.Select(t => t.locCode).Contains(r.locationCode) && r.warehouseId == 1).ToList(); var location = nullLocList.OrderBy(t => t.locColumn).FirstOrDefault(); - + if (location == null) return; item.currPointId = 8; item.currPointNo = "AGV01"; item.nextPointId = location.locationId; item.nextPointNo = location.locationCode; - //dbContext.Update(item); + //锁定库位 + dbContext.WmsBaseLocation.Where(t => t.locRow == location.locRow && t.locColumn == location.locColumn && t.layerNum == location.layerNum).Update(t => new WmsBaseLocation() + { + locationStatus = "6", + updateTime = DateTime.Now, + updateBy = "agv出库", + }); } //下发agv出库指令 SendAndUpdateTask(item); } - else + else if (item.taskType == 6) { var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList(); - //出库 - if (item.taskType == 6)//成品出库 - { - //获取库存 - var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1" && t.stockType == "3").ToList(); + var outProStock = dbContext.WmsProductOutstock.Where(t => t.productOutstockId == item.orderId).FirstOrDefault(); + //获取库存 + var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1" && t.stockType == "3" && t.planCode == outProStock.planCode && t.saleorderCode == outProStock.saleorderCode).ToList(); - var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault(); - var DateRange = Convert.ToInt32(dic.dicValue); - var stockList = from t in proStock.Where(r => r.productId == item.materialId) - join b in locList on t.locationCode equals b.locationCode - into temp - from newStock in temp.DefaultIfEmpty() - select new - { - proID = t.productStockId, - locID = newStock.locationId, - locCode = t.locationCode, - layerNum = newStock.layerNum, - locColumn = newStock.locColumn, - locRow = newStock.locRow, - locDeep = newStock.locDeep, - inStockDate = newStock.createTime, - }; - //先查出最早入库时间 - var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault(); - var inStockDate = inStockModel.inStockDate; - //查出符合条件的成品 - var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList(); - var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault(); - if (outModel.locDeep == 1) + var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault(); + var DateRange = Convert.ToInt32(dic.dicValue); + var stockList = from t in proStock.Where(r => r.productId == item.materialId) + join b in locList on t.locationCode equals b.locationCode + into temp + from newStock in temp.DefaultIfEmpty() + select new + { + proID = t.productStockId, + locID = newStock.locationId, + locCode = t.locationCode, + layerNum = newStock.layerNum, + locColumn = newStock.locColumn, + locRow = newStock.locRow, + locDeep = newStock.locDeep, + inStockDate = newStock.createTime, + }; + //先查出最早入库时间 + var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault(); + var inStockDate = inStockModel.inStockDate; + //查出符合条件的成品 + var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList(); + var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault(); + if (outModel.locDeep == 1) + { + //自动获取id + Jc.SnowId.JcSnowId id = new Jc.SnowId.JcSnowId(1, 1); + var objid = id.NextId(); + var isExiStock = stockList.Where(t => t.locRow == outModel.locRow && t.locColumn == outModel.locColumn && t.locDeep == 2).FirstOrDefault(); + if (isExiStock != null) { - //自动获取id - Jc.SnowId.JcSnowId id = new Jc.SnowId.JcSnowId(1, 1); - var objid = id.NextId(); - var isExiStock = stockList.Where(t=>t.locRow==outModel.locRow && t.locColumn==outModel.locColumn && t.locDeep ==2).FirstOrDefault(); - if (isExiStock != null) - { - //创建成品移库任务 - WcsTask newTask = new() - { - objid = objid, - taskType = 11, - containerNo = "", - taskStatus = 0, - materialId = isExiStock.locID, - qty = 1, - startPointId = isExiStock.locID, - startPointNo = "", - currPointId = isExiStock.locID, - currPointNo = "", - }; - dbContext.Add(newTask); - dbContext.SaveChanges(); - return; - } + //创建成品移库任务 + WcsTask newTask = new() + { + objid = objid, + taskType = 11, + containerNo = "", + taskStatus = 0, + materialId = isExiStock.locID, + qty = 1, + startPointId = isExiStock.locID, + currPointId = isExiStock.locID, + endPointId = 12, + endPointNo = "WH02", + }; + dbContext.Add(newTask); + dbContext.SaveChanges(); + return; } - //锁定库位 - dbContext.WmsBaseLocation.Where(t => t.locationCode == outModel.locCode).Update(t => new WmsBaseLocation() - { - locationStatus = "1", - updateTime = DateTime.Now, - updateBy = "agv出库", - }); - //下发agv出库指令 - SendAndUpdateTask(item); } + //锁定库位 + dbContext.WmsBaseLocation.Where(t => t.locRow == outModel.locRow && t.locColumn == outModel.locColumn && t.layerNum == outModel.layerNum).Update(t => new WmsBaseLocation() + { + locationStatus = "6", + updateTime = DateTime.Now, + updateBy = "agv出库", + }); + //下发agv出库指令 + SendAndUpdateTask(item); } } } @@ -201,28 +204,6 @@ namespace Khd.Core.Wcs.Wcs } } - public List GetTask(int floorNo, string equipNo) - { - using var scope = _host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - List wcsTask = new List(); - var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); - var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault(); - try - { - //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv - var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid && t.currPointId != equip.objid && (t.taskType==1|| t.taskType == 2|| t.taskType == 5 || t.taskType == 6)).ToList(); - if (taskList.Count() == 0) - { return null; } - wcsTask = taskList; - } - catch (Exception ex) - { - LogManager.Info(floorNo + "楼AGV异常" + ex.Message); - throw; - } - return wcsTask; - } public void SendAndUpdateTask(WcsTask task) { //获取 @@ -233,6 +214,7 @@ namespace Khd.Core.Wcs.Wcs //首先判断是否已下发指令 var cmd = dbContext.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList(); + if (locList.Count == 0) return; //指令表存在说明已下发 if (cmd == null) { //获取下发agv指令 @@ -254,10 +236,10 @@ namespace Khd.Core.Wcs.Wcs setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); } putPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); - p.podCode = setPos.agvPositionCode; + p.podCode = setPos?.agvPositionCode; p.podTyp = ""; agvtask.positionCodePath.Add(p); - p.podCode = putPos.agvPositionCode; + p.podCode = putPos?.agvPositionCode; p.podTyp = ""; //取料点 agvtask.positionCodePath.Add(p); @@ -329,140 +311,31 @@ namespace Khd.Core.Wcs.Wcs currPointId = task.currPointId, currPointNo = task.currPointNo, nextPointId = task.nextPointId, - nextPointNo= task.nextPointNo, + nextPointNo = task.nextPointNo, updateTime = DateTime.Now, updateBy = "agv出库", - }) ; + }); } - ///// - ///// 下发任务 - ///// - ///// - //public void SendTask1(WcsTask task) + //public List GetTask(int floorNo, string equipNo) //{ // using var scope = _host.Services.CreateScope(); // using var dbContext = scope.ServiceProvider.GetRequiredService(); - // //入库类型 - // //List taskInType = new List { 1, 3, 5, 7 }; - // //List taskOutType = new List { 2, 4, 6, 8 }; - // //获取 - // if (task == null) return; - // if (taskInType.Contains(task.taskType.GetValueOrDefault()))//入库 + // List wcsTask = new List(); + // var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault(); + // try // { - // WcsToWms wcsToWms = new WcsToWms(); - // //首先判断是否已下发指令 - // var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); - // //指令表存在说明已下发 - // if (cmd == null) - // { //获取下发agv指令 - // string ip = ""; int port = 0; string url = ""; - // RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); - // agvtask.reqCode = task.serialNo.ToString(); - // //var json = JsonConvert.SerializeObject(agvtask); - // //HttpHelper.SendPostMessage(ip, port, url, json); - // wcsToWms.genAgvSchedulingTask(agvtask); - // //未下发给agv下发指令 - // WcsCmd taskCmd = new WcsCmd() - // { - // taskId = task.objid, - // cmdType = task.taskType, - // serialNo = task.serialNo, - // equipmentNo = task.equipmentNo, - // cmdStatus = 1, - // createBy = FloorNo + "楼AGV", - // createTime = DateTime.Now, - // }; - // dbContext.Add(taskCmd); - // dbContext.SaveChanges(); - // } - // else - // { - - // var IsPallet = this._plc.Read(this.LineIsPallet.plcpointAddress); - // if (cmd.sendFlag == 0) - // { - // if (Convert.ToInt32(IsPallet) == 1) - // { - - // continueTaskDto continueTask = new continueTaskDto(); - // continueTask.taskCode = task.objid.ToString(); - // wcsToWms.continueTask(continueTask); - // //未下发给agv下发指令 - // WcsCmd taskCmd = new WcsCmd() - // { - // taskId = task.objid, - // cmdType = task.taskType, - // serialNo = task.serialNo, - // equipmentNo = task.equipmentNo, - // sendFlag = 1, - // createBy = FloorNo + "楼AGV", - // createTime = DateTime.Now, - // }; - // dbContext.Update(taskCmd); - // dbContext.SaveChanges(); - - // } - // } - // } - + // //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + // var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid && t.currPointId != equip.objid && (t.taskType==1|| t.taskType == 2|| t.taskType == 5 || t.taskType == 6)).ToList(); + // if (taskList.Count() == 0) + // { return null; } + // wcsTask = taskList; // } - // else + // catch (Exception ex) // { - // var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList(); - // //出库 - // if (task.taskType == 6)//成品出库 - // { - // //获取库存 - // var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1" && t.stockType == "3" && t.productId == task.materialId).ToList(); - - // var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault(); - // var DateRange = Convert.ToInt32(dic.dicValue); - // var stockList = from t in proStock - // join b in locList on t.locationCode equals b.locationCode - // into temp - // from newStock in temp.DefaultIfEmpty() - // select new - // { - // proID = t.productStockId, - // locID = newStock.locationId, - // locCode = t.locationCode, - // layerNum = newStock.layerNum, - // locColumn = newStock.locColumn, - // locRow = newStock.locRow, - // locDeep = newStock.locDeep, - // inStockDate = newStock.createTime, - // }; - // //先查出最早入库时间 - // var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault(); - // var inStockDate = inStockModel.inStockDate; - // //查出符合条件的成品 - // var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList(); - // var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault(); - - - // dbContext.WmsBaseLocation.Where(t => t.locationCode == outModel.locCode).Update(t => new WmsBaseLocation() - // { - // locationStatus = "1", - // updateTime = DateTime.Now, - // updateBy = "agv出库", - // }); - - // dbContext.WcsTask.Where(t => t.objid == task.objid).Update(t => new WcsTask() - // { - // currPointId = outModel.locID, - // currPointNo = outModel.locCode, - // updateTime = DateTime.Now, - // updateBy = "agv出库", - // }); - // //下发agv出库指令 - - - // } - // else if (task.taskType == 2)//原材料出库 - // { - - // } + // LogManager.Info(floorNo + "楼AGV异常" + ex.Message); + // throw; // } + // return wcsTask; //} } } diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs index b9c09c8..dea4206 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs @@ -32,6 +32,7 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread; int FloorNo { get; set; } string EquipNo = ""; + int EquipID = 2; public SecondFloorLine(IHost host, Plc.S7.Plc plc, int floor, string equipNo) { this._host = host; @@ -87,11 +88,12 @@ namespace Khd.Core.Wcs.Wcs { //获取条码信息 var palletNo = Convert.ToString(rfid); - //获取入库任务 - var wcsTask = GetTask(palletNo, FloorNo, EquipNo); + //获取任务 + var wcsTask = StaticData.WcsTask.Where(t => t.nextPointId == 2 && t.taskType==3 && t.containerNo==palletNo).FirstOrDefault(); //判断是否为出库任务 - if (wcsTask.taskType == 3) + if (wcsTask != null) { + //下发去提升机的去向 this._plc.Write(LineWcsrun.plcpointAddress, 1); //更新任务 dbContext.WcsTask.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTask() @@ -127,16 +129,7 @@ namespace Khd.Core.Wcs.Wcs var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); try { - //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv - var task = StaticData.WcsTask.Where(t => t.containerNo == containerNo).FirstOrDefault(); - if (task == null) - { - wcsTask = task; - } - else - { wcsTask = StaticData.WcsTask.Where(t => t.currPointNo == equipNo).FirstOrDefault(); - } } catch (Exception ex) { diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs index 18e5c0d..64046e0 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs @@ -32,6 +32,7 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread; int FloorNo { get; set; } string EquipNo = ""; + int EquipID = 9; //3楼AGV List taskInType = new List { 1, 3, 5, 7 }; List taskOutType = new List { 2, 4, 6, 8 }; public ThirdFloorAGV(IHost host, Plc.S7.Plc plc, int floor, string equipNo) @@ -80,162 +81,107 @@ namespace Khd.Core.Wcs.Wcs { try { - var taskList = GetTask(FloorNo, EquipNo); + //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + var taskList = StaticData.WcsTask.Where(t => t.nextPointId == EquipID&& t.currPointId!= EquipID && (t.taskType == 1|| t.taskType == 2 || t.taskType == 9)).ToList(); if (taskList.Count == 0) { LogManager.Info(FloorNo + "楼AGV无任务"); } foreach (var item in taskList) { - if (taskInType.Contains(item.taskType.GetValueOrDefault()))//入库 + if (item.taskType == 1)//入库 { var loc = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList(); - //2楼成品 - if (item.taskType == 5) - { - var stock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1").ToList(); - //获取有物料的库位 - var locStock = from l in loc - join s in stock on l.locationCode equals s.locationCode - select new - { - LocId = l.locationId, - locCode = l.locationCode, - LocDeep = l.locDeep, - productBatch = s.productBatch - }; - //获取空库位 - var nullLocList = loc.Where(r => !locStock.Select(t => t.locCode).Contains(r.locationCode) && r.warehouseId == 1).ToList(); - var location = nullLocList.OrderBy(t => t.locColumn).FirstOrDefault(); - - item.currPointId = 8; - item.currPointNo = "AGV01"; - item.nextPointId = location.locationId; - item.nextPointNo = location.locationCode; - dbContext.Update(item); - } - else - { - //3楼原材料 - var stock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1").ToList(); - //获取有物料的库位 - var locStock = from l in loc - join s in stock on l.locationCode equals s.locationCode - select new - { - LocId = l.locationId, - locCode = l.locationCode, - LocDeep = l.locDeep, - productBatch = s.instockBatch - }; - //获取空库位 - var nullLocList = loc.Where(r => !locStock.Select(t => t.locCode).Contains(r.locationCode) && r.warehouseId == 2).ToList(); - var location = nullLocList.OrderBy(t => t.locColumn).FirstOrDefault(); - item.currPointId = 9; - item.currPointNo = "AGV02"; - item.nextPointId = location.locationId; - item.nextPointNo = location.locationCode; - dbContext.Update(item); - - } + //3楼原材料 + var stock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1").ToList(); + //获取有物料的库位 + var locStock = from l in loc + join s in stock on l.locationCode equals s.locationCode + select new + { + LocId = l.locationId, + locCode = l.locationCode, + LocDeep = l.locDeep, + productBatch = s.instockBatch + }; + //获取空库位 + var nullLocList = loc.Where(r => !locStock.Select(t => t.locCode).Contains(r.locationCode) && r.warehouseId == 2).ToList(); + var location = nullLocList.OrderBy(t => t.locColumn).FirstOrDefault(); + item.currPointId = 9; + item.currPointNo = "AGV02"; + item.nextPointId = location.locationId; + item.nextPointNo = location.locationCode; + dbContext.Update(item); + //下发agv出库指令 + SendAndUpdateTask(item); } - else + else if (item.taskType == 2) { var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList(); - //出库 - if (item.taskType == 6)//成品出库 + //获取库存 + var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1" && t.stockType == "1" && t.materialId == item.materialId).ToList(); + + var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault(); + var DateRange = Convert.ToInt32(dic.dicValue); + var stockList = from t in rawStock + join b in locList on t.locationCode equals b.locationCode + into temp + from newStock in temp.DefaultIfEmpty() + select new + { + rawID = t.rawStockId, + locID = newStock.locationId, + locCode = t.locationCode, + layerNum = newStock.layerNum, + locColumn = newStock.locColumn, + locRow = newStock.locRow, + locDeep = newStock.locDeep, + inStockDate = newStock.createTime, + }; + //先查出最早入库时间 + var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault(); + var inStockDate = inStockModel.inStockDate; + //查出符合条件的成品 + var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList(); + var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault(); + if (outModel.locDeep == 1) { - //var outStock = dbContext.WmsProductOutstock.Where(t=>t.productOutstockId==item.orderId).FirstOrDefault(); - //获取库存 - var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1" && t.stockType == "3" && t.productId == item.materialId).ToList(); - - var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault(); - var DateRange = Convert.ToInt32(dic.dicValue); - var stockList = from t in proStock - join b in locList on t.locationCode equals b.locationCode - into temp - from newStock in temp.DefaultIfEmpty() - select new - { - proID = t.productStockId, - locID = newStock.locationId, - locCode = t.locationCode, - layerNum = newStock.layerNum, - locColumn = newStock.locColumn, - locRow = newStock.locRow, - locDeep = newStock.locDeep, - inStockDate = newStock.createTime, - }; - //先查出最早入库时间 - var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault(); - var inStockDate = inStockModel.inStockDate; - //查出符合条件的成品 - var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList(); - var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault(); - //锁定库位 - dbContext.WmsBaseLocation.Where(t => t.locationCode == outModel.locCode).Update(t => new WmsBaseLocation() + //自动获取id + Jc.SnowId.JcSnowId id = new Jc.SnowId.JcSnowId(1, 1); + var objid = id.NextId(); + var isExiStock = stockList.Where(t => t.locRow == outModel.locRow && t.locColumn == outModel.locColumn && t.locDeep == 2).FirstOrDefault(); + if (isExiStock != null) { - locationStatus = "1", - updateTime = DateTime.Now, - updateBy = "agv出库", - }); - //更新任务 - dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() - { - currPointId = outModel.locID, - currPointNo = outModel.locCode, - updateTime = DateTime.Now, - updateBy = "agv出库", - }); - } - else if (item.taskType == 2)//原材料出库 - { //获取库存 - var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1" && t.stockType == "1" && t.materialId == item.materialId).ToList(); - - var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault(); - var DateRange = Convert.ToInt32(dic.dicValue); - var stockList = from t in rawStock - join b in locList on t.locationCode equals b.locationCode - into temp - from newStock in temp.DefaultIfEmpty() - select new - { - rawID = t.rawStockId, - locID = newStock.locationId, - locCode = t.locationCode, - layerNum = newStock.layerNum, - locColumn = newStock.locColumn, - locRow = newStock.locRow, - locDeep = newStock.locDeep, - inStockDate = newStock.createTime, - }; - //先查出最早入库时间 - var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault(); - var inStockDate = inStockModel.inStockDate; - //查出符合条件的成品 - var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList(); - var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault(); - //锁定库位 - dbContext.WmsBaseLocation.Where(t => t.locationCode == outModel.locCode).Update(t => new WmsBaseLocation() - { - locationStatus = "1", - updateTime = DateTime.Now, - updateBy = "agv出库", - }); - //更新任务 - dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() - { - currPointId = outModel.locID, - currPointNo = outModel.locCode, - updateTime = DateTime.Now, - updateBy = "agv出库", - }); - + //创建成品移库任务 + WcsTask newTask = new() + { + objid = objid, + taskType = 11, + containerNo = "", + taskStatus = 0, + materialId = isExiStock.locID, + qty = 1, + startPointId = isExiStock.locID, + currPointId = isExiStock.locID, + endPointId = 12, + endPointNo = "WH02", + }; + dbContext.Add(newTask); + dbContext.SaveChanges(); + return; + } } + //锁定库位 + dbContext.WmsBaseLocation.Where(t => t.locationCode == outModel.locCode).Update(t => new WmsBaseLocation() + { + locationStatus = "1", + updateTime = DateTime.Now, + updateBy = "agv出库", + }); + //下发agv出库指令 + SendAndUpdateTask(item); } - //下发agv出库指令 - SendTask(item); } } catch (Exception ex) @@ -249,28 +195,139 @@ namespace Khd.Core.Wcs.Wcs } } - public List GetTask(int floorNo, string equipNo) + public void SendAndUpdateTask(WcsTask task) { + //获取 + if (task == null) return; using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); - List wcsTask = new List(); - var wareHouseList = StaticData.WmsBaseWarehouse.ToList(); - var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault(); - try - { - //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv - var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid && (t.taskType==1|| t.taskType == 2|| t.taskType == 5 || t.taskType == 6)).ToList(); - if (taskList.Count() == 0) - { return null; } - wcsTask = taskList; + WcsToWms wcsToWms = new WcsToWms(); + //首先判断是否已下发指令 + var cmd = dbContext.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); + var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList(); + if (locList.Count == 0) return; + //指令表存在说明已下发 + if (cmd == null) + { //获取下发agv指令 + string ip = ""; int port = 0; string url = ""; + RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); + agvtask.reqCode = task.objid.ToString(); + //var json = JsonConvert.SerializeObject(agvtask); + //HttpHelper.SendPostMessage(ip, port, url, json); + agvtask.positionCodePath = new List(); + Position p = new Position(); + WmsBaseLocation putPos = new WmsBaseLocation(); //放料点 + WmsBaseLocation setPos = new WmsBaseLocation(); //取料点 + if (task.taskType == 5) //入库 + { + setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); + } + else + { + setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); + } + putPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault(); + p.podCode = setPos?.agvPositionCode; + p.podTyp = ""; + agvtask.positionCodePath.Add(p); + p.podCode = putPos?.agvPositionCode; + p.podTyp = ""; + //取料点 + agvtask.positionCodePath.Add(p); + agvtask.taskTyp = ""; + //给agv创建任务 + wcsToWms.genAgvSchedulingTask(agvtask); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + cmdType = task.taskType, + serialNo = task.serialNo, + equipmentNo = task.equipmentNo, + cmdStatus = 1, + createBy = FloorNo + "楼AGV", + createTime = DateTime.Now, + }; + dbContext.Add(taskCmd); + dbContext.SaveChanges(); } - catch (Exception ex) + else { - LogManager.Info(floorNo + "楼AGV异常" + ex.Message); - throw; + //获取接驳位是否有托盘 + var IsPallet = this._plc.Read(this.LineIsPallet.plcpointAddress); + if (cmd.sendFlag == 0) + { + if (taskInType.Contains(task.taskType.GetValueOrDefault()))//入库 + { + //入库时有托盘继续任务 + if (Convert.ToInt32(IsPallet) == 1) + { + continueTaskDto continueTask = new continueTaskDto(); + continueTask.taskCode = task.objid.ToString(); + wcsToWms.continueTask(continueTask); + //未下发给agv下发指令 + WcsCmd taskCmd = new WcsCmd() + { + taskId = task.objid, + sendFlag = 1, + createBy = FloorNo + "楼AGV", + createTime = DateTime.Now, + }; + dbContext.Update(taskCmd); + dbContext.SaveChanges(); + } + } + else + { + //出库时没有托盘继续任务 + if (Convert.ToInt32(IsPallet) == 0) + { + continueTaskDto continueTask = new continueTaskDto(); + continueTask.taskCode = task.objid.ToString(); + wcsToWms.continueTask(continueTask); + //更新任务 + dbContext.WcsCmd.Where(t => t.taskId == task.objid).Update(t => new WcsCmd() + { + sendFlag = 1, + updateTime = DateTime.Now, + updateBy = "agv出库", + }); + } + } + } } - return wcsTask; + //更新任务表 + dbContext.WcsTask.Where(t => t.objid == task.objid).Update(t => new WcsTask() + { + currPointId = task.currPointId, + currPointNo = task.currPointNo, + nextPointId = task.nextPointId, + nextPointNo = task.nextPointNo, + updateTime = DateTime.Now, + updateBy = "agv出库", + }); } + //public List GetTask(int floorNo) + //{ + // using var scope = _host.Services.CreateScope(); + // using var dbContext = scope.ServiceProvider.GetRequiredService(); + // List wcsTask = new List(); + // var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault(); + // try + // { + // //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv + // var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid && (t.taskType == 1 || t.taskType == 2 || t.taskType == 5 || t.taskType == 6)).ToList(); + // if (taskList.Count() == 0) + // { return null; } + // wcsTask = taskList; + // } + // catch (Exception ex) + // { + // LogManager.Info(floorNo + "楼AGV异常" + ex.Message); + // throw; + // } + // return wcsTask; + //} public void SendTask(WcsTask task) { //获取 @@ -351,135 +408,6 @@ namespace Khd.Core.Wcs.Wcs } } } - ///// - ///// 下发任务 - ///// - ///// - //public void SendTask1(WcsTask task) - //{ - // using var scope = _host.Services.CreateScope(); - // using var dbContext = scope.ServiceProvider.GetRequiredService(); - // //入库类型 - // //List taskInType = new List { 1, 3, 5, 7 }; - // //List taskOutType = new List { 2, 4, 6, 8 }; - // //获取 - // if (task == null) return; - // if (taskInType.Contains(task.taskType.GetValueOrDefault()))//入库 - // { - // WcsToWms wcsToWms = new WcsToWms(); - // //首先判断是否已下发指令 - // var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault(); - // //指令表存在说明已下发 - // if (cmd == null) - // { //获取下发agv指令 - // string ip = ""; int port = 0; string url = ""; - // RequestAGVTaskDto agvtask = new RequestAGVTaskDto(); - // agvtask.reqCode = task.serialNo.ToString(); - // //var json = JsonConvert.SerializeObject(agvtask); - // //HttpHelper.SendPostMessage(ip, port, url, json); - // wcsToWms.genAgvSchedulingTask(agvtask); - // //未下发给agv下发指令 - // WcsCmd taskCmd = new WcsCmd() - // { - // taskId = task.objid, - // cmdType = task.taskType, - // serialNo = task.serialNo, - // equipmentNo = task.equipmentNo, - // cmdStatus = 1, - // createBy = FloorNo + "楼AGV", - // createTime = DateTime.Now, - // }; - // dbContext.Add(taskCmd); - // dbContext.SaveChanges(); - // } - // else - // { - // var IsPallet = this._plc.Read(this.LineIsPallet.plcpointAddress); - // if (cmd.sendFlag == 0) - // { - // if (Convert.ToInt32(IsPallet) == 1) - // { - - // continueTaskDto continueTask = new continueTaskDto(); - // continueTask.taskCode = task.objid.ToString(); - // wcsToWms.continueTask(continueTask); - // //未下发给agv下发指令 - // WcsCmd taskCmd = new WcsCmd() - // { - // taskId = task.objid, - // cmdType = task.taskType, - // serialNo = task.serialNo, - // equipmentNo = task.equipmentNo, - // sendFlag = 1, - // createBy = FloorNo + "楼AGV", - // createTime = DateTime.Now, - // }; - // dbContext.Update(taskCmd); - // dbContext.SaveChanges(); - - // } - // } - // } - - // } - // else - // { - // var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList(); - // //出库 - // if (task.taskType == 6)//成品出库 - // { - // //获取库存 - // var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1" && t.stockType == "3" && t.productId == task.materialId).ToList(); - - // var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault(); - // var DateRange = Convert.ToInt32(dic.dicValue); - // var stockList = from t in proStock - // join b in locList on t.locationCode equals b.locationCode - // into temp - // from newStock in temp.DefaultIfEmpty() - // select new - // { - // proID = t.productStockId, - // locID = newStock.locationId, - // locCode = t.locationCode, - // layerNum = newStock.layerNum, - // locColumn = newStock.locColumn, - // locRow = newStock.locRow, - // locDeep = newStock.locDeep, - // inStockDate = newStock.createTime, - // }; - // //先查出最早入库时间 - // var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault(); - // var inStockDate = inStockModel.inStockDate; - // //查出符合条件的成品 - // var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList(); - // var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault(); - - - // dbContext.WmsBaseLocation.Where(t => t.locationCode == outModel.locCode).Update(t => new WmsBaseLocation() - // { - // locationStatus = "1", - // updateTime = DateTime.Now, - // updateBy = "agv出库", - // }); - - // dbContext.WcsTask.Where(t => t.objid == task.objid).Update(t => new WcsTask() - // { - // currPointId = outModel.locID, - // currPointNo = outModel.locCode, - // updateTime = DateTime.Now, - // updateBy = "agv出库", - // }); - // //下发agv出库指令 - - - // } - // else if (task.taskType == 2)//原材料出库 - // { - - // } - // } - //} } } diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs index 4bbb4b2..f4f5ee7 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs @@ -30,6 +30,7 @@ namespace Khd.Core.Wcs.Wcs BasePlcpoint? LineFeedSeriaNo { get; set; } Thread FlowPointThread; int FloorNo { get; set; } + int EquipID = 3; string EquipNo = ""; public ThirdFloorPoint(IHost host, Plc.S7.Plc plc, int floor, string equipNo) { @@ -88,31 +89,14 @@ namespace Khd.Core.Wcs.Wcs var palletNo = Convert.ToString(rfid); //获取入库任务 var wcsTask = GetTask(palletNo, FloorNo, EquipNo); - //判断是否为出库任务 - if (wcsTask.taskType == 2 || wcsTask.taskType == 3) - { - this._plc.Write(LineWcsrun.plcpointAddress, 1); - //更新任务下一点位为提升机 - wcsTask.nextPointId = 6; - wcsTask.nextPointNo = "T01"; - wcsTask.updateTime=DateTime.Now; - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - } - else - { - var nextEquip = StaticData.BaseEquip.Where(t=>t.floorNo==FloorNo && t.equipType==4).FirstOrDefault(); - //更新任务下一点位为AGV - wcsTask.nextPointId = nextEquip.objid; - wcsTask.nextPointNo = nextEquip.equipNo; - wcsTask.updateTime = DateTime.Now; - wcsTask.updateBy = FloorNo+"楼输送线"; - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - ////入库任务 - ////下发agv任务 - //SendTask(wcsTask); - } + var nextEquip = StaticData.BaseEquip.Where(t => t.floorNo == FloorNo && t.equipType == 4).FirstOrDefault(); + //更新任务下一点位为AGV + wcsTask.nextPointId = nextEquip.objid; + wcsTask.nextPointNo = nextEquip.equipNo; + wcsTask.updateTime = DateTime.Now; + wcsTask.updateBy = FloorNo + "楼输送线"; + dbContext.Update(wcsTask); + dbContext.SaveChanges(); } } }