From fc061d945d3b77d6aaa0c06ed229938ea7b73e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83?= <15095123350@163.com> Date: Sat, 22 Jun 2024 13:24:47 +0800 Subject: [PATCH] 20240622 --- .../Controllers/RecieveRcsController.cs | 7 + .../Interface/IWcsTaskApplication.cs | 1 + .../WcsTaskApplication.cs | 121 ++- .../Dto/webapi/AgvCompeleted.cs | 21 + src/Khd.Core.Domain/Dto/webapi/agvCallback.cs | 25 +- src/Khd.Core.Domain/Models/BaseEquip.cs | 2 +- src/Khd.Core.Domain/Models/WcsCmd.cs | 1 + src/Khd.Core.Domain/Models/WcsTask.cs | 2 +- src/Khd.Core.Wcs/MainCentralControl.cs | 16 +- src/Khd.Core.Wcs/Program.cs | 2 +- src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs | 877 +++++++++++++----- src/Khd.Core.Wcs/Wcs/FirstFloor.cs | 117 ++- src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs | 83 +- src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs | 204 ++++ src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs | 69 +- src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs | 2 +- src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs | 2 + src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs | 1 + src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs | 1 + src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs | 1 + src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs | 1 + src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs | 1 + src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs | 1 + src/Khd.Core.Wcs/appsettings.json | 14 +- src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs | 12 +- 25 files changed, 1203 insertions(+), 381 deletions(-) create mode 100644 src/Khd.Core.Domain/Dto/webapi/AgvCompeleted.cs create mode 100644 src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs diff --git a/src/Khd.Core.Api/Controllers/RecieveRcsController.cs b/src/Khd.Core.Api/Controllers/RecieveRcsController.cs index 9fcaf38..e9f4ffb 100644 --- a/src/Khd.Core.Api/Controllers/RecieveRcsController.cs +++ b/src/Khd.Core.Api/Controllers/RecieveRcsController.cs @@ -28,5 +28,12 @@ namespace Khd.Core.Api.Controllers return _application.AgvCallback(agvCallbackDto); } + + [HttpPost("MesToAgvComplete")] + public AgvCompeletedResponse MesToAgvComplete(AgvCompeleted agvCompeletedRequest) + { + LogManager.Info($"RecieveRcsController接口信息:{agvCompeletedRequest.ToJsonString()}"); + return _application.MesToAgvComplete(agvCompeletedRequest); + } } } \ No newline at end of file diff --git a/src/Khd.Core.Application/Interface/IWcsTaskApplication.cs b/src/Khd.Core.Application/Interface/IWcsTaskApplication.cs index eac9316..f4e1c93 100644 --- a/src/Khd.Core.Application/Interface/IWcsTaskApplication.cs +++ b/src/Khd.Core.Application/Interface/IWcsTaskApplication.cs @@ -23,5 +23,6 @@ namespace Khd.Core.Application.Interface string OutWare(long taskId); + AgvCompeletedResponse MesToAgvComplete(AgvCompeleted agvCompeletedRequest); } } \ No newline at end of file diff --git a/src/Khd.Core.Application/WcsTaskApplication.cs b/src/Khd.Core.Application/WcsTaskApplication.cs index a9b227a..bf9c2b6 100644 --- a/src/Khd.Core.Application/WcsTaskApplication.cs +++ b/src/Khd.Core.Application/WcsTaskApplication.cs @@ -47,47 +47,64 @@ namespace Khd.Core.Application ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto(); try { - //处理逻辑 var wcscmd = _dbContext.WcsCmd .Where(t=>t.taskCode==agvCallbackDto.taskCode) - .Where(t => t.taskId == Convert.ToInt64(agvCallbackDto.reqCode)).FirstOrDefault(); + .FirstOrDefault(); if (wcscmd != null) { - //start 开始 end结束 continue继续 - //待取货 - if (agvCallbackDto.method.ToLower() == "start") + WcsTask wcsTask = _dbContext.WcsTask.FirstOrDefault(t => t.objid == wcscmd.taskId); + if(wcsTask != null) { - wcscmd.cmdStatus = 2; - wcscmd.sendFlag = 1; - _dbContext.WcsCmd.Update(wcscmd); - _dbContext.SaveChanges(); - } - //已取货待放货 - if (agvCallbackDto.method.ToLower() == "continue") - { - wcscmd.cmdStatus = 3; - wcscmd.sendFlag = 1; - _dbContext.WcsCmd.Update(wcscmd); - _dbContext.SaveChanges(); + //start 开始 end结束 continue继续 + //待取货 + if (agvCallbackDto.method.ToLower() == "start") + { + wcscmd.cmdStatus = 2; + wcscmd.sendFlag = 1; + wcsTask.taskStatus = 2; + _dbContext.WcsCmd.Update(wcscmd); + _dbContext.WcsTask.Update(wcsTask); + _dbContext.SaveChanges(); + reponseagvCallbackDto.code = "0"; + reponseagvCallbackDto.message = "成功"; + } + //已取货待放货 + if (agvCallbackDto.method.ToLower() == "continue") + { + wcscmd.cmdStatus = 3; + wcscmd.sendFlag = 1; + wcsTask.taskStatus = 3; + _dbContext.WcsCmd.Update(wcscmd); + _dbContext.Update(wcsTask); + _dbContext.SaveChanges(); + reponseagvCallbackDto.code = "0"; + reponseagvCallbackDto.message = "成功"; - var list = _dbContext.WcsTask.Where(t => t.objid == wcscmd.taskId).Update(a => new WcsTask() { currPointNo = wcscmd.equipmentNo }); + //_dbContext.WcsTask.Where(t => t.objid == wcscmd.taskId).Update(t=>t.taskStatus==3); + } + //放货完成 + if (agvCallbackDto.method.ToLower() == "end") + { + wcscmd.cmdStatus = 5; + wcscmd.sendFlag = 1; + wcsTask.taskStatus= 5; + _dbContext.WcsCmd.Update(wcscmd); + _dbContext.Update(wcsTask); + _dbContext.SaveChanges(); + reponseagvCallbackDto.code = "0"; + reponseagvCallbackDto.message = "成功"; + } } - //放货完成 - if (agvCallbackDto.method.ToLower() == "end") - { - wcscmd.cmdStatus = 5; - wcscmd.sendFlag = 1; - _dbContext.WcsCmd.Update(wcscmd); - _dbContext.SaveChanges(); - } - } - reponseagvCallbackDto.code = "S"; - reponseagvCallbackDto.message = "成功"; + else + { + reponseagvCallbackDto.code = "1"; + reponseagvCallbackDto.message = "未找到当前任务"; + } } catch (Exception ex) { - reponseagvCallbackDto.code = "E"; + reponseagvCallbackDto.code = "1"; reponseagvCallbackDto.message = ex.Message; } //返回请求 @@ -111,5 +128,49 @@ namespace Khd.Core.Application { return ""; } + + public AgvCompeletedResponse MesToAgvComplete(AgvCompeleted agvCompeletedRequest) + { + AgvCompeletedResponse agvCompeletedResponse = new AgvCompeletedResponse(); + try + { + string stationId = agvCompeletedRequest.stationId; + BaseEquip baseEquip = _dbContext.BaseEquip.FirstOrDefault(t=>t.equipNo==stationId); + if (baseEquip != null) + { + var wcsCmd = _dbContext.WcsCmd.Where(t => t.nextPointId == baseEquip.objid).FirstOrDefault(); + if (wcsCmd != null) + { + WcsTask wcsTask = _dbContext.WcsTask.FirstOrDefault(t => t.objid == wcsCmd.taskId); + if (wcsTask != null) + { + agvCompeletedResponse.code = "0"; + agvCompeletedResponse.message = "成功"; + wcsCmd.cmdStatus = 6; + wcsTask.taskStatus = 6; + _dbContext.WcsCmd.Update(wcsCmd); + _dbContext.WcsTask.Update(wcsTask); + _dbContext.SaveChanges(); + } + } + else + { + agvCompeletedResponse.code = "1"; + agvCompeletedResponse.message = "未找到当前任务"; + } + } + else + { + agvCompeletedResponse.code = "1"; + agvCompeletedResponse.message = "未找到当前设备"; + } + } + catch (Exception ex) + { + agvCompeletedResponse.code = "1"; + agvCompeletedResponse.message = ex.Message; + } + return agvCompeletedResponse; + } } } \ No newline at end of file diff --git a/src/Khd.Core.Domain/Dto/webapi/AgvCompeleted.cs b/src/Khd.Core.Domain/Dto/webapi/AgvCompeleted.cs new file mode 100644 index 0000000..e964d3f --- /dev/null +++ b/src/Khd.Core.Domain/Dto/webapi/AgvCompeleted.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Domain.Dto.webapi +{ + public class AgvCompeleted + { + public string stationId { get; set; } + public string stationState { get; set; } + public string method { get; set; } + } + + public class AgvCompeletedResponse + { + public string code { get; set; } + public string message { get; set; } + } +} diff --git a/src/Khd.Core.Domain/Dto/webapi/agvCallback.cs b/src/Khd.Core.Domain/Dto/webapi/agvCallback.cs index e966184..b7e5225 100644 --- a/src/Khd.Core.Domain/Dto/webapi/agvCallback.cs +++ b/src/Khd.Core.Domain/Dto/webapi/agvCallback.cs @@ -11,8 +11,8 @@ /// 请求时间截 格式: “yyyy-MM-dd HH:mm:ss”。 /// public string reqTime { get; set; } - public string cooX { get; set; } - public string cooY { get; set; } + public decimal cooX { get; set; } + public decimal cooY { get; set; } public string currentPositionCode { get; set; } public string data { get; set; } public string mapCode { get; set; } @@ -31,6 +31,27 @@ public string roadWayCode { get; set; } public string seq { get; set; } public string eqpCode { get; set; } + + + + public string action { get; set; } + public string areaCode { get; set; } + public string berthCode { get; set; } + public string callCode { get; set; } + public string clientCode { get; set; } + public string currentCallCode { get; set; } + public string dstBinCode { get; set; } + public string indBind { get; set; } + public string layer { get; set; } + public string mapShortName { get; set; } + public string orgCode { get; set; } + public string podNum { get; set; } + public string podTyp { get; set; } + public string relatedArea { get; set; } + public string subTaskNum { get; set; } + public string tokenCode { get; set; } + public string username { get; set; } + public string whCode { get; set; } } public class ReponseagvCallbackDto { diff --git a/src/Khd.Core.Domain/Models/BaseEquip.cs b/src/Khd.Core.Domain/Models/BaseEquip.cs index 3bf1e7d..0445bdb 100644 --- a/src/Khd.Core.Domain/Models/BaseEquip.cs +++ b/src/Khd.Core.Domain/Models/BaseEquip.cs @@ -18,7 +18,7 @@ namespace Khd.Core.Domain.Models public class BaseEquip { [Column("agv_position_code")] - public string agvPositionCode; + public string agvPositionCode { get; set; } [Key] [Column("objid")] diff --git a/src/Khd.Core.Domain/Models/WcsCmd.cs b/src/Khd.Core.Domain/Models/WcsCmd.cs index 4067f6a..4593ade 100644 --- a/src/Khd.Core.Domain/Models/WcsCmd.cs +++ b/src/Khd.Core.Domain/Models/WcsCmd.cs @@ -151,6 +151,7 @@ namespace Khd.Core.Domain.Models /// [Column("send_flag")] public int? sendFlag { get; set; } + } } diff --git a/src/Khd.Core.Domain/Models/WcsTask.cs b/src/Khd.Core.Domain/Models/WcsTask.cs index aaeaa57..57c6997 100644 --- a/src/Khd.Core.Domain/Models/WcsTask.cs +++ b/src/Khd.Core.Domain/Models/WcsTask.cs @@ -18,7 +18,7 @@ namespace Khd.Core.Domain.Models public class WcsTask { [Column("from_floor_no")] - public int? fromFloorNo; + public int? fromFloorNo { get; set; } [Key] [Column("objid")] diff --git a/src/Khd.Core.Wcs/MainCentralControl.cs b/src/Khd.Core.Wcs/MainCentralControl.cs index 5d623b9..df08b63 100644 --- a/src/Khd.Core.Wcs/MainCentralControl.cs +++ b/src/Khd.Core.Wcs/MainCentralControl.cs @@ -45,7 +45,7 @@ namespace Khd.Core.Wcs WcsChuLiWanCheng = StaticPlcHelper.GetValue("2", "1"); //设置默认去向=>1为 Int16位 WcsMoRenQuXiang = StaticPlcHelper.GetValue("2", "1"); - + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); StaticData.BasePlcpointList = dbContext.BasePlcpoint.Where(t => t.isDelete == 0).ToList(); StaticData.BaseEquip = dbContext.BaseEquip.ToList(); foreach (var plcConfig in StaticData.PlcConfigs) @@ -54,7 +54,7 @@ namespace Khd.Core.Wcs { Plc.S7.Plc plc; plc = new Plc.S7.Plc(plcConfig.CpuType, plcConfig.IP, plcConfig.Port, plcConfig.Rack, plcConfig.Slot); - //plc.Open(); + plc.Open(); StaticData.PlcDic.TryAdd(plcConfig.Code, plc); } } @@ -101,15 +101,19 @@ namespace Khd.Core.Wcs //FiveFloorLine fiveFloorLine = new(_host, StaticData.PlcDic[0], FiveFloorLineEquip.floorNo.Value, FiveFloorLineEquip.equipNo); //fiveFloorLine.StartPoint(); - //五层CTU - var FiveFloorCTUEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 6).First(); - FiveFloorCTU fiveFloorCTU = new(_host, StaticData.PlcDic[0], FiveFloorCTUEquip.floorNo.Value, FiveFloorCTUEquip.equipNo); - fiveFloorCTU.StartPoint(); + ////五层CTU + //var FiveFloorCTUEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 6).First(); + //FiveFloorCTU fiveFloorCTU = new(_host, StaticData.PlcDic[0], FiveFloorCTUEquip.floorNo.Value, FiveFloorCTUEquip.equipNo); + //fiveFloorCTU.StartPoint(); ////五层AGV //var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First(); //FiveFloorAGV fifthFloorAGV = new(_host, StaticData.PlcDic[0], FifthFloorAgvEquip.floorNo.Value, FifthFloorAgvEquip.equipNo); //fifthFloorAGV.StartPoint(); + + var FifthFloorBearAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 11).First(); + FiveFloorBearAgv fiveFloorBearAgv = new(_host, StaticData.PlcDic[0], FifthFloorBearAgvEquip.floorNo.Value, FifthFloorBearAgvEquip.equipNo); + fiveFloorBearAgv.StartPoint(); } catch (Exception ex) { diff --git a/src/Khd.Core.Wcs/Program.cs b/src/Khd.Core.Wcs/Program.cs index fcb3fb0..4f843a9 100644 --- a/src/Khd.Core.Wcs/Program.cs +++ b/src/Khd.Core.Wcs/Program.cs @@ -85,6 +85,6 @@ internal class Program .ConfigureServices((_, services) => { services.AddDbContext(options => - options.UseMySql(ConnectionStrings.ConnectionString, new MySqlServerVersion(new Version(8, 0, 31)))); + options.UseMySql(ConnectionStrings.ConnectionString, new MySqlServerVersion(new Version(8, 0, 31))), ServiceLifetime.Transient); }); } diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index ead0c82..6ea5e45 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -61,91 +61,229 @@ namespace Khd.Core.Wcs.Wcs public void StartPoint() { - var FlowPointThread = new Thread(MonitorInLocatorPoint); - FlowPointThread.Start(); + var createRawInWareTaskThread = new Thread(CreateRawInWareTaskLogic); + createRawInWareTaskThread.Start(); + + var createProductTaskThread=new Thread(CreateProductTaskLogic); + createProductTaskThread.Start(); + + var createRawTaskThread=new Thread(CreateRawTaskLogic); + createRawTaskThread.Start(); Console.WriteLine(DateTime.Now + ":出库任务监听启动成功"); LogManager.Info("出库任务监听启动成功"); } - public void MonitorInLocatorPoint() + + /// + /// 背板安装区到半成品入库 + /// + private void CreateRawInWareTaskLogic() { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { - //原料&辅料出库 - CreateRawTask(); - //成品&半成品出库 - CreateProductTask(); + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + } catch (Exception ex) { + Console.WriteLine(ex.Message + ex.StackTrace); LogManager.Error(ex); } - finally - { - Thread.Sleep(2000); - } } + } /// /// 成品出库 /// - public void CreateProductTask() + private void CreateProductTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); - - var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "0").ToList(); - var proOutStock = dbContext.WmsProductOutstock.Where(t => t.executeStatus == "0").ToList(); - //获取最早入库时间 - foreach (var item in proOutStock) + while (true) { - //自动获取id - - var objid = StaticData.SnowId.NextId(); - //锁定库存 - WcsOutstockLock stockLock = new() + try { - objid = objid, - materialId = item.productId, - qty = item.applyQty, - warehouseId = item.warehouseId, - wmsOrderId = item.productOutstockId, - wmsOrderDetailId = item.productOutstockId, - createBy = "sys", - createTime = DateTime.Now - }; + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "0").ToList(); + var proOutStock = dbContext.WmsProductOutstock.Where(t => t.operationType == "3").Where(t => t.executeStatus == "0").ToList(); + //获取最早入库时间 + foreach (var item in proOutStock) + { + BaseEquip endEquip = dbContext.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1); - var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O" && t.dicField == item.productType).FirstOrDefault(); - //获取最早入库时间 - var firstDate = proStock.Where(t => t.productId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault(); - if (firstDate != null && dic != null) + var wmsproStocks = proStock + .Where(t => t.productId == item.productId && t.warehouseId == item.warehouseId) + .Select(t => t.palletInfoCode) + .ToList(); + + var wmsBaseLocations = dbContext.WmsBaseLocation + .Where(t => t.activeFlag == "1") + .Where(t => t.delFlag == "0") + .Where(t => t.locationScrapType == "1") + .Where(t => t.instockFlag == "0") + .Where(t => t.outstockFlag == "0") + .Where(t => t.warehouseId == item.warehouseId) + .Where(t => wmsproStocks.Contains(t.containerCode)) + .ToList(); + + decimal needNumber = Convert.ToDecimal(item.applyQty - item.outstockQty); + if (needNumber <= 0) + { + item.executeStatus = "2"; + dbContext.Update(item); + dbContext.SaveChanges(); + continue; + } + + var bill = from a in wmsBaseLocations + from b in proStock + where a.containerCode == b.palletInfoCode + select new { a, b }; + //如果第一列满足需求,则按第一列排序,否则按最后一列排序 + if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.occupyAmount - t.b.frozenAmount).Sum() > needNumber) + { + bill = bill.OrderBy(t => t.a.locColumn).ToList(); + } + else + { + bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); + } + //做数量限制 + + BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 28); + BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 5); + foreach (var b in bill) + { + item.executeStatus = "1"; + WmsBaseLocation location = b.a; + WmsProductStock stock = b.b; + WcsTask wcsTask; + int qty = 0; + if (stock.totalAmount - stock.occupyAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + { + item.outstockQty += stock.totalAmount - stock.occupyAmount - stock.frozenAmount; + qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); + stock.occupyAmount += qty; + stock.updateDate = DateTime.Now; + } + else + { + item.outstockQty += needNumber; + stock.occupyAmount += needNumber; + qty = Convert.ToInt32(needNumber); + stock.updateDate = DateTime.Now; + } + wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.saleOrderId, + taskType = 38, + containerNo = location.containerCode, + createBy = "WCS", + createTime = DateTime.Now, + taskStatus = 0, + materialId = item.productId, + currPointId = location.locationId, + currPointNo = location.locationCode, + startPointId = location.locationId, + startPointNo = location.locationCode, + nextPointId = ctuEquip.objid, + nextPointNo = ctuEquip.equipNo, + endPointId = lineEquip.objid, + endPointNo = lineEquip.equipNo, + equipmentNo = ctuEquip.equipNo, + useFlag = 1, + qty = qty + }; + location.outstockFlag = "1"; + location.locationStatus = "6"; + location.updateBy = "SYS"; + location.updateTime = DateTime.Now; + WcsOutstockLock stockLock = new() + { + objid = StaticData.SnowId.NextId(), + boxNo = stock.palletInfoCode, + boxStatus = 0, + createTime = DateTime.Now, + createBy = "SYS", + floorNum = 5, + materialId = item.productId, + qty = qty, + warehouseId = item.warehouseId, + wmsOrderId = item.saleOrderId, + wmsOrderDetailId = item.productOutstockId, + orderType = 2, + taskId = wcsTask.objid, + useFlag = 1, + }; + dbContext.Add(stockLock); + dbContext.Update(location); + dbContext.Add(wcsTask); + dbContext.Update(stock); + dbContext.SaveChanges(); + if (qty >= needNumber) + { + break; + } + } + dbContext.Update(item); + dbContext.SaveChanges(); + } + ////自动获取id + + //var objid = StaticData.SnowId.NextId(); + ////锁定库存 + //WcsOutstockLock stockLock = new() + //{ + // objid = objid, + // materialId = item.productId, + // qty = item.applyQty, + // warehouseId = item.warehouseId, + // wmsOrderId = item.productOutstockId, + // wmsOrderDetailId = item.productOutstockId, + // createBy = "sys", + // createTime = DateTime.Now + //}; + + //var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O" && t.dicField == item.productType).FirstOrDefault(); + ////获取最早入库时间 + //var firstDate = proStock.Where(t => t.productId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault(); + //if (firstDate != null && dic != null) + //{ + // //创建出库任务 + // WcsTask newTask = new() + // { + // objid = objid, + // taskType = Convert.ToInt32(dic.dicValue), + // containerNo = "", + // taskStatus = 0, + // materialId = item.warehouseId, + // qty = 1, + // startPointId = item.warehouseId, + // startPointNo = "", + // currPointId = item.warehouseId, + // currPointNo = "", + // endPointId = item.warehouseId, + // endPointNo = "", + // }; + // dbContext.Add(newTask); + // dbContext.SaveChanges(); + // //回写wms记录表 + // dbContext.WmsProductOutstock.Where(t => t.productOutstockId == item.productOutstockId).Update(t => new WmsProductOutstock() + // { + // executeStatus = "1", + // updateDate = DateTime.Now + // }); + //} + } + catch (Exception ex) { - //创建出库任务 - WcsTask newTask = new() - { - objid = objid, - taskType = Convert.ToInt32(dic.dicValue), - containerNo = "", - taskStatus = 0, - materialId = item.warehouseId, - qty = 1, - startPointId = item.warehouseId, - startPointNo = "", - currPointId = item.warehouseId, - currPointNo = "", - endPointId = item.warehouseId, - endPointNo = "", - }; - dbContext.Add(newTask); - dbContext.SaveChanges(); - //回写wms记录表 - dbContext.WmsProductOutstock.Where(t => t.productOutstockId == item.productOutstockId).Update(t => new WmsProductOutstock() - { - executeStatus = "1", - updateDate = DateTime.Now - }); + Console.WriteLine(ex.Message + ex.StackTrace); + LogManager.Error(ex); } } } @@ -154,184 +292,479 @@ namespace Khd.Core.Wcs.Wcs /// /// 原材料出库 /// - public void CreateRawTask() + private void CreateRawTaskLogic() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); - //原材料库存 - var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1").ToList(); - //原材料出库记录 - var rawOutStock = dbContext.WmsRawOutstock - .Where(t => t.executeStatus != "2").ToList(); - foreach (var item in rawOutStock) + while (true) { - //自动获取id - if (item.warehouseId == 512)//CTU出库 + try { - var wmsRawStocks = rawStock - .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId) - .Select(t => t.palletInfoCode) - .ToList(); - - var wmsBaseLocations = dbContext.WmsBaseLocation - .Where(t => t.activeFlag == "1") - .Where(t => t.delFlag == "0") - .Where(t => t.locationScrapType == "1") - .Where(t => t.instockFlag == "0") - .Where(t => t.outstockFlag == "0") - .Where(t => t.warehouseId == item.warehouseId) - .Where(t => wmsRawStocks.Contains(t.containerCode)) + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + //原材料库存 + var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1").ToList(); + //原材料出库记录 + var rawOutStock = dbContext.WmsRawOutstock + .Where(t => t.operationType == "3") + .Where(t => t.executeStatus != "2") + .Where(t => t.auditStatus == "1") .ToList(); - - decimal needNumber = item.outstockAmount - item.realOutstockAmount; - if (needNumber <= 0) + foreach (var item in rawOutStock) { - item.executeStatus = "2"; - dbContext.Update(item); - dbContext.SaveChanges(); - continue; + var endEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == item.endStationCode); + if (endEquip != null && endEquip.floorNo == 5) + { + if (endEquip.equipType == 8)//CTU出库 + { + var wmsRawStocks = rawStock + .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId) + .Select(t => t.palletInfoCode) + .ToList(); + + var wmsBaseLocations = dbContext.WmsBaseLocation + .Where(t => t.activeFlag == "1") + .Where(t => t.delFlag == "0") + .Where(t => t.locationScrapType == "1") + .Where(t => t.instockFlag == "0") + .Where(t => t.outstockFlag == "0") + .Where(t => t.warehouseId == item.warehouseId) + .Where(t => wmsRawStocks.Contains(t.containerCode)) + .ToList(); + + decimal needNumber = item.outstockAmount - item.realOutstockAmount; + if (needNumber <= 0) + { + item.executeStatus = "2"; + dbContext.Update(item); + dbContext.SaveChanges(); + continue; + } + + var bill = from a in wmsBaseLocations + from b in rawStock + where a.containerCode == b.palletInfoCode + select new { a, b }; + //如果第一列满足需求,则按第一列排序,否则按最后一列排序 + if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.occupyAmount - t.b.frozenAmount).Sum() > needNumber) + { + bill = bill.OrderBy(t => t.a.locColumn).ToList(); + } + else + { + bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); + } + //做数量限制 + + bill = bill.Take(5 - dbContext.WcsCmd.Where(t => t.cmdStatus < 3 && t.nextPointId == 20).Count()); + BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); + BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); + foreach (var b in bill) + { + item.executeStatus = "1"; + WmsBaseLocation location = b.a; + WmsRawStock stock = b.b; + WcsTask wcsTask; + int qty = 0; + if (stock.totalAmount - stock.occupyAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + { + item.realOutstockAmount += stock.totalAmount - stock.occupyAmount - stock.frozenAmount; + qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); + stock.occupyAmount += qty; + stock.updateDate = DateTime.Now; + } + else + { + item.realOutstockAmount += needNumber; + stock.occupyAmount += 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 = 0, + materialId = item.materialId, + currPointId = location.locationId, + currPointNo = location.locationCode, + startPointId = location.locationId, + startPointNo = location.locationCode, + nextPointId = ctuEquip.objid, + nextPointNo = ctuEquip.equipNo, + endPointId = lineEquip.objid, + endPointNo = lineEquip.equipNo, + equipmentNo = ctuEquip.equipNo, + useFlag = 1, + qty = qty + }; + location.outstockFlag = "1"; + location.locationStatus = "6"; + location.updateBy = "SYS"; + location.updateTime = DateTime.Now; + WcsOutstockLock stockLock = new() + { + objid = StaticData.SnowId.NextId(), + boxNo = stock.palletInfoCode, + boxStatus = 0, + createTime = DateTime.Now, + createBy = "SYS", + floorNum = 5, + materialId = item.materialId, + qty = qty, + warehouseId = item.warehouseId, + wmsOrderId = item.orderId, + wmsOrderDetailId = item.rawOutstockId, + orderType = 2, + taskId = wcsTask.objid, + useFlag = 1, + }; + dbContext.Add(stockLock); + dbContext.Update(location); + dbContext.Add(wcsTask); + dbContext.Update(stock); + dbContext.SaveChanges(); + if (qty >= needNumber) + { + break; + } + } + dbContext.Update(item); + dbContext.SaveChanges(); + }//CTU出库 + else if (endEquip.equipType == 10) + { + var wmsRawStocks = rawStock + .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId) + .Select(t => t.palletInfoCode) + .ToList(); + + var wmsBaseLocations = dbContext.WmsBaseLocation + .Where(t => t.activeFlag == "1") + .Where(t => t.delFlag == "0") + .Where(t => t.locationScrapType == "1") + .Where(t => t.instockFlag == "0") + .Where(t => t.outstockFlag == "0") + .Where(t => t.warehouseId == item.warehouseId) + .Where(t => wmsRawStocks.Contains(t.containerCode)) + .ToList(); + + decimal needNumber = item.outstockAmount - item.realOutstockAmount; + if (needNumber <= 0) + { + item.executeStatus = "2"; + dbContext.Update(item); + dbContext.SaveChanges(); + continue; + } + + var bill = from a in wmsBaseLocations + from b in rawStock + where a.containerCode == b.palletInfoCode + select new { a, b }; + //如果第一列满足需求,则按第一列排序,否则按最后一列排序 + if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.occupyAmount - t.b.frozenAmount).Sum() > needNumber) + { + bill = bill.OrderBy(t => t.a.locColumn).ToList(); + } + else + { + bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); + } + //做数量限制 + + bill = bill.Take(5 - dbContext.WcsCmd.Where(t => t.cmdStatus < 3 && t.nextPointId == 20).Count()); + BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); + BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); + foreach (var b in bill) + { + item.executeStatus = "1"; + WmsBaseLocation location = b.a; + WmsRawStock stock = b.b; + WcsTask wcsTask; + int qty = 0; + if (stock.totalAmount - stock.occupyAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + { + item.realOutstockAmount += stock.totalAmount - stock.occupyAmount - stock.frozenAmount; + qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); + stock.occupyAmount += qty; + stock.updateDate = DateTime.Now; + } + else + { + item.realOutstockAmount += needNumber; + stock.occupyAmount += 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 = 0, + materialId = item.materialId, + currPointId = location.locationId, + currPointNo = location.locationCode, + startPointId = location.locationId, + startPointNo = location.locationCode, + nextPointId = ctuEquip.objid, + nextPointNo = ctuEquip.equipNo, + endPointId = lineEquip.objid, + endPointNo = lineEquip.equipNo, + equipmentNo = ctuEquip.equipNo, + useFlag = 1, + qty = qty + }; + location.outstockFlag = "1"; + location.locationStatus = "6"; + location.updateBy = "SYS"; + location.updateTime = DateTime.Now; + WcsOutstockLock stockLock = new() + { + objid = StaticData.SnowId.NextId(), + boxNo = stock.palletInfoCode, + boxStatus = 0, + createTime = DateTime.Now, + createBy = "SYS", + floorNum = 5, + materialId = item.materialId, + qty = qty, + warehouseId = item.warehouseId, + wmsOrderId = item.orderId, + wmsOrderDetailId = item.rawOutstockId, + orderType = 2, + taskId = wcsTask.objid, + useFlag = 1, + }; + dbContext.Add(stockLock); + dbContext.Update(location); + dbContext.Add(wcsTask); + dbContext.Update(stock); + dbContext.SaveChanges(); + if (qty >= needNumber) + { + break; + } + } + BaseEquip startStationEquip = StaticData.BaseEquip.First(t => t.objid == 21); + BaseEquip bearAgvEquip = StaticData.BaseEquip.First(t => t.objid == 10); + BaseEquip endStationEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode); + WcsTask bearAgvTask = new() + { + objid = StaticData.SnowId.NextId(), + orderId = item.orderId, + taskType = 32, + containerNo = "", + startPointId = startStationEquip.objid, + startPointNo = startStationEquip.equipNo, + 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 = 0, + equipmentNo = startStationEquip.equipNo, + remark = "组装出库", + floorNo = 5, + masterId = item.materialId, + fromFloorNo = 5, + materialNo = item.materialBatch, + }; + dbContext.Add(bearAgvTask); + dbContext.Update(item); + dbContext.SaveChanges(); + + }//CTU出库到装配区 + else if (endEquip.equipType == 12 || endEquip.equipType == 13)//原材料到柜体验收区 + { + var wmsRawStocks = rawStock + .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId) + .Select(t => t.palletInfoCode) + .ToList(); + + var wmsBaseLocations = dbContext.WmsBaseLocation + .Where(t => t.activeFlag == "1") + .Where(t => t.delFlag == "0") + .Where(t => t.locationScrapType == "1") + .Where(t => t.instockFlag == "0") + .Where(t => t.outstockFlag == "0") + .Where(t => t.warehouseId == item.warehouseId) + .Where(t => wmsRawStocks.Contains(t.containerCode)) + .ToList(); + + decimal needNumber = item.outstockAmount - item.realOutstockAmount; + if (needNumber <= 0) + { + item.executeStatus = "2"; + dbContext.Update(item); + dbContext.SaveChanges(); + continue; + } + + var bill = from a in wmsBaseLocations + from b in rawStock + where a.containerCode == b.palletInfoCode + select new { a, b }; + //如果第一列满足需求,则按第一列排序,否则按最后一列排序 + if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.occupyAmount - t.b.frozenAmount).Sum() > needNumber) + { + bill = bill.OrderBy(t => t.a.locColumn).ToList(); + } + else + { + bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); + } + + BaseEquip bearAgvEquip = StaticData.BaseEquip.First(t => t.objid == 10); + 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.occupyAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + { + item.realOutstockAmount += stock.totalAmount - stock.occupyAmount - stock.frozenAmount; + qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); + stock.occupyAmount += qty; + stock.updateDate = DateTime.Now; + } + else + { + item.realOutstockAmount += needNumber; + stock.occupyAmount += needNumber; + qty = Convert.ToInt32(needNumber); + stock.updateDate = DateTime.Now; + } + wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.rawOutstockId, + taskType = endEquip.equipType == 12 ? 27 : 33,//如果是12那么就是原材料到柜体验收区,如果是13那么就是原材料到背板安装区 + containerNo = location.containerCode, + createBy = "WCS", + createTime = DateTime.Now, + taskStatus = 0, + materialId = item.materialId, + currPointId = location.locationId, + currPointNo = location.locationCode, + startPointId = location.locationId, + startPointNo = location.locationCode, + nextPointId = bearAgvEquip.objid, + nextPointNo = bearAgvEquip.equipNo, + endPointId = lineEquip.objid, + endPointNo = lineEquip.equipNo, + equipmentNo = bearAgvEquip.equipNo, + useFlag = 1, + qty = qty + }; + location.outstockFlag = "1"; + location.locationStatus = "6"; + location.updateBy = "SYS"; + location.updateTime = DateTime.Now; + dbContext.Update(location); + dbContext.Add(wcsTask); + dbContext.Update(stock); + dbContext.SaveChanges(); + if (qty >= needNumber) + { + break; + } + } + dbContext.Update(item); + dbContext.SaveChanges(); + } + } + + + //var objid = StaticData.SnowId.NextId(); + //long orderID = 0; + ////插入锁定库存 + //WcsOutstockLock stockLock = new() + //{ + // objid = objid, + // materialId = item.productId, + // qty = 1, + // warehouseId = item.warehouseId, + // wmsOrderId = item.rawOutstockId, + // wmsOrderDetailId = item.rawOutstockId, + // createBy = "sys", + // createTime = DateTime.Now + //}; + //dbContext.Add(stockLock); + //if (item.warehouseId == 5)//五楼辅料出库 + //{ + // //辅料出库时,需创建订单表数据 + // orderID = StaticData.SnowId.NextId(); + // WcsWarehouseOrder order = new() + // { + // objid = orderID, + // wmsOrderId = item.rawOutstockId, + // orderType = Convert.ToInt32(item.taskType), + // qty = 1, + // createBy = "", + // createTime = DateTime.Now + // }; + // dbContext.Add(order); + //} + //var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O").FirstOrDefault(); + //if (dic != null) + //{ + // WcsTask rawTask = new() + // { + // objid = StaticData.SnowId.NextId(), + // orderId = item.rawOutstockId, + // masterId = orderID, + // taskType = Convert.ToInt32(dic.dicValue), + // containerNo = "", + // taskStatus = 0, + // materialId = item.materialId, + // qty = 1, + // startPointId = item.warehouseId, + // startPointNo = "", + // currPointId = item.warehouseId, + // currPointNo = "", + // endPointId = item.warehouseId, + // endPointNo = "" + // }; + // dbContext.Add(rawTask); + + // //获取最早入库时间 + // var firstDate = rawStock.Where(t => t.materialId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault(); + + // //回写wms出库记录表 + // dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.rawOutstockId).Update(t => new WmsProductOutstock() + // { + // executeStatus = "1", + // updateDate = DateTime.Now + // }); + //} } - var bill = from a in wmsBaseLocations - from b in rawStock - where a.containerCode == b.palletInfoCode - select new { a, b }; - //如果第一列满足需求,则按第一列排序,否则按最后一列排序 - if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.occupyAmount - t.b.frozenAmount).Sum() > needNumber) - { - bill = bill.OrderBy(t => t.a.locColumn).ToList(); - } - else - { - bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); - } - //做数量限制 - - bill = bill.Take(5 - dbContext.WcsCmd.Where(t => t.cmdStatus < 3 && t.nextPointId == 20).Count()); - BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); - BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); - foreach (var b in bill) - { - item.executeStatus = "1"; - WmsBaseLocation location = b.a; - WmsRawStock stock = b.b; - WcsTask wcsTask; - int qty = 0; - if (stock.totalAmount - stock.occupyAmount - stock.frozenAmount <= needNumber)//该料箱全部出 - { - item.realOutstockAmount += stock.totalAmount - stock.occupyAmount - stock.frozenAmount; - qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); - stock.occupyAmount += qty; - stock.updateDate = DateTime.Now; - } - else - { - item.realOutstockAmount += needNumber; - stock.occupyAmount += 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 = 0, - materialId = item.materialId, - currPointId = location.locationId, - currPointNo = location.locationCode, - startPointId = location.locationId, - startPointNo = location.locationCode, - nextPointId = ctuEquip.objid, - nextPointNo = ctuEquip.equipNo, - endPointId = lineEquip.objid, - endPointNo = lineEquip.equipNo, - equipmentNo = ctuEquip.equipNo, - useFlag = 1, - qty = qty - }; - dbContext.Add(wcsTask); - dbContext.Update(stock); - dbContext.SaveChanges(); - if (qty == needNumber) - { - break; - } - } - dbContext.Update(item); - dbContext.SaveChanges(); } - else + catch { } - //var objid = StaticData.SnowId.NextId(); - //long orderID = 0; - ////插入锁定库存 - //WcsOutstockLock stockLock = new() - //{ - // objid = objid, - // materialId = item.productId, - // qty = 1, - // warehouseId = item.warehouseId, - // wmsOrderId = item.rawOutstockId, - // wmsOrderDetailId = item.rawOutstockId, - // createBy = "sys", - // createTime = DateTime.Now - //}; - //dbContext.Add(stockLock); - //if (item.warehouseId == 5)//五楼辅料出库 - //{ - // //辅料出库时,需创建订单表数据 - // orderID = StaticData.SnowId.NextId(); - // WcsWarehouseOrder order = new() - // { - // objid = orderID, - // wmsOrderId = item.rawOutstockId, - // orderType = Convert.ToInt32(item.taskType), - // qty = 1, - // createBy = "", - // createTime = DateTime.Now - // }; - // dbContext.Add(order); - //} - //var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O").FirstOrDefault(); - //if (dic != null) - //{ - // WcsTask rawTask = new() - // { - // objid = StaticData.SnowId.NextId(), - // orderId = item.rawOutstockId, - // masterId = orderID, - // taskType = Convert.ToInt32(dic.dicValue), - // containerNo = "", - // taskStatus = 0, - // materialId = item.materialId, - // qty = 1, - // startPointId = item.warehouseId, - // startPointNo = "", - // currPointId = item.warehouseId, - // currPointNo = "", - // endPointId = item.warehouseId, - // endPointNo = "" - // }; - // dbContext.Add(rawTask); - - // //获取最早入库时间 - // var firstDate = rawStock.Where(t => t.materialId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault(); - - // //回写wms出库记录表 - // dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.rawOutstockId).Update(t => new WmsProductOutstock() - // { - // executeStatus = "1", - // updateDate = DateTime.Now - // }); - //} } + } } } diff --git a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs index 557a8d9..2641094 100644 --- a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs +++ b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs @@ -54,6 +54,11 @@ namespace Khd.Core.Wcs.Wcs /// private readonly BasePlcpoint reserialno06; + /// + /// 是否可以写去向 + /// + private readonly BasePlcpoint canwritewcsrun06; + public FirstFloor(IHost host, Plc.S7.Plc plc) { @@ -78,6 +83,7 @@ namespace Khd.Core.Wcs.Wcs //一楼提升机到位信号 读 this.reserialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("reserialno06")); + this.canwritewcsrun06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("canwritewcsrun06")); } /// @@ -114,9 +120,9 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var RFID001Value = this._plc.ReadRFID(this.RFID001.plcpointAddress); //一楼RFID 读 var linesignal01Value = this._plc.Read(this.linesignal01.plcpointAddress); //到位信号 读 - //正常读到plc值 if (linesignal01Value != null && RFID001Value != null) { @@ -238,66 +244,83 @@ namespace Khd.Core.Wcs.Wcs /// private void FirstFloorHoister() { - using var scope = _host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) { try { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); var serialno06Value = this._plc.Read(this.serialno06.plcpointAddress); //提升机流水号 读 var equipstate06Value = this._plc.Read(this.equipstate06.plcpointAddress); //提升机状态 读 var hoisterTrayIn06Value = this._plc.Read(this.hoistertrayin06.plcpointAddress); //提升机货物到位状态 读 var currentfloor06Value = this._plc.Read(this.currentfloor06.plcpointAddress); //提升机当前楼层 读 var targetfloor06Value = this._plc.Read(this.targetfloor06.plcpointAddress); //提升机目的楼层 写 var reserialno06 = this._plc.Read(this.reserialno06.plcpointAddress); //反馈流水号 + var canwritewcsrun06value = this._plc.Read(this.canwritewcsrun06.plcpointAddress); //正常读到plc值 - if (targetfloor06Value != null && serialno06Value != null && equipstate06Value != null && currentfloor06Value != null && reserialno06 != null && hoisterTrayIn06Value != null) + if (targetfloor06Value != null && canwritewcsrun06value != null && serialno06Value != null && equipstate06Value != null && currentfloor06Value != null && reserialno06 != null && hoisterTrayIn06Value != null) { //提升机空闲 if (Convert.ToInt32(equipstate06Value) == 0) { - var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == T01).OrderBy(t => t.createTime).FirstOrDefault(); - if (wcsTask != null) + var wcsTasks = dbContext.WcsTask.Where(t => t.nextPointId == T01).OrderBy(t => t.createTime); + foreach (var wcsTask in wcsTasks) { if (wcsTask.taskStatus == 0 && Convert.ToInt32(hoisterTrayIn06Value) == 0)//创建状态,并且里面没有货物 { - if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo) + BasePlcpoint floorPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID00" + wcsTask.fromFloorNo); + if (wcsTask.containerNo == this._plc.ReadRFID(floorPoint.plcpointAddress)) { - wcsTask.taskStatus = 2; - wcsTask.updateBy = "提升机线程"; - wcsTask.updateTime = DateTime.Now; - wcsTask.remark = "提升机任务执行中"; - BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); - this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); - this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString()); - dbContext.Update(wcsTask); - dbContext.SaveChanges(); - } - else - { - wcsTask.taskStatus = 1; - wcsTask.updateBy = "提升机线程"; - wcsTask.updateTime = DateTime.Now; - wcsTask.remark = "提升机任务执行中"; - this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.fromFloorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层 - this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString()); - dbContext.Update(wcsTask); - dbContext.SaveChanges(); + if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo) + { + if (Convert.ToInt32(canwritewcsrun06value) == 0) + { + wcsTask.taskStatus = 2; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行中"; + BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); + this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); + this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString()); + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } + } + else + { + wcsTask.taskStatus = 1; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行中"; + this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.fromFloorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层 + this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString()); + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } } } if (wcsTask.taskStatus == 1 && Convert.ToInt32(reserialno06) == wcsTask.serialNo) { - if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//提升机当前楼层为初始地楼层 + BasePlcpoint floorPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID00" + wcsTask.fromFloorNo); + if (wcsTask.containerNo == this._plc.ReadRFID(floorPoint.plcpointAddress)) { - wcsTask.taskStatus = 2; - wcsTask.updateBy = "提升机线程"; - wcsTask.updateTime = DateTime.Now; - wcsTask.remark = "提升机任务执行中"; - BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); - this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); - dbContext.Update(wcsTask); - dbContext.SaveChanges(); + if (Convert.ToInt32(canwritewcsrun06value) == 0) + { + if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//提升机当前楼层为初始地楼层 + { + wcsTask.taskStatus = 2; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行中"; + BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); + this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); + this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString()); + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } + } } } if (wcsTask.taskStatus == 2 && Convert.ToInt32(reserialno06) == wcsTask.serialNo) @@ -315,15 +338,19 @@ namespace Khd.Core.Wcs.Wcs } if (wcsTask.taskStatus == 3 && Convert.ToInt32(currentfloor06Value) == wcsTask.floorNo && Convert.ToInt32(reserialno06) == wcsTask.serialNo)//任务状态为3,且当前楼层为任务的目的楼层 { - wcsTask.taskStatus = 4; - wcsTask.updateBy = "提升机线程"; - wcsTask.updateTime = DateTime.Now; - wcsTask.remark = "提升机任务执行完成"; - BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); - this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2,表示提升机已到达目的地,让货出去 - dbContext.Update(wcsTask); - dbContext.SaveChanges(); + if (Convert.ToInt32(canwritewcsrun06value) == 0) + { + wcsTask.taskStatus = 4; + wcsTask.updateBy = "提升机线程"; + wcsTask.updateTime = DateTime.Now; + wcsTask.remark = "提升机任务执行完成"; + BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun")); + this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2,表示提升机已到达目的地,让货出去 + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } } + break; } } } @@ -344,7 +371,7 @@ namespace Khd.Core.Wcs.Wcs } LogManager.Error(ex); } - Thread.Sleep(1000); + Thread.Sleep(5000); } } } diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index 9953ba1..4519fea 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -24,7 +24,7 @@ namespace Khd.Core.Wcs.Wcs private readonly BasePlcpoint LineSignal; int FloorNo { get; set; } private readonly string EquipNo = ""; - int agvID = 10; + int agvID = 28; public FiveFloorAGV(IHost host, Plc.S7.Plc plc, int floor, string equipNo) { this._host = host; @@ -68,7 +68,10 @@ namespace Khd.Core.Wcs.Wcs { try { - var taskList = dbContext.WcsTask.Where(t => t.nextPointId == agvID).OrderBy(t => t.createTime).ToList(); + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var taskList = dbContext.WcsTask + .Where(t => t.useFlag == 1) + .Where(t => t.nextPointId == agvID).OrderBy(t => t.createTime).ToList(); if (taskList.Count == 0) { LogManager.Info(FloorNo + "楼AGV无任务"); @@ -77,13 +80,8 @@ namespace Khd.Core.Wcs.Wcs { if (item.taskStatus == 0)//下发任务 { - if (taskType.Contains(item.taskType))//入库任务 + if (item.taskType == 37)//入库任务 { - if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1) - { - Console.WriteLine($"{DateTime.Now}:5楼接驳位上有货,无法下发Agv出库任务"); - continue; - } WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1); WcsCmd wcsCmd = new() @@ -109,12 +107,12 @@ namespace Khd.Core.Wcs.Wcs new () { positionCode=wcsCmd.currPointNo, - type="1" + type="00" }, new () { positionCode=wcsCmd.nextPointNo, - type="2" + type="00" } }, ctnrTyp = "2", @@ -136,7 +134,7 @@ namespace Khd.Core.Wcs.Wcs } } - else//出库任务 + else if (item.taskType == 38)//出库任务 { if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1) { @@ -168,19 +166,19 @@ namespace Khd.Core.Wcs.Wcs new () { positionCode=wcsCmd.currPointNo, - type="1" + type="00" }, new () { positionCode=wcsCmd.nextPointNo, - type="2" + type="00" } }, taskTyp = "", ctnrTyp = "2" }; string message = JsonConvert.SerializeObject(agvTask); - string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); + string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { @@ -198,7 +196,7 @@ namespace Khd.Core.Wcs.Wcs WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.objid == item.objid); if (wcsCmd != null) { - if (wcsCmd.cmdStatus == 2) + if (wcsCmd.cmdStatus == 3) { var agvTask = new RequestAGVTaskDto { @@ -210,7 +208,7 @@ namespace Khd.Core.Wcs.Wcs ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { - wcsCmd.cmdStatus = 3; + wcsCmd.cmdStatus = 4; dbContext.Update(wcsCmd); dbContext.SaveChanges(); } @@ -236,20 +234,47 @@ namespace Khd.Core.Wcs.Wcs { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation .First(t => t.locationId == item.startPointId && t.warehouseFloor == 5); - wmsBaseLocation.outstockFlag = "0"; - wmsBaseLocation.locationStatus = "1"; - dbContext.Update(wmsBaseLocation); + if (item.taskType == 38)//出库 + { + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.locationStatus = "1"; + wmsBaseLocation.containerCode = ""; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "SYS"; - BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5); - BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2); - item.nextPointId = floorLineEquip.objid; - item.nextPointNo = floorLineEquip.equipNo; - item.fromFloorNo = 5; - item.floorNo = 1; - item.taskStatus = 6; - dbContext.Update(item); - dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); - dbContext.SaveChanges(); + + dbContext.Update(wmsBaseLocation); + + BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5); + BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2); + item.nextPointId = floorLineEquip.objid; + item.nextPointNo = floorLineEquip.equipNo; + item.fromFloorNo = 5; + item.floorNo = 1; + item.taskStatus = 6; + dbContext.Update(item); + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); + dbContext.SaveChanges(); + } + else if (item.taskType == 37)//入库 + { + wmsBaseLocation.locationStatus = "1"; + wmsBaseLocation.instockFlag = "0"; + + + dbContext.Update(wmsBaseLocation); + BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5); + BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2); + item.nextPointId = floorLineEquip.objid; + item.nextPointNo = floorLineEquip.equipNo; + item.fromFloorNo = 5; + item.floorNo = 1; + item.taskStatus = 6; + dbContext.Update(item); + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); + dbContext.SaveChanges(); + + } } } } diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs new file mode 100644 index 0000000..2319d77 --- /dev/null +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs @@ -0,0 +1,204 @@ +using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; +using Khd.Core.Wcs.Global; +using Masuit.Tools.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Z.EntityFramework.Plus; + +namespace Khd.Core.Wcs.Wcs +{ + internal class FiveFloorBearAgv + { + + List ScanPoint { get; set; }//点位信息 + private readonly IHost _host; + private readonly Plc.S7.Plc _plc; + private readonly BasePlcpoint LineRFID; + private readonly BasePlcpoint LineWcsrun; + private readonly BasePlcpoint LineSignal; + int FloorNo { get; set; } + private readonly string EquipNo = ""; + int agvID = 10; + public FiveFloorBearAgv(IHost host, Plc.S7.Plc plc, int floor, string equipNo) + { + this._host = host; + this._plc = plc; + FloorNo = floor; + EquipNo = equipNo; + this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位 + this.LineRFID = this.ScanPoint.First(t => t.plcpointNo.Contains("RFID")); + this.LineWcsrun = this.ScanPoint.First(t => t.plcpointNo.Contains("wcsrun")); + this.LineSignal = this.ScanPoint.First(t => t.plcpointNo.Contains("linesignal")); + //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress); + try + { + //默认启动,清理plc的上位机写入点位值 + //this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei); + } + catch (Exception ex) + { + Console.WriteLine("楼层" + floor + " 初始化数据异常" + ex.Message); + LogManager.Error(ex); + } + } + /// + /// 启动上件扫描监听 + /// + public void StartPoint() + { + + Thread FlowPointThread = new(MonitorInLocatorPoint); + FlowPointThread.Start(); + Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功"); + LogManager.Info("五楼AGV上件扫描监听启动成功"); + } + + public void MonitorInLocatorPoint() + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + List taskType = new() { 1, 3, 5, 7 }; + while (true) + { + try + { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var taskList = dbContext.WcsTask + .Where(t => t.useFlag == 1) + .Where(t => t.nextPointId == agvID) + .OrderBy(t => t.createTime).ToList(); + if (taskList.Count == 0) + { + LogManager.Info(FloorNo + "楼AGV无任务"); + } + foreach (var item in taskList) + { + if (item.taskStatus == 0)//下发任务 + { + BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId); + BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId); + BaseDictionary baseDictionary = dbContext.BaseDictionary.First(t=>t.objid==item.taskType); + WcsCmd wcsCmd = new() + { + objid = StaticData.SnowId.NextId(), + cmdStatus = 0, + taskId = item.objid, + useFlag = 1, + cmdType = item.taskType, + containerNo = item.containerNo, + createTime = DateTime.Now, + createBy = FloorNo + "楼AGV", + currPointId = item.startPointId, + currPointNo = startEquip.agvPositionCode, + nextPointId = item.endPointId, + nextPointNo = endEquip.agvPositionCode, + }; + var agvTask = new RequestAGVTaskDto + { + reqCode = StaticData.SnowId.NextId().ToString(), + positionCodePath = new List + { + new () + { + positionCode=wcsCmd.currPointNo, + type="00" + }, + new () + { + positionCode=wcsCmd.nextPointNo, + type="00" + } + }, + taskTyp=baseDictionary.dicValue, + ctnrTyp = "2", + }; + string message = JsonConvert.SerializeObject(agvTask); + string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); + var reponseMessage = JsonConvert.DeserializeObject(result); + if (reponseMessage != null && reponseMessage.code == "0") + { + wcsCmd.taskCode = reponseMessage.data; + wcsCmd.cmdStatus = 1; + item.taskStatus = 1; + dbContext.Update(item); + dbContext.Add(wcsCmd); + dbContext.SaveChanges(); + } + else + { + LogManager.Info("下发小车任务失败" + result); + } + } + else + { + WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid); + if (wcsCmd != null) + { + if (wcsCmd.cmdStatus == 3) + { + var agvTask = new RequestAGVTaskDto + { + reqCode = StaticData.SnowId.NextId().ToString(), + taskCode = wcsCmd.taskCode + }; + string message = JsonConvert.SerializeObject(agvTask); + string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/continueTask", message); + ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result); + if (reponseMessage != null && reponseMessage.message == "成功") + { + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => t.cmdStatus == 4); + dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => t.taskStatus == 4); + dbContext.SaveChanges(); + } + } + else if (wcsCmd.cmdStatus == 5) + { + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t=>t.cmdStatus==6); + dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => t.taskStatus == 6); + dbContext.SaveChanges(); + } + else if (wcsCmd.cmdStatus == 7) + { + var agvTask = new RequestAGVTaskDto + { + reqCode = StaticData.SnowId.NextId().ToString(), + taskCode = wcsCmd.taskCode + }; + string message = JsonConvert.SerializeObject(agvTask); + string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/continueTask", message); + ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result); + if (reponseMessage != null && reponseMessage.message == "成功") + { + dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete(); + dbContext.WcsTask.Where(t => t.objid == item.objid).Delete(); + dbContext.SaveChanges(); + } + } + } + } + } + //foreach (var item in taskList) + //{ + // SendAndUpdateTask(item); + //} + } + catch (Exception ex) + { + LogManager.Error(ex); + } + finally + { + Thread.Sleep(1000); + } + } + } + } +} diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs index f7076cb..59eba9b 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs @@ -71,6 +71,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var rfid = this._plc.Read(LineRFID.plcpointAddress); var isArrive = this._plc.Read(isarrive.plcpointAddress); if (rfid != null && isArrive != null && Convert.ToInt32(isArrive) == 1) @@ -123,6 +124,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var taskList = dbContext.WcsTask.Where(t => t.nextPointId == CTUID).ToList(); if (taskList.Count == 0) { @@ -132,7 +134,7 @@ namespace Khd.Core.Wcs.Wcs { if (item.taskStatus == 0)//CTU会同时生成多个任务,生成就下发? { - if (item.taskType % 2 == 0)//出库任务 + if (item.taskType == 30)//出库任务 { BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId); @@ -150,22 +152,24 @@ namespace Khd.Core.Wcs.Wcs currPointNo = wmsBaseLocation.agvPositionCode, nextPointId = baseEquip.objid, nextPointNo = baseEquip.agvPositionCode, - taskCode=null + taskCode = null }; var agvTask = new RequestAGVTaskDto { - reqCode = wcsCmd.objid.ToString(), + reqCode = StaticData.SnowId.NextId().ToString(), positionCodePath = new List - { - new() { - positionCode=wcsCmd.currPointNo, - type="05" - }, - new() { - positionCode=wcsCmd.nextPointNo, - type="05" - }, - }, + { + new() + { + positionCode = wcsCmd.currPointNo, + type = "05" + }, + new() + { + positionCode = wcsCmd.nextPointNo, + type = "05" + }, + }, ctnrTyp = "1", taskTyp = "F504" }; @@ -182,7 +186,7 @@ namespace Khd.Core.Wcs.Wcs dbContext.SaveChanges(); } } - else//入库任务 + else if (item.taskType == 29)//入库任务 { BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); @@ -203,18 +207,20 @@ namespace Khd.Core.Wcs.Wcs }; var agvTask = new RequestAGVTaskDto { - reqCode = item.objid.ToString(), + reqCode = StaticData.SnowId.NextId().ToString(), positionCodePath = new List - { - new() { - positionCode=wcsCmd.currPointNo, - type="0" - }, - new() { - positionCode=wcsCmd.nextPointNo, - type="0" - }, - }, + { + new() + { + positionCode = wcsCmd.currPointNo, + type = "0" + }, + new() + { + positionCode = wcsCmd.nextPointNo, + type = "0" + }, + }, ctnrTyp = "1", taskTyp = "F503" }; @@ -235,14 +241,14 @@ namespace Khd.Core.Wcs.Wcs } else { - WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.objid == item.objid); + WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid); if (wcsCmd != null) { if (wcsCmd.cmdStatus == 3) { var agvTask = new RequestAGVTaskDto { - reqCode = item.objid.ToString(), + reqCode = StaticData.SnowId.NextId().ToString(), taskCode = wcsCmd.taskCode }; string message = JsonConvert.SerializeObject(agvTask); @@ -275,9 +281,12 @@ namespace Khd.Core.Wcs.Wcs { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation .First(t => t.locationId == item.startPointId && t.warehouseFloor == 5); - wmsBaseLocation.outstockFlag = "0"; - wmsBaseLocation.locationStatus = "1"; - dbContext.Update(wmsBaseLocation); + if (item.taskType == 29) + { + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.locationStatus = "1"; + dbContext.Update(wmsBaseLocation); + } BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5); BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2); diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs index 8fd9ca6..9c5b267 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorLine.cs @@ -66,7 +66,7 @@ namespace Khd.Core.Wcs.Wcs { try { - + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var rfid = this._plc.Read(LineRFID.plcpointAddress); var isarrive = this._plc.Read(IsArrive.plcpointAddress); //获取条码信息 diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs index 3eb6a0c..c86820c 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs @@ -69,6 +69,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //入库任务 var rfid = this._plc.ReadRFID(LineRFID.plcpointAddress); var isSignal = this._plc.Read(LineSignal.plcpointAddress); @@ -134,6 +135,7 @@ namespace Khd.Core.Wcs.Wcs wcsTask.nextPointNo = AgvEquip.equipNo; wcsTask.endPointId = wmsBaseLocation.locationId; wcsTask.endPointNo = wmsBaseLocation.locationCode; + wcsTask.useFlag = 0;//什么情况下需要确认 wmsBaseLocation.instockFlag = "1"; wmsBaseLocation.locationStatus = "2"; dbContext.Update(wmsBaseLocation); diff --git a/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs index a025402..63d8ea3 100644 --- a/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs @@ -50,6 +50,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var RFID004Value = this._plc.Read(this.LineRFID.plcpointAddress); //一楼RFID 读 var linesignal04Value = this._plc.Read(this.LineSignal.plcpointAddress); //到位信号 读 var wcsrun04Value = this._plc.Read(this.WcsRun.plcpointAddress); //去向 写 diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs index 8f5c7e9..1c0be47 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs @@ -72,6 +72,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度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) diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs index b97c59a..95bdee3 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs @@ -70,6 +70,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //入库任务 var rfid = this._plc.Read(LineRFID.plcpointAddress); var isSignal = this._plc.Read(LineSignal.plcpointAddress); //到位信号 diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs index fb68c69..9c7ac10 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs @@ -69,6 +69,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //入库任务 var rfid = this._plc.Read(LineRFID.plcpointAddress); var isSignal = this._plc.Read(LineSignal.plcpointAddress); diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs index 819fbb7..278d82d 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs @@ -72,6 +72,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv var taskList = dbContext.WcsTask.Where(t => t.nextPointId == EquipID && t.currPointId != EquipID && (t.taskType == 1 || t.taskType == 2 || t.taskType == 9)).ToList(); if (taskList.Count == 0) diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs index 90d4265..d155d20 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs @@ -70,6 +70,7 @@ namespace Khd.Core.Wcs.Wcs { try { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //入库任务 var rfid = this._plc.Read(LineRFID.plcpointAddress); var isSignal = this._plc.Read(LineSignal.plcpointAddress); diff --git a/src/Khd.Core.Wcs/appsettings.json b/src/Khd.Core.Wcs/appsettings.json index 85a0350..f4a6cf7 100644 --- a/src/Khd.Core.Wcs/appsettings.json +++ b/src/Khd.Core.Wcs/appsettings.json @@ -22,11 +22,11 @@ "WaitTime": "60000", "SiteCode": "999" }, - //"Logging": { - // "LogLevel": { - // "Default": "Information", - // "Microsoft": "Warning", - // "Microsoft.Hosting.Lifetime": "Information" - // } - //} + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } } diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs index 396d02e..61667e6 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs @@ -422,12 +422,12 @@ namespace Khd.Core.Wpf.Form // 映射数据库字段,这里需要根据你的实际需求进行调整 var columnMappings = new Dictionary { - // 添加映射 - {columnHeaders[0],"production_sequence"}, - {columnHeaders[1],"line_code"}, - {columnHeaders[3],"prod_code"}, - {columnHeaders[4],"Quantity"}, - {columnHeaders[5],"order_code"} + // 添加映射 + {columnHeaders[0],"production_sequence"}, + {columnHeaders[1],"line_code"}, + {columnHeaders[3],"prod_code"}, + {columnHeaders[4],"Quantity"}, + {columnHeaders[5],"order_code"} }; int ordernum = 0; // 获取实际的行数和列数