diff --git a/src/Khd.Core.Api/Controllers/RecieveRcsController.cs b/src/Khd.Core.Api/Controllers/RecieveRcsController.cs index 8e68c16..3474a03 100644 --- a/src/Khd.Core.Api/Controllers/RecieveRcsController.cs +++ b/src/Khd.Core.Api/Controllers/RecieveRcsController.cs @@ -54,7 +54,7 @@ namespace Khd.Core.Api.Controllers [HttpPost("agvComplete")] public AgvCompeletedResponse MesToAgvComplete(AgvCompeleted agvCompeletedRequest) { - LogManager.Info($"RecieveRcsController接口信息:{agvCompeletedRequest.ToJsonString()}"); + LogManager.Info($"agvComplete接口信息:{agvCompeletedRequest.ToJsonString()}"); return _application.MesToAgvComplete(agvCompeletedRequest); } diff --git a/src/Khd.Core.Application/WcsTaskApplication.cs b/src/Khd.Core.Application/WcsTaskApplication.cs index f8de10a..ce42d71 100644 --- a/src/Khd.Core.Application/WcsTaskApplication.cs +++ b/src/Khd.Core.Application/WcsTaskApplication.cs @@ -166,10 +166,11 @@ namespace Khd.Core.Application { var wcsTask = _dbContext.WcsTask .Where(t => (t.taskType == 32 || t.taskType == 48) && (t.endPointId == baseEquip.objid || t.currPointId == baseEquip.objid)) - .OrderByDescending(t => t.createTime) + .OrderBy(t => t.createTime) .FirstOrDefault(); if (wcsTask != null) { + LogManager.Info($"agvComplete接口找到任务:{wcsTask.ToJsonString()}"); if (wcsTask.taskType != 48 && wcsTask.taskStatus != 0) { wcsTask.taskStatus = 7; @@ -178,6 +179,7 @@ namespace Khd.Core.Application _dbContext.SaveChanges(); agvCompeletedResponse.code = "0"; agvCompeletedResponse.message = "成功"; + LogManager.Info($"agvComplete更新任务状态7{wcsTask.ToJsonString()}"); } else if (wcsTask.taskStatus != 0) { diff --git a/src/Khd.Core.Domain/Models/MesProductPlanDetail.cs b/src/Khd.Core.Domain/Models/MesProductPlanDetail.cs new file mode 100644 index 0000000..42c37c2 --- /dev/null +++ b/src/Khd.Core.Domain/Models/MesProductPlanDetail.cs @@ -0,0 +1,136 @@ + +//----------------------------------------------------------------------- +// +// * Copyright (C) 2021 KEHAIDASOFT All Rights Reserved +// * version : 4.0.30319.42000 +// * author : khd by t4-2 +// +//----------------------------------------------------------------------- + +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + [Table("mes_product_plan_detail")] + public class MesProductPlanDetail + { + [Key] + [Column("plan_detail_id")] + public long PlanDetailId { get; set; } + + /// + /// 明细编号 + /// + [Column("plan_detail_code")] + [Required] + [StringLength(64)] + public string PlanDetailCode { get; set; } + + /// + /// 生产计划ID + /// + [Column("plan_id")] + [Required] + public long PlanId { get; set; } + + /// + /// 计划编号, 关联mes_product_plan_info的plan_code + /// + [Column("plan_code")] + [Required] + [StringLength(64)] + public string PlanCode { get; set; } + + /// + /// 操作人员ID,关联sys_user的user_id + /// + [Column("user_id")] + public long? UserId { get; set; } + + /// + /// 操作人员名称,关联sys_user的user_name + /// + [Column("user_name")] + [StringLength(64)] + public string UserName { get; set; } + + /// + /// 开始时间 + /// + [Column("real_begin_time")] + public DateTime? RealBeginTime { get; set; } + + /// + /// 完成时间 + /// + [Column("real_end_time")] + public DateTime? RealEndTime { get; set; } + + /// + /// 文件ID,关联附件信息主键 + /// + [Column("attach_id")] + public int? AttachId { get; set; } + + /// + /// 明细状态:1-未开始;2-已开始;3-已完成;9-异常完成(校验物料信息不完整) + /// + [Column("plan_detail_status")] + [Required] + [StringLength(1)] + public string PlanDetailStatus { get; set; } = "1"; + + /// + /// 是否标识:1-是;0-否 + /// + [Column("is_flag")] + [Required] + [StringLength(1)] + public string IsFlag { get; set; } = "1"; + + /// + /// 备注 + /// + [Column("remark")] + [StringLength(500)] + public string Remark { get; set; } + + /// + /// 创建人 + /// + [Column("create_by")] + [StringLength(64)] + public string CreateBy { get; set; } + + /// + /// 创建时间 + /// + [Column("create_time")] + public DateTime? CreateTime { get; set; } + + /// + /// 更新人 + /// + [Column("update_by")] + [StringLength(64)] + public string UpdateBy { get; set; } + + /// + /// 更新时间 + /// + [Column("update_time")] + public DateTime? UpdateTime { get; set; } + + /// + /// 物料条码 + /// + [Column("material_barcode")] + [StringLength(64)] + public string MaterialBarcode { get; set; } + } + + +} + diff --git a/src/Khd.Core.Domain/Models/MesSaleOrderRelate.cs b/src/Khd.Core.Domain/Models/MesSaleOrderRelate.cs new file mode 100644 index 0000000..729f4a6 --- /dev/null +++ b/src/Khd.Core.Domain/Models/MesSaleOrderRelate.cs @@ -0,0 +1,41 @@ + +//----------------------------------------------------------------------- +// +// * Copyright (C) 2021 KEHAIDASOFT All Rights Reserved +// * version : 4.0.30319.42000 +// * author : khd by t4-2 +// +//----------------------------------------------------------------------- + +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + + [Table("mes_sale_order_relate")] + public class MesSaleOrderRelate + { + [Key] + [Column("sale_order_relate_id")] + public long SaleOrderRelateId { get; set; } + + [Column("sale_order_id")] + public long SaleOrderId { get; set; } + + [Column("relate_sale_order_id")] + public long RelateSaleOrderId { get; set; } + + [Column("purchase_order_id")] + public long PurchaseOrderId { get; set; } + + [Column("relate_sale_order_amout")] + public decimal RelateSaleOrderAmount { get; set; } + + [Column("material_id")] + public long MaterialId { get; set; } + + } +} + diff --git a/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs b/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs index 4558961..7db09e4 100644 --- a/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs +++ b/src/Khd.Core.Domain/Models/WmsInventoryCheck.cs @@ -36,5 +36,11 @@ namespace Khd.Core.Domain.Models public string UpdateBy { get; set; } [Column("update_date")] public DateTime? UpdateTime { get; set; } + + /// + /// 物料类型id,如果为null盘所有库,不为null盘该物料的库 + /// + [Column("material_id")] + public string? MaterialId { get; set; } } } diff --git a/src/Khd.Core.Domain/Models/WmsMove.cs b/src/Khd.Core.Domain/Models/WmsMove.cs new file mode 100644 index 0000000..33bc6a4 --- /dev/null +++ b/src/Khd.Core.Domain/Models/WmsMove.cs @@ -0,0 +1,120 @@ + +//----------------------------------------------------------------------- +// +// * Copyright (C) 2021 KEHAIDASOFT All Rights Reserved +// * version : 4.0.30319.42000 +// * author : khd by t4-2 +// +//----------------------------------------------------------------------- + +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + + [Table("wms_move")] + public class WmsMove + { + [Key] + [Column("move_id")] + public long MoveId { get; set; } + + [Required] + [Column("task_code")] + [MaxLength(128)] + public string TaskCode { get; set; } + + [Required] + [Column("warehouse_id")] + public long WarehouseId { get; set; } + + [Required] + [Column("ori_location_code")] + [MaxLength(64)] + public string OriLocationCode { get; set; } + + [Required] + [Column("target_location_code")] + [MaxLength(64)] + public string TargetLocationCode { get; set; } + + [Column("instock_batch")] + [MaxLength(64)] + public string InstockBatch { get; set; } + + [Column("material_id")] + public long? MaterialId { get; set; } + + [Column("plan_amount")] + public decimal? PlanAmount { get; set; } + + [Column("real_outstock_amount")] + public decimal RealOutstockAmount { get; set; } = 0.000000m; + + [Column("real_instock_amount")] + public decimal RealInstockAmount { get; set; } = 0.000000m; + + [Required] + [Column("operation_type")] + [MaxLength(1)] + public string OperationType { get; set; } + + [Required] + [Column("move_way")] + [MaxLength(1)] + public string MoveWay { get; set; } + + [Required] + [Column("move_type")] + [MaxLength(1)] + public string MoveType { get; set; } + + [Column("apply_reason")] + [MaxLength(500)] + public string ApplyReason { get; set; } + + [Column("audit_reason")] + [MaxLength(500)] + public string AuditReason { get; set; } + + [Required] + [Column("audit_status")] + [MaxLength(1)] + public string AuditStatus { get; set; } + + [Required] + [Column("execute_status")] + [MaxLength(1)] + public string ExecuteStatus { get; set; } + + [Column("apply_by")] + [MaxLength(64)] + public string ApplyBy { get; set; } + + [Column("apply_date")] + public DateTime? ApplyDate { get; set; } + + [Column("audit_by")] + [MaxLength(64)] + public string AuditBy { get; set; } + + [Column("audit_date")] + public DateTime? AuditDate { get; set; } + + [Column("update_by")] + [MaxLength(64)] + public string UpdateBy { get; set; } + + [Column("update_date")] + public DateTime? UpdateDate { get; set; } + + [Column("begin_time")] + public DateTime? BeginTime { get; set; } + + [Column("end_time")] + public DateTime? EndTime { get; set; } + } +} + diff --git a/src/Khd.Core.Domain/Models/WmsMoveDetail .cs b/src/Khd.Core.Domain/Models/WmsMoveDetail .cs new file mode 100644 index 0000000..4291ce8 --- /dev/null +++ b/src/Khd.Core.Domain/Models/WmsMoveDetail .cs @@ -0,0 +1,92 @@ + +//----------------------------------------------------------------------- +// +// * Copyright (C) 2021 KEHAIDASOFT All Rights Reserved +// * version : 4.0.30319.42000 +// * author : khd by t4-2 +// +//----------------------------------------------------------------------- + +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + + [Table("wms_move_detail")] + public class WmsMoveDetail + { + [Key] + [Column("move_detail_id")] + public long MoveDetailId { get; set; } + + [Required] + [Column("move_id")] + public long MoveId { get; set; } + + [Column("material_barcode")] + [MaxLength(64)] + public string? MaterialBarcode { get; set; } + + [Column("instock_batch")] + [MaxLength(64)] + public string? InstockBatch { get; set; } + + [Required] + [Column("material_id")] + public long MaterialId { get; set; } + + [Column("location_code")] + [MaxLength(64)] + public string? LocationCode { get; set; } + + [Required] + [Column("plan_amount")] + public decimal PlanAmount { get; set; } + + [Column("real_amount")] + public decimal? RealAmount { get; set; } + + [Column("real_instock_amount")] + public decimal? RealInstockAmount { get; set; } + + [Required] + [Column("execute_status")] + [MaxLength(1)] + public string ExecuteStatus { get; set; } + + [Column("execute_person")] + [MaxLength(64)] + public string? ExecutePerson { get; set; } + + [Column("execute_time")] + public DateTime? ExecuteTime { get; set; } + + [Column("execute_end_time")] + public DateTime? ExecuteEndTime { get; set; } + + [Column("machine_name")] + [MaxLength(64)] + public string? MachineName { get; set; } + + [Column("create_by")] + [MaxLength(64)] + public string? CreateBy { get; set; } + + [Column("create_date")] + public DateTime? CreateDate { get; set; } + + [Column("update_by")] + [MaxLength(64)] + public string? UpdateBy { get; set; } + + [Column("update_date")] + public DateTime? UpdateDate { get; set; } + + [Column("active_flag")] + [MaxLength(1)] + public string? ActiveFlag { get; set; } + } +} + diff --git a/src/Khd.Core.Domain/Models/WmsRawInstock.cs b/src/Khd.Core.Domain/Models/WmsRawInstock.cs index 520eba1..93cf4dd 100644 --- a/src/Khd.Core.Domain/Models/WmsRawInstock.cs +++ b/src/Khd.Core.Domain/Models/WmsRawInstock.cs @@ -64,6 +64,12 @@ namespace Khd.Core.Domain.Models [Column("material_id")] public long? materialId { get; set; } + /// + /// 物料条码信息 + /// + [Column("material_barcode")] + public string materialBarCode { get; set; } + /// /// 物料批次信息 /// @@ -106,17 +112,17 @@ 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; } ///// ///// 审核人 @@ -159,6 +165,12 @@ namespace Khd.Core.Domain.Models /// [Column("return_flag")] public string? returnFlag { get; set; } + + /// + /// 请求返回标识(1是),execute_status改为2时此return_flag改为null + /// + [Column("purchase_order_id")] + public long? purchaseOrderId { get; set; } } } diff --git a/src/Khd.Core.Domain/Models/WmsRawPreferredOut.cs b/src/Khd.Core.Domain/Models/WmsRawPreferredOut.cs new file mode 100644 index 0000000..1d0cfb4 --- /dev/null +++ b/src/Khd.Core.Domain/Models/WmsRawPreferredOut.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Domain.Models +{ + [Table("wms_raw_preferred_out")] + public class WmsRawPreferredOut + { + [Key] + [Column("raw_preferred_out_id")] + public long RawPreferredOutId { get; set; } // 优先出库ID + + [Column("warehouse_id")] + public long WarehouseId { get; set; } // 仓库ID + + [Column("warehouse_floor")] + public int? WarehouseFloor { get; set; } // 仓库楼层 + + [Column("location_code")] + [Required] + [MaxLength(64)] + public string LocationCode { get; set; } // 库位编码 + + [Column("stock_type")] + [Required] + [MaxLength(1)] + public string StockType { get; set; } // 库存类型:1原材料,2成品 + + [Column("material_id")] + public long MaterialId { get; set; } // 物料ID + + [Column("create_by")] + [MaxLength(64)] + public string CreateBy { get; set; } // 创建人 + + [Column("create_date")] + public DateTime? CreateDate { get; set; } // 创建时间 + + [Column("update_by")] + [MaxLength(64)] + public string UpdateBy { get; set; } // 最后更新人 + + [Column("update_date")] + public DateTime? UpdateDate { get; set; } // 最后更新时间 + + [Column("use_flag")] + [Required] + [MaxLength(1)] + public string UseFlag { get; set; } = "1"; // 有效标记 + } +} diff --git a/src/Khd.Core.Domain/Models/WmsRawReturnDetail.cs b/src/Khd.Core.Domain/Models/WmsRawReturnDetail.cs new file mode 100644 index 0000000..ca0792a --- /dev/null +++ b/src/Khd.Core.Domain/Models/WmsRawReturnDetail.cs @@ -0,0 +1,104 @@ + +//----------------------------------------------------------------------- +// +// * Copyright (C) 2021 KEHAIDASOFT All Rights Reserved +// * version : 4.0.30319.42000 +// * author : khd by t4-2 +// +//----------------------------------------------------------------------- + +using Microsoft.EntityFrameworkCore; +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + + [Table("wms_raw_return_detail")] + public class WmsRawReturnDetail + { + [Key] + [Column("raw_return_detail_id")] + public long RawReturnDetailId { get; set; } + + [Column("raw_return_id")] + public long RawReturnId { get; set; } + + [Column("location_code")] + [StringLength(64)] + public string LocationCode { get; set; } + + [Column("material_barcode")] + [StringLength(64)] + public string MaterialBarcode { get; set; } + + [Column("material_id")] + public long MaterialId { get; set; } + + [Column("instock_batch")] + [StringLength(64)] + public string InstockBatch { get; set; } + + [Column("material_production_date")] + public DateTime? MaterialProductionDate { get; set; } + + [Column("plan_amount")] + [Precision(16, 2)] + public decimal PlanAmount { get; set; } + + [Column("return_amount")] + [Precision(16, 2)] + public decimal? ReturnAmount { get; set; } + + [Column("execute_status")] + [StringLength(1)] + public string ExecuteStatus { get; set; } + + [Column("erp_status")] + [StringLength(1)] + public string ErpStatus { get; set; } + + [Column("erp_amount")] + [Precision(16, 2)] + public decimal? ErpAmount { get; set; } + + [Column("return_person")] + [StringLength(64)] + public string ReturnPerson { get; set; } + + [Column("return_time")] + public DateTime? ReturnTime { get; set; } + + [Column("return_way")] + [StringLength(1)] + public string ReturnWay { get; set; } + + [Column("machine_name")] + [StringLength(64)] + public string MachineName { get; set; } + + [Column("quality_status")] + [StringLength(1)] + public string QualityStatus { get; set; } + + [Column("create_by")] + [StringLength(64)] + public string CreateBy { get; set; } + + [Column("create_date")] + public DateTime? CreateDate { get; set; } + + [Column("update_by")] + [StringLength(64)] + public string UpdateBy { get; set; } + + [Column("update_date")] + public DateTime? UpdateDate { get; set; } + + [Column("stack_amount")] + [Precision(16, 2)] + public decimal? StackAmount { get; set; } + } +} + diff --git a/src/Khd.Core.EntityFramework/DefaultDbContext.cs b/src/Khd.Core.EntityFramework/DefaultDbContext.cs index dc28d57..8414db6 100644 --- a/src/Khd.Core.EntityFramework/DefaultDbContext.cs +++ b/src/Khd.Core.EntityFramework/DefaultDbContext.cs @@ -19,6 +19,10 @@ namespace Khd.Core.EntityFramework public DbSet WmsInventoryCheckDetail { get; set; } public DbSet MesBaseMaterialInfo { get; set; } public DbSet WmsRawReturn { get; set; } + public DbSet WmsRawPreferredOut { get; set; } + public DbSet WmsMove { get; set; } + public DbSet WmsMoveDetail { get; set; } + public DbSet WmsRawReturnDetail { get; set; } public DbSet WcsTaskManual { get; set; } public DbSet BaseDictionary { get; set; } @@ -27,9 +31,13 @@ namespace Khd.Core.EntityFramework public DbSet BasePlcpoint { get; set; } public DbSet BasePlc { get; set; } - + public DbSet MesBasePalletInfo { get; set; } + public DbSet MesSaleOrderRelate { get; set; } + + public DbSet MesProductPlanDetail { get; set; } + public DbSet WcsCmd { get; set; } public DbSet WcsCmdLog { get; set; } diff --git a/src/Khd.Core.Plc/StaticPlcHelper.cs b/src/Khd.Core.Plc/StaticPlcHelper.cs index f61f755..b545915 100644 --- a/src/Khd.Core.Plc/StaticPlcHelper.cs +++ b/src/Khd.Core.Plc/StaticPlcHelper.cs @@ -27,6 +27,38 @@ namespace Khd.Core.Plc plc.Write(address, GetValue(len, valueString)); } + /// + /// 写入RFID + /// + /// plc + /// 读取地址 + /// 长度 + /// 读取到的RFID + public static void WriteRFID(this Plc.S7.Plc plc, string address, string value,int len = 15) + { + string[] adds = address.Split("."); + int db = int.Parse(adds[0].Replace("DB", "")); + int startByteAdr = int.Parse(adds[1].Replace("DBX", "")); + + // 将 value 转换为字节数组,确保其长度符合要求 + byte[] byteArray = Encoding.ASCII.GetBytes(value); + if (byteArray.Length > len) + { + throw new ArgumentException($"Value length exceeds the specified length of {len} bytes."); + } + + // 填充字节数组到指定长度 + byte[] dataToWrite = new byte[len]; + Array.Copy(byteArray, dataToWrite, byteArray.Length); + + + + plc.Write(S7.DataType.DataBlock, db, startByteAdr, dataToWrite); + + } + + + /// /// 读取RFID /// diff --git a/src/Khd.Core.Wcs/MainCentralControl.cs b/src/Khd.Core.Wcs/MainCentralControl.cs index 0c3e843..0cf185c 100644 --- a/src/Khd.Core.Wcs/MainCentralControl.cs +++ b/src/Khd.Core.Wcs/MainCentralControl.cs @@ -1,7 +1,11 @@ -using Khd.Core.EntityFramework; +using Jc.SnowId; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Models; +using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Wcs.Global; using Khd.Core.Wcs.Wcs; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Data; @@ -31,6 +35,7 @@ namespace Khd.Core.Wcs /// public void Start() { + LoggerUtils logger = new LoggerUtils(); using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); @@ -43,6 +48,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)) @@ -61,6 +67,7 @@ namespace Khd.Core.Wcs StaticData.PlcDic.TryAdd(plcConfig.Code, plc); } } + //创建定时器 SystemTimer systemTimer = new(_host); systemTimer.Start(); @@ -77,11 +84,11 @@ namespace Khd.Core.Wcs SecondFloorPoint secondFloorPoint = new(_host, 2); secondFloorPoint.StartPoint(); - //二层AGV + ////二层AGV SecondFloorAGV secondFloorAGV = new(_host, 2); secondFloorAGV.StartPoint(); - //二楼线体 + // //二楼线体 SecondFloorLine secondFloorLine = new(_host, 2); secondFloorLine.StartPoint(); @@ -109,7 +116,7 @@ namespace Khd.Core.Wcs FiveFloorAGV fifthFloorAGV = new(_host, 5); fifthFloorAGV.StartPoint(); - //背负式Agv + ////背负式Agv FiveFloorBearAgv fiveFloorBearAgv = new(_host, 5); fiveFloorBearAgv.StartPoint(); } @@ -118,7 +125,12 @@ namespace Khd.Core.Wcs Console.WriteLine(ex.Message); logger.Error(ex.Message + "\n" + ex.StackTrace); } + + } + + + } } diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index 399665d..96a5105 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -10,6 +10,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using SixLabors.ImageSharp; using System.Data; +using System.Drawing.Text; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs @@ -833,7 +834,7 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") - .Where(t => t.containerCode == null) + .Where(t => string.IsNullOrEmpty(t.containerCode)) .Where(t => t.warehouseId == 521) .OrderByDescending(t => t.locColumn) .FirstOrDefault(); @@ -934,6 +935,9 @@ namespace Khd.Core.Wcs.Wcs if (wcsTask == null) { WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.taskType == 999).FirstOrDefault();//调接口生成的任务 + + + if (wcsTaskManual != null) { var wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.rawOutstockId == wcsTaskManual.orderId); @@ -942,14 +946,19 @@ namespace Khd.Core.Wcs.Wcs var wmsRawStocks = dbContext.WmsRawStock .Where(t => t.saleOrderId == (wmsRawOutstock.saleOrderId == null ? 0 : wmsRawOutstock.saleOrderId)) .Where(t => t.warehouseId == 311) - .ToList(); + .Where(t => t.materialId == wmsRawOutstock.materialId) + .Where(t => t.totalAmount > t.frozenAmount) + .ToList(); + var wmsRawStockLocations = wmsRawStocks.Select(x => x.locationCode).ToList(); var AllWmsBaseLocations = dbContext.WmsBaseLocation .Where(t => t.activeFlag == "1") .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") - .Where(t => t.warehouseId == 311).ToList(); + .Where(t => t.warehouseId == 311) + .Where(t => t.locationStatus == "1").ToList(); var wmsBaseLocations = AllWmsBaseLocations .Where(t => t.warehouseId == 311) + .Where(t => wmsRawStockLocations.Contains(t.locationCode)) .ToList(); var bill = from a in wmsBaseLocations from b in wmsRawStocks @@ -958,198 +967,220 @@ namespace Khd.Core.Wcs.Wcs WmsBaseLocation? wmsBaseLocation = null; WmsRawStock? wmsRawStock = null; bill = bill.OrderBy(t => t.b.instockDate.Value.Date);//按某个时间段 + + #region 如果有需要优先投料的库位,则该库位优先投料 + List PreferredOutsLocation = dbContext.WmsRawPreferredOut.Where(x=>x.WarehouseId==311).ToList().Select(x=>x.LocationCode).ToList(); + if (PreferredOutsLocation!=null && PreferredOutsLocation.Count > 0) + { + bill.OrderBy(t => PreferredOutsLocation.Contains(t.a.locationCode) ? 0 : 1); + } + + #endregion + + foreach (var item in bill) { - var fistbill = bill.First(); - if (fistbill != null) + // 目标库位 + var fistbill = item; + + int? locRow = 0; + if (fistbill.a.locRow % 2 == 1) { - int? locRow = 0; - if (fistbill.a.locRow % 2 == 1) + locRow = fistbill.a.locRow + 1; + } + else + { + locRow = fistbill.a.locRow - 1; + } + wmsBaseLocation = fistbill.a; + + // 目标库位处于深库位,判断是否需要移库浅库位 + if (wmsBaseLocation.locDeep == 1) + { + int? row = 0; + if (wmsBaseLocation.locRow % 2 == 1) { - locRow = fistbill.a.locRow + 1; + row = wmsBaseLocation.locRow + 1; } else { - locRow = fistbill.a.locRow - 1; + row = wmsBaseLocation.locRow - 1; } - var lastbill = bill.Where(t => t.a.locRow == locRow) - .Where(t => t.a.locColumn == fistbill.a.locColumn) - .Where(t => t.a.locDeep == 2) - .FirstOrDefault(); - wmsBaseLocation = fistbill.a; - if (lastbill != null) + var lowLocationBill = bill.Where(t => t.a.locRow == locRow).Where(t => t.a.locColumn == wmsBaseLocation.locColumn).Where(t => t.a.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault(); + if (lowLocationBill != null) { - if (lastbill.b.instockDate != null && fistbill.b.instockDate != null) + //对应的浅库位满足条件,直接出浅库位 + wmsBaseLocation = lowLocationBill.a; + } + else + { + //目标出库库位对应的浅库位 + 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) && fromBaseLocation.locationStatus == "1") { - if (wmsBaseLocation.locDeep == 1) + // 浅库位有库存 + WmsRawStock? wmsRawStock1 = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == fromBaseLocation.locationCode); + if (wmsRawStock1 != null) { - int? row = 0; - if (wmsBaseLocation.locRow % 2 == 1) + #region 找寻移库目标库位 + // 寻找移库目的库位 + WmsBaseLocation? toLocation = null; + + var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == fromBaseLocation.warehouseId) + .Where(t => t.warehouseId != fromBaseLocation.locationId) + .Where(t => string.IsNullOrEmpty(t.containerCode)).OrderBy(t => t.locDeep).ToList(); + + foreach (WmsBaseLocation itemLocation in moveLocationList) { - row = wmsBaseLocation.locRow + 1; - } - else - { - row = wmsBaseLocation.locRow - 1; - } - var lowLocationBill = bill.Where(t => t.a.locRow == locRow).Where(t => t.a.locColumn == wmsBaseLocation.locColumn).Where(t => t.a.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault(); - if (lowLocationBill != null) - { - wmsBaseLocation = lowLocationBill.a; - } - else - { - WmsBaseLocation? fromBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == row) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Where(t => t.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault(); - if (fromBaseLocation != null && !string.IsNullOrEmpty(fromBaseLocation.containerCode)) + + if (itemLocation.locDeep == 1) { - WmsRawStock? wmsRawStock1 = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == fromBaseLocation.locationCode); - if (wmsRawStock1 != null) + bool hasLocation = AllWmsBaseLocations + .Where(t => t.locRow == (itemLocation.locRow % 2 == 1 ? (itemLocation.locRow + 1) : (itemLocation.locRow - 1))) + .Where(t => t.locColumn == itemLocation.locColumn) + .Where(t => t.locationStatus == "1" && string.IsNullOrEmpty(t.containerCode)) + .Any(); + if (!hasLocation) { - WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId) - .Where(t => t.locDeep == 1) - .Where(t => string.IsNullOrEmpty(t.containerCode)) - .Where(t => t.locColumn > wmsBaseLocation.locColumn) - .OrderBy(t => t.locColumn) - .FirstOrDefault(); - toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId) - .Where(t => t.locDeep == 1) - .Where(t => string.IsNullOrEmpty(t.containerCode)) - .Where(t => t.locColumn < wmsBaseLocation.locColumn) - .OrderByDescending(t => t.locColumn) - .FirstOrDefault(); - toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId) - .Where(t => t.warehouseId != wmsBaseLocation.locationId) - .Where(t => string.IsNullOrEmpty(t.containerCode)) - .FirstOrDefault(); - if (toLocation != null) - { - if (toLocation.locDeep == 1) - { - bool hasLocation = AllWmsBaseLocations - .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) - .Where(t => t.locColumn == toLocation.locColumn) - .Any(); - if (!hasLocation) - { - Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); - _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); - continue; - } - } - var RemoveTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - taskType = StaticTaskType.ThirdRemove, - containerNo = wmsRawStock1.palletInfoCode, - createBy = "WCS", - createTime = DateTime.Now.AddSeconds(-10), - taskStatus = 0, - currPointId = fromBaseLocation.locationId, - currPointNo = fromBaseLocation.locationCode, - nextPointId = baseEquip.objid, - nextPointNo = baseEquip.equipNo, - endPointId = toLocation.locationId, - endPointNo = toLocation.locationCode, - equipmentNo = baseEquip.equipNo, - useFlag = 1, - qty = 1 - }; - SystemData.LockOutLocation(toLocation, dbContext); - SystemData.LockOutLocation(fromBaseLocation, dbContext); - toLocation.locationStatus = "4"; - toLocation.updateBy = "WCS"; - toLocation.updateTime = DateTime.Now; - fromBaseLocation.updateBy = "WCS"; - fromBaseLocation.updateTime = DateTime.Now; - fromBaseLocation.locationStatus = "4"; - dbContext.Update(toLocation); - dbContext.Update(fromBaseLocation); - dbContext.Add(RemoveTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); - dbContext.Add(wcsTaskLog); - } - else - { - continue; - } + Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + continue; } else { - continue; + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; } + } + else + { + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } + } - } - } - } - if (wmsBaseLocation != null) - { - wmsRawStock = wmsRawStocks.Where(t => t.locationCode == wmsBaseLocation.locationCode).First(); - MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsRawStock.palletInfoCode); - if (mesBasePalletInfo != null) - { - MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); - if (mesBaseBarcodeInfo != null) - { - WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail() + if (toLocation == null) { - 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() + // 找寻下一个可出库库存 + continue; + } + + var RemoveTask = new WcsTask() { objid = StaticData.SnowId.NextId(), - orderId = wmsRawOutstock.rawOutstockId, - taskType = StaticTaskType.ThirdRawToFlip, - containerNo = wmsRawStock.palletInfoCode, + taskType = StaticTaskType.ThirdRemove, + containerNo = wmsRawStock1.palletInfoCode, 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 }; - SystemData.LockOutLocation(wmsBaseLocation, dbContext); - wmsBaseLocation.locationStatus = "6"; - dbContext.Update(wmsBaseLocation); - dbContext.Add(wmsRawOutstockDetail); - WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); - dbContext.Remove(wcsTaskManual); - dbContext.Add(wcsTask); + SystemData.LockOutLocation(toLocation, dbContext); + SystemData.LockOutLocation(fromBaseLocation, dbContext); + toLocation.locationStatus = "4"; + toLocation.updateBy = "WCS"; + toLocation.updateTime = DateTime.Now; + fromBaseLocation.updateBy = "WCS"; + fromBaseLocation.updateTime = DateTime.Now; + fromBaseLocation.locationStatus = "4"; + dbContext.Update(toLocation); + dbContext.Update(fromBaseLocation); + dbContext.Add(RemoveTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); dbContext.Add(wcsTaskLog); - dbContext.SaveChanges(); + #endregion + + } + + } + else if(fromBaseLocation != null&& fromBaseLocation.locationStatus != "1") + { + //浅库位状态异常,找寻下一个可出库库存 + continue; } } } + + if (wmsBaseLocation != null) + { + wmsRawStock = wmsRawStocks.Where(t => t.locationCode == wmsBaseLocation.locationCode).First(); + MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsRawStock.palletInfoCode); + if (mesBasePalletInfo != null) + { + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); + if (mesBaseBarcodeInfo != null) + { + WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail() + { + rawOutstockDetailId = StaticData.SnowId.NextId(), + createBy = "WCS", + createDate = DateTime.Now, + executeStatus = "0", + erpAmount = 0, + erpStatus = "0", + instockBatch = mesBaseBarcodeInfo.batchCode, + stackAmount = 1, + locationCode = wmsBaseLocation.locationCode, + rawOutstockId = wmsRawOutstock.rawOutstockId, + planAmount = 1, + outstockWay = "2", + outstockPerson = "WCS", + outstockTime = DateTime.Now, + materialProductionDate = mesBaseBarcodeInfo.productionDate, + materialBarcode = mesBasePalletInfo.materialBarcode, + materialId = wmsRawOutstock.materialId, + machineName = mesBaseBarcodeInfo.machineName, + outstockAmount = 1, + taskCode = wmsRawOutstock.taskCode + }; + wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = wmsRawOutstock.rawOutstockId, + taskType = StaticTaskType.ThirdRawToFlip, + containerNo = wmsRawStock.palletInfoCode, + createBy = "WCS", + createTime = DateTime.Now, + taskStatus = 0, + materialId = wmsRawOutstock.materialId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = baseEquip.objid, + nextPointNo = baseEquip.equipNo, + endPointId = endEquip.objid, + endPointNo = endEquip.equipNo, + equipmentNo = endEquip.equipNo, + useFlag = 1, + qty = 1 + }; + SystemData.LockOutLocation(wmsBaseLocation, dbContext); + wmsBaseLocation.locationStatus = "6"; + dbContext.Update(wmsBaseLocation); + dbContext.Add(wmsRawOutstockDetail); + WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask); + dbContext.Remove(wcsTaskManual); + dbContext.Add(wcsTask); + dbContext.Add(wcsTaskLog); + dbContext.SaveChanges(); + } + } + } + } } } @@ -1342,29 +1373,34 @@ namespace Khd.Core.Wcs.Wcs } else { - WmsBaseLocation? wmsBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == row) + // 外侧浅库位 + WmsBaseLocation? wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == row) .Where(t => t.locColumn == location.locColumn) .Where(t => t.warehouseId == location.warehouseId).FirstOrDefault(); - if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") + if (!string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") { + WmsProductStock? wmsProductStock = dbContext.WmsProductStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); if (wmsProductStock != null) { - WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.locDeep == 1) - .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); - toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.warehouseId != location.locationId) - .Where(t => string.IsNullOrEmpty(t.containerCode)) - .FirstOrDefault(); + #region 找寻移库目标库位 - if (toLocation != null) + WmsBaseLocation? toLocation = null; + + + var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) + .Where(t => t.warehouseId != location.locationId) + .Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList(); + + foreach (WmsBaseLocation itemLocation in moveLocationList) { - if (toLocation.locDeep == 1) + + if (itemLocation.locDeep == 1) { bool hasLocation = AllWmsBaseLocations - .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) - .Where(t => t.locColumn == toLocation.locColumn) + .Where(t => t.locRow == (itemLocation.locRow % 2 == 1 ? (itemLocation.locRow + 1) : (itemLocation.locRow - 1))) + .Where(t => t.locColumn == itemLocation.locColumn) + .Where(t => t.locationStatus == "1" && string.IsNullOrEmpty(t.containerCode)) .Any(); if (!hasLocation) { @@ -1372,53 +1408,130 @@ namespace Khd.Core.Wcs.Wcs _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); continue; } - } - var RemoveTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - orderId = item.productOutstockId, - taskType = StaticTaskType.FiveRemove, - containerNo = wmsProductStock.palletInfoCode, - createBy = "WCS", - createTime = DateTime.Now.AddSeconds(-10), - taskStatus = 0, - materialId = item.productId, - currPointId = wmsBaseLocation.locationId, - currPointNo = wmsBaseLocation.locationCode, - nextPointId = agvEquip.objid, - nextPointNo = agvEquip.equipNo, - endPointId = toLocation.locationId, - endPointNo = toLocation.locationCode, - equipmentNo = agvEquip.equipNo, - useFlag = 1, - qty = 1 - }; - SystemData.LockOutLocation(toLocation, dbContext); - SystemData.LockOutLocation(wmsBaseLocation, dbContext); + else + { + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } + + } + else + { + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } - toLocation.locationStatus = "4"; - toLocation.updateBy = "WCS"; - toLocation.updateTime = DateTime.Now; - wmsBaseLocation.updateBy = "WCS"; - wmsBaseLocation.updateTime = DateTime.Now; - wmsBaseLocation.locationStatus = "4"; - dbContext.Update(toLocation); - dbContext.Update(wmsBaseLocation); - dbContext.Add(RemoveTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); - dbContext.Add(wcsTaskLog); } - else + if (toLocation == null) { + // 找寻下一个可出库库存 continue; } + var RemoveTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.productOutstockId, + taskType = StaticTaskType.SecondRemove, + containerNo = wmsBaseLocation.containerCode, + createBy = "WCS", + createTime = DateTime.Now.AddSeconds(-10), + taskStatus = 0, + materialId = item.productId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = toLocation.locationId, + endPointNo = toLocation.locationCode, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = 1 + }; + SystemData.LockOutLocation(toLocation, dbContext); + SystemData.LockOutLocation(wmsBaseLocation, dbContext); + toLocation.locationStatus = "4"; + toLocation.updateBy = "WCS"; + toLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "WCS"; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.locationStatus = "4"; + dbContext.Update(toLocation); + dbContext.Update(wmsBaseLocation); + dbContext.Add(RemoveTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); + dbContext.Add(wcsTaskLog); + #endregion + //WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) + // .Where(t => t.locDeep == 1) + // .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); + //toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) + // .Where(t => t.warehouseId != location.locationId) + // .Where(t => string.IsNullOrEmpty(t.containerCode)) + // .FirstOrDefault(); + + //if (toLocation != null) + //{ + // if (toLocation.locDeep == 1) + // { + // bool hasLocation = AllWmsBaseLocations + // .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) + // .Where(t => t.locColumn == toLocation.locColumn) + // .Any(); + // if (!hasLocation) + // { + // Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + // _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + // continue; + // } + // } + // var RemoveTask = new WcsTask() + // { + // objid = StaticData.SnowId.NextId(), + // orderId = item.productOutstockId, + // taskType = StaticTaskType.FiveRemove, + // containerNo = wmsProductStock.palletInfoCode, + // createBy = "WCS", + // createTime = DateTime.Now.AddSeconds(-10), + // taskStatus = 0, + // materialId = item.productId, + // currPointId = wmsBaseLocation.locationId, + // currPointNo = wmsBaseLocation.locationCode, + // nextPointId = agvEquip.objid, + // nextPointNo = agvEquip.equipNo, + // endPointId = toLocation.locationId, + // endPointNo = toLocation.locationCode, + // equipmentNo = agvEquip.equipNo, + // useFlag = 1, + // qty = 1 + // }; + // SystemData.LockOutLocation(toLocation, dbContext); + // SystemData.LockOutLocation(wmsBaseLocation, dbContext); + + // toLocation.locationStatus = "4"; + // toLocation.updateBy = "WCS"; + // toLocation.updateTime = DateTime.Now; + // wmsBaseLocation.updateBy = "WCS"; + // wmsBaseLocation.updateTime = DateTime.Now; + // wmsBaseLocation.locationStatus = "4"; + // dbContext.Update(toLocation); + // dbContext.Update(wmsBaseLocation); + // dbContext.Add(RemoveTask); + // WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); + // dbContext.Add(wcsTaskLog); + //} + //else + //{ + // continue; + //} } else { continue; } } - else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1") + else { Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库"); _logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库"); @@ -1528,6 +1641,8 @@ namespace Khd.Core.Wcs.Wcs //获取最早入库时间 foreach (var item in proOutStock) { + task = dbContext.WcsTask.Where(t => t.nextPointId == 8 && t.taskStatus <= 7).Any(); + if (task) break; var wmsproStocks = proStock .Where(t => t.productId == item.productId && t.saleOrderId == (item.saleOrderId == null ? 0 : item.saleOrderId) && t.warehouseId == item.warehouseId) @@ -1538,6 +1653,7 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.delFlag == "0") .Where(t => t.locationScrapType == "1") .Where(t => t.locationStatus == "1") + .Where(t => t.warehouseId == item.warehouseId) .Where(t => t.warehouseId == item.warehouseId).ToList(); var wmsBaseLocations = AllWmsBaseLocations .Where(t => t.warehouseId == item.warehouseId) @@ -1584,98 +1700,112 @@ namespace Khd.Core.Wcs.Wcs } var lowLocationBill = bill.Where(t => t.a.locRow == row).Where(t => t.a.locColumn == location.locColumn).Where(t => t.a.warehouseId == location.warehouseId).FirstOrDefault(); if (lowLocationBill != null) - { + { //对应的浅库位满足条件,直接出浅库位 location = lowLocationBill.a; stock = lowLocationBill.b; } else { + + // 目标出库库位对应的浅库位 WmsBaseLocation? wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == row) .Where(t => t.locColumn == location.locColumn) .Where(t => t.warehouseId == location.warehouseId).FirstOrDefault(); + if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") - { + {//浅库位有库存 WmsProductStock? wmsProductStock = dbContext.WmsProductStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); - if (wmsProductStock != null) + + #region 找寻移库目标库位 + // 寻找移库目的库位 + WmsBaseLocation? toLocation = null; + + + var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) + .Where(t => t.warehouseId != location.locationId) + .Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList(); + + foreach (WmsBaseLocation itemLocation in moveLocationList) { - WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.locDeep == 1) - .Where(t => t.activeFlag == "1") - .Where(t => t.delFlag == "0") - .Where(t => t.locationScrapType == "1") - .Where(t => t.locationStatus == "1") - .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); - toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.warehouseId != location.locationId) - .Where(t => string.IsNullOrEmpty(t.containerCode)) - .FirstOrDefault(); - if (toLocation != null) + + if (itemLocation.locDeep == 1) { - if (toLocation.locDeep == 1) + bool hasLocation = AllWmsBaseLocations + .Where(t => t.locRow == (itemLocation.locRow % 2 == 1 ? (itemLocation.locRow + 1) : (itemLocation.locRow - 1))) + .Where(t => t.locColumn == itemLocation.locColumn) + .Where(t => t.locationStatus == "1" && string.IsNullOrEmpty(t.containerCode)) + .Any(); + if (!hasLocation) { - bool hasLocation = AllWmsBaseLocations - .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) - .Where(t => t.locColumn == toLocation.locColumn) - .Any(); - if (!hasLocation) - { - Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); - _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); - continue; - } + Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + continue; } - var RemoveTask = new WcsTask() + else { - objid = StaticData.SnowId.NextId(), - orderId = item.productOutstockId, - taskType = StaticTaskType.SecondRemove, - containerNo = wmsBaseLocation.containerCode, - createBy = "WCS", - createTime = DateTime.Now.AddSeconds(-10), - taskStatus = 0, - materialId = item.productId, - currPointId = wmsBaseLocation.locationId, - currPointNo = wmsBaseLocation.locationCode, - nextPointId = agvEquip.objid, - nextPointNo = agvEquip.equipNo, - endPointId = toLocation.locationId, - endPointNo = toLocation.locationCode, - equipmentNo = agvEquip.equipNo, - useFlag = 1, - qty = 1 - }; - SystemData.LockOutLocation(toLocation, dbContext); - SystemData.LockOutLocation(wmsBaseLocation, dbContext); - toLocation.locationStatus = "4"; - toLocation.updateBy = "WCS"; - toLocation.updateTime = DateTime.Now; - wmsBaseLocation.updateBy = "WCS"; - wmsBaseLocation.updateTime = DateTime.Now; - wmsBaseLocation.locationStatus = "4"; - dbContext.Update(toLocation); - dbContext.Update(wmsBaseLocation); - dbContext.Add(RemoveTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); - dbContext.Add(wcsTaskLog); + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } + } else { - continue; + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; } + } - else + if (toLocation == null) { + // 找寻下一个可出库库存 continue; } + var RemoveTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.productOutstockId, + taskType = StaticTaskType.SecondRemove, + containerNo = wmsBaseLocation.containerCode, + createBy = "WCS", + createTime = DateTime.Now.AddSeconds(-10), + taskStatus = 0, + materialId = item.productId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = toLocation.locationId, + endPointNo = toLocation.locationCode, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = 1 + }; + SystemData.LockOutLocation(toLocation, dbContext); + SystemData.LockOutLocation(wmsBaseLocation, dbContext); + toLocation.locationStatus = "4"; + toLocation.updateBy = "WCS"; + toLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "WCS"; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.locationStatus = "4"; + dbContext.Update(toLocation); + dbContext.Update(wmsBaseLocation); + dbContext.Add(RemoveTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); + dbContext.Add(wcsTaskLog); + #endregion } - else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1") + else if (wmsBaseLocation.locationStatus != "1") { - Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库"); - _logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库"); + // 浅库位状态异常,找寻下一个可出库库存 continue; } + } } + wcsTask = new WcsTask() { objid = StaticData.SnowId.NextId(), @@ -2090,7 +2220,7 @@ namespace Khd.Core.Wcs.Wcs tasks.Add(wcsTask); location.locationStatus = "6"; location.updateBy = "WCS"; - location.ContainerStatus = "2"; + // location.ContainerStatus = "2"; location.updateTime = DateTime.Now; dbContext.Update(location); dbContext.Update(stock); @@ -2170,7 +2300,7 @@ namespace Khd.Core.Wcs.Wcs { lock (SystemData.FiveTaskLock) { - if (endEquip.equipType == 12)//原材料到柜体验收区,背板安装 + if (endEquip.equipType == 12)//原材料到柜体拆分区 { var rawStock = dbContext.WmsRawStock .Where(t => t.activeFlag == "1").ToList(); @@ -2249,25 +2379,29 @@ namespace Khd.Core.Wcs.Wcs .Where(t => t.locRow == row) .Where(t => t.locColumn == location.locColumn) .Where(t => t.warehouseId == location.warehouseId).FirstOrDefault(); - if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") + if (!string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") { WmsRawStock? wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); if (wmsRawStock != null) { - WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.locDeep == 1) - .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); - toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) + #region + // 寻找移库目的库位 + WmsBaseLocation? toLocation = null; + + + var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) .Where(t => t.warehouseId != location.locationId) - .Where(t => string.IsNullOrEmpty(t.containerCode)) - .FirstOrDefault(); - if (toLocation != null) + .Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList(); + + foreach (WmsBaseLocation itemLocation in moveLocationList) { - if (toLocation.locDeep == 1) + + if (itemLocation.locDeep == 1) { bool hasLocation = AllWmsBaseLocations - .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) - .Where(t => t.locColumn == toLocation.locColumn) + .Where(t => t.locRow == (itemLocation.locRow % 2 == 1 ? (itemLocation.locRow + 1) : (itemLocation.locRow - 1))) + .Where(t => t.locColumn == itemLocation.locColumn) + .Where(t => t.locationStatus == "1" && string.IsNullOrEmpty(t.containerCode)) .Any(); if (!hasLocation) { @@ -2275,43 +2409,62 @@ namespace Khd.Core.Wcs.Wcs _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); continue; } + else + { + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } + } - var RemoveTask = new WcsTask() + else { - objid = StaticData.SnowId.NextId(), - orderId = item.rawOutstockId, - taskType = StaticTaskType.FiveRemove, - containerNo = wmsRawStock.palletInfoCode, - createBy = "WCS", - createTime = DateTime.Now.AddSeconds(-10), - taskStatus = 0, - materialId = item.materialId, - currPointId = wmsBaseLocation.locationId, - currPointNo = wmsBaseLocation.locationCode, - nextPointId = agvEquip.objid, - nextPointNo = agvEquip.equipNo, - endPointId = toLocation.locationId, - endPointNo = toLocation.locationCode, - equipmentNo = agvEquip.equipNo, - useFlag = 1, - qty = qty - }; - toLocation.locationStatus = "4"; - toLocation.updateBy = "WCS"; - toLocation.updateTime = DateTime.Now; - wmsBaseLocation.updateBy = "WCS"; - wmsBaseLocation.updateTime = DateTime.Now; - wmsBaseLocation.locationStatus = "4"; - dbContext.Update(toLocation); - dbContext.Update(wmsBaseLocation); - dbContext.Add(RemoveTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); - dbContext.Add(wcsTaskLog); + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } + } - else + if (toLocation == null) { + // TODO : 没有找到可以移库的目标库位,添加报警 + Console.WriteLine("5F原材料前往背板安装需要先移库,没有找到可以移库的目标库位,添加报警"); + Thread.Sleep(1000 * 5); continue; } + var RemoveTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.rawOutstockId, + taskType = StaticTaskType.FiveRemove, + containerNo = wmsRawStock.palletInfoCode, + createBy = "WCS", + createTime = DateTime.Now.AddSeconds(-10), + taskStatus = 0, + materialId = item.materialId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = toLocation.locationId, + endPointNo = toLocation.locationCode, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = qty + }; + toLocation.locationStatus = "4"; + toLocation.updateBy = "WCS"; + toLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "WCS"; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.locationStatus = "4"; + dbContext.Update(toLocation); + dbContext.Update(wmsBaseLocation); + dbContext.Add(RemoveTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); + dbContext.Add(wcsTaskLog); + #endregion + } else { @@ -2423,6 +2576,12 @@ namespace Khd.Core.Wcs.Wcs MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault(); if (mesBaseBarcodeInfo != null) { + if (location.locationStatus != "1") + { + Console.WriteLine(DateTime.Now + $":{location.locationCode}库位状态异常,无法出库"); + _logger.Info($"{location.locationCode}库位状态异常,无法出库"); + continue; + } if (location.locDeep == 1) { int? row = 0; @@ -2434,154 +2593,171 @@ namespace Khd.Core.Wcs.Wcs { row = location.locRow - 1;//5 } - + //对应的浅库位 WmsBaseLocation? wmsBaseLocation = AllWmsBaseLocations .Where(t => t.locRow == row) .Where(t => t.locColumn == location.locColumn) .Where(t => t.warehouseId == location.warehouseId).FirstOrDefault(); - if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") + + if (!string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1") { + // 浅库位有库存 WmsRawStock? wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); - if (wmsRawStock != null) + + + // 寻找移库目的库位 + WmsBaseLocation? toLocation = null; + + + var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) + .Where(t => t.warehouseId != location.locationId) + .Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList(); + + foreach (WmsBaseLocation itemLocation in moveLocationList) { - WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.locDeep == 1) - .Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(); - toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId) - .Where(t => t.warehouseId != location.locationId) - .Where(t => string.IsNullOrEmpty(t.containerCode)) - .FirstOrDefault(); - if (toLocation != null) + + if (itemLocation.locDeep == 1) { - if (toLocation.locDeep == 1) + bool hasLocation = AllWmsBaseLocations + .Where(t => t.locRow == (itemLocation.locRow % 2 == 1 ? (itemLocation.locRow + 1) : (itemLocation.locRow - 1))) + .Where(t => t.locColumn == itemLocation.locColumn) + .Where(t => t.locationStatus == "1" && string.IsNullOrEmpty(t.containerCode)) + .Any(); + if (!hasLocation) { - bool hasLocation = AllWmsBaseLocations - .Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1))) - .Where(t => t.locColumn == toLocation.locColumn) - .Any(); - if (!hasLocation) - { - Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); - _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); - continue; - } + Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + _logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库"); + continue; } - var RemoveTask = new WcsTask() + else { - objid = StaticData.SnowId.NextId(), - orderId = item.rawOutstockId, - taskType = StaticTaskType.FiveRemove, - containerNo = wmsRawStock.palletInfoCode, - createBy = "WCS", - createTime = DateTime.Now.AddSeconds(-10), - taskStatus = 0, - materialId = item.materialId, - currPointId = wmsBaseLocation.locationId, - currPointNo = wmsBaseLocation.locationCode, - nextPointId = agvEquip.objid, - nextPointNo = agvEquip.equipNo, - endPointId = toLocation.locationId, - endPointNo = toLocation.locationCode, - equipmentNo = agvEquip.equipNo, - useFlag = 1, - qty = qty - }; - toLocation.locationStatus = "4"; - toLocation.updateBy = "WCS"; - toLocation.updateTime = DateTime.Now; - wmsBaseLocation.updateBy = "WCS"; - wmsBaseLocation.updateTime = DateTime.Now; - wmsBaseLocation.locationStatus = "4"; - dbContext.Update(toLocation); - dbContext.Update(wmsBaseLocation); - dbContext.Add(RemoveTask); - WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); - dbContext.Add(wcsTaskLog); + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; + } + } else { - continue; + // 找到可以移库的目标库位 + toLocation = itemLocation; + break; } + } - else + if (toLocation == null) { + // TODO : 没有找到可以移库的目标库位,添加报警 + Console.WriteLine("5F原材料前往背板安装需要先移库,没有找到可以移库的目标库位,添加报警"); continue; } + var RemoveTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.rawOutstockId, + taskType = StaticTaskType.FiveRemove, + containerNo = wmsRawStock.palletInfoCode, + createBy = "WCS", + createTime = DateTime.Now.AddSeconds(-10), + taskStatus = 0, + materialId = item.materialId, + currPointId = wmsBaseLocation.locationId, + currPointNo = wmsBaseLocation.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = toLocation.locationId, + endPointNo = toLocation.locationCode, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = qty + }; + toLocation.locationStatus = "4"; + toLocation.updateBy = "WCS"; + toLocation.updateTime = DateTime.Now; + wmsBaseLocation.updateBy = "WCS"; + wmsBaseLocation.updateTime = DateTime.Now; + wmsBaseLocation.locationStatus = "4"; + dbContext.Update(toLocation); + dbContext.Update(wmsBaseLocation); + dbContext.Add(RemoveTask); + WcsTaskLog wcsTaskLog = CoreMapper.Map(RemoveTask); + dbContext.Add(wcsTaskLog); + } - else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1") + else if (wmsBaseLocation.locationStatus != "1") { - Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库"); - _logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库"); - continue; - } - else - { - Console.WriteLine(DateTime.Now + $":{location.locationCode}浅库位状态异常,无法移库"); - _logger.Info($"{location.locationCode}浅库位状态异常,无法移库"); + Console.WriteLine("浅库位状态异常,禁止出库,请检查浅库位状态"); continue; } } - wcsTask = new WcsTask() - { - objid = StaticData.SnowId.NextId(), - orderId = item.rawOutstockId, - taskType = StaticTaskType.FiveRawToBack,//如果是12那么就是原材料到柜体验收区,如果是13那么就是原材料到背板安装区 - containerNo = location.containerCode, - createBy = "WCS", - createTime = DateTime.Now, - taskStatus = 0, - materialId = item.materialId, - currPointId = location.locationId, - currPointNo = location.locationCode, - nextPointId = agvEquip.objid, - nextPointNo = agvEquip.equipNo, - endPointId = lineEquip.objid, - endPointNo = lineEquip.equipNo, - equipmentNo = agvEquip.equipNo, - useFlag = 1, - qty = qty - }; - //location是出库的库位,mesBaseBarcodeInfo是条码信息表数据,item是出库申请单 - WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail() - { - rawOutstockDetailId = StaticData.SnowId.NextId(), - rawOutstockId = item.rawOutstockId, - materialId = item.materialId, - createDate = DateTime.Now, - createBy = "WCS", - taskCode = wcsTask.objid.ToString(), - executeStatus = "1", - locationCode = location.locationCode, - outstockAmount = qty, - planAmount = item.outstockAmount, - warehouseId = item.warehouseId, - materialBarcode = mesBaseBarcodeInfo.barcodeInfo, - instockBatch = mesBaseBarcodeInfo.batchCode, - stackAmount = qty, - outstockPerson = "WCS", - outstockTime = DateTime.Now, - outstockWay = "2", - materialProductionDate = mesBaseBarcodeInfo.productionDate - }; - if (item.beginTime == null) - { - item.beginTime = DateTime.Now; - } - SystemData.LockOutLocation(location, dbContext); - dbContext.Add(wmsProductOutstockDetail); - location.locationStatus = "6"; - location.updateBy = "WCS"; - location.updateTime = DateTime.Now; - endEquip.emptyCount = 1; - dbContext.Update(endEquip); - dbContext.Update(location); - dbContext.Add(wcsTask); - dbContext.Update(item); - dbContext.Update(stock); - WcsTaskLog wcsTaskLog1 = CoreMapper.Map(wcsTask); - dbContext.Add(wcsTaskLog1); - dbContext.SaveChanges(); + + //else + //{ + // Console.WriteLine(DateTime.Now + $":{location.locationCode}浅库位状态异常,无法移库"); + // _logger.Info($"{location.locationCode}浅库位状态异常,无法移库"); + // continue; + //} } + wcsTask = new WcsTask() + { + objid = StaticData.SnowId.NextId(), + orderId = item.rawOutstockId, + taskType = StaticTaskType.FiveRawToBack,//如果是12那么就是原材料到柜体验收区,如果是13那么就是原材料到背板安装区 + containerNo = location.containerCode, + createBy = "WCS", + createTime = DateTime.Now, + taskStatus = 0, + materialId = item.materialId, + currPointId = location.locationId, + currPointNo = location.locationCode, + nextPointId = agvEquip.objid, + nextPointNo = agvEquip.equipNo, + endPointId = lineEquip.objid, + endPointNo = lineEquip.equipNo, + equipmentNo = agvEquip.equipNo, + useFlag = 1, + qty = qty + }; + //location是出库的库位,mesBaseBarcodeInfo是条码信息表数据,item是出库申请单 + //WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail() + //{ + // rawOutstockDetailId = StaticData.SnowId.NextId(), + // rawOutstockId = item.rawOutstockId, + // materialId = item.materialId, + // createDate = DateTime.Now, + // createBy = "WCS", + // taskCode = wcsTask.objid.ToString(), + // executeStatus = "1", + // locationCode = location.locationCode, + // outstockAmount = qty, + // planAmount = item.outstockAmount, + // warehouseId = item.warehouseId, + // materialBarcode = mesBaseBarcodeInfo.barcodeInfo, + // instockBatch = mesBaseBarcodeInfo.batchCode, + // stackAmount = qty, + // outstockPerson = "WCS", + // outstockTime = DateTime.Now, + // outstockWay = "2", + // materialProductionDate = mesBaseBarcodeInfo.productionDate + //}; + if (item.beginTime == null) + { + item.beginTime = DateTime.Now; + } + SystemData.LockOutLocation(location, dbContext); + //dbContext.Add(wmsProductOutstockDetail); + location.locationStatus = "6"; + location.updateBy = "WCS"; + location.updateTime = DateTime.Now; + endEquip.emptyCount = 1; + dbContext.Update(endEquip); + dbContext.Update(location); + dbContext.Add(wcsTask); + dbContext.Update(item); + dbContext.Update(stock); + WcsTaskLog wcsTaskLog1 = CoreMapper.Map(wcsTask); + dbContext.Add(wcsTaskLog1); + dbContext.SaveChanges(); } } } @@ -2597,7 +2773,8 @@ namespace Khd.Core.Wcs.Wcs Thread.Sleep(3000); } - } + + } } diff --git a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs index 84e60e9..a23fe6f 100644 --- a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs +++ b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs @@ -420,6 +420,10 @@ namespace Khd.Core.Wcs.Wcs } } } + else + { //TODO 物料未绑定仓库,添加报警 + + } } } } @@ -541,7 +545,10 @@ namespace Khd.Core.Wcs.Wcs BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == wcsTask.floorNo); if (wcsTask.taskStatus == 0 && Convert.ToInt32(hoisterTrayIn06Value) == 0)//创建状态,并且里面没有货物 { - if (lineEquip.equipStatus == 1) + // 目的楼层从接驳位出发入库的任务 --待测试 + var InTask = dbContext.WcsTask.FirstOrDefault(t => t.currPointId == lineEquip.objid); + + if (lineEquip.equipStatus == 1 && InTask==null) { _logger.Info("提升机线程:" + wcsTask.floorNo + "楼接驳位有AGV任务,跳过当前任务"); continue; diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index b675c0a..189df8a 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -7,6 +7,7 @@ using Khd.Core.Library.Mapper; using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; using Masuit.Tools; +using Microsoft.AspNetCore.Razor.Language; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; @@ -463,6 +464,48 @@ namespace Khd.Core.Wcs.Wcs }); dbContext.Remove(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 6 }); + #region 插入移库记录 + WmsMove wmsMove = new WmsMove(); + wmsMove.MoveId = StaticData.SnowId.NextId(); + wmsMove.TaskCode = StaticData.SnowId.NextId().ToString(); + wmsMove.WarehouseId = wmsBaseLocation.warehouseId; + wmsMove.OriLocationCode = wmsBaseLocation.locationCode; + wmsMove.TargetLocationCode = toLocation.locationCode; + wmsMove.InstockBatch = wmsRawStock.instockBatch; + wmsMove.MaterialId = wmsRawStock.materialId; + wmsMove.PlanAmount = 1; + wmsMove.RealOutstockAmount = 1; + wmsMove.RealInstockAmount = 1; + wmsMove.OperationType = "3"; + wmsMove.MoveWay = "2"; + wmsMove.MoveType = "1"; + wmsMove.AuditStatus = "1"; + wmsMove.ExecuteStatus = "2"; + wmsMove.UpdateBy = "WCS"; + wmsMove.UpdateDate = DateTime.Now; + wmsMove.BeginTime = DateTime.Now; + wmsMove.EndTime = DateTime.Now; + + WmsMoveDetail wmsMoveDetail = new WmsMoveDetail(); + wmsMoveDetail.MoveId = wmsMove.MoveId; + wmsMoveDetail.MaterialBarcode = wmsMove.InstockBatch; + wmsMoveDetail.InstockBatch = wmsMove.InstockBatch; + wmsMoveDetail.MaterialId = (long)wmsRawStock.materialId; + wmsMoveDetail.LocationCode = toLocation.locationCode; + wmsMoveDetail.PlanAmount = 1; + wmsMoveDetail.RealInstockAmount = 1; + wmsMoveDetail.RealAmount = 1; + wmsMoveDetail.ExecuteStatus = "2"; + wmsMoveDetail.ExecuteTime = DateTime.Now; + wmsMoveDetail.ExecuteEndTime = DateTime.Now; + wmsMoveDetail.ExecutePerson = "WCS"; + wmsMoveDetail.UpdateBy = "WCS"; + wmsMoveDetail.UpdateDate = DateTime.Now; + + dbContext.WmsMove.Add(wmsMove); + dbContext.WmsMoveDetail.Add(wmsMoveDetail); + #endregion + dbContext.SaveChanges(); dbContextTransaction.Commit(); } @@ -483,27 +526,47 @@ namespace Khd.Core.Wcs.Wcs { Console.WriteLine(DateTime.Now + ":五楼AGV线程完成任务" + item.currPointNo + "," + item.endPointNo); _logger.Info("五楼Agv完成任务成功:" + item.ToJsonString()); - var wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(t => t.productOutstockId == item.orderId && t.executeStatus == "1" && t.locationCode == item.currPointNo); + var wmsProductOutstock = dbContext.WmsProductOutstock.FirstOrDefault(t => t.productOutstockId == item.orderId); - if (wmsProductOutstockDetail != null && wmsProductOutstock != null) + + if ( wmsProductOutstock != null) { - wmsProductOutstockDetail.executeStatus = "2"; - wmsProductOutstockDetail.endTime = DateTime.Now; - dbContext.Update(wmsProductOutstockDetail); + var wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locationId == item.currPointId).First(); + WmsProductStock wmsProductStock = dbContext.WmsProductStock.First(t => t.locationCode == wmsBaseLocation.locationCode); + + wmsProductOutstock.outstockQty += 1; if (wmsProductOutstock.applyQty <= wmsProductOutstock.outstockQty) { wmsProductOutstock.endTime = DateTime.Now; wmsProductOutstock.executeStatus = "2"; } - WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation - .First(t => t.locationId == item.currPointId && t.warehouseFloor == 5); + + + WmsProductOutstockDetail newWmsProductOutstockDetail = new WmsProductOutstockDetail(); + newWmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId; + newWmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId; + newWmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode; + newWmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch; + newWmsProductOutstockDetail.productId = wmsProductStock.productId; + newWmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty; + newWmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty; + newWmsProductOutstockDetail.executeStatus = "2"; + newWmsProductOutstockDetail.updateBy = "WCS"; + newWmsProductOutstockDetail.updateDate = DateTime.Now; + newWmsProductOutstockDetail.beginTime = DateTime.Now; + newWmsProductOutstockDetail.endTime = DateTime.Now; + + + wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.containerCode = null; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; dbContext.Update(wmsBaseLocation); + SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); + dbContext.WmsProductStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).Delete(); BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5); WcsTask newTask = CoreMapper.Map(item); @@ -514,6 +577,7 @@ namespace Khd.Core.Wcs.Wcs newTask.floorNo = 1; newTask.taskStatus = 6; newTask.objid = StaticData.SnowId.NextId(); + dbContext.Add(newWmsProductOutstockDetail); dbContext.Remove(item); dbContext.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); @@ -529,14 +593,11 @@ namespace Khd.Core.Wcs.Wcs 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) - { + wmsRawOutstock.realOutstockAmount += 1; - wmsRawOutstockDetail.executeStatus = "2"; wmsRawOutstock.executeStatus = "2"; wmsRawOutstock.endTime = DateTime.Now; - wmsRawOutstockDetail.outstockTime = DateTime.Now; + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); wmsBaseLocation.returnFlag = "0"; @@ -545,13 +606,13 @@ namespace Khd.Core.Wcs.Wcs 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.WcsTask.Remove(item); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); - } + } } else if (item.taskType == StaticTaskType.FiveHalfIn)//半成品入库 @@ -598,7 +659,7 @@ namespace Khd.Core.Wcs.Wcs occupyAmount = 0, planCode = wmsProductInstock.planCode, planDetailCode = wmsProductInstock.planDetailCode, - warehouseId = 512 + warehouseId = 521 }; BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); //wmsProductInstockDetail.executeStatus = "2"; @@ -620,31 +681,58 @@ namespace Khd.Core.Wcs.Wcs Console.WriteLine(DateTime.Now + ":五楼AGV线程完成任务" + item.currPointNo + "," + item.endPointNo); _logger.Info("五楼Agv完成任务成功:" + item.ToJsonString()); 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) + + WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); + WmsRawStock? wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).FirstOrDefault(); + + if (wmsRawOutStock != null && wmsRawStock != null) { + + wmsRawOutStock.realOutstockAmount += 1; - wmsRawOutstockDetail.executeStatus = "2"; wmsRawOutStock.executeStatus = "2"; wmsRawOutStock.endTime = DateTime.Now; - wmsRawOutstockDetail.outstockTime = DateTime.Now; - dbContext.Update(wmsRawOutStock); - dbContext.Update(wmsRawOutstockDetail); - WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); + + + + WmsRawOutstockDetail newWmsRawOutstockDetail = new WmsRawOutstockDetail(); + newWmsRawOutstockDetail.rawOutstockId = wmsRawOutStock.rawOutstockId; + newWmsRawOutstockDetail.taskCode = wmsRawOutStock.taskCode; + newWmsRawOutstockDetail.warehouseId = wmsRawOutStock.warehouseId; + newWmsRawOutstockDetail.locationCode = wmsRawStock.locationCode; + newWmsRawOutstockDetail.materialBarcode = wmsRawStock.instockBatch; + newWmsRawOutstockDetail.materialId = wmsRawStock.materialId; + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == wmsRawStock.instockBatch).FirstOrDefault(); + if (mesBaseBarcodeInfo != null) + { + newWmsRawOutstockDetail.instockBatch = mesBaseBarcodeInfo.batchCode; + newWmsRawOutstockDetail.materialProductionDate = mesBaseBarcodeInfo.productionDate; + } + newWmsRawOutstockDetail.planAmount = wmsRawOutStock.outstockAmount; + newWmsRawOutstockDetail.outstockAmount = wmsRawOutStock.realOutstockAmount; + newWmsRawOutstockDetail.executeStatus = "2"; + newWmsRawOutstockDetail.outstockPerson = wmsRawOutStock.applyBy; + newWmsRawOutstockDetail.outstockTime = DateTime.Now; + newWmsRawOutstockDetail.outstockWay = "2"; + newWmsRawOutstockDetail.createBy = "WCS"; + newWmsRawOutstockDetail.createDate = DateTime.Now; + newWmsRawOutstockDetail.stackAmount = 1; + + + wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.containerCode = null; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); - WmsRawStock? wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).FirstOrDefault(); - if (wmsRawStock != null) - { - dbContext.Remove(wmsRawStock); - dbContext.Update(wmsBaseLocation); - dbContext.Remove(item); - dbContext.SaveChanges(); - dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); - } + dbContext.Update(wmsRawOutStock); + dbContext.Add(newWmsRawOutstockDetail); + dbContext.Remove(wmsRawStock); + dbContext.Update(wmsBaseLocation); + dbContext.Remove(item); + dbContext.SaveChanges(); + dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); + } } else if (item.taskType == StaticTaskType.FiveRawSplitReturn)//柜体拆分到原材料 @@ -688,23 +776,13 @@ namespace Khd.Core.Wcs.Wcs updateDate = DateTime.Now, warehouseId = 511, }; - WmsRawInstock wmsRawInstock = new WmsRawInstock() - { - beginTime = System.DateTime.Now, - endTime = DateTime.Now, - locationCode = wmsBaseLocation.locationCode, - executeStatus = "2", - instockAmount = 1, - instockType = "2", - materialBatchCode = mesBaseBarcodeInfo.barcodeInfo, - materialId = mesBaseBarcodeInfo.materialId, - operationType = "3", - palletInfoCode = mesBaseBarcodeInfo.palletInfoCode, - poNo = mesBaseBarcodeInfo.poNo, - warehouseId = 511 - }; + WmsRawInstock? WmsRawInstock = dbContext.WmsRawInstock.FirstOrDefault(t => t.materialBarCode == mesBasePalletInfo.materialBarcode && t.instockType == "2"); + WmsRawInstock.returnFlag = null; + WmsRawInstock.executeStatus = "2"; + WmsRawInstock.updateDate = DateTime.Now; + SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); - dbContext.Add(wmsRawInstock); + dbContext.Update(WmsRawInstock); dbContext.Add(wmsRawStock); BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); startEquip.emptyCount = 0; @@ -730,6 +808,68 @@ namespace Khd.Core.Wcs.Wcs var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != null) { + + if (mesBaseBarcodeInfo.PurchaseOrderId == -1) + { // 虚拟托盘号,合并的物料分别插入WmsRawInstock + List mesSaleOrderRelates = dbContext.MesSaleOrderRelate.Where(x => x.SaleOrderId == mesBaseBarcodeInfo.saleOrderId).ToList(); + List? wmsRawInstocks = new List(); + foreach(var mesSaleOrderRelate in mesSaleOrderRelates) + { + WmsRawInstock wmsRawInstock = new WmsRawInstock() + { + taskCode = StaticData.SnowId.NextId().ToString(), + materialBarCode = null, + materialBatchCode = null, + applyBy = "wcs", + applyDate = System.DateTime.Now, + purchaseOrderId = mesSaleOrderRelate.PurchaseOrderId, + beginTime = DateTime.Now, + endTime = DateTime.Now, + locationCode = wmsBaseLocation.locationCode, + executeStatus = "2", + instockAmount = mesSaleOrderRelate.RelateSaleOrderAmount, + instockType = "1", + + materialId = mesSaleOrderRelate.MaterialId, + operationType = "3", + palletInfoCode = mesBaseBarcodeInfo.palletInfoCode, + poNo = mesBaseBarcodeInfo.poNo, + warehouseId = 511 + }; + wmsRawInstocks.Add(wmsRawInstock); + } + if(wmsRawInstocks.Count > 0) + { + dbContext.WmsRawInstock.AddRange(wmsRawInstocks); + } + } + else + { + WmsRawInstock wmsRawInstock = new WmsRawInstock() + { + taskCode = StaticData.SnowId.NextId().ToString(), + materialBarCode = mesBaseBarcodeInfo.barcodeInfo, + materialBatchCode = mesBaseBarcodeInfo.batchCode, + applyBy = "wcs", + applyDate = System.DateTime.Now, + purchaseOrderId = mesBaseBarcodeInfo.PurchaseOrderId, + beginTime = DateTime.Now, + endTime = DateTime.Now, + locationCode = wmsBaseLocation.locationCode, + executeStatus = "2", + instockAmount = 1, + instockType = "1", + + materialId = mesBaseBarcodeInfo.materialId, + operationType = "3", + palletInfoCode = mesBaseBarcodeInfo.palletInfoCode, + poNo = mesBaseBarcodeInfo.poNo, + warehouseId = 511 + }; + dbContext.Add(wmsRawInstock); + + } + WmsRawStock wmsRawStock = new() { palletInfoCode = mesBasePalletInfo.palletInfoCode, @@ -755,23 +895,8 @@ namespace Khd.Core.Wcs.Wcs updateDate = DateTime.Now, warehouseId = 511, }; - WmsRawInstock wmsRawInstock = new WmsRawInstock() - { - beginTime = DateTime.Now, - endTime = DateTime.Now, - locationCode = wmsBaseLocation.locationCode, - executeStatus = "2", - instockAmount = 1, - instockType = "1", - materialBatchCode = mesBaseBarcodeInfo.barcodeInfo, - materialId = mesBaseBarcodeInfo.materialId, - operationType = "3", - palletInfoCode = mesBaseBarcodeInfo.palletInfoCode, - poNo = mesBaseBarcodeInfo.poNo, - warehouseId = 511 - }; SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); - dbContext.Add(wmsRawInstock); + wmsBaseLocation.returnFlag = "0"; BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == 5); lineEquip.equipStatus = 0; diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs index ed6a216..6904f08 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs @@ -148,7 +148,7 @@ namespace Khd.Core.Wcs.Wcs } else { - if (task.taskType == StaticTaskType.FiveAccessoryOut || task.taskType == StaticTaskType.FiveAccessoryRemove) + if (task.taskType == StaticTaskType.FiveAccessoryOut || task.taskType == StaticTaskType.FiveAccessoryRemove || task.taskType == StaticTaskType.FiveAccessoryStorage) { dbContext.WcsTask.Where(t => t.objid == task.objid).Delete(); #region 暂不使用-因为删除之后ctu无法知道还有几个箱子///如果已经开始入库,还有出库任务,删除出库任务 @@ -418,7 +418,7 @@ namespace Khd.Core.Wcs.Wcs } else if (item.taskType == StaticTaskType.FiveAccessoryIn)//入库任务 { - bool haveOut = taskList.Where(t => t.taskType == StaticTaskType.FiveAccessoryOut).Where(t => t.taskStatus != 6).Any(); + bool haveOut = taskList.Where(t => item.taskType == StaticTaskType.FiveAccessoryOut || item.taskType == StaticTaskType.FiveAccessoryStorage || item.taskType == StaticTaskType.FiveAccessoryRemove).Where(t => t.taskStatus != 6).Any(); if (!haveOut && CtuWaitLogic()) { BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); @@ -455,7 +455,7 @@ namespace Khd.Core.Wcs.Wcs dbContext.Update(item); lock (SystemData.outStockLock) { - bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 11 && t.taskType == StaticTaskType.FiveAccessoryOut).Any(); + bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 11 && (t.taskType == StaticTaskType.FiveAccessoryOut || t.taskType == StaticTaskType.FiveAccessoryStorage || t.taskType == StaticTaskType.FiveAccessoryRemove) ).Any(); int taskCount = dbContext.WcsTask.Where(t => t.nextPointId == 11 && t.taskType == StaticTaskType.FiveAccessoryIn).Count(); if ((!hasTask && item.ud3 == "1") || (taskCount >= 6))//如果CTU当前任务数量很多,取消预执行任务,或者出库的任务都生成了入库任务 { @@ -532,7 +532,7 @@ namespace Khd.Core.Wcs.Wcs { _logger.Info("五楼CTU线程完成任务" + item.objid); Console.WriteLine(DateTime.Now + ":五楼CTU线程完成任务" + item.currPointNo + "," + item.endPointNo); - if (item.taskType == StaticTaskType.FiveAccessoryOut)//出库任务 + if (item.taskType == StaticTaskType.FiveAccessoryOut || item.taskType == StaticTaskType.FiveAccessoryStorage || item.taskType == StaticTaskType.FiveAccessoryRemove)//出库任务 { WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.FirstOrDefault(t => t.taskCode == item.objid.ToString()); if (wmsRawOutstockDetail != null) diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs index 20321c1..aff3993 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs @@ -43,6 +43,56 @@ namespace Khd.Core.Wcs.Wcs _logger.Info("二楼AGV上件扫描监听启动成功"); } + + /// + /// 开启线程监听2分钟小包出口光电信号,如果小包出口到位信号消失,即取托盘完成,发送信号通知线体 + /// + /// + public static void ListenForSignal(int timeoutMinutes = 2) + { + // 创建一个 CancellationTokenSource 来控制超时 + var cts = new CancellationTokenSource(TimeSpan.FromMinutes(timeoutMinutes)); + + Task.Run(async () => + { + var agvGetPoint = StaticData.BasePlcpointList.First(t => t.id == 53); + var agvGetValue = StaticData.PlcDic[2].Read(agvGetPoint.plcpointAddress); + + while (!cts.Token.IsCancellationRequested) + { + // 每隔 1 秒检查一次小包出口光电信号 + await Task.Delay(1000, cts.Token); + + agvGetValue = StaticData.PlcDic[2].Read(agvGetPoint.plcpointAddress); + + if (agvGetValue != null && Convert.ToInt32(agvGetValue) == 0) + { + // 信号消失,20s后执行相关操作 + Thread.Sleep(1000*20); + + // 取托盘确认信号DB4.DBX310.1写true + BasePlcpoint secondOutGetOverPoint = StaticData.BasePlcpointList.First(t => t.id == 71); + StaticData.PlcDic[2].WriteToPoint(secondOutGetOverPoint.plcpointAddress, true, secondOutGetOverPoint.plcpointLength.ToString()); + + // 清空小包出口RFID + BasePlcpoint rfid2001Point = StaticData.BasePlcpointList.First(t => t.id == 52); + StaticData.PlcDic[2].WriteRFID(rfid2001Point.plcpointAddress, "", 12); + + // 满足条件后退出循环 + break; + } + } + + // 任务被取消或者超时 + if (cts.Token.IsCancellationRequested) + { + Console.WriteLine("任务超时或被取消"); + } + }).Wait(); + } + + + public void MonitorInLocatorPoint() { using var scope = _host.Services.CreateScope(); @@ -225,7 +275,7 @@ namespace Khd.Core.Wcs.Wcs } else { - _logger.Info("五楼Agv下发任务失败" + item.taskType + result); + _logger.Info("2楼Agv下发任务失败" + item.taskType + result); } } else if (item.taskType == StaticTaskType.SecondStorageToLift)//库位-提升机 @@ -538,8 +588,16 @@ namespace Khd.Core.Wcs.Wcs { dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 4 }); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 4 }); + + // 开启线程监听2分钟小包出口光电信号,如果小包出口到位信号消失,即取托盘完成,发送信号通知线体 + ListenForSignal(2); + + } } + + + } else { @@ -557,13 +615,29 @@ namespace Khd.Core.Wcs.Wcs dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 4 }); } } + + + } else if (item.taskStatus == 5) { if (item.taskType == StaticTaskType.SecondLineToSmallPackage) { - if (true) + // 托盘库叫料信号 + var agvPutPoint = StaticData.BasePlcpointList.First(t => t.id == 54); + //2F托盘库产线数据通讯情况 + var ConnectStatus2FPoint = StaticData.BasePlcpointList.First(t => t.id == 73); + //2F托盘库入口上料光电 + var PalletInIsHas2FPoint = StaticData.BasePlcpointList.First(t => t.id == 74); + + var agvPutValue = StaticData.PlcDic[2].Read(agvPutPoint.plcpointAddress);//托盘库叫料信号 + var ConnectStatus2F = StaticData.PlcDic[2].Read(ConnectStatus2FPoint.plcpointAddress);//2F托盘库产线数据通讯情况 + var PalletInIsHas2F = StaticData.PlcDic[2].Read(PalletInIsHas2FPoint.plcpointAddress);//2F托盘库入口上料光电 + + + if (agvPutValue !=null && ConnectStatus2F != null && PalletInIsHas2F !=null&& Convert.ToInt32(agvPutValue) == 1 && Convert.ToInt32(ConnectStatus2F) == 1 && Convert.ToInt32(PalletInIsHas2F) == 0) { + // 托盘库叫料信号,并且通讯正常,并且小包入口无料 ,才可放托盘 var agvTask = new RequestAGVTaskDto { reqCode = StaticData.SnowId.NextId().ToString(), @@ -579,6 +653,7 @@ namespace Khd.Core.Wcs.Wcs } } } + } else if (item.taskStatus == 7) { @@ -588,7 +663,7 @@ namespace Khd.Core.Wcs.Wcs lineEquip.equipStatus = 0; dbContext.Update(lineEquip); } - if (item.taskType == StaticTaskType.SecondSmallPackageToStorage) + if (item.taskType == StaticTaskType.SecondSmallPackageToStorage) //小包出口到库位 { //WmsProductInstock? wmsProductInstock = dbContext.WmsProductInstock.FirstOrDefault(t => t.productInstockId == item.orderId); //if (wmsProductInstock != null) @@ -607,6 +682,7 @@ namespace Khd.Core.Wcs.Wcs wmsBaseLocation.containerCode = item.containerNo; WmsProductStock wmsProductStock = new WmsProductStock() { + productId = mesBasePalletInfo.materialId, activeFlag = "1", frozenAmount = 0, @@ -619,7 +695,7 @@ namespace Khd.Core.Wcs.Wcs occupyAmount = 0, totalAmount = 1, palletInfoCode = item.containerNo, - planCode = mesBaseBarcodeInfo.planCode, + planCode = StaticData.SnowId.NextId().ToString(), planDetailCode = mesBaseBarcodeInfo.planDetailCode, productBatch = mesBasePalletInfo.materialBarcode, saleorderCode = mesBaseBarcodeInfo.saleorderCode, @@ -630,6 +706,34 @@ namespace Khd.Core.Wcs.Wcs warehouseFloor = 2, warehouseId = wmsBaseLocation.warehouseId }; + #region 插入WmsProductInstock表 + + WmsProductInstock wmsProductInstock = new WmsProductInstock(); + wmsProductInstock.taskCode = StaticData.SnowId.NextId().ToString(); + wmsProductInstock.warehouseId = wmsBaseLocation.warehouseId; + wmsProductInstock.warehouseFloor = 2; + wmsProductInstock.locationCode = wmsBaseLocation.locationCode; + wmsProductInstock.productType = "3"; + wmsProductInstock.operationType = "3"; + wmsProductInstock.planCode = StaticData.SnowId.NextId().ToString(); + wmsProductInstock.planDetailCode = mesBaseBarcodeInfo.planDetailCode; + wmsProductInstock.SaleOrderId = mesBaseBarcodeInfo.saleOrderId; + wmsProductInstock.saleorderCode = mesBaseBarcodeInfo.saleorderCode; + wmsProductInstock.instockType = "1"; + wmsProductInstock.productId = mesBaseBarcodeInfo.materialId; + wmsProductInstock.productBatch = mesBaseBarcodeInfo.barcodeInfo; + wmsProductInstock.instockAmount = mesBaseBarcodeInfo.amount; + wmsProductInstock.palletInfoCode = mesBaseBarcodeInfo.palletInfoCode; + wmsProductInstock.auditStatus = "1"; + wmsProductInstock.executeStatus = "2"; + wmsProductInstock.applyBy = "WCS"; + wmsProductInstock.applyDate = DateTime.Now; + wmsProductInstock.updateBy = "WCS"; + wmsProductInstock.updateDate = DateTime.Now; + wmsProductInstock.beginTime = DateTime.Now; + wmsProductInstock.endTime = DateTime.Now; + dbContext.Add(wmsProductInstock); + #endregion //wmsProductInstockDetail.executeStatus = "2"; //wmsProductInstock.endTime = DateTime.Now; //wmsProductInstock.executeStatus = "2"; @@ -652,33 +756,47 @@ namespace Khd.Core.Wcs.Wcs WmsProductOutstock? wmsProductOutstock = dbContext.WmsProductOutstock.FirstOrDefault(t => t.productOutstockId == item.orderId); if (wmsProductOutstock != null) { - WmsProductOutstockDetail? wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(t => t.productOutstockId == wmsProductOutstock.productOutstockId); - if (wmsProductOutstockDetail != null) + + var wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locationId == item.currPointId).First(); + WmsProductStock wmsProductStock = dbContext.WmsProductStock.First(t => t.locationCode == wmsBaseLocation.locationCode); + + wmsProductOutstock.outstockQty++; + if (wmsProductOutstock.applyQty <= wmsProductOutstock.outstockQty) { - var wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locationId == item.currPointId).First(); - WmsProductStock wmsProductStock = dbContext.WmsProductStock.First(t => t.locationCode == wmsBaseLocation.locationCode); - wmsProductOutstock.outstockQty++; - if (wmsProductOutstock.applyQty <= wmsProductOutstock.outstockQty) - { - wmsProductOutstock.endTime = DateTime.Now; - wmsProductOutstock.executeStatus = "2"; - } - wmsProductOutstockDetail.executeStatus = "2"; - wmsProductOutstockDetail.endTime = DateTime.Now; - wmsBaseLocation.locationStatus = "1"; - wmsBaseLocation.containerCode = null; - item.nextPointId = 2; - item.taskStatus = 8; - SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); - dbContext.Remove(wmsProductStock); - dbContext.Update(wmsBaseLocation); - dbContext.Update(wmsProductOutstockDetail); - dbContext.Update(wmsProductOutstock); - dbContext.Update(item); - dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 }); - dbContext.SaveChanges(); - _logger.Info("二楼AGV线程完成任务" + item.objid); + wmsProductOutstock.endTime = DateTime.Now; + wmsProductOutstock.executeStatus = "2"; } + + + WmsProductOutstockDetail newWmsProductOutstockDetail = new WmsProductOutstockDetail(); + newWmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId; + newWmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId; + newWmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode; + newWmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch; + newWmsProductOutstockDetail.productId = wmsProductStock.productId; + newWmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty; + newWmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty; + newWmsProductOutstockDetail.executeStatus = "2"; + newWmsProductOutstockDetail.updateBy = "WCS"; + newWmsProductOutstockDetail.updateDate = DateTime.Now; + newWmsProductOutstockDetail.beginTime = DateTime.Now; + newWmsProductOutstockDetail.endTime = DateTime.Now; + + + wmsBaseLocation.locationStatus = "1"; + wmsBaseLocation.containerCode = null; + item.nextPointId = 2; + item.taskStatus = 8; + SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); + dbContext.Remove(wmsProductStock); + dbContext.Update(wmsBaseLocation); + dbContext.Add(newWmsProductOutstockDetail); + dbContext.Update(wmsProductOutstock); + dbContext.Update(item); + dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 }); + dbContext.SaveChanges(); + _logger.Info("二楼AGV线程完成任务" + item.objid); + } } else if (item.taskType == StaticTaskType.SecondLiftToTransit)//空托盘入周转位 @@ -709,6 +827,12 @@ namespace Khd.Core.Wcs.Wcs } else if (item.taskType == StaticTaskType.SecondLineToSmallPackage)//输送线到小包入口 { + // 小包入口放料完成确认信号 + //放托盘确认信号DB4.DBX310.0写true + BasePlcpoint SecondInPutOverPoint = StaticData.BasePlcpointList.First(t => t.id == 72); + StaticData.PlcDic[2].WriteToPoint(SecondInPutOverPoint.plcpointAddress, true, SecondInPutOverPoint.plcpointLength.ToString()); + + BaseEquip startEquip = dbContext.BaseEquip.First(t => t.objid == item.currPointId); startEquip.equipStatus = 0; dbContext.Update(startEquip); @@ -763,6 +887,50 @@ namespace Khd.Core.Wcs.Wcs }); dbContext.Remove(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 }); + + #region 插入移库记录 + WmsMove wmsMove = new WmsMove(); + wmsMove.MoveId = StaticData.SnowId.NextId(); + wmsMove.TaskCode = StaticData.SnowId.NextId().ToString(); + wmsMove.WarehouseId = wmsBaseLocation.warehouseId; + wmsMove.OriLocationCode = wmsBaseLocation.locationCode; + wmsMove.TargetLocationCode = toLocation.locationCode; + wmsMove.InstockBatch = wmsProductStock.productBatch; + wmsMove.MaterialId = wmsProductStock.productId; + wmsMove.PlanAmount = 1; + wmsMove.RealOutstockAmount = 1; + wmsMove.RealInstockAmount = 1; + wmsMove.OperationType = "3"; + wmsMove.MoveWay = "2"; + wmsMove.MoveType = "1"; + wmsMove.AuditStatus = "1"; + wmsMove.ExecuteStatus = "2"; + wmsMove.UpdateBy = "WCS"; + wmsMove.UpdateDate = DateTime.Now; + wmsMove.BeginTime = DateTime.Now; + wmsMove.EndTime = DateTime.Now; + + WmsMoveDetail wmsMoveDetail = new WmsMoveDetail(); + wmsMoveDetail.MoveId = wmsMove.MoveId; + wmsMoveDetail.MaterialBarcode = wmsMove.InstockBatch; + wmsMoveDetail.InstockBatch = wmsMove.InstockBatch; + wmsMoveDetail.MaterialId = (long)wmsProductStock.productId; + wmsMoveDetail.LocationCode = toLocation.locationCode; + wmsMoveDetail.PlanAmount = 1; + wmsMoveDetail.RealInstockAmount = 1; + wmsMoveDetail.RealAmount = 1; + wmsMoveDetail.ExecuteStatus = "2"; + wmsMoveDetail.ExecuteTime = DateTime.Now; + wmsMoveDetail.ExecuteEndTime = DateTime.Now; + wmsMoveDetail.ExecutePerson = "WCS"; + wmsMoveDetail.UpdateBy = "WCS"; + wmsMoveDetail.UpdateDate = DateTime.Now; + + dbContext.WmsMove.Add(wmsMove); + dbContext.WmsMoveDetail.Add(wmsMoveDetail); + #endregion + + transaction.Commit(); dbContext.SaveChanges(); _logger.Info("二楼AGV线程完成任务" + item.objid); diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs index b8723bf..1a8d83f 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs @@ -45,7 +45,13 @@ namespace Khd.Core.Wcs.Wcs using var dbContext = scope.ServiceProvider.GetRequiredService(); var rfidPoint = StaticData.BasePlcpointList.First(t => t.id == 52); var agvGetPoint = StaticData.BasePlcpointList.First(t => t.id == 53); + // 托盘库叫料信号 var agvPutPoint = StaticData.BasePlcpointList.First(t => t.id == 54); + //2F托盘库产线数据通讯情况 + var ConnectStatus2FPoint = StaticData.BasePlcpointList.First(t => t.id == 73); + //2F托盘库入口上料光电 + var PalletInIsHas2FPoint = StaticData.BasePlcpointList.First(t => t.id == 74); + BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8); BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 36); List canNotIn = new List(); @@ -54,13 +60,18 @@ namespace Khd.Core.Wcs.Wcs try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); - var agvPutValue = StaticData.PlcDic[2].Read(agvPutPoint.plcpointAddress);//小包入口叫料 + var agvPutValue = StaticData.PlcDic[2].Read(agvPutPoint.plcpointAddress);//托盘库叫料信号 + var ConnectStatus2F = StaticData.PlcDic[2].Read(ConnectStatus2FPoint.plcpointAddress);//2F托盘库产线数据通讯情况 + var PalletInIsHas2F = StaticData.PlcDic[2].Read(PalletInIsHas2FPoint.plcpointAddress);//2F托盘库入口上料光电 + var agvGetValue = StaticData.PlcDic[2].Read(agvGetPoint.plcpointAddress);//小包出口的到位 - var rfidValue = StaticData.PlcDic[2].ReadRFID(rfidPoint.plcpointAddress);//小包出口的RFID - if (agvGetValue != null && agvPutValue != null && rfidValue != null)//读Plc + var rfidValue = StaticData.PlcDic[2].ReadRFID(rfidPoint.plcpointAddress, 15);//小包出口的RFID + if (agvGetValue != null && agvPutValue != null && rfidValue != null && ConnectStatus2F != null && PalletInIsHas2F != null)//读Plc { - if (Convert.ToInt32(agvPutValue) == 0)//小包入口叫料 + // 托盘库叫料信号,并且通讯正常,并且小包入口无料才可叫料 + if (Convert.ToInt32(agvPutValue) == 1 && Convert.ToInt32(ConnectStatus2F) == 1 && Convert.ToInt32(PalletInIsHas2F) == 0)//小包入口叫料 { + bool canCreate = dbContext.WcsTask.Where(t => t.nextPointId == 8 || t.endPointId == endEquip.objid).Any();//有没有生成任务 //36 是小包入口的设备信息,8是二楼Agv设备 if (!canCreate)//没有任务 @@ -218,9 +229,10 @@ namespace Khd.Core.Wcs.Wcs } else { - //todo:没有空托盘 - Console.WriteLine(DateTime.Now + ":二楼码垛输送线没有空托盘"); - _logger.Info("二楼码垛输送线没有空托盘"); + //todo:没有空托盘超过十次预警报警 + Console.WriteLine(DateTime.Now + ":二楼码垛输送线没有空托盘,叫托盘失败!"); + _logger.Info("二楼码垛输送线没有空托盘,叫托盘失败!"); + Thread.Sleep(1000 * 5); } } } @@ -228,71 +240,101 @@ namespace Khd.Core.Wcs.Wcs } if (Convert.ToInt32(agvGetValue) == 1 && !string.IsNullOrEmpty(rfidValue))//小包出口成品入口 { - lock (SystemData.SecondTaskLock) + bool canCreate = dbContext.WcsTask.Where(t => t.nextPointId == 8).Any();//有没有生成任务 + if (!canCreate) { - MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == rfidValue); - if (mesBasePalletInfo != null) + lock (SystemData.SecondTaskLock) { - MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); - if (mesBaseBarcodeInfo != null) + MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == rfidValue); + if (mesBasePalletInfo != null) { - var wmsBaseLocations = dbContext.WmsBaseLocation - .Where(t => t.warehouseFloor == FloorNo) - .Where(t => t.activeFlag == "1") - .Where(t => t.delFlag == "0") - .Where(t => t.locationScrapType == "1") - .Where(t => t.locationStatus == "1") - .Where(t => t.warehouseId == 231) - .ToList();//所有可用库位 - var wmsProductStocks = dbContext.WmsProductStock - .Where(t => t.warehouseId == 231) - .ToList();//仓库的库存 - WmsBaseLocation? wmsBaseLocation = null; - if (wmsBaseLocations.Count > 0) + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); + if (mesBaseBarcodeInfo != null) { - List containerCodes = wmsBaseLocations - .Where(t => t.locDeep == 1) - .Select(t => t.containerCode).ToList();//深库位的有托盘 - containerCodes.RemoveAll(t => string.IsNullOrEmpty(t)); + // 目标库位 + WmsBaseLocation? wmsBaseLocation = null; + var wmsBaseLocations = dbContext.WmsBaseLocation + .Where(t => t.warehouseFloor == FloorNo) + .Where(t => t.activeFlag == "1") + .Where(t => t.delFlag == "0") + .Where(t => t.locationScrapType == "1") + .Where(t => t.locationStatus == "1") + .Where(t => t.warehouseId == 231) + .ToList();//所有未锁定的库位 - List productStocks = wmsProductStocks.Where(t => t.productId == mesBaseBarcodeInfo.materialId) + //深库位有库存的库位 + List DeepContainerCodes = wmsBaseLocations + .Where(t => t.locDeep == 1) + .Where(t => !string.IsNullOrEmpty(t.containerCode)) + .Select(t => t.containerCode).ToList(); + + //相同型号及销售订单的深库位库存 + List productStocks = dbContext.WmsProductStock.Where(t => t.productId == mesBaseBarcodeInfo.materialId) .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) - .Where(t => t.palletInfoCode != null) - .Where(t => containerCodes.Contains(t.palletInfoCode)).ToList(); + .Where(t => t.warehouseId== 231) + .Where(t => DeepContainerCodes.Contains(t.palletInfoCode)).ToList(); - var bill = from a in productStocks - join b in wmsBaseLocations.Where(t => t.locDeep == 1) on a.palletInfoCode equals b.containerCode - select new { b };//等于当前任务的物料的托盘的库位信息 - - var outBill = from a in bill//深库位托盘和当前任务绑定物料一致的托盘库位 - from b in wmsBaseLocations//所有库位 - where b.locDeep == 2//浅库位 - && b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1) - //如果是4则找3,如果是1则找2 - && a.b.locColumn == b.locColumn//列数相同 - && string.IsNullOrEmpty(b.containerCode) - select new { a.b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 - - wmsBaseLocation ??= outBill.Where(t => !canNotIn.Contains(t.b.locationCode)).FirstOrDefault()?.b;//先找相同物料的外侧库位 - wmsBaseLocation ??= wmsBaseLocations.Where(t => !canNotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位 - wmsBaseLocation ??= wmsBaseLocations.Where(t => !canNotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位 - if (wmsBaseLocation != null)//如果找到库位,生成入库任务 - { - if (wmsBaseLocation.locDeep == 1) + if(productStocks.Count > 0) + { //优先找同销售订单的有库存的深库位对应的浅库位 + foreach(var productStock in productStocks) { - var hasLocation = wmsBaseLocations - .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Where(t => !string.IsNullOrEmpty(t.containerCode) || t.locationStatus != "1") - .Any(); - if (hasLocation) + // 深库位库存对用的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) { - canNotIn.Add(wmsBaseLocation.locationCode); - Console.WriteLine(DateTime.Now + $":目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - _logger.Info($"目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - continue; + break; } } + } + if(wmsBaseLocation == null) + { // 找深库位有库存的库位对应的浅库位 + var stockLocations = wmsBaseLocations.Where(x => !string.IsNullOrEmpty(x.containerCode) && x.locDeep==1).ToList(); + foreach (var item in stockLocations) + { + wmsBaseLocation = 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 (wmsBaseLocation != null) + { + break; + } + } + } + if(wmsBaseLocation == null) + { // 在所有符合条件的库位里,找一个库位,优先深库位,但是如果是深库位,需要判断浅库位状态是否正常 + 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) + { + //浅库位能否使用 + 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; + break; + } + } + else + { + wmsBaseLocation = item; + break; + } + + } + } + + if (wmsBaseLocation != null)//如果找到库位,生成入库任务 + { + BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 37); var wcsTask = new WcsTask() { @@ -325,12 +367,17 @@ namespace Khd.Core.Wcs.Wcs } else { - //报警 + Console.WriteLine(DateTime.Now + ":2楼调度入库任务,未找到库位"); + _logger.Info("2楼调度入库任务,未找到库位"); + // TODO: 没有找到库位,添加报警处理 + Thread.Sleep(1000 * 5); } + } } } } + } } } diff --git a/src/Khd.Core.Wcs/Wcs/SystemTimer.cs b/src/Khd.Core.Wcs/Wcs/SystemTimer.cs index 13a0a12..953560e 100644 --- a/src/Khd.Core.Wcs/Wcs/SystemTimer.cs +++ b/src/Khd.Core.Wcs/Wcs/SystemTimer.cs @@ -738,6 +738,17 @@ namespace Khd.Core.Wcs.Wcs var Ylc = basePlcs.First(t => t.Name.Contains('Y')); StaticData.PlcDic[2].WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); StaticData.PlcDic[2].WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); + + #region 经过走廊区域报警 + if (int.Parse(cardStatus.PosX) >= 53040 && int.Parse(cardStatus.PosX) <= 58090 && (int.Parse(cardStatus.PosY) >= 53520 && int.Parse(cardStatus.PosY) <= 64590)) + { + Console.WriteLine("=======>3F走廊区域预警"); + } + else + { + // Console.WriteLine("3F走廊区域正常"); + } + #endregion } } catch @@ -777,7 +788,22 @@ namespace Khd.Core.Wcs.Wcs var Ylc = basePlcs.First(t => t.Name.Contains('Y')); StaticData.PlcDic[2].WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); StaticData.PlcDic[2].WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); + + #region 经过走廊区域报警 + if (int.Parse(cardStatus.PosX) >= 119000 && int.Parse(cardStatus.PosX) <= 122800 && (int.Parse(cardStatus.PosY) >= 124100 && int.Parse(cardStatus.PosY) <= 134435)) + { + Console.WriteLine("=======>2F走廊区域预警"); + } + else + { + // Console.WriteLine("2F走廊区域正常"); + } + #endregion } + + + + } catch { diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs index 30b7c08..3f612d6 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs @@ -599,6 +599,50 @@ namespace Khd.Core.Wcs.Wcs }); dbContext.Remove(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 6 }); + + #region 插入移库记录 + WmsMove wmsMove = new WmsMove(); + wmsMove.MoveId = StaticData.SnowId.NextId(); + wmsMove.TaskCode = StaticData.SnowId.NextId().ToString(); + wmsMove.WarehouseId = wmsBaseLocation.warehouseId; + wmsMove.OriLocationCode = wmsBaseLocation.locationCode; + wmsMove.TargetLocationCode = toLocation.locationCode; + wmsMove.InstockBatch = wmsRawStock.instockBatch; + wmsMove.MaterialId = wmsRawStock.materialId; + wmsMove.PlanAmount = 1; + wmsMove.RealOutstockAmount = 1; + wmsMove.RealInstockAmount = 1; + wmsMove.OperationType = "3"; + wmsMove.MoveWay = "2"; + wmsMove.MoveType = "1"; + wmsMove.AuditStatus = "1"; + wmsMove.ExecuteStatus = "2"; + wmsMove.UpdateBy = "WCS"; + wmsMove.UpdateDate = DateTime.Now; + wmsMove.BeginTime = DateTime.Now; + wmsMove.EndTime = DateTime.Now; + + WmsMoveDetail wmsMoveDetail = new WmsMoveDetail(); + wmsMoveDetail.MoveId = wmsMove.MoveId; + wmsMoveDetail.MaterialBarcode = wmsMove.InstockBatch; + wmsMoveDetail.InstockBatch = wmsMove.InstockBatch; + wmsMoveDetail.MaterialId = (long)wmsRawStock.materialId; + wmsMoveDetail.LocationCode = toLocation.locationCode; + wmsMoveDetail.PlanAmount = 1; + wmsMoveDetail.RealInstockAmount = 1; + wmsMoveDetail.RealAmount = 1; + wmsMoveDetail.ExecuteStatus = "2"; + wmsMoveDetail.ExecuteTime = DateTime.Now; + wmsMoveDetail.ExecuteEndTime = DateTime.Now; + wmsMoveDetail.ExecutePerson = "WCS"; + wmsMoveDetail.UpdateBy = "WCS"; + wmsMoveDetail.UpdateDate = DateTime.Now; + + dbContext.WmsMove.Add(wmsMove); + dbContext.WmsMoveDetail.Add(wmsMoveDetail); + #endregion + + dbContext.SaveChanges(); transaction.Commit(); } @@ -654,13 +698,20 @@ namespace Khd.Core.Wcs.Wcs }; WmsRawInstock wmsRawInstock = new WmsRawInstock() { + taskCode = item.taskCode, + materialBarCode = mesBaseBarcodeInfo.barcodeInfo, + materialBatchCode = mesBaseBarcodeInfo.batchCode, + applyBy = "wcs", + applyDate = System.DateTime.Now, + purchaseOrderId = mesBaseBarcodeInfo.PurchaseOrderId, + beginTime = System.DateTime.Now, endTime = DateTime.Now, locationCode = wmsBaseLocation.locationCode, executeStatus = "2", instockAmount = 1, instockType = item.fromFloorNo == 1 ? "1" : "3", - materialBatchCode = mesBaseBarcodeInfo.barcodeInfo, + materialId = mesBaseBarcodeInfo.materialId, operationType = "3", palletInfoCode = mesBaseBarcodeInfo.palletInfoCode, @@ -705,42 +756,63 @@ namespace Khd.Core.Wcs.Wcs wmsBaseLocation.updateBy = "WCS"; WmsRawOutstock? wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.rawOutstockId == item.orderId); - if (wmsRawOutstock != null) + WmsRawStock? wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == item.currPointNo).FirstOrDefault(); + + if (wmsRawOutstock != null && wmsRawStock != null) { - WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.FirstOrDefault(t => t.rawOutstockId == wmsRawOutstock.rawOutstockId && t.executeStatus == "1"); - if (wmsRawOutstockDetail != null) + + wmsRawOutstock.realOutstockAmount += 1; + if (wmsRawOutstock.realOutstockAmount >= wmsRawOutstock.outstockAmount) { - wmsRawOutstockDetail.executeStatus = "2"; - wmsRawOutstockDetail.outstockTime = DateTime.Now; - WmsRawStock? wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == item.currPointNo).FirstOrDefault(); - if (wmsRawStock != null) - { - BaseEquip endEquip = dbContext.BaseEquip.First(t => t.objid == 31); - endEquip.emptyCount = 1; - wmsRawOutstock.realOutstockAmount += 1; - if (wmsRawOutstock.realOutstockAmount >= wmsRawOutstock.outstockAmount) - { - wmsRawOutstock.endTime = DateTime.Now; - wmsRawOutstock.executeStatus = "2"; - } - SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); - dbContext.Update(endEquip); - dbContext.Update(wmsRawOutstock); - dbContext.Remove(wmsRawStock); - dbContext.Update(wmsBaseLocation); - WcsTask wcsTask = CoreMapper.Map(item); - wcsTask.objid = StaticData.SnowId.NextId(); - wcsTask.taskStatus = 0; - wcsTask.useFlag = 0; - wcsTask.taskType = StaticTaskType.ThirdFlipToBin; - wcsTask.createBy = "WCS"; - wcsTask.createTime = DateTime.Now; - dbContext.Remove(item); - dbContext.Add(wcsTask); - dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); - dbContext.SaveChanges(); - } + wmsRawOutstock.endTime = DateTime.Now; + wmsRawOutstock.executeStatus = "2"; } + + + WmsRawOutstockDetail newWmsRawOutstockDetail = new WmsRawOutstockDetail(); + newWmsRawOutstockDetail.rawOutstockId = wmsRawOutstock.rawOutstockId; + newWmsRawOutstockDetail.taskCode = wmsRawOutstock.taskCode; + newWmsRawOutstockDetail.warehouseId = wmsRawOutstock.warehouseId; + newWmsRawOutstockDetail.locationCode = wmsRawStock.locationCode; + newWmsRawOutstockDetail.materialBarcode = wmsRawStock.instockBatch; + newWmsRawOutstockDetail.materialId = wmsRawStock.materialId; + MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == wmsRawStock.instockBatch).FirstOrDefault(); + if (mesBaseBarcodeInfo != null) + { + newWmsRawOutstockDetail.instockBatch = mesBaseBarcodeInfo.batchCode; + newWmsRawOutstockDetail.materialProductionDate = mesBaseBarcodeInfo.productionDate; + } + newWmsRawOutstockDetail.planAmount = wmsRawOutstock.outstockAmount; + newWmsRawOutstockDetail.outstockAmount = wmsRawOutstock.realOutstockAmount; + newWmsRawOutstockDetail.executeStatus = "2"; + newWmsRawOutstockDetail.outstockPerson = wmsRawOutstock.applyBy; + newWmsRawOutstockDetail.outstockTime = DateTime.Now; + newWmsRawOutstockDetail.outstockWay = "2"; + newWmsRawOutstockDetail.createBy = "WCS"; + newWmsRawOutstockDetail.createDate = DateTime.Now; + newWmsRawOutstockDetail.stackAmount = 1; + + BaseEquip endEquip = dbContext.BaseEquip.First(t => t.objid == 31); + endEquip.emptyCount = 1; + + SystemData.UnLockOutLocation(wmsBaseLocation, dbContext); + dbContext.Update(endEquip); + dbContext.Update(wmsRawOutstock); + dbContext.Remove(wmsRawStock); + dbContext.Add(newWmsRawOutstockDetail); + dbContext.Update(wmsBaseLocation); + WcsTask wcsTask = CoreMapper.Map(item); + wcsTask.objid = StaticData.SnowId.NextId(); + wcsTask.taskStatus = 0; + wcsTask.useFlag = 0; + wcsTask.taskType = StaticTaskType.ThirdFlipToBin; + wcsTask.createBy = "WCS"; + wcsTask.createTime = DateTime.Now; + dbContext.Remove(item); + dbContext.Add(wcsTask); + dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); + dbContext.SaveChanges(); + } } else if (item.taskType == StaticTaskType.ThirdFlipToBin)//翻转机就到收集架 diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs index b4789f2..e46a10d 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs @@ -76,57 +76,90 @@ namespace Khd.Core.Wcs.Wcs MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != null) { - var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == FloorNo) - .Where(t => t.activeFlag == "1") - .Where(t => t.delFlag == "0") - .Where(t => t.locationScrapType == "1") - .Where(t => t.locationStatus == "1") - .OrderByDescending(t => t.locRow) - .ThenByDescending(t => t.locColumn) - .ToList(); + // 目标库位 + WmsBaseLocation? wmsBaseLocation = null; + var wmsBaseLocations = dbContext.WmsBaseLocation + .Where(t => t.warehouseFloor == FloorNo) + .Where(t => t.activeFlag == "1") + .Where(t => t.delFlag == "0") + .Where(t => t.locationScrapType == "1") + .Where(t => t.locationStatus == "1") + .Where(t => t.warehouseId == 311) + .ToList();//所有未锁定的库位 - List containerCodes = wmsBaseLocations.Where(t => t.locDeep == 1).Select(t => t.containerCode).ToList();//深库位的托盘 - containerCodes.RemoveAll(t => string.IsNullOrEmpty(t)); + //深库位有库存的库位 + List DeepContainerCodes = wmsBaseLocations + .Where(t => t.locDeep == 1) + .Where(t => !string.IsNullOrEmpty(t.containerCode)) + .Select(t => t.containerCode).ToList(); + + //相同型号及销售订单的深库位库存 + List wmsRawStocks = dbContext.WmsRawStock.Where(t => t.materialId == mesBaseBarcodeInfo.materialId) - .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) - .Where(t => t.palletInfoCode != null) - .Where(t => t.warehouseId == 311) - .Where(t => containerCodes.Contains(t.palletInfoCode)).ToList(); - - var bill = from a in wmsRawStocks - join b in wmsBaseLocations.Where(t => t.locDeep == 1 && !string.IsNullOrEmpty(t.containerCode)) on a.palletInfoCode equals b.containerCode - select new { b };//等于当前任务的物料的托盘的库位信息 - - - var outBill = from b in wmsBaseLocations - from a in bill - where b.locDeep == 2 - && b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1) - && a.b.locColumn == b.locColumn - && b.locationStatus == "1" - && string.IsNullOrEmpty(b.containerCode) - select new { b };//在上面的基础上获取对应托盘的外侧库位的空库位信息 - WmsBaseLocation? wmsBaseLocation = outBill.Where(t => !canNotIn.Contains(t.b.locationCode)).FirstOrDefault()?.b;//先找相同物料的外侧库位 - wmsBaseLocation ??= wmsBaseLocations.Where(t => !canNotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位 - wmsBaseLocation ??= wmsBaseLocations.Where(t => !canNotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位 - - if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null) - { - if (wmsBaseLocation.locDeep == 1) + .Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId) + .Where(t => DeepContainerCodes.Contains(t.palletInfoCode)) + .Where(t => t.warehouseId == 311).ToList(); + if (wmsRawStocks.Count > 0) + { //优先找同销售订单的有库存的深库位对应的浅库位 + foreach (var wmsRawStock in wmsRawStocks) { - bool hasLocation = wmsBaseLocations - .Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1))) - .Where(t => t.locColumn == wmsBaseLocation.locColumn) - .Where(t => !string.IsNullOrEmpty(t.containerCode) || t.locationStatus != "1") - .Any(); - if (hasLocation) + // 深库位库存对用的Location信息 + var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == wmsRawStock.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) { - canNotIn.Add(wmsBaseLocation.locationCode); - Console.WriteLine(DateTime.Now + $":目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - _logger.Info($"目标库位{canNotIn.Join(",")}的浅库位库位状态异常,无法入库"); - continue; + break; } } + } + if (wmsBaseLocation == null) + { // 找深库位有库存的库位对应的浅库位 + var stockLocations = wmsBaseLocations.Where(x => !string.IsNullOrEmpty(x.containerCode) && x.locDeep == 1).ToList(); + foreach (var item in stockLocations) + { + wmsBaseLocation = 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 (wmsBaseLocation != null) + { + break; + } + } + } + if (wmsBaseLocation == null) + { // 在所有符合条件的库位里,找一个库位,优先深库位,但是如果是深库位,需要判断浅库位状态是否正常 + 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) + { + //浅库位能否使用 + 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; + break; + } + } + else + { + wmsBaseLocation = item; + break; + } + + } + } + + if ( wmsBaseLocation != null) + { + dbContext.Remove(wcsTask); WcsTask newTask = CoreMapper.Map(wcsTask); newTask.objid = StaticData.SnowId.NextId(); @@ -155,6 +188,9 @@ namespace Khd.Core.Wcs.Wcs { Console.WriteLine(DateTime.Now + ":三楼楼接驳位调度入库任务,未找到库位"); _logger.Info("三楼接驳位调度入库任务,未找到库位"); + // TODO: 没有找到库位,添加报警处理 + Thread.Sleep(1000 * 5); + } } } diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml b/src/Khd.Core.Wpf/Form/FormBoardT.xaml index c46253b..51b0e46 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml @@ -15,7 +15,12 @@ Height="1080" > + + + + + @@ -362,6 +367,51 @@ + + + + + + @@ -390,7 +440,7 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1613,7 +1724,7 @@ - + @@ -1816,7 +1927,7 @@ - + @@ -1827,6 +1938,7 @@ - + @@ -2511,7 +2630,7 @@ - + @@ -2520,7 +2639,7 @@ - + @@ -2528,40 +2647,45 @@ - + - + - + - + - + -