diff --git a/src/Khd.Core.Domain/Models/DmsRecordAlarmInfo.cs b/src/Khd.Core.Domain/Models/DmsRecordAlarmInfo.cs index fbd1ac3..fb67b7d 100644 --- a/src/Khd.Core.Domain/Models/DmsRecordAlarmInfo.cs +++ b/src/Khd.Core.Domain/Models/DmsRecordAlarmInfo.cs @@ -45,7 +45,7 @@ namespace Khd.Core.Domain.Models public string HandleUser { get; set; } [Column("handle_time")] - public DateTime HandleTime { get; set; } + public DateTime? HandleTime { get; set; } [Column("cause_analysis")] public string CauseAnalysis { get; set; } @@ -63,6 +63,6 @@ namespace Khd.Core.Domain.Models public string UpdateBy { get; set; } [Column("update_time")] - public DateTime UpdateTime { get; set; } + public DateTime? UpdateTime { get; set; } } } diff --git a/src/Khd.Core.Plc/StaticPlcHelper.cs b/src/Khd.Core.Plc/StaticPlcHelper.cs index b545915..07ff01b 100644 --- a/src/Khd.Core.Plc/StaticPlcHelper.cs +++ b/src/Khd.Core.Plc/StaticPlcHelper.cs @@ -51,8 +51,6 @@ namespace Khd.Core.Plc byte[] dataToWrite = new byte[len]; Array.Copy(byteArray, dataToWrite, byteArray.Length); - - plc.Write(S7.DataType.DataBlock, db, startByteAdr, dataToWrite); } diff --git a/src/Khd.Core.Wcs/MainCentralControl.cs b/src/Khd.Core.Wcs/MainCentralControl.cs index 24545fb..0490385 100644 --- a/src/Khd.Core.Wcs/MainCentralControl.cs +++ b/src/Khd.Core.Wcs/MainCentralControl.cs @@ -46,7 +46,7 @@ namespace Khd.Core.Wcs StaticData.BaseEquip = dbContext.BaseEquip.ToList();//设备信息 StaticData.BaseDictionary = dbContext.BaseDictionary.ToList();//字典表,Agv任务模板 StaticData.DmsBaseAlarmRuleList = dbContext.DmsBaseAlarmRule.ToList(); - + foreach (var plcConfig in StaticData.PlcConfigs) { if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code)) diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index db949d9..8ef97c5 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -115,7 +115,11 @@ namespace Khd.Core.Wcs.Wcs { int thirdTray = dbContext.BaseEquip .Where(t => t.equipType == 15) + .Where(t => t.useFlag == 1) .Where(t => t.emptyCount == SystemData.maxTray).Count(); + int thirdBTray = dbContext.BaseEquip + .Where(t => t.equipType == 15) + .Where(t => t.emptyCount > 0).Count(); List baseEquips = dbContext.BaseEquip.Where(t => t.useFlag == 1).Where(t => t.equipType == 20).ToList(); int emptyCount = baseEquips.Where(t => t.emptyCount == 0).Count(); int maxCount = baseEquips.Where(t => t.emptyCount == SystemData.maxTray).Count(); @@ -125,10 +129,14 @@ namespace Khd.Core.Wcs.Wcs { create = true; } + if (emptyCount > 6 && thirdBTray >= 1) + { + create = true; + } } if (create) { - var baseEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.emptyCount == SystemData.maxTray);//三楼三个周转区是否存在空托盘 + var baseEquip = dbContext.BaseEquip.Where(t => t.equipType == 15).OrderByDescending(t => t.emptyCount).FirstOrDefault();//三楼三个周转区是否存在空托盘 if (baseEquip != null)//如果三楼有空托盘 { BaseEquip ThirdLineEquip = dbContext.BaseEquip.First(t => t.objid == 3);//三楼接驳位 @@ -585,7 +593,7 @@ namespace Khd.Core.Wcs.Wcs try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); - bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 9).Any(); + bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 9).Where(t => t.useFlag == 1).Any(); if (!hasTask) { WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.nextPointId == 9 || t.nextPointId == 8).OrderBy(t => t.createBy).FirstOrDefault(); diff --git a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs index ec2c1b9..4c1ca0a 100644 --- a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs +++ b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Dto.waring; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Dto.waring; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; @@ -320,7 +321,7 @@ namespace Khd.Core.Wcs.Wcs fromFloorNo = 1, floorNo = 4, useFlag = 1, - ud1=20, + ud1 = 20, createBy = "一楼接驳位", createTime = DateTime.Now, remark = "一楼创建入库任务" @@ -424,7 +425,7 @@ namespace Khd.Core.Wcs.Wcs else { //TODO 物料未绑定仓库,添加报警 - SystemData.InsertWaringLog(dbContext,WaringType.绑定物料无仓库信息); + SystemData.InsertWaringLog(dbContext, WaringType.绑定物料无仓库信息); continue; } } @@ -496,7 +497,7 @@ namespace Khd.Core.Wcs.Wcs _logger.Error(ex.Message + "\n" + ex.StackTrace); } } - SystemData.DeleteWaringLog(dbContext,WaringType.绑定物料无仓库信息); + SystemData.DeleteWaringLog(dbContext, WaringType.绑定物料无仓库信息); Thread.Sleep(3000); } } @@ -536,6 +537,21 @@ namespace Khd.Core.Wcs.Wcs .OrderBy(t => t.ud1).OrderBy(t => t.createTime).ToList(); foreach (var wcsTask in wcsTasks) { + if (wcsTask.taskType == StaticTaskType.SecondTransitToLift && !string.IsNullOrEmpty(wcsTask.containerNo)) + { + var mesBasePalletInfo = dbContext.MesBasePalletInfo + .Where(t => t.palletInfoCode == wcsTask.containerNo).FirstOrDefault(); + if (mesBasePalletInfo == null || string.IsNullOrEmpty(mesBasePalletInfo.materialBarcode)) + { + continue; + } + var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo + .Where(t => t.palletInfoCode == wcsTask.containerNo && t.barcodeInfo == mesBasePalletInfo.materialBarcode).FirstOrDefault(); + if (mesBaseBarcodeInfo == null) + { + continue; + } + } _logger.Info($"当前任务?{wcsTask.ToJsonString()}"); bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == wcsTask.endPointId && t.objid != wcsTask.objid && t.nextPointId != 6).Any(); if (!hasTask) @@ -549,10 +565,10 @@ namespace Khd.Core.Wcs.Wcs BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == wcsTask.floorNo); if (wcsTask.taskStatus == 0 && Convert.ToInt32(hoisterTrayIn06Value) == 0)//创建状态,并且里面没有货物 { - // 目的楼层从接驳位出发入库的任务 --待测试 + // 目的楼层从接驳位出发入库的任务 --待测试 var InTask = dbContext.WcsTask.FirstOrDefault(t => t.currPointId == lineEquip.objid); - if (lineEquip.equipStatus == 1 && InTask==null) + if (lineEquip.equipStatus == 1 && InTask == null) { _logger.Info("提升机线程:" + wcsTask.floorNo + "楼接驳位有AGV任务,跳过当前任务"); continue; diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs index 43af451..62cf2e1 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs @@ -71,6 +71,10 @@ namespace Khd.Core.Wcs.Wcs .FirstOrDefault(t => t.containerNo == rfid && t.nextPointId == baseEquip.objid); if (wcsTask != null) { + if (wcsTask.taskType == 99) + { + continue; + } if (StaticData.BigContainerCodes.Contains(rfid)) { if (rfid == lastRFID) diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs index 2f6f683..9b899af 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs @@ -805,6 +805,7 @@ namespace Khd.Core.Wcs.Wcs BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId); endEquip.equipStatus = 1; endEquip.emptyCount = item.qty; + endEquip.ud3 = "1"; dbContext.Update(endEquip); dbContext.Remove(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 }); @@ -819,6 +820,7 @@ namespace Khd.Core.Wcs.Wcs endEquip.equipStatus = 1; endEquip.emptyCount = 1; endEquip.containerNo = item.containerNo; + endEquip.ud3 = "2"; dbContext.Update(endEquip); dbContext.Update(startEquip); dbContext.Remove(item); @@ -847,11 +849,13 @@ namespace Khd.Core.Wcs.Wcs BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); startEquip.equipStatus = 0; startEquip.emptyCount = 0; + startEquip.ud3 = "0"; startEquip.containerNo = null; BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId); endEquip.equipStatus = 1; endEquip.emptyCount = 1; endEquip.containerNo = item.containerNo; + endEquip.ud3 = "2"; dbContext.Update(startEquip); dbContext.Update(endEquip); dbContext.Remove(item); @@ -956,6 +960,7 @@ namespace Khd.Core.Wcs.Wcs { wasteEquip.emptyCount = 0; wasteEquip.equipStatus = 0; + wasteEquip.ud3 = "0"; BaseEquip endEquip = dbContext.BaseEquip.First(t => t.objid == item.endPointId); endEquip.emptyCount = 1; endEquip.equipStatus = 2; @@ -971,6 +976,7 @@ namespace Khd.Core.Wcs.Wcs BaseEquip emptyEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); emptyEquip.emptyCount = 0; emptyEquip.equipStatus = 0; + emptyEquip.ud3 = "0"; emptyEquip.containerNo = null; item.nextPointId = 2; item.taskStatus = 8; @@ -985,6 +991,7 @@ namespace Khd.Core.Wcs.Wcs BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); startEquip.equipStatus = 0; startEquip.emptyCount = 0; + startEquip.ud3 = "0"; startEquip.containerNo = null; dbContext.Update(startEquip); dbContext.Remove(item); diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs index 679c46d..56942e6 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs @@ -272,18 +272,18 @@ namespace Khd.Core.Wcs.Wcs //相同型号及销售订单的深库位库存 List productStocks = dbContext.WmsProductStock.Where(t => t.productId == mesBaseBarcodeInfo.materialId) .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) - .Where(t => t.warehouseId== 231) + .Where(t => t.warehouseId == 231) .Where(t => DeepContainerCodes.Contains(t.palletInfoCode)).ToList(); - if(productStocks.Count > 0) + if (productStocks.Count > 0) { //优先找同销售订单的有库存的深库位对应的浅库位 - foreach(var productStock in productStocks) + foreach (var productStock in productStocks) { - // 深库位库存对用的Location信息 - var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == productStock.palletInfoCode).FirstOrDefault(); - wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus=="1") - .Where(t=> t.locDeep == 2 && t.locColumn ==deepStockLocation.locColumn) - .Where(t=> t.locRow == (deepStockLocation.locRow % 2 == 0 ? (deepStockLocation.locRow - 1) :(deepStockLocation.locRow + 1)) ) + // 深库位库存对用的Location信息 + var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == productStock.palletInfoCode).FirstOrDefault(); + wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1") + .Where(t => t.locDeep == 2 && t.locColumn == deepStockLocation.locColumn) + .Where(t => t.locRow == (deepStockLocation.locRow % 2 == 0 ? (deepStockLocation.locRow - 1) : (deepStockLocation.locRow + 1))) .FirstOrDefault(); if (wmsBaseLocation != null) { @@ -306,18 +306,18 @@ namespace Khd.Core.Wcs.Wcs // } // } //} - if(wmsBaseLocation == null) + if (wmsBaseLocation == null) { // 在所有符合条件的库位里,找一个库位,优先深库位,但是如果是深库位,需要判断浅库位状态是否正常 - var searchLocations = wmsBaseLocations.Where(x => string.IsNullOrEmpty(x.containerCode) && x.locationStatus == "1").OrderBy(x=>x.locDeep).ToList(); + var searchLocations = wmsBaseLocations.Where(x => string.IsNullOrEmpty(x.containerCode) && x.locationStatus == "1").OrderBy(x => x.locDeep).ToList(); foreach (var item in searchLocations) { - if(item.locDeep == 1) + if (item.locDeep == 1) { //浅库位能否使用 - var shallowLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1") - .Where(t => t.locDeep == 2 && t.locColumn == item.locColumn) - .Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1))) - .FirstOrDefault(); + var shallowLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1") + .Where(t => t.locDeep == 2 && t.locColumn == item.locColumn) + .Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1))) + .FirstOrDefault(); if (shallowLocation != null) { wmsBaseLocation = item; @@ -326,16 +326,15 @@ namespace Khd.Core.Wcs.Wcs } else { - wmsBaseLocation = item; - break; + wmsBaseLocation = item; + break; } - } } - + if (wmsBaseLocation != null)//如果找到库位,生成入库任务 { - + BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 37); var wcsTask = new WcsTask() { diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs index fbc8d51..1b1cb5c 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs @@ -50,7 +50,9 @@ namespace Khd.Core.Wcs.Wcs BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 2);//二楼接驳位 BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8);//二楼叉车 BaseEquip tsjEquip = StaticData.BaseEquip.First(t => t.objid == 6);//提升机 + var PalletInIsHas2FPoint = StaticData.BasePlcpointList.First(t => t.id == 74); var agvPutPoint = StaticData.BasePlcpointList.First(t => t.id == 54);//二楼小包入口点位 + var ConnectStatus2FPoint = StaticData.BasePlcpointList.First(t => t.id == 73); while (true) { try @@ -58,6 +60,7 @@ namespace Khd.Core.Wcs.Wcs dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); //入库任务 var rfid = StaticData.PlcDic[0].ReadRFID(LineRFID.plcpointAddress); + //2F托盘库产线数据通讯情况 var isSignal = StaticData.PlcDic[0].Read(LineSignal.plcpointAddress); if (rfid != null && isSignal != null) @@ -73,9 +76,13 @@ namespace Khd.Core.Wcs.Wcs if (wcsTask.taskStatus == 5 && (wcsTask.nextPointId == 6 || wcsTask.nextPointId == 2))//入托盘入口,提升机任务是完成状态 { object? agvPutValue = null; + object? PalletInIsHas2F = null; + object? ConnectStatus2F = null; try { + ConnectStatus2F = StaticData.PlcDic[2].Read(ConnectStatus2FPoint.plcpointAddress);//2F托盘库产线数据通讯情况 agvPutValue = StaticData.PlcDic[2].Read(agvPutPoint.plcpointAddress); + PalletInIsHas2F = StaticData.PlcDic[2].Read(PalletInIsHas2FPoint.plcpointAddress);//2F托盘库入口上料光电 } catch { @@ -84,7 +91,7 @@ namespace Khd.Core.Wcs.Wcs if (wcsTask.taskType != 99)//不是人工任务 { bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == inEquip.objid).Any(); - if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask)//小包入口要料 + if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask && Convert.ToInt32(PalletInIsHas2F) == 0 && Convert.ToInt32(ConnectStatus2F) == 1)//小包入口要料 { dbContext.WcsTask.Remove(wcsTask);//删除原本的任务 WcsTask newTask = CoreMapper.Map(wcsTask); @@ -110,7 +117,7 @@ namespace Khd.Core.Wcs.Wcs } else { - BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0);//二楼周转位 + BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.useFlag == 1 && t.equipStatus == 0 && t.emptyCount == 0);//二楼周转位 if (endEquip != null) { dbContext.WcsTask.Remove(wcsTask);//删除原本的任务 @@ -142,7 +149,7 @@ namespace Khd.Core.Wcs.Wcs if (wcsTask.endPointId == 36)//目的地是小包入口 { bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == inEquip.objid).Any(); - if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask)//小包入口要料 + if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask&& Convert.ToInt32(PalletInIsHas2F) == 0 && Convert.ToInt32(ConnectStatus2F) == 1)//小包入口要料 { dbContext.WcsTask.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs index cf8e011..2f885fa 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs @@ -538,12 +538,21 @@ namespace Khd.Core.Wpf.Form try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); - List wmsRawOutstocks = dbContext.WmsRawOutstock.Where(t => endStationCodes.Contains(t.endStationCode)) + BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10); + List wmsRawOutstocks = dbContext.WmsRawOutstock + .Where(t => endStationCodes.Contains(t.endStationCode)) .Where(t => t.auditStatus == "1") .Where(t => t.executeStatus == "0" || t.executeStatus == "1") .Where(t => t.outstockAmount > t.realOutstockAmount) .ToList(); List list = wmsRawOutstocks.Select(t => t.endStationCode).ToList(); + Dispatcher.Invoke(() => + { + this.OutOrder.Text = "待出库单:\n" + list.Distinct().Join("\n"); + }); + wmsRawOutstocks = wmsRawOutstocks + .Where(t => baseEquip.endStationCode.Contains(t.endStationCode)) + .ToList(); List orderIds = wmsRawOutstocks.Select(t => t.rawOutstockId).ToList(); var endStations = wmsRawOutstocks.Select(t => new { @@ -551,7 +560,6 @@ namespace Khd.Core.Wpf.Form t.materialId, t.endStationCode }); - BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10); string nowStationCode = baseEquip.endStationCode; if (!string.IsNullOrEmpty(nowStationCode)) { @@ -569,10 +577,7 @@ namespace Khd.Core.Wpf.Form //SelectOutButton.IsEnabled = true; }); } - Dispatcher.Invoke(() => - { - this.OutOrder.Text = "待出库单:\n" + list.Distinct().Join("\n"); - }); + if (!string.IsNullOrEmpty(baseEquip.endStationCode)) @@ -2763,11 +2768,11 @@ namespace Khd.Core.Wpf.Form // 没有申请单 // 如果选中了出库单,并且无需要出库的申请单,则禁止出库 - if (!string.IsNullOrEmpty(baseEquip.endStationCode)) - { - scanOutMsg.Text = "申请单里该条码无需出库!"; - return; - } + //if (!string.IsNullOrEmpty(baseEquip.endStationCode)) + //{ + // scanOutMsg.Text = "申请单里该条码无需出库!"; + // return; + //} if (wmsRawStock.safeFlag != "1") { scanOutMsg.Text = "该条码不是安全库存,且无申请单,禁止出库!";