From 464524d8455509dd28040e1c5f4f8cf7de1443f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83?= <15095123350@163.com> Date: Wed, 17 Jul 2024 13:30:58 +0800 Subject: [PATCH] 20240717 --- src/Khd.Core.Api/appsettings.json | 4 +- .../WcsTaskApplication.cs | 4 +- .../Models/MesBaseMaterialInfo.cs | 8 +- .../Models/WmsInventoryCheck.cs | 44 + .../Models/WmsInventoryCheckDetail.cs | 52 + src/Khd.Core.Domain/Models/WmsRawInstock.cs | 70 +- .../DefaultDbContext.cs | 3 +- src/Khd.Core.Wcs/MainCentralControl.cs | 13 +- src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs | 1038 ++++++++++------- src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs | 177 +-- src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs | 164 ++- src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs | 6 + src/Khd.Core.Wcs/Wcs/SystemTimer.cs | 47 +- src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs | 63 +- src/Khd.Core.Wcs/appsettings.json | 20 +- src/Khd.Core.Wpf/Form/FormBoardT.xaml | 185 ++- src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs | 276 ++++- .../Inventory/InventoryTaskEditForm.xaml | 81 ++ .../Inventory/InventoryTaskEditForm.xaml.cs | 221 ++++ .../TaskForm/Inventory/InventoryTaskForm.xaml | 120 ++ .../Inventory/InventoryTaskForm.xaml.cs | 120 ++ src/Khd.Core.Wpf/appsettings.json | 4 +- 22 files changed, 2099 insertions(+), 621 deletions(-) create mode 100644 src/Khd.Core.Domain/Models/WmsInventoryCheck.cs create mode 100644 src/Khd.Core.Domain/Models/WmsInventoryCheckDetail.cs create mode 100644 src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskEditForm.xaml create mode 100644 src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskEditForm.xaml.cs create mode 100644 src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml create mode 100644 src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml.cs diff --git a/src/Khd.Core.Api/appsettings.json b/src/Khd.Core.Api/appsettings.json index 21dd7e5..344b949 100644 --- a/src/Khd.Core.Api/appsettings.json +++ b/src/Khd.Core.Api/appsettings.json @@ -11,10 +11,10 @@ //}, "AllowedHosts": "*", "ConnectionStrings": { - //"DefaultConnection": "server=172.16.12.100;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khdrkjy2024...;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" + "DefaultConnection": "server=172.16.12.100;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khdrkjy2024...;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" //"DefaultConnection": "server=175.27.215.92;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khd2024;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True", //"DefaultConnection": "server=175.27.215.92;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khd2024;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True", - "DefaultConnection": "server=localhost;port=3306;database=jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" + //"DefaultConnection": "server=localhost;port=3306;database=jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" }, "JwtSecurityOption": { "SigningKey": "3c41f60c-1d12-11ec-890d-00163e1b8678", diff --git a/src/Khd.Core.Application/WcsTaskApplication.cs b/src/Khd.Core.Application/WcsTaskApplication.cs index 61dacce..5f112e7 100644 --- a/src/Khd.Core.Application/WcsTaskApplication.cs +++ b/src/Khd.Core.Application/WcsTaskApplication.cs @@ -98,9 +98,9 @@ namespace Khd.Core.Application wcscmd.sendFlag = 1; wcscmd.cmdStatus = 3; wcsTask.taskStatus = 3; - _dbContext.WcsCmd.Where(t => t.objid == wcscmd.objid).Update(a => new WcsCmd { cmdStatus = 3 }); + _dbContext.WcsCmd.Update(wcscmd); _dbContext.WcsCmdLog.Where(t => t.objid == wcscmd.objid).Update(a => new WcsCmdLog { cmdStatus = 3 }); - _dbContext.WcsTask.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTask { taskStatus = 3 }); + _dbContext.WcsTask.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 3 }); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; diff --git a/src/Khd.Core.Domain/Models/MesBaseMaterialInfo.cs b/src/Khd.Core.Domain/Models/MesBaseMaterialInfo.cs index 4345dc0..327abb7 100644 --- a/src/Khd.Core.Domain/Models/MesBaseMaterialInfo.cs +++ b/src/Khd.Core.Domain/Models/MesBaseMaterialInfo.cs @@ -25,7 +25,7 @@ namespace Khd.Core.Domain.Models [Column("material_type_id")] public string MaterialTypeId { get; set; } [Column("batch_flag")] - public int? BatchFlag { get; set; } + public string BatchFlag { get; set; } [Column("batch_amount")] public int? BatchAmount { get; set; } [Column("material_unit_id")] @@ -41,7 +41,7 @@ namespace Khd.Core.Domain.Models [Column("gross_weight")] public decimal? GrossWeight { get; set; } [Column("bind_flag")] - public decimal? BindFlag { get; set; } + public string BindFlag { get; set; } [Column("factory_id")] public string FactoryId { get; set; } [Column("create_org_id")] @@ -59,11 +59,11 @@ namespace Khd.Core.Domain.Models [Column("purchase_price_unit_id")] public long? PurchasePriceUnitId { get; set; } [Column("create_by")] - public long? CreateBy { get; set; } + public string CreateBy { get; set; } [Column("create_time")] public DateTime? CreateTime { get; set; } [Column("update_by")] - public long? UpdateBy { get; set; } + public string UpdateBy { get; set; } [Column("update_time")] public DateTime? UpdateTime { get; set; } [Column("approve_date")] diff --git a/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs b/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs new file mode 100644 index 0000000..cfade07 --- /dev/null +++ b/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Domain.Models +{ + [Table("wms_inventory_check")] + public class WmsInventoryCheck + { + [Key] + [Column("inventory_check_id")] + public long InventoryCheckId { get; set; } + [Column("inventory_check_code")] + public string InventoryCheckCode { get; set; } + [Column("warehouse_id")] + public long WarehouseId { get; set; } + [Column("check_status")] + public string CheckStatus { get; set; } + [Column("begin_time")] + public DateTime? BeginTime { get; set; } + [Column("end_time")] + public DateTime? EndTime { get; set; } + [Column("location_amount")] + public int LocationAmount { get; set; } + [Column("inventorying_amount")] + public int InventoryingAmount { get; set; } + [Column("inventoried_amount")] + public int InventoriedAmount { get; set; } + [Column("remark")] + public string Remark { get; set; } + [Column("create_by")] + public string CreateBy { get; set; } + [Column("create_date")] + public DateTime? CreateTime { get; set; } + [Column("update_by")] + public string UpdateBy { get; set; } + [Column("update_date")] + public DateTime? UpdateTime { get; set; } + } +} diff --git a/src/Khd.Core.Domain/Models/WmsInventoryCheckDetail.cs b/src/Khd.Core.Domain/Models/WmsInventoryCheckDetail.cs new file mode 100644 index 0000000..93a3e0f --- /dev/null +++ b/src/Khd.Core.Domain/Models/WmsInventoryCheckDetail.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Domain.Models +{ + [Table("wms_inventory_check_detail")] + public class WmsInventoryCheckDetail + { + [Key] + [Column("inventory_check_detail_id")] + public long InventoryCheckDetailId { get; set; } + [Column("inventory_check_id")] + public long InventoryCheckId { get; set; } + [Column("material_id")] + public long? MaterialId { get; set; } + [Column("location_code")] + public string LocationCode { get; set; } + [Column("material_batch")] + public string MaterialBatch { get; set; } + [Column("stock_type")] + public string StockType { get; set; } + [Column("stock_id")] + public long? StockId { get; set; } + [Column("stock_amount")] + public decimal? StockAmount { get; set; } + [Column("real_amount")] + public decimal? RealAmount { get; set; } + [Column("check_status")] + public string CheckStatus { get; set; } + [Column("inventory_time")] + public int? InventoryCount { get; set; } + [Column("erp_status")] + public string? ErpStatus { get; set; } + [Column("erp_amount")] + public decimal? ErpAmount { get; set; } + [Column("create_by")] + public string CreateBy { get; set; } + [Column("create_date")] + public DateTime? CreateTime { get; set; } + [Column("update_by")] + public string UpdateBy { get; set; } + [Column("update_date")] + public DateTime? UpdateTime { get; set; } + [Column("check_type")] + public string CheckType { get; set; } + } +} diff --git a/src/Khd.Core.Domain/Models/WmsRawInstock.cs b/src/Khd.Core.Domain/Models/WmsRawInstock.cs index efa75de..50cab6b 100644 --- a/src/Khd.Core.Domain/Models/WmsRawInstock.cs +++ b/src/Khd.Core.Domain/Models/WmsRawInstock.cs @@ -82,23 +82,23 @@ namespace Khd.Core.Domain.Models [Column("instock_amount")] public decimal? instockAmount { get; set; } - /// - /// 申请原因 - /// - [Column("apply_reason")] - public string applyReason { get; set; } + ///// + ///// 申请原因 + ///// + //[Column("apply_reason")] + //public string applyReason { get; set; } - /// - /// 审核原因 - /// - [Column("audit_reason")] - public string auditReason { get; set; } + ///// + ///// 审核原因 + ///// + //[Column("audit_reason")] + //public string auditReason { get; set; } - /// - /// 审核状态(0待审核,1审核通过,2审核未通过) - /// - [Column("audit_status")] - public string auditStatus { get; set; } + ///// + ///// 审核状态(0待审核,1审核通过,2审核未通过) + ///// + //[Column("audit_status")] + //public string auditStatus { get; set; } /// /// 执行状态(0待执行,1执行中,2执行完成) @@ -106,29 +106,29 @@ namespace Khd.Core.Domain.Models [Column("execute_status")] public string executeStatus { get; set; } - /// - /// 申请人 - /// - [Column("apply_by")] - public string applyBy { get; set; } + ///// + ///// 申请人 + ///// + //[Column("apply_by")] + //public string applyBy { get; set; } - /// - /// 申请时间 - /// - [Column("apply_date")] - public DateTime? applyDate { get; set; } + ///// + ///// 申请时间 + ///// + //[Column("apply_date")] + //public DateTime? applyDate { get; set; } - /// - /// 审核人 - /// - [Column("audit_by")] - public string auditBy { get; set; } + ///// + ///// 审核人 + ///// + //[Column("audit_by")] + //public string auditBy { get; set; } - /// - /// 审核时间 - /// - [Column("audit_date")] - public DateTime? auditDate { get; set; } + ///// + ///// 审核时间 + ///// + //[Column("audit_date")] + //public DateTime? auditDate { get; set; } /// /// 最后更新人 diff --git a/src/Khd.Core.EntityFramework/DefaultDbContext.cs b/src/Khd.Core.EntityFramework/DefaultDbContext.cs index 6c92f67..a97523c 100644 --- a/src/Khd.Core.EntityFramework/DefaultDbContext.cs +++ b/src/Khd.Core.EntityFramework/DefaultDbContext.cs @@ -14,7 +14,8 @@ namespace Khd.Core.EntityFramework public DbSet SysRole { get; set; } public DbSet SysMenu { get; set; } public DbSet WcsAgvStatus { get; set; } - + public DbSet WmsInventoryCheck { get; set; } + public DbSet WmsInventoryCheckDetail { get; set; } public DbSet MesBaseMaterialInfo { get; set; } public DbSet WmsRawReturn { get; set; } public DbSet WcsTaskManual { get; set; } diff --git a/src/Khd.Core.Wcs/MainCentralControl.cs b/src/Khd.Core.Wcs/MainCentralControl.cs index ae9c196..cd52084 100644 --- a/src/Khd.Core.Wcs/MainCentralControl.cs +++ b/src/Khd.Core.Wcs/MainCentralControl.cs @@ -58,7 +58,7 @@ namespace Khd.Core.Wcs plc = new Plc.S7.Plc(plcConfig.CpuType, plcConfig.IP, plcConfig.Port, plcConfig.Rack, plcConfig.Slot); try { - plc.Open(); + //plc.Open(); Console.WriteLine(DateTime.Now + ":连接到PLC:" + plcConfig.IP); } catch @@ -70,9 +70,9 @@ namespace Khd.Core.Wcs } //SystemTimer systemTimer = new SystemTimer(_host); //systemTimer.Start(); - ////创建任务 - //CreateTaskByRecord createTaskByRecord = new(_host); - //createTaskByRecord.StartPoint(); + //创建任务 + CreateTaskByRecord createTaskByRecord = new(_host); + createTaskByRecord.StartPoint(); ////一楼提升机以及接驳位 //FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]); @@ -100,7 +100,7 @@ namespace Khd.Core.Wcs ////三层AGV //var ThirdFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 3 && t.equipType == 4).First(); - //ThirdFloorAGV thirdFloorAGV = new(_host, StaticData.PlcDic[0], ThirdFloorAgvEquip.floorNo.Value); + //ThirdFloorAGV thirdFloorAGV = new(_host, StaticData.PlcDic[2], ThirdFloorAgvEquip.floorNo.Value); //thirdFloorAGV.StartPoint(); ////五层接驳位 @@ -115,9 +115,10 @@ namespace Khd.Core.Wcs ////五层AGV //var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First(); - //FiveFloorAGV fifthFloorAGV = new(_host, StaticData.PlcDic[2], FifthFloorAgvEquip.floorNo.Value); + //FiveFloorAGV fifthFloorAGV = new(_host, StaticData.PlcDic[0], FifthFloorAgvEquip.floorNo.Value); //fifthFloorAGV.StartPoint(); + ////背负式Agv //var FifthFloorBearAgvEquip = StaticData.BaseEquip.Where(t => t.objid == 28).First(); //FiveFloorBearAgv fiveFloorBearAgv = new(_host, StaticData.PlcDic[1], FifthFloorBearAgvEquip.floorNo.Value); //fiveFloorBearAgv.StartPoint(); diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index 7724904..420701d 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -41,22 +41,90 @@ namespace Khd.Core.Wcs.Wcs var createRawTaskThread = new Thread(CreateRawTaskLogic); createRawTaskThread.Start(); - var createThirdOutTaskThread = new Thread(CreateThirdOutTaskLogic); - createThirdOutTaskThread.Start(); + var createRawInThread = new Thread(CreateRawInTaskLogic); + createRawInThread.Start(); - var CreateSecondProductTaskThread = new Thread(CreateSecondProductTaskLogic); - CreateSecondProductTaskThread.Start(); + //var createThirdOutTaskThread = new Thread(CreateThirdOutTaskLogic); + //createThirdOutTaskThread.Start(); - var createEmptyTrayThread = new Thread(CreateEmptyTrayLogic); - createEmptyTrayThread.Start(); + //var CreateSecondProductTaskThread = new Thread(CreateSecondProductTaskLogic); + //CreateSecondProductTaskThread.Start(); - var createThirdWasterTaskThread = new Thread(CreateThirdWasterTaskLogic); - createThirdWasterTaskThread.Start(); + //var createEmptyTrayThread = new Thread(CreateEmptyTrayLogic); + //createEmptyTrayThread.Start(); + + //var createThirdWasterTaskThread = new Thread(CreateThirdWasterTaskLogic); + //createThirdWasterTaskThread.Start(); Console.WriteLine(DateTime.Now + ":出库任务监听启动成功"); LogManager.Info("出库任务监听启动成功"); } + private void CreateRawInTaskLogic(object? obj) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.useFlag == 0 && t.currPointId == 29).FirstOrDefault(); + if (wcsTask != null) + { + WmsRawInstock? wmsRawInstock = dbContext.WmsRawInstock.Where(t => t.warehouseId == 511 && t.instockType == "2" && t.executeStatus == "0").FirstOrDefault(); + if (wmsRawInstock != null) + { + MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wcsTask.containerNo); + if (mesBasePalletInfo != null) + { + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); + if (mesBaseBarcodeInfo != null) + { + WmsRawInstockDetail wmsRawInstockDetail = new WmsRawInstockDetail + { + rawInstockDetailId = StaticData.SnowId.NextId(), + stackAmount = 1, + erpStatus = "0", + executeStatus = "1", + qualityStatus = "0", + activeFlag = "1", + createBy = "WCS", + createDate = DateTime.Now, + erpAmount = 0, + instockAmount = 1, + instockBatch = mesBasePalletInfo.materialBarcode, + instockTime = DateTime.Now, + instockWay = "2", + locationCode = wcsTask.endPointNo, + machineName = mesBaseBarcodeInfo.machineName, + materialBarcode = mesBasePalletInfo.materialBarcode, + materialId = mesBaseBarcodeInfo.materialId, + materialProductionDate = mesBaseBarcodeInfo.productionDate, + planAmount = 1, + poNo = mesBaseBarcodeInfo.poNo, + rawInstockId = wmsRawInstock.rawInstockId, + taskCode = wmsRawInstock.taskCode, + }; + dbContext.Add(wmsRawInstockDetail); + wmsRawInstock.executeStatus = "1"; + wcsTask.useFlag = 1; + dbContext.Update(wmsRawInstock); + dbContext.Update(wcsTask); + dbContext.SaveChanges(); + } + } + } + } + } + catch (Exception ex) + { + LogManager.Error(ex); + } + Thread.Sleep(5000); + } + } + /// /// 根据人工任务生成可执行任务 /// @@ -352,7 +420,8 @@ namespace Khd.Core.Wcs.Wcs wmsProductInstock.executeStatus = "1"; wmsBaseLocation.instockFlag = "1"; wmsBaseLocation.locationStatus = "4"; - dbContext.Add(wmsProductInstock); + wmsProductInstock.instockAmount += 1; + dbContext.Add(wmsProductInstockDetail); dbContext.Update(wmsProductInstock); dbContext.Update(wmsBaseLocation); dbContext.Add(wcsTask); @@ -442,107 +511,129 @@ namespace Khd.Core.Wcs.Wcs { wmsBaseLocation = lastbill.a; } - else//移库 + if (wmsBaseLocation.locDeep == 1) { - var formWmsBaseLocation = lastbill.a; - //先找深库位 - List list = wmsRawStocks.Select(t => t.locationCode).ToList(); - var deepLocation = wmsBaseLocations - .Where(t => t.locDeep == 1) - .Where(t => !list.Contains(t.locationCode)) - .ToList(); - if (deepLocation.Count > 0) + int? row = 0; + if (wmsBaseLocation.locRow % 2 == 1) { - var toWmsBaseLocation = deepLocation.First(); - var EKWcsTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - orderId = wmsRawOutstock.rawOutstockId, - taskType = 49, - containerNo = wmsBaseLocation.containerCode, - createBy = "WCS", - createTime = DateTime.Now.AddSeconds(-10), - taskStatus = 0, - materialId = wmsRawOutstock.materialId, - currPointId = formWmsBaseLocation.locationId, - currPointNo = formWmsBaseLocation.locationCode, - nextPointId = baseEquip.objid, - nextPointNo = baseEquip.equipNo, - endPointId = toWmsBaseLocation.locationId, - endPointNo = toWmsBaseLocation.locationCode, - equipmentNo = baseEquip.equipNo, - useFlag = 1, - qty = 1 - }; - formWmsBaseLocation.outstockFlag = "1"; - formWmsBaseLocation.locationStatus = "4"; - toWmsBaseLocation.instockFlag = "1"; - toWmsBaseLocation.locationStatus = "4"; - dbContext.Add(EKWcsTask); + row = wmsBaseLocation.locRow + 1; } - } - if (wmsBaseLocation != null) - { - MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsBaseLocation.containerCode); - if (mesBasePalletInfo != null) + else { - MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); - if (mesBaseBarcodeInfo != null) + row = wmsBaseLocation.locRow - 1; + } + WmsBaseLocation? fromBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == row) + .Where(t => t.locColumn == wmsBaseLocation.locColumn) + .Where(t => t.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault(); + if (fromBaseLocation != null && !string.IsNullOrEmpty(fromBaseLocation.containerCode)) + { + WmsBaseLocation? toLocation = dbContext.WmsBaseLocation.Where(t => t.warehouseId == wmsBaseLocation.warehouseId) + .Where(t => t.locDeep == 1) + .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); + toLocation ??= dbContext.WmsBaseLocation.Where(t => t.warehouseId == wmsBaseLocation.warehouseId) + .Where(t => t.warehouseId != wmsBaseLocation.locationId) + .Where(t => string.IsNullOrEmpty(t.containerCode)) + .FirstOrDefault(); + if (toLocation != null) { - WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail() - { - rawOutstockDetailId = StaticData.SnowId.NextId(), - createBy = "WCS", - createDate = DateTime.Now, - executeStatus = "0", - erpAmount = 0, - erpStatus = "0", - instockBatch = mesBaseBarcodeInfo.batchCode, - stackAmount = 1, - locationCode = wmsBaseLocation.locationCode, - rawOutstockId = wmsRawOutstock.rawOutstockId, - planAmount = 1, - outstockWay = "2", - outstockPerson = "WCS", - outstockTime = DateTime.Now, - materialProductionDate = mesBaseBarcodeInfo.productionDate, - materialBarcode = mesBasePalletInfo.materialBarcode, - materialId = wmsRawOutstock.materialId, - machineName = mesBaseBarcodeInfo.machineName, - outstockAmount = 1, - taskCode = wmsRawOutstock.taskCode - }; - wcsTask = new WcsTask() + var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), - orderId = wmsRawOutstock.rawOutstockId, - taskType = 41, + taskType = 67, containerNo = wmsBaseLocation.containerCode, createBy = "WCS", - createTime = DateTime.Now, + createTime = DateTime.Now.AddSeconds(-10), taskStatus = 0, - materialId = wmsRawOutstock.materialId, - currPointId = wmsBaseLocation.locationId, - currPointNo = wmsBaseLocation.locationCode, + currPointId = fromBaseLocation.locationId, + currPointNo = fromBaseLocation.locationCode, nextPointId = baseEquip.objid, nextPointNo = baseEquip.equipNo, - endPointId = endEquip.objid, - endPointNo = endEquip.equipNo, - equipmentNo = endEquip.equipNo, + endPointId = toLocation.locationId, + endPointNo = toLocation.locationCode, + equipmentNo = baseEquip.equipNo, useFlag = 1, qty = 1 }; - dbContext.Add(wmsRawOutstockDetail); - WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); - dbContext.Remove(wcsTaskManual); - dbContext.Add(wcsTask); + toLocation.locationStatus = "4"; + toLocation.instockFlag = "1"; + toLocation.updateBy = "WCS"; + toLocation.updateTime = DateTime.Now; + fromBaseLocation.updateBy = "WCS"; + fromBaseLocation.updateTime = DateTime.Now; + fromBaseLocation.outstockFlag = "1"; + fromBaseLocation.locationStatus = "4"; + dbContext.Update(toLocation); + dbContext.Update(fromBaseLocation); + dbContext.Add(RemoveTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); dbContext.Add(wcsTaskLog); - dbContext.SaveChanges(); } } } } } + if (wmsBaseLocation != null) + { + MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsBaseLocation.containerCode); + if (mesBasePalletInfo != null) + { + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); + if (mesBaseBarcodeInfo != null) + { + WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail() + { + rawOutstockDetailId = StaticData.SnowId.NextId(), + createBy = "WCS", + createDate = DateTime.Now, + executeStatus = "0", + erpAmount = 0, + erpStatus = "0", + instockBatch = mesBaseBarcodeInfo.batchCode, + stackAmount = 1, + locationCode = wmsBaseLocation.locationCode, + rawOutstockId = wmsRawOutstock.rawOutstockId, + planAmount = 1, + outstockWay = "2", + outstockPerson = "WCS", + outstockTime = DateTime.Now, + materialProductionDate = mesBaseBarcodeInfo.productionDate, + materialBarcode = mesBasePalletInfo.materialBarcode, + materialId = wmsRawOutstock.materialId, + machineName = mesBaseBarcodeInfo.machineName, + outstockAmount = 1, + taskCode = wmsRawOutstock.taskCode + }; + wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = wmsRawOutstock.rawOutstockId, + taskType = 41, + containerNo = wmsBaseLocation.containerCode, + createBy = "WCS", + createTime = DateTime.Now, + taskStatus = 0, + materialId = wmsRawOutstock.materialId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = baseEquip.objid, + nextPointNo = baseEquip.equipNo, + endPointId = endEquip.objid, + endPointNo = endEquip.equipNo, + equipmentNo = endEquip.equipNo, + useFlag = 1, + qty = 1 + }; + dbContext.Update(wmsBaseLocation); + dbContext.Add(wmsRawOutstockDetail); + WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); + dbContext.Remove(wcsTaskManual); + dbContext.Add(wcsTask); + dbContext.Add(wcsTaskLog); + dbContext.SaveChanges(); + } + } + } + } } } @@ -607,6 +698,7 @@ namespace Khd.Core.Wcs.Wcs //materialNo = wmsRawReturn.materialBatch, }; wmsRawReturn.executeStatus = "1"; + wmsRawReturn.returnAmount += 1; dbContext.Add(wcsTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); dbContext.Add(wcsTaskLog); @@ -1174,7 +1266,6 @@ namespace Khd.Core.Wcs.Wcs WmsRawStock stock = b.b; WcsTask wcsTask; int qty = 0; - int outNumber = 0; if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 { RealOutNumber += stock.totalAmount - stock.frozenAmount; @@ -1265,75 +1356,88 @@ namespace Khd.Core.Wcs.Wcs if (wcsOutstockLock.qty == 0 && wcsOutstockLock.boxStatus == 0) { var orderList = rawOutStock.Where(t => t.endStationCode == item.endStationCode).ToList(); - foreach (var order in orderList) + List tasks = new(); + + //对物料和数量进行分组 + var list = orderList.GroupBy(t => t.materialId).Select(t => new { - WcsTask? task = dbContext.WcsTask.FirstOrDefault(t => t.taskType == 32); - if (task == null) + MaterialId = t.Key, + TotalAmount = t.Sum(x => x.outstockAmount), + realOutstockAmount = t.Sum(x => x.realOutstockAmount) + } + ).ToList(); + + foreach (var order in list) + { + if (tasks.Count >= 6) { - var wmsRawStocks = rawStock - .Where(t => t.materialId == order.materialId && t.warehouseId == order.warehouseId) - .Select(t => t.palletInfoCode) - .ToList(); + break; + } + var wmsRawStocks = rawStock + .Where(t => t.materialId == order.MaterialId && t.warehouseId == 512) + .Select(t => t.palletInfoCode) + .ToList(); - var wmsBaseLocations = dbContext.WmsBaseLocation - .Where(t => t.activeFlag == "1") - .Where(t => t.delFlag == "0") - .Where(t => t.locationScrapType == "1") - .Where(t => t.instockFlag == "0") - .Where(t => t.outstockFlag == "0") - .Where(t => t.warehouseId == order.warehouseId) - .Where(t => wmsRawStocks.Contains(t.containerCode)) - .ToList(); + 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 == 512) + .Where(t => wmsRawStocks.Contains(t.containerCode)) + .ToList(); + decimal? needNumber = order.TotalAmount - order.realOutstockAmount; - decimal? needNumber = order.outstockAmount - RealOutNumber; - - var bill = from a in wmsBaseLocations - from b in rawStock - where a.containerCode == b.palletInfoCode - select new { a, b }; - //如果第一列满足需求,则按第一列排序,否则按最后一列排序 - if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() > needNumber) + var bill = from a in wmsBaseLocations + from b in rawStock + where a.containerCode == b.palletInfoCode + select new { a, b }; + //如果第一列满足需求,则按第一列排序,否则按最后一列排序 + if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() >= needNumber) + { + bill = bill.OrderBy(t => t.a.locColumn).ToList(); + } + else + { + bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); + } + BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); + BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); + foreach (var b in bill) + { + if (tasks.Where(t => t.containerNo == b.a.containerCode).Any() || tasks.Count >= 6) { - bill = bill.OrderBy(t => t.a.locColumn).ToList(); + continue; + } + WmsBaseLocation location = b.a; + WmsRawStock stock = b.b; + int qty = 0; + if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + { + RealOutNumber += stock.totalAmount - stock.frozenAmount; + qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); + stock.updateDate = DateTime.Now; } else { - bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); + RealOutNumber += needNumber; + qty = Convert.ToInt32(needNumber); + stock.updateDate = DateTime.Now; } - //做数量限制 - - 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) + WmsRawOutstock? wmsRawOutstock = orderList.Where(t => t.materialId == order.MaterialId).FirstOrDefault(); + if (wmsRawOutstock != null) { - item.executeStatus = "1"; - WmsBaseLocation location = b.a; - WmsRawStock stock = b.b; - WcsTask wcsTask; - int qty = 0; - if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 - { - RealOutNumber += stock.totalAmount - stock.frozenAmount; - qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); - stock.updateDate = DateTime.Now; - } - else - { - RealOutNumber += needNumber; - qty = Convert.ToInt32(needNumber); - stock.updateDate = DateTime.Now; - } - wcsTask = new WcsTask() + WcsTask wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), - orderId = item.rawOutstockId, + orderId = wmsRawOutstock.rawOutstockId, taskType = 30, containerNo = location.containerCode, createBy = "WCS", createTime = DateTime.Now, taskStatus = 0, - materialId = item.materialId, + materialId = wmsRawOutstock.materialId, currPointId = location.locationId, currPointNo = location.locationCode, nextPointId = ctuEquip.objid, @@ -1345,292 +1449,408 @@ namespace Khd.Core.Wcs.Wcs useFlag = 0, qty = qty }; - MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault(); - if (mesBaseBarcodeInfo != null) + tasks.Add(wcsTask); + location.outstockFlag = "1"; + location.locationStatus = "6"; + location.updateBy = "WCS"; + location.ContainerStatus = "2"; + location.updateTime = DateTime.Now; + wcsOutstockLock.qty += 1; + wcsOutstockLock.boxStatus = 1; + dbContext.Update(location); + dbContext.Update(stock); + CreateSuccess = true; + if (tasks.Count >= 6) { - WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail() - { - rawOutstockDetailId = StaticData.SnowId.NextId(), - rawOutstockId = item.rawOutstockId, - materialId = item.materialId, - createDate = DateTime.Now, - createBy = "WCS", - taskCode = wcsTask.objid.ToString(), - executeStatus = "1", - locationCode = location.locationCode, - outstockAmount = qty, - planAmount = item.outstockAmount, - warehouseId = item.warehouseId, - materialBarcode = mesBaseBarcodeInfo.barcodeInfo, - instockBatch = mesBaseBarcodeInfo.batchCode, - stackAmount = qty, - outstockPerson = "WCS", - outstockTime = DateTime.Now, - outstockWay = "2", - materialProductionDate = mesBaseBarcodeInfo.productionDate - }; - dbContext.Add(wmsProductOutstockDetail); - location.outstockFlag = "1"; - location.locationStatus = "6"; - location.updateBy = "WCS"; - location.updateTime = DateTime.Now; - wcsOutstockLock.qty += 1; - wcsOutstockLock.boxStatus = 1; - dbContext.Update(wcsOutstockLock); - dbContext.Update(location); - dbContext.Add(wcsTask); - dbContext.Update(stock); - CreateSuccess = true; - if (qty >= needNumber) - { - break; - } + break; } } - if (CreateSuccess) - { - 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 = "", - currPointId = startStationEquip.objid, - currPointNo = startStationEquip.equipNo, - nextPointId = bearAgvEquip.objid, - nextPointNo = bearAgvEquip.equipNo, - endPointId = endStationEquip.objid, - endPointNo = endStationEquip.equipNo, - serialNo = SystemData.GetSerialNo(dbContext), - taskStatus = 0, - createTime = DateTime.Now, - createBy = "WCS", - materialId = item.materialId, - qty = 1, - useFlag = 1, - equipmentNo = startStationEquip.equipNo, - remark = "组装出库", - floorNo = 5, - masterId = item.materialId, - fromFloorNo = 5, - }; - if (item.beginTime == null) - { - item.beginTime = DateTime.Now; - } - dbContext.Add(bearAgvTask); - dbContext.Update(item); - } - dbContext.SaveChanges(); } - } - } - } - } - if (endEquip.equipType == 12 || endEquip.equipType == 13)//原材料到柜体验收区 - { - bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any(); - if (hasTask) - { - if (endEquip.emptyCount == 0) - { - var wmsRawStocks = rawStock - .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId) - .WhereIf(endEquip.equipType == 13, t => t.completeFlag == "0") - .WhereIf(endEquip.equipType == 12, t => t.completeFlag == "1") - .Where(t => t.totalAmount > t.frozenAmount) - .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(); + #region 原逻辑 + //foreach (var order in orderList) + //{ + // if(tasks.Count >= 6) + // { + // break; + // } + // WcsTask? task = dbContext.WcsTask.FirstOrDefault(t => t.taskType == 32); + // if (task == null) + // { + // var wmsRawStocks = rawStock + // .Where(t => t.materialId == order.materialId && t.warehouseId == order.warehouseId) + // .Select(t => t.palletInfoCode) + // .ToList(); - decimal? needNumber = item.outstockAmount - item.realOutstockAmount; - if (needNumber <= 0) - { - item.executeStatus = "2"; - dbContext.Update(item); - dbContext.SaveChanges(); - continue; - } + // var wmsBaseLocations = dbContext.WmsBaseLocation + // .Where(t => t.activeFlag == "1") + // .Where(t => t.delFlag == "0") + // .Where(t => t.locationScrapType == "1") + // .Where(t => t.instockFlag == "0") + // .Where(t => t.outstockFlag == "0") + // .Where(t => t.warehouseId == order.warehouseId) + // .Where(t => wmsRawStocks.Contains(t.containerCode)) + // .ToList(); - var bill = from a in wmsBaseLocations - from b in rawStock - where a.containerCode == b.palletInfoCode - select new { a, b }; - //如果第一列满足需求,则按第一列排序,否则按最后一列排序 - if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() > needNumber) - { - bill = bill.OrderBy(t => t.a.locColumn).Take(1).ToList(); - } - else - { - bill = bill.OrderByDescending(t => t.a.locColumn).Take(1).ToList(); - } + // decimal? needNumber = order.outstockAmount - RealOutNumber; - BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); - BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode); - foreach (var b in bill) + // var bill = from a in wmsBaseLocations + // from b in rawStock + // where a.containerCode == b.palletInfoCode + // select new { a, b }; + // //如果第一列满足需求,则按第一列排序,否则按最后一列排序 + // if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() > needNumber) + // { + // bill = bill.OrderBy(t => t.a.locColumn).ToList(); + // } + // else + // { + // bill = bill.OrderByDescending(t => t.a.locColumn).ToList(); + // } + // //做数量限制 + // bill = bill.Take(5 - dbContext.WcsCmd.Where(t => t.cmdStatus < 3 && t.nextPointId == 20).Count()); + // BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); + // BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20); + // foreach (var b in bill) + // { + // if (tasks.Where(t => t.containerNo == b.a.containerCode).Any()) + // { + // continue; + // } + // item.executeStatus = "1"; + // WmsBaseLocation location = b.a; + // WmsRawStock stock = b.b; + // int qty = 0; + // if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + // { + // RealOutNumber += stock.totalAmount - stock.frozenAmount; + // qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); + // stock.updateDate = DateTime.Now; + // } + // else + // { + // RealOutNumber += needNumber; + // qty = Convert.ToInt32(needNumber); + // stock.updateDate = DateTime.Now; + // } + // WcsTask wcsTask = new WcsTask() + // { + // objid = StaticData.SnowId.NextId(), + // orderId = item.rawOutstockId, + // taskType = 30, + // containerNo = location.containerCode, + // createBy = "WCS", + // createTime = DateTime.Now, + // taskStatus = 0, + // materialId = item.materialId, + // currPointId = location.locationId, + // currPointNo = location.locationCode, + // nextPointId = ctuEquip.objid, + // nextPointNo = ctuEquip.equipNo, + // endPointId = lineEquip.objid, + // endPointNo = lineEquip.equipNo, + // equipmentNo = ctuEquip.equipNo, + // ud1 = location.locColumn, + // useFlag = 0, + // qty = qty + // }; + // tasks.Add(wcsTask); + // MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault(); + // if (mesBaseBarcodeInfo != null) + // { + // WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail() + // { + // rawOutstockDetailId = StaticData.SnowId.NextId(), + // rawOutstockId = item.rawOutstockId, + // materialId = item.materialId, + // createDate = DateTime.Now, + // createBy = "WCS", + // taskCode = wcsTask.objid.ToString(), + // executeStatus = "1", + // locationCode = location.locationCode, + // outstockAmount = qty, + // planAmount = item.outstockAmount, + // warehouseId = item.warehouseId, + // materialBarcode = mesBaseBarcodeInfo.barcodeInfo, + // instockBatch = mesBaseBarcodeInfo.batchCode, + // stackAmount = qty, + // outstockPerson = "WCS", + // outstockTime = DateTime.Now, + // outstockWay = "2", + // materialProductionDate = mesBaseBarcodeInfo.productionDate + // }; + // details.Add(wmsProductOutstockDetail); + // location.outstockFlag = "1"; + // location.locationStatus = "6"; + // location.updateBy = "WCS"; + // location.updateTime = DateTime.Now; + // wcsOutstockLock.qty += 1; + // wcsOutstockLock.boxStatus = 1; + // dbContext.Update(wcsOutstockLock); + // dbContext.Update(location); + // dbContext.Add(wcsTask); + // dbContext.Update(stock); + // CreateSuccess = true; + // if (tasks.Count >= 6) + // { + // break; + // } + // } + // } + // } + //} + #endregion + + } + if (CreateSuccess) { - item.executeStatus = "1"; - WmsBaseLocation location = b.a; - WmsRawStock stock = b.b; - WcsTask wcsTask; - int qty = 0; - if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + foreach (var orderItem in orderList) { - item.realOutstockAmount += stock.totalAmount - stock.frozenAmount; - qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); - stock.updateDate = DateTime.Now; - } - else - { - item.realOutstockAmount += needNumber; - qty = Convert.ToInt32(needNumber); - stock.updateDate = DateTime.Now; - } - MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault(); - if (mesBaseBarcodeInfo != null) - { - if (location.locDeep == 1) + if (orderItem.beginTime == null) { - int? row = 0; - if (location.locRow % 2 == 1) - { - row = location.locRow + 1; - } - else - { - row = location.locRow - 1; - } - WmsBaseLocation? wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == row) - .Where(t => t.locColumn == location.locColumn) - .Where(t => t.warehouseId == location.warehouseId).FirstOrDefault(); - if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode)) - { - WmsBaseLocation? toLocation = dbContext.WmsBaseLocation.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.locDeep == 1) - .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); - toLocation ??= dbContext.WmsBaseLocation.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.warehouseId != location.locationId) - .Where(t => string.IsNullOrEmpty(t.containerCode)) - .FirstOrDefault(); - if (toLocation != null) - { - var RemoveTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - orderId = item.rawOutstockId, - taskType = 38, - containerNo = wmsBaseLocation.containerCode, - createBy = "WCS", - createTime = DateTime.Now.AddSeconds(-10), - taskStatus = 0, - materialId = item.materialId, - currPointId = wmsBaseLocation.locationId, - currPointNo = wmsBaseLocation.locationCode, - nextPointId = agvEquip.objid, - nextPointNo = agvEquip.equipNo, - endPointId = toLocation.locationId, - endPointNo = toLocation.locationCode, - equipmentNo = agvEquip.equipNo, - useFlag = 1, - qty = qty - }; - toLocation.locationStatus = "4"; - toLocation.instockFlag = "1"; - toLocation.updateBy = "WCS"; - toLocation.updateTime = DateTime.Now; - wmsBaseLocation.updateBy = "WCS"; - wmsBaseLocation.updateTime = DateTime.Now; - wmsBaseLocation.outstockFlag = "1"; - wmsBaseLocation.locationStatus = "4"; - dbContext.Update(toLocation); - dbContext.Update(wmsBaseLocation); - dbContext.Add(RemoveTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); - dbContext.Add(wcsTaskLog); - } - else - { - continue; - } - } - } - wcsTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - orderId = item.rawOutstockId, - taskType = endEquip.equipType == 12 ? 46 : 33,//如果是12那么就是原材料到柜体验收区,如果是13那么就是原材料到背板安装区 - containerNo = location.containerCode, - createBy = "WCS", - createTime = DateTime.Now, - taskStatus = 0, - materialId = item.materialId, - currPointId = location.locationId, - currPointNo = location.locationCode, - nextPointId = agvEquip.objid, - nextPointNo = agvEquip.equipNo, - endPointId = lineEquip.objid, - endPointNo = lineEquip.equipNo, - equipmentNo = agvEquip.equipNo, - useFlag = 1, - qty = qty - }; - WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail() - { - rawOutstockDetailId = StaticData.SnowId.NextId(), - rawOutstockId = item.rawOutstockId, - materialId = item.materialId, - createDate = DateTime.Now, - createBy = "WCS", - taskCode = wcsTask.objid.ToString(), - executeStatus = "1", - locationCode = location.locationCode, - outstockAmount = qty, - planAmount = item.outstockAmount, - warehouseId = item.warehouseId, - materialBarcode = mesBaseBarcodeInfo.barcodeInfo, - instockBatch = mesBaseBarcodeInfo.batchCode, - stackAmount = qty, - outstockPerson = "WCS", - outstockTime = DateTime.Now, - outstockWay = "2", - materialProductionDate = mesBaseBarcodeInfo.productionDate - }; - dbContext.Add(wmsProductOutstockDetail); - location.outstockFlag = "1"; - location.locationStatus = "6"; - location.updateBy = "WCS"; - location.updateTime = DateTime.Now; - endEquip.emptyCount = 1; - dbContext.Update(endEquip); - dbContext.Update(location); - dbContext.Add(wcsTask); - dbContext.Update(stock); - dbContext.SaveChanges(); - if (qty >= needNumber) - { - break; + orderItem.beginTime = DateTime.Now; } + orderItem.executeStatus = "1"; } + BaseEquip startStationEquip = StaticData.BaseEquip.First(t => t.objid == 21); + BaseEquip bearAgvEquip = StaticData.BaseEquip.First(t => t.objid == 10); + BaseEquip endStationEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode); + WcsTask bearAgvTask = new() + { + objid = StaticData.SnowId.NextId(), + orderId = item.orderId, + taskType = 32, + containerNo = "", + currPointId = startStationEquip.objid, + currPointNo = startStationEquip.equipNo, + nextPointId = bearAgvEquip.objid, + nextPointNo = bearAgvEquip.equipNo, + endPointId = endStationEquip.objid, + endPointNo = endStationEquip.equipNo, + serialNo = SystemData.GetSerialNo(dbContext), + taskStatus = 0, + createTime = DateTime.Now, + createBy = "WCS", + materialId = item.materialId, + qty = 1, + useFlag = 1, + equipmentNo = startStationEquip.equipNo, + remark = "组装出库", + floorNo = 5, + masterId = item.materialId, + fromFloorNo = 5, + }; if (item.beginTime == null) { item.beginTime = DateTime.Now; } + dbContext.UpdateRange(orderList); + dbContext.AddRange(tasks); + dbContext.Add(bearAgvTask); dbContext.Update(item); + dbContext.Update(wcsOutstockLock); dbContext.SaveChanges(); - break; + } + } + } + if (endEquip.equipType == 12 || endEquip.equipType == 13)//原材料到柜体验收区 + { + bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.useFlag == 1 && t.taskStatus <= 5).Any(); + if (!hasTask) + { + if (endEquip.emptyCount == 0) + { + var wmsRawStocks = rawStock + .Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId) + .WhereIf(endEquip.equipType == 13, t => t.completeFlag == "0") + .WhereIf(endEquip.equipType == 12, t => t.completeFlag == "1") + .Where(t => t.totalAmount > t.frozenAmount) + .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.frozenAmount).Sum() > needNumber) + { + bill = bill.OrderBy(t => t.a.locColumn).Take(1).ToList(); + } + else + { + bill = bill.OrderByDescending(t => t.a.locColumn).Take(1).ToList(); + } + + BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28); + BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode); + foreach (var b in bill) + { + item.executeStatus = "1"; + WmsBaseLocation location = b.a; + WmsRawStock stock = b.b; + WcsTask wcsTask; + int qty = 0; + if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 + { + item.realOutstockAmount += stock.totalAmount - stock.frozenAmount; + qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); + stock.updateDate = DateTime.Now; + } + else + { + item.realOutstockAmount += needNumber; + qty = Convert.ToInt32(needNumber); + stock.updateDate = DateTime.Now; + } + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault(); + if (mesBaseBarcodeInfo != null) + { + if (location.locDeep == 1) + { + int? row = 0; + if (location.locRow % 2 == 1) + { + row = location.locRow + 1; + } + else + { + row = location.locRow - 1; + } + WmsBaseLocation? wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == row) + .Where(t => t.locColumn == location.locColumn) + .Where(t => t.warehouseId == location.warehouseId).FirstOrDefault(); + if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode)) + { + WmsBaseLocation? toLocation = dbContext.WmsBaseLocation.Where(t => t.warehouseId == location.warehouseId) + .Where(t => t.locDeep == 1) + .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); + toLocation ??= dbContext.WmsBaseLocation.Where(t => t.warehouseId == location.warehouseId) + .Where(t => t.warehouseId != location.locationId) + .Where(t => string.IsNullOrEmpty(t.containerCode)) + .FirstOrDefault(); + if (toLocation != null) + { + var RemoveTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.rawOutstockId, + taskType = 38, + containerNo = wmsBaseLocation.containerCode, + createBy = "WCS", + createTime = DateTime.Now.AddSeconds(-10), + taskStatus = 0, + materialId = item.materialId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = toLocation.locationId, + endPointNo = toLocation.locationCode, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = qty + }; + toLocation.locationStatus = "4"; + toLocation.instockFlag = "1"; + toLocation.updateBy = "WCS"; + toLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "WCS"; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.outstockFlag = "1"; + wmsBaseLocation.locationStatus = "4"; + dbContext.Update(toLocation); + dbContext.Update(wmsBaseLocation); + dbContext.Add(RemoveTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); + dbContext.Add(wcsTaskLog); + } + else + { + continue; + } + } + } + wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.rawOutstockId, + taskType = endEquip.equipType == 12 ? 46 : 33,//如果是12那么就是原材料到柜体验收区,如果是13那么就是原材料到背板安装区 + containerNo = location.containerCode, + createBy = "WCS", + createTime = DateTime.Now, + taskStatus = 0, + materialId = item.materialId, + currPointId = location.locationId, + currPointNo = location.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = lineEquip.objid, + endPointNo = lineEquip.equipNo, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = qty + }; + WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail() + { + rawOutstockDetailId = StaticData.SnowId.NextId(), + rawOutstockId = item.rawOutstockId, + materialId = item.materialId, + createDate = DateTime.Now, + createBy = "WCS", + taskCode = wcsTask.objid.ToString(), + executeStatus = "1", + locationCode = location.locationCode, + outstockAmount = qty, + planAmount = item.outstockAmount, + warehouseId = item.warehouseId, + materialBarcode = mesBaseBarcodeInfo.barcodeInfo, + instockBatch = mesBaseBarcodeInfo.batchCode, + stackAmount = qty, + outstockPerson = "WCS", + outstockTime = DateTime.Now, + outstockWay = "2", + materialProductionDate = mesBaseBarcodeInfo.productionDate + }; + dbContext.Add(wmsProductOutstockDetail); + location.outstockFlag = "1"; + location.locationStatus = "6"; + location.updateBy = "WCS"; + location.updateTime = DateTime.Now; + endEquip.emptyCount = 1; + dbContext.Update(endEquip); + dbContext.Update(location); + dbContext.Add(wcsTask); + dbContext.Update(stock); + dbContext.SaveChanges(); + } + if (item.beginTime == null) + { + item.beginTime = DateTime.Now; + } + dbContext.Update(item); + dbContext.SaveChanges(); + break; + } } } } diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index b5b7955..e5fc5fd 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -499,9 +499,28 @@ namespace Khd.Core.Wcs.Wcs WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid); if (wcsCmd != null) { - if (wcsCmd.cmdStatus == 3) { + if (item.currPointId == 5) + { + var lineSignalValue = this._plc.Read(LineSignal.plcpointAddress); + if (lineSignalValue == null || Convert.ToInt32(lineSignalValue) == 0) + { + Console.WriteLine(DateTime.Now + ":五楼Agv:接驳位为空,无法取货"); + LogManager.Info("五楼Agv:接驳位为空,无法取货"); + continue; + } + } + else if (item.endPointId == 5) + { + var lineSignalValue = this._plc.Read(LineSignal.plcpointAddress); + if (lineSignalValue == null || Convert.ToInt32(lineSignalValue) == 1) + { + Console.WriteLine(DateTime.Now + ":五楼Agv:接驳位有货,无法送货"); + LogManager.Info("五楼Agv:接驳位有货,无法送货"); + continue; + } + } var agvTask = new RequestAGVTaskDto { reqCode = StaticData.SnowId.NextId().ToString(), @@ -526,7 +545,7 @@ namespace Khd.Core.Wcs.Wcs LogManager.Info("五楼叉车线程完成任务" + wcsCmd.objid); Console.WriteLine(DateTime.Now + ":五楼背负式AGV线程完成任务" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo); LogManager.Info("五楼Agv完成任务成功:" + wcsCmd.ToJsonString()); - if (item.taskType == 66) + if (item.taskType == 66)//移库 { WmsBaseLocation fromBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); WmsBaseLocation toBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); @@ -608,19 +627,31 @@ namespace Khd.Core.Wcs.Wcs } else if (item.taskType == 33)//原材料到背板安装 { - WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); - wmsBaseLocation.locationStatus = "1"; - wmsBaseLocation.outstockFlag = "0"; - wmsBaseLocation.containerCode = ""; - wmsBaseLocation.updateTime = DateTime.Now; - wmsBaseLocation.updateBy = "WCS"; - dbContext.Update(wmsBaseLocation); - dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).Delete(); - dbContext.WcsCmd.Remove(wcsCmd); - dbContext.WcsTask.Remove(item); - dbContext.SaveChanges(); - dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); - dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); + WmsRawOutstock? wmsRawOutstock = dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.orderId).FirstOrDefault(); + if (wmsRawOutstock != null) + { + WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.Where(t => t.rawOutstockId == wmsRawOutstock.rawOutstockId && t.executeStatus == "1").FirstOrDefault(); + if (wmsRawOutstockDetail != null) + { + wmsRawOutstockDetail.executeStatus = "2"; + wmsRawOutstock.executeStatus = "2"; + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); + wmsBaseLocation.locationStatus = "1"; + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.containerCode = ""; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "WCS"; + dbContext.Update(wmsRawOutstock); + dbContext.Update(wmsRawOutstockDetail); + dbContext.Update(wmsBaseLocation); + dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).Delete(); + dbContext.WcsCmd.Remove(wcsCmd); + dbContext.WcsTask.Remove(item); + dbContext.SaveChanges(); + dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); + dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); + } + } } else if (item.taskType == 34)//半成品入库 { @@ -640,6 +671,8 @@ namespace Khd.Core.Wcs.Wcs WmsProductInstockDetail? wmsProductInstockDetail = dbContext.WmsProductInstockDetail.Where(t => t.productInstockId == wmsProductInstock.productInstockId).FirstOrDefault(); if (wmsProductInstockDetail != null) { + wmsProductInstock.executeStatus = "2"; + dbContext.Update(wmsProductInstock); WmsProductStock wmsProductStock = new WmsProductStock() { productId = wmsProductInstock.productId, @@ -683,64 +716,74 @@ namespace Khd.Core.Wcs.Wcs } else if (item.taskType == 46)//该任务结束后,立刻生成一个新的返库任务,但是是否使用标志未0,等待mes通知 { - WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); - wmsBaseLocation.outstockFlag = "0"; - wmsBaseLocation.instockFlag = "1"; - wmsBaseLocation.locationStatus = "2"; - wmsBaseLocation.containerCode = null; - wmsBaseLocation.updateTime = DateTime.Now; - wmsBaseLocation.updateBy = "WCS"; - WmsRawStock? wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).FirstOrDefault(); - if (wmsRawStock != null) + var wmsRawOutStock = dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.orderId).FirstOrDefault(); + WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.Where(t => t.rawOutstockId == item.orderId).FirstOrDefault(); + if (wmsRawOutStock != null && wmsRawOutstockDetail != null) { - wmsRawStock.completeFlag = "0"; - wmsRawStock.updateDate = DateTime.Now; - wmsRawStock.updateBy = "WCS"; - dbContext.Update(wmsRawStock); - dbContext.Update(wmsBaseLocation); - if (wmsBaseLocation.locDeep == 1) + wmsRawOutstockDetail.executeStatus = "2"; + wmsRawOutStock.executeStatus = "2"; + dbContext.Update(wmsRawOutStock); + dbContext.Update(wmsRawOutstockDetail); + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.instockFlag = "1"; + wmsBaseLocation.locationStatus = "2"; + wmsBaseLocation.containerCode = null; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "WCS"; + WmsRawStock? wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).FirstOrDefault(); + if (wmsRawStock != null) { - int? locRow = 0; - if (wmsBaseLocation.locRow % 2 == 1) + wmsRawStock.completeFlag = "0"; + wmsRawStock.updateDate = DateTime.Now; + wmsRawStock.updateBy = "WCS"; + dbContext.Update(wmsRawStock); + dbContext.Update(wmsBaseLocation); + if (wmsBaseLocation.locDeep == 1) { - locRow = wmsBaseLocation.locRow + 1; - } - else - { - locRow = wmsBaseLocation.locRow - 1; - } - WmsBaseLocation? deepWmsLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == locRow) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Where(t => t.warehouseId == wmsBaseLocation.warehouseId) - .FirstOrDefault(); - if (deepWmsLocation != null) - { - deepWmsLocation.instockFlag = "1"; - deepWmsLocation.locationStatus = "2"; - dbContext.Update(deepWmsLocation); + int? locRow = 0; + if (wmsBaseLocation.locRow % 2 == 1) + { + locRow = wmsBaseLocation.locRow + 1; + } + else + { + locRow = wmsBaseLocation.locRow - 1; + } + WmsBaseLocation? deepWmsLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == locRow) + .Where(t => t.locColumn == wmsBaseLocation.locColumn) + .Where(t => t.warehouseId == wmsBaseLocation.warehouseId) + .FirstOrDefault(); + if (deepWmsLocation != null) + { + deepWmsLocation.instockFlag = "1"; + deepWmsLocation.locationStatus = "2"; + dbContext.Update(deepWmsLocation); + } } + WcsTask newTask = CoreMapper.Map(item); + newTask.objid = StaticData.SnowId.NextId(); + var currPointId = item.currPointId; + var currPointNo = item.currPointNo; + newTask.currPointId = item.endPointId; + newTask.currPointNo = item.endPointNo; + newTask.endPointId = item.currPointId; + newTask.endPointNo = item.currPointNo; + newTask.createTime = DateTime.Now; + newTask.taskType = 28; + newTask.taskStatus = 0; + newTask.useFlag = 0; + dbContext.Remove(item); + dbContext.Remove(wcsCmd); + WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); + dbContext.Add(newTask); + dbContext.Add(wcsTaskLog); + dbContext.SaveChanges(); + dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); + dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); } - WcsTask newTask = CoreMapper.Map(item); - newTask.objid = StaticData.SnowId.NextId(); - var currPointId = item.currPointId; - var currPointNo = item.currPointNo; - newTask.currPointId = item.endPointId; - newTask.currPointNo = item.endPointNo; - newTask.endPointId = item.currPointId; - newTask.endPointNo = item.currPointNo; - newTask.createTime = DateTime.Now; - newTask.taskType = 28; - newTask.taskStatus = 0; - newTask.useFlag = 0; - dbContext.Remove(item); - dbContext.Remove(wcsCmd); - WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); - dbContext.Add(newTask); - dbContext.Add(wcsTaskLog); - dbContext.SaveChanges(); - dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); - dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); } + } else if (item.taskType == 28)//柜体拆分到原材料 diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs index 0c76cf9..e25db62 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs @@ -39,7 +39,7 @@ namespace Khd.Core.Wcs.Wcs this.isput = StaticData.BasePlcpointList.First(t => t.plcpointNo == "isput"); this.canReceive = StaticData.BasePlcpointList.First(t => t.plcpointNo == "canReceive"); this.ReceiveMaterial = StaticData.BasePlcpointList.First(t => t.plcpointNo == "ReceiveMaterial"); - this.CtuLineWaring = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CtuLineWaring"); + this.CtuLineWaring = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTULineWaring"); } /// @@ -153,6 +153,45 @@ namespace Khd.Core.Wcs.Wcs else { if (task.taskType == 30) + { + dbContext.WcsTask.Where(t => t.objid == task.objid).Delete(); + //根据rfid找到库位 + //生成入库任务 + var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == rfid); + if (wmsBaseLocation != null) + { + BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051"); + BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11); + if (wmsBaseLocation != null) + { + var wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + currPointId = baseEquip.objid, + currPointNo = baseEquip.agvPositionCode, + nextPointId = ctuEquip.objid, + useFlag = 1, + endPointId = wmsBaseLocation.locationId, + endPointNo = wmsBaseLocation.agvPositionCode, + taskType = 29, + taskStatus = 0, + floorNo = 5, + containerNo = rfid.ToString(), + equipmentNo = baseEquip.equipNo, + createBy = FloorNo + "楼CTU", + createTime = DateTime.Now, + }; + wmsBaseLocation.instockFlag = "1"; + wmsBaseLocation.locationStatus = "2"; + wmsBaseLocation.updateTime = DateTime.Now; + dbContext.Update(wmsBaseLocation); + dbContext.Add(wcsTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); + dbContext.Add(wcsTaskLog); + dbContext.SaveChanges(); + } + } + }else if (task.taskType == 100) { dbContext.WcsTask.Where(t => t.objid == task.objid).Delete(); //根据rfid找到库位 @@ -203,28 +242,27 @@ namespace Khd.Core.Wcs.Wcs } else if (receiveMaterial != null && Convert.ToInt32(receiveMaterial) == 1) { - Task.Run(() => - { - var receiveMaterial2 = this._plc.Read(ReceiveMaterial.plcpointAddress); - while (receiveMaterial2 != null && Convert.ToInt32(receiveMaterial2) == 1) - { - receiveMaterial2 = this._plc.Read(ReceiveMaterial.plcpointAddress); - lock (SystemData.outStockLock) - { - dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); - WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First(); - bool haveTask = dbContext.WcsTask.Where(t => t.nextPointId == 11).Any(); - if (!haveTask && wcsOutstockLock.boxStatus == 1) - { - wcsOutstockLock.boxStatus = 0; - wcsOutstockLock.qty = 0; - dbContext.Update(wcsOutstockLock); - dbContext.SaveChanges(); - } - } - Thread.Sleep(3000); - } - }); + //Task.Run(() => + //{ + // var receiveMaterial2 = this._plc.Read(ReceiveMaterial.plcpointAddress); + // while (receiveMaterial2 != null && Convert.ToInt32(receiveMaterial2) == 1) + // { + // receiveMaterial2 = this._plc.Read(ReceiveMaterial.plcpointAddress); + // lock (SystemData.outStockLock) + // { + // WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First(); + // bool haveTask = dbContext.WcsTask.Where(t => t.nextPointId == 11).Any(); + // if (!haveTask && wcsOutstockLock.boxStatus == 1) + // { + // wcsOutstockLock.boxStatus = 0; + // wcsOutstockLock.qty = 0; + // dbContext.Update(wcsOutstockLock); + // dbContext.SaveChanges(); + // } + // } + // Thread.Sleep(3000); + // } + //}); } } catch (Exception ex) @@ -480,6 +518,65 @@ namespace Khd.Core.Wcs.Wcs } } } + else if (item.taskType == 100)//盘库 + { + BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId); + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); + var wcsCmd = new WcsCmd() + { + objid = StaticData.SnowId.NextId(), + cmdStatus = 0, + taskId = item.objid, + useFlag = 1, + cmdType = item.taskType, + containerNo = item.containerNo, + createTime = DateTime.Now, + createBy = FloorNo + "楼CTU", + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.agvPositionCode, + nextPointId = endEquip.objid, + nextPointNo = endEquip.agvPositionCode, + taskCode = null + }; + var agvTask = new RequestAGVTaskDto + { + reqCode = StaticData.SnowId.NextId().ToString(), + positionCodePath = new List + { + new() + { + positionCode = wcsCmd.currPointNo, + type = "05" + }, + new() + { + positionCode = wcsCmd.nextPointNo, + type = "00" + }, + }, + ctnrTyp = "1", + taskTyp = "F504" + }; + string message = JsonConvert.SerializeObject(agvTask); + string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "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.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 }); + WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); + dbContext.Add(wcsCmdLog); + dbContext.WcsCmd.Add(wcsCmd); + dbContext.SaveChanges(); + } + else + { + LogManager.Info("CTU下发出库任务失败:" + reponseMessage?.message); + } + } } else { @@ -488,7 +585,7 @@ namespace Khd.Core.Wcs.Wcs { if (wcsCmd.cmdStatus == 3) { - if (item.taskType == 30) + if (item.taskType == 30 || item.taskType == 100) { var canOut = this._plc.Read(isput.plcpointAddress); if (canOut != null && Convert.ToInt64(canOut) == 0) @@ -604,6 +701,25 @@ namespace Khd.Core.Wcs.Wcs } } } + else if (item.taskType == 100)//出库任务 + { + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation + .First(t => t.locationId == item.currPointId && t.warehouseFloor == 5); + wmsBaseLocation.outstockFlag = "0"; + wmsBaseLocation.locationStatus = "1"; + wmsBaseLocation.locationStatus = "2"; + dbContext.Update(wmsBaseLocation); + dbContext.Remove(wcsCmd); + dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 6 }); + dbContext.SaveChanges(); + dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 }); + dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 }); + int wcsTaskCount = dbContext.WcsTask.Where(t => (t.taskType == 30 || t.taskType == 100) && t.taskStatus != 6).Count(); + if (wcsTaskCount == 0) + { + this._plc.WriteToPoint(this.canReceive.plcpointAddress, "1", this.canReceive.plcpointLength?.ToString()); + } + } } } } diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs index 30704db..e189d48 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs @@ -45,6 +45,7 @@ namespace Khd.Core.Wcs.Wcs public void MonitorInLocatorPoint() { + List BigContainerCodes = new() { "JYHB01020001", "JYHB01020002", "JYHB01020003", "JYHB01020004" }; List ITypes = new() { 1, 3, 5, 7 }; using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); @@ -58,6 +59,11 @@ namespace Khd.Core.Wcs.Wcs var isSignal = this._plc.Read(LineSignal.plcpointAddress); if (rfid != null && isSignal != null) { + if (BigContainerCodes.Contains(rfid)) + { + Thread.Sleep(1000); + continue; + } //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息 if (Convert.ToInt32(isSignal) == 1) { diff --git a/src/Khd.Core.Wcs/Wcs/SystemTimer.cs b/src/Khd.Core.Wcs/Wcs/SystemTimer.cs index a8bc84e..0b37be0 100644 --- a/src/Khd.Core.Wcs/Wcs/SystemTimer.cs +++ b/src/Khd.Core.Wcs/Wcs/SystemTimer.cs @@ -193,22 +193,21 @@ namespace Khd.Core.Wcs.Wcs /// private void MessageSynchronousLogic(object? obj) { + while (true) { try { - using var scope = host.Services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + HositerLogic(); //CtuLineLogic(); - ThirdAgvLogic(dbContext); - FiveAgvLogic(dbContext); - FiveBearAgvLogic(dbContext); - CtuCmdLogic(dbContext); - SecondAgvLogic(dbContext); - SendTrayMessage(dbContext); - UpdatePlcPointValue(dbContext); + ThirdAgvLogic(); + FiveAgvLogic(); + FiveBearAgvLogic(); + CtuCmdLogic(); + SecondAgvLogic(); + //SendTrayMessage(); + UpdatePlcPointValue(); } catch (Exception ex) { @@ -235,8 +234,10 @@ namespace Khd.Core.Wcs.Wcs } } - private void SendTrayMessage(DefaultDbContext dbContext) + private void SendTrayMessage() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 40); BasePlcpoint oneInPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "oneIn"); BasePlcpoint oneOutPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "oneOut"); @@ -265,10 +266,12 @@ namespace Khd.Core.Wcs.Wcs StaticData.PlcDic[2].WriteToPoint(basePlc2.Address, baseEquip.emptyCount.ToString(), basePlc2.type); } - private void UpdatePlcPointValue(DefaultDbContext dbContext) + private void UpdatePlcPointValue() { try { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); foreach (var item in StaticData.basePlcs) { item.Value = StaticData.PlcDic[2].Read(item.Address)?.ToString(); @@ -286,8 +289,10 @@ namespace Khd.Core.Wcs.Wcs /// 定时更新三楼AGV信息 /// /// - private void ThirdAgvLogic(DefaultDbContext dbContext) + private void ThirdAgvLogic() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); var baseEquip = StaticData.BaseEquip.First(t => t.objid == 9); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "3楼AGV").ToList(); @@ -317,8 +322,10 @@ namespace Khd.Core.Wcs.Wcs /// 定时更新二楼AGV信息 /// /// - private void SecondAgvLogic(DefaultDbContext dbContext) + private void SecondAgvLogic() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); var baseEquip = StaticData.BaseEquip.First(t => t.objid == 8); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "2楼AGV").ToList(); @@ -348,8 +355,10 @@ namespace Khd.Core.Wcs.Wcs /// 定时更新五楼AGV信息 /// /// - private void FiveAgvLogic(DefaultDbContext dbContext) + private void FiveAgvLogic() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); var baseEquip = StaticData.BaseEquip.First(t => t.objid == 10); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼AGV").ToList(); @@ -425,8 +434,10 @@ namespace Khd.Core.Wcs.Wcs /// 定时更新五楼背负式AGV信息 /// /// - private void FiveBearAgvLogic(DefaultDbContext dbContext) + private void FiveBearAgvLogic() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); var baseEquip = StaticData.BaseEquip.First(t => t.objid == 10); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼背负式").ToList(); @@ -457,8 +468,10 @@ namespace Khd.Core.Wcs.Wcs /// 定时更新五楼CTU信息 /// /// - private void CtuCmdLogic(DefaultDbContext dbContext) + private void CtuCmdLogic() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); var baseEquip = StaticData.BaseEquip.First(t => t.objid == 11); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼CTU").ToList(); diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs index 5a08e0c..693d31c 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs @@ -19,13 +19,16 @@ namespace Khd.Core.Wcs.Wcs private readonly IHost _host; private readonly Plc.S7.Plc _plc; int FloorNo { get; set; } + private readonly BasePlcpoint putTrayPoint; + private readonly BasePlcpoint getTrayPoint; public ThirdFloorAGV(IHost host, Plc.S7.Plc plc, int floor) { this._host = host; this._plc = plc; FloorNo = floor; - //var IsPallet = this._plc.Read(LineIsPallet.plcpointAddress); - + this.putTrayPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "putTray"); + this.getTrayPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "getTray"); + } /// /// 启动上件扫描监听 @@ -35,10 +38,66 @@ namespace Khd.Core.Wcs.Wcs Thread FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); + + Thread FZJThread = new Thread(MonitorInFZJPoint); + FZJThread.Start(); + Console.WriteLine(DateTime.Now + ":三楼AGV 启动上件扫描监听"); LogManager.Info("三楼AGV 启动上件扫描监听"); } + private void MonitorInFZJPoint(object? obj) + { + using var scope = _host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + try + { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var getTrayValue = this._plc.Read(getTrayPoint.plcpointAddress); + if (getTrayValue != null && Convert.ToInt32(getTrayValue) == 1) + { + bool hasTask = dbContext.WcsTask.Where(t => t.taskType == 41 || t.taskType == 42).Any(); + if (!hasTask) + { + BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 35); + BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 31); + BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 9); + WcsTask wcsTask = new() + { + objid = StaticData.SnowId.NextId(), + taskType = 42, + taskStatus = 0, + useFlag = 1, + createBy = FloorNo + "楼AGV", + nextPointId=agvEquip.objid, + nextPointNo=agvEquip.agvPositionCode, + currPointId = startEquip.objid, + currPointNo = startEquip.agvPositionCode, + endPointId = endEquip.objid, + endPointNo = endEquip.agvPositionCode, + containerNo="", + createTime = DateTime.Now, + isEmpty="1", + qty=1, + }; + dbContext.Add(wcsTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); + dbContext.Add(wcsTaskLog); + dbContext.SaveChanges(); + LogManager.Info("三楼AGV 生成空托盘入收集架任务:" + wcsTask.objid); + } + } + } + catch (Exception ex) + { + LogManager.Error(ex); + } + Thread.Sleep(5000); + } + } + public void MonitorInLocatorPoint() { using var scope = _host.Services.CreateScope(); diff --git a/src/Khd.Core.Wcs/appsettings.json b/src/Khd.Core.Wcs/appsettings.json index 852bfab..c024c85 100644 --- a/src/Khd.Core.Wcs/appsettings.json +++ b/src/Khd.Core.Wcs/appsettings.json @@ -1,8 +1,8 @@ { "ConnectionStrings": { //"DefaultConnection": "server=106.12.13.113;port=3336;database=khd_jyhb;uid=khd;pwd=khd@123;charset='utf8';persistsecurityinfo=True;SslMode=none;Allow User Variables=True", - //"DefaultConnection": "server=172.16.12.100;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khdrkjy2024...;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" - "DefaultConnection": "server=localhost;port=3306;database=jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" + "DefaultConnection": "server=172.16.12.100;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khdrkjy2024...;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" + //"DefaultConnection": "server=localhost;port=3306;database=jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" //"DefaultConnection": "server=175.27.215.92;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khd2024;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True" }, "PlcConfigs": [ @@ -14,14 +14,14 @@ "Slot": 1, "Code": 0 }, - //{ - // "IP": "192.168.2.31", - // "Port": 102, //102是默认端口 - // "CpuType": 40, - // "Rack": 0, - // "Slot": 1, - // "Code": 1 - //}, + { + "IP": "192.168.2.31", + "Port": 102, //102是默认端口 + "CpuType": 40, + "Rack": 0, + "Slot": 1, + "Code": 1 + }, { "IP": "192.168.2.220", "Port": 102, //102是默认端口 diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml b/src/Khd.Core.Wpf/Form/FormBoardT.xaml index 2864b0d..0a1d2b7 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml @@ -1744,38 +1744,167 @@ + + + + + + + + +