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 @@
+
+ IsReadOnly="True" Visibility="Collapsed" />
-
+
+
+
+
+
@@ -1974,7 +2090,7 @@
-
+
@@ -1988,14 +2104,14 @@
-
-
-
-
+
+
+
+
-
-
-
+
+
+
@@ -2014,7 +2130,7 @@
-
+
@@ -2026,7 +2142,7 @@
-
+
@@ -2174,7 +2290,7 @@
-
+
@@ -2183,7 +2299,7 @@
-
+
@@ -2197,12 +2313,24 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2224,7 +2352,7 @@
Width="*"
/>
-
-
-
@@ -2275,8 +2395,6 @@
-
-
@@ -2342,8 +2461,7 @@
-
-
+
@@ -2475,7 +2593,7 @@
-
+
@@ -2485,6 +2603,7 @@
+
@@ -2496,14 +2615,14 @@
-
+
-
+
@@ -2511,7 +2630,7 @@
-
+
@@ -2520,7 +2639,7 @@
-
+
@@ -2528,40 +2647,45 @@
-
+
-
+
-
+
-
+
-
+
-
+
+
+
-
+
+
+
+
-
+
-
+
@@ -2605,7 +2729,7 @@
-
+
@@ -2808,7 +2932,7 @@
-
+
/// 页面加载事件
@@ -119,8 +123,8 @@ namespace Khd.Core.Wpf.Form
///
private void FormBoard_Loaded(object sender, RoutedEventArgs e)
{
-
-
+ InitializeData(1);
+ QueryPositionCombox.SelectedIndex = 0; // 设置默认选择为 "南侧"
try
{
itemsControlItems = new ObservableCollection();
@@ -147,7 +151,7 @@ namespace Khd.Core.Wpf.Form
});
GetMenu();
-
+ GetTask();
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(ShowTime); //委托刷新时间方法
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
@@ -292,8 +296,87 @@ namespace Khd.Core.Wpf.Form
{
HandyControl.Controls.MessageBox.Error(ex.Message);
}
+
+
}
+ #region 库位状态可视化
+ private void InitializeData(int rowPosition)
+ {
+ try
+ {
+ LocationsControl.ItemsSource = null;
+ using var scope = _host.Services.CreateScope();
+
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+ // 该侧所有库位
+ var allLocationLists = dbContext.WmsBaseLocation.Where(x => x.warehouseId == 512 && x.locRow == rowPosition).ToList();
+ allLocationLists = allLocationLists.OrderBy(x => x.layerNum).ThenBy(x => x.locColumn).ToList();
+ //在库里的库位
+ var inLocationList = allLocationLists.Where(x => x.ContainerStatus == "1").Select(x => x.locationCode).ToList();
+ //在库里有库存的库位
+ var withStockLocationList = dbContext.WmsRawStock.Where(x => x.warehouseId == 512 && inLocationList.Contains(x.locationCode)).Select(x => x.locationCode).Distinct().ToList();
+ // 在库里无库存的库位
+ var withoutStockLocationList = inLocationList
+ .Except(withStockLocationList)
+ .ToList();
+
+ var locations = new List();
+ for (int i = 0; i < 6 * 36; i++)
+ {
+ LocationStatus status = LocationStatus.OutOfStock;
+ WmsBaseLocation targetLocation = allLocationLists[i];
+ if (withStockLocationList.Contains(targetLocation.locationCode))
+ {
+ status = LocationStatus.InAndStock;
+ }
+ if (withoutStockLocationList.Contains(targetLocation.locationCode))
+ {
+ status = LocationStatus.EmptyInStock;
+ }
+
+ Visibility isFreeze = targetLocation.locationStatus == "1" ? Visibility.Collapsed : Visibility.Visible;
+ locations.Add(new Location { LocationId = targetLocation.locationId, Code = targetLocation.locColumn.ToString(), Status = status, isFreeze = isFreeze });
+ }
+
+ LocationsControl.ItemsSource = locations;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+ }
+
+ private void LocationButton_Click(object sender, RoutedEventArgs e)
+ {
+ var button = sender as Button;
+ if (button != null)
+ {
+ var location = button.DataContext as Location;
+ if (location != null)
+ {
+ StockWindow window = new StockWindow(_host, location.LocationId);
+ window.Show();
+ // MessageBox.Show(location.LocationId.ToString());
+ }
+ }
+ }
+
+ private void QueryPositionCombox_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ // 获取选中的 ComboBoxItem
+ ComboBox comboBox = sender as ComboBox;
+ ComboBoxItem selectedItem = comboBox.SelectedItem as ComboBoxItem;
+
+ if (selectedItem != null)
+ {
+ // 获取选中项的内容和 Tag
+ string content = selectedItem.Content.ToString();
+ object tag = selectedItem.Tag;
+ InitializeData(int.Parse(tag.ToString()));
+ }
+ }
+ #endregion
private void ReturnOrderTimer(object? obj)
{
@@ -372,6 +455,7 @@ namespace Khd.Core.Wpf.Form
{
}
+ Thread.Sleep(1000);
}
}
@@ -393,12 +477,31 @@ namespace Khd.Core.Wpf.Form
.ToList();
List list = wmsRawOutstocks.Select(t => t.endStationCode).ToList();
List orderIds = wmsRawOutstocks.Select(t => t.rawOutstockId).ToList();
+
+ BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
+ string nowStationCode = baseEquip.endStationCode;
+ if (!string.IsNullOrEmpty(nowStationCode))
+ {
+ Dispatcher.Invoke(() =>
+ {
+ SelectOutButton.Content = "当前:" + nowStationCode;
+ //SelectOutButton.IsEnabled = false;
+ });
+ }
+ else
+ {
+ Dispatcher.Invoke(() =>
+ {
+ SelectOutButton.Content = "选择出库";
+ //SelectOutButton.IsEnabled = true;
+ });
+ }
Dispatcher.Invoke(() =>
{
this.OutOrder.Text = "待出库单:\n" + list.Distinct().Join("\n");
});
- var baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
+
if (!string.IsNullOrEmpty(baseEquip.endStationCode))
{
#region 待测试
@@ -448,7 +551,7 @@ namespace Khd.Core.Wpf.Form
// 托盘携带可用信息,用分号分隔
PalletDetails = string.Join("\n", palletMaterialSummary
.Where(pallet => pallet.MaterialId == order.materialId)
- .Select(pallet => $"托盘{pallet.PalletInfoCode}数量{pallet.canUseAmount}")
+ .Select(pallet => $"托盘{pallet.PalletInfoCode}数量{string.Format("{0:0.00}", pallet.canUseAmount)}")
)
}).ToList();
@@ -464,8 +567,8 @@ namespace Khd.Core.Wpf.Form
materiaName = m.MaterialName,
materialSpec = m.MaterialSpec,
saleOrderId = r.SaleOrderId,
- outstockAmount = r.RequestedAmount,
- realOutstockAmount = r.RealOutstockAmount,
+ outstockAmount = string.Format("{0:0.00}", r.RequestedAmount),
+ realOutstockAmount = string.Format("{0:0.00}", r.RealOutstockAmount),
isSendOver = r.RequestedAmount <= r.RealOutstockAmount ? "已出完" : "未出完",
thisOutAmount = r.PalletDetails
};
@@ -533,7 +636,7 @@ namespace Khd.Core.Wpf.Form
{
}
- Thread.Sleep(1000);
+ Thread.Sleep(2000);
}
}
@@ -784,10 +887,10 @@ namespace Khd.Core.Wpf.Form
this.LoadMaterial0.ItemsSource = null;
this.LoadMaterial0.ItemsSource = taskModel;
this.LoadMaterial0.Items.Refresh();
- if (data.Count == 0)
- {
- HandyControl.Controls.MessageBox.Show("未查询到数据");
- }
+ //if (data.Count == 0)
+ //{
+ // HandyControl.Controls.MessageBox.Show("未查询到数据");
+ //}
}
///
/// 删除任务
@@ -1297,6 +1400,7 @@ namespace Khd.Core.Wpf.Form
{
if (HandyControl.Controls.MessageBox.Show("是否确认关闭程序", "提示信息", MessageBoxButton.YesNo, MessageBoxImage.Information) == MessageBoxResult.Yes)
{
+ Application.Current.Shutdown();
System.Environment.Exit(System.Environment.ExitCode);
}
}
@@ -1353,56 +1457,78 @@ namespace Khd.Core.Wpf.Form
{
try
{
- using var scope = _host.Services.CreateScope();
- using var dbContext = scope.ServiceProvider.GetRequiredService();
- BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
- baseEquip.endStationCode = string.Empty;
- baseEquip.ud3 = null;
- dbContext.Update(baseEquip);
- var wcsCmd = dbContext.WcsTask
- .Where(t => t.taskStatus == 6 || t.taskStatus == 3)
- .Where(t => t.nextPointId == 10)
- .FirstOrDefault();
- if (wcsCmd == null)
+ MessageBoxResult messageBoxResult = HandyControl.Controls.MessageBox.Show("是否确认捡料完成?", "提示信息", MessageBoxButton.YesNo, MessageBoxImage.Information);
+ if (messageBoxResult == MessageBoxResult.Yes)
{
- HandyControl.Controls.MessageBox.Error("未查询到当前有背负式Agv由装配区到捡料区任务");
- }
- else
- {
- if (wcsCmd.taskType == 32)//领料
+ //剩余出库单
+ int count = OutTaskNumber.Items.Count;
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+
+ var wcsCmd = dbContext.WcsTask
+ .Where(t => t.taskStatus == 6 || t.taskStatus == 3)
+ .Where(t => t.nextPointId == 10)
+ .FirstOrDefault();
+ if (wcsCmd == null)
{
- MessageBoxResult messageBoxResult = HandyControl.Controls.MessageBox.Show("是否需要背负式小车返回?", "提示信息", MessageBoxButton.YesNoCancel, MessageBoxImage.Information);
- if (messageBoxResult == MessageBoxResult.Yes)
- {
- WcsTask wcsTask = CoreMapper.Map(wcsCmd);
- wcsTask.taskStatus = 0;
- wcsTask.createTime = DateTime.Now;
- wcsTask.useFlag = 1;
- wcsTask.objid = Global.SnowId.NextId();
- WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask);
- dbContext.Add(wcsTaskLog);
- dbContext.Add(wcsTask);
- }
- else if (messageBoxResult == MessageBoxResult.Cancel)
- {
- return;
- }
- if (wcsCmd.taskStatus == 3)
- {
- wcsCmd.taskStatus = 4;
- }
+ HandyControl.Controls.MessageBox.Error("未查询到当前有背负式Agv由装配区到捡料区任务");
}
- else if (wcsCmd.taskType == 48)//返库
+ else
{
- if (wcsCmd.taskStatus == 6)
+ if (wcsCmd.taskType == 32)//领料
{
- wcsCmd.taskStatus = 7;
+ if (count > 0)
+ {
+ MessageBoxResult messageBoxResult1 = HandyControl.Controls.MessageBox.Show("是否需要背负式小车返回?", "提示信息", MessageBoxButton.YesNoCancel, MessageBoxImage.Information);
+ if (messageBoxResult1 == MessageBoxResult.Yes)
+ {
+ WcsTask wcsTask = CoreMapper.Map(wcsCmd);
+ wcsTask.taskStatus = 0;
+ wcsTask.createTime = DateTime.Now;
+ wcsTask.useFlag = 1;
+ wcsTask.objid = Global.SnowId.NextId();
+ WcsTaskLog wcsTaskLog = CoreMapper.Map(wcsTask);
+ dbContext.Add(wcsTaskLog);
+ dbContext.Add(wcsTask);
+ }
+ else
+ {
+ BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
+ baseEquip.endStationCode = string.Empty;
+ baseEquip.ud3 = null;
+ dbContext.Update(baseEquip);
+
+ }
+
+ }
+ else
+ {
+ BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
+ baseEquip.endStationCode = string.Empty;
+ baseEquip.ud3 = null;
+ dbContext.Update(baseEquip);
+ dbContext.SaveChanges();
+
+ }
+
+ if (wcsCmd.taskStatus == 3)
+ {
+ wcsCmd.taskStatus = 4;
+ }
}
+ else if (wcsCmd.taskType == 48)//返库
+ {
+ if (wcsCmd.taskStatus == 6)
+ {
+ wcsCmd.taskStatus = 7;
+ }
+ }
+ dbContext.Update(wcsCmd);
+ dbContext.SaveChanges();
+ HandyControl.Controls.MessageBox.Success("背负式Agv任务确认完成成功");
}
- dbContext.Update(wcsCmd);
- dbContext.SaveChanges();
- HandyControl.Controls.MessageBox.Success("背负式Agv任务确认完成成功");
}
+
}
catch (Exception ex)
{
@@ -1414,9 +1540,26 @@ namespace Khd.Core.Wpf.Form
///
///
///
- private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ private async void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
+ // 获取当前选中的TabItem
+ var selectedTabItem = TabControl.SelectedItem as TabItem;
+
+ //if (selectedTabItem != null && selectedTabItem.Name == "TaskManager")
+ //{ //任务界面
+
+ // GetTask();
+ //}
+ if (selectedTabItem != null && selectedTabItem.Name == "CallPersonManager")
+ { //人工叫料界面
+ CallSelectedItem.Clear();
+ await GetPersonCallMaterialData();
+ }
+ else if (selectedTabItem != null && selectedTabItem.Name == "InventoryManager")
+ { //盘库界面
+ GetInvertoryData();
+ }
}
///
/// 添加任务
@@ -1813,15 +1956,21 @@ namespace Khd.Core.Wpf.Form
var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == txtInBarCode.Text);
WmsRawInstock wmsRawInstock = new WmsRawInstock()
{
+ taskCode = Global.SnowId.NextId().ToString(),
+ materialBarCode = mesBaseBarcodeInfo.barcodeInfo,
+ materialBatchCode = mesBaseBarcodeInfo.batchCode,
+ applyBy = "WPF",
+ applyDate = System.DateTime.Now,
+ purchaseOrderId = mesBaseBarcodeInfo.PurchaseOrderId,
+
beginTime = System.DateTime.Now,
endTime = DateTime.Now,
locationCode = container.locationCode,
executeStatus = "2",
instockAmount = amount,
instockType = "1",
- materialBatchCode = txtInBarCode.Text,
materialId = material.materialId,
- operationType = "2",
+ operationType = "1",
palletInfoCode = container.containerCode,
poNo = mesBaseBarcodeInfo.poNo,
warehouseId = 512
@@ -1861,15 +2010,21 @@ namespace Khd.Core.Wpf.Form
var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == txtInBarCode.Text);
WmsRawInstock wmsRawInstock = new WmsRawInstock()
{
+ taskCode = Global.SnowId.NextId().ToString(),
+ materialBarCode = mesBaseBarcodeInfo.barcodeInfo,
+ materialBatchCode = mesBaseBarcodeInfo.batchCode,
+ applyBy = "WPF",
+ applyDate = System.DateTime.Now,
+ purchaseOrderId = mesBaseBarcodeInfo.PurchaseOrderId,
+
beginTime = System.DateTime.Now,
endTime = DateTime.Now,
locationCode = container.locationCode,
executeStatus = "2",
instockAmount = amount,
instockType = "1",
- materialBatchCode = txtInBarCode.Text,
materialId = material.materialId,
- operationType = "2",
+ operationType = "1",
palletInfoCode = container.containerCode,
poNo = mesBaseBarcodeInfo.poNo,
warehouseId = 512
@@ -1945,7 +2100,7 @@ namespace Khd.Core.Wpf.Form
List wmsRawStocks = dbContext.WmsRawStock
.Where(t => txtInBarCode.Text == t.instockBatch)
.Where(t => t.warehouseFloor == 5 && t.warehouseId == 512).ToList();
- if (wmsRawStocks.Count > 0)
+ if (wmsRawStocks.Count > 0 && material.batchFlag != "1")
{
HandyControl.Controls.MessageBox.Info($"该条码已入库!料箱号为{wmsRawStocks.First().palletInfoCode},库位号为{wmsRawStocks.First().locationCode}");
txtInBarCode.Text = string.Empty;
@@ -1965,30 +2120,67 @@ namespace Khd.Core.Wpf.Form
txtInScan.Text = string.Empty;
return;
}
- var newRawStock = new WmsRawStock()
- {
- materialId = material.materialId,
- supplierId = material.manufacturerId,
- instockBatch = txtInBarCode.Text,
- locationCode = container.locationCode,
- stockType = "1",
- palletInfoCode = container.containerCode,
- totalAmount = material.batchFlag == "1" ? material.amount : 1,
- activeFlag = "1",
- occupyAmount = 0,
- completeFlag = "1",
- frozenAmount = 0,
- instockDate = System.DateTime.Now,
- rawStockId = Global.SnowId.NextId(),
- saleOrderId = material.saleOrderId == null ? 0 : material.saleOrderId,
- warehouseFloor = 5,
- warehouseId = 512,
- createBy = "扫描退库",
- createDate = System.DateTime.Now,
- safeFlag = material.safeFlag
- };
- dbContext.WmsRawStock.Add(newRawStock);
+ decimal amount = decimal.Parse(txtInScan.Text);
+ wmsRawReturn.returnAmount += amount;
+ if (wmsRawReturn.returnAmount >= wmsRawReturn.planAmount)
+ {
+ wmsRawReturn.executeStatus = "2";
+ wmsRawReturn.endTime = DateTime.Now;
+ }
+
+ WmsRawReturnDetail? wmsRawReturnDetail = new WmsRawReturnDetail();
+ wmsRawReturnDetail.RawReturnId = (long)wmsRawReturn.rawReturnId;
+ wmsRawReturnDetail.LocationCode = container.locationCode;
+ wmsRawReturnDetail.MaterialBarcode = txtInBarCode.Text;
+ wmsRawReturnDetail.MaterialId = (long)material.materialId;
+ wmsRawReturnDetail.InstockBatch = material.batchCode;
+ wmsRawReturnDetail.MaterialProductionDate = material.productionDate;
+ wmsRawReturnDetail.PlanAmount = wmsRawReturn.planAmount;
+ wmsRawReturnDetail.ReturnAmount = wmsRawReturn.returnAmount;
+ wmsRawReturnDetail.ExecuteStatus = "2";
+ wmsRawReturnDetail.ReturnAmount = wmsRawReturn.returnAmount;
+ wmsRawReturnDetail.ReturnPerson = "WPF";
+ wmsRawReturnDetail.ReturnTime = DateTime.Now;
+ wmsRawReturnDetail.ReturnWay = "2";
+ wmsRawReturnDetail.CreateBy = "WPF";
+ wmsRawReturnDetail.CreateDate = DateTime.Now;
+
+
+ if (wmsRawStocks.Count > 0)
+ { // 批次条码并且有库存
+ var newRawStock = wmsRawStocks.First();
+ newRawStock.totalAmount += amount;
+ newRawStock.updateDate = DateTime.Now;
+ dbContext.WmsRawStock.Update(newRawStock);
+ }
+ else
+ { // 无库存
+ var newRawStock = new WmsRawStock()
+ {
+ materialId = material.materialId,
+ supplierId = material.manufacturerId,
+ instockBatch = txtInBarCode.Text,
+ locationCode = container.locationCode,
+ stockType = "1",
+ palletInfoCode = container.containerCode,
+ totalAmount = material.batchFlag == "1" ? amount : 1,
+ activeFlag = "1",
+ occupyAmount = 0,
+ completeFlag = "1",
+ frozenAmount = 0,
+ instockDate = System.DateTime.Now,
+ rawStockId = Global.SnowId.NextId(),
+ saleOrderId = material.saleOrderId == null ? 0 : material.saleOrderId,
+ warehouseFloor = 5,
+ warehouseId = 512,
+ createBy = "扫描退库",
+ createDate = System.DateTime.Now,
+ safeFlag = material.safeFlag
+ };
+ dbContext.WmsRawStock.Add(newRawStock);
+ }
+
dbContext.SaveChanges();
HandyControl.Controls.MessageBox.Success("入库成功!");
txtInBarCode.Text = string.Empty;
@@ -2284,7 +2476,7 @@ namespace Khd.Core.Wpf.Form
outMaterialNameTxt.Text = materialInfo.MaterialName;
outMaterialSpecTxt.Text = materialInfo.MaterialSpec;
}
- txtTotalAmount.Text = string.Format("{0:0}", wmsRawStock.totalAmount - wmsRawStock.frozenAmount);
+ txtTotalAmount.Text = string.Format("{0:0.00}", wmsRawStock.totalAmount - wmsRawStock.frozenAmount);
txtOutScan.Focus();
//txtOutScan.Text = string.Format("{0:0}", (mesBaseMaterialInfo.batchFlag == "1" ? (wmsRawStock.totalAmount - wmsRawStock.frozenAmount) : 1)) ;
//if (mesBaseMaterialInfo.batchFlag == "1")
@@ -2328,10 +2520,14 @@ namespace Khd.Core.Wpf.Form
{
try
{
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
+
+
if (!string.IsNullOrEmpty(txtOutBox.Text) && !string.IsNullOrEmpty(txtOutBarCode.Text))
{
- using var scope = _host.Services.CreateScope();
- using var dbContext = scope.ServiceProvider.GetRequiredService();
+
var wmsRawStock = dbContext.WmsRawStock
.FirstOrDefault(t => t.instockBatch == txtOutBarCode.Text && t.palletInfoCode == txtOutBox.Text);
if (wmsRawStock == null)
@@ -2357,7 +2553,7 @@ namespace Khd.Core.Wpf.Form
if (mesBaseBarcodeInfo != null)
{
WmsRawOutstock? wmsRawOutstock = dbContext.WmsRawOutstock
- .Where(t => t.materialId == mesBaseBarcodeInfo.materialId && t.realOutstockAmount < t.outstockAmount && t.saleOrderId == (mesBaseBarcodeInfo.saleOrderId == null ? 0 : mesBaseBarcodeInfo.saleOrderId)).FirstOrDefault();
+ .Where(t => t.materialId == mesBaseBarcodeInfo.materialId && t.realOutstockAmount < t.outstockAmount && t.saleOrderId == (mesBaseBarcodeInfo.saleOrderId == null ? 0 : mesBaseBarcodeInfo.saleOrderId) && t.endStationCode == baseEquip.endStationCode).FirstOrDefault();
if (wmsRawOutstock != null)
{
wmsRawOutstock.realOutstockAmount += outScan;
@@ -2410,6 +2606,19 @@ namespace Khd.Core.Wpf.Form
}
else
{
+ // 没有申请单
+ // 如果选中了出库单,并且无需要出库的申请单,则禁止出库
+
+ if (!string.IsNullOrEmpty(baseEquip.endStationCode))
+ {
+ scanOutMsg.Text = "申请单里该条码无需出库!";
+ return;
+ }
+ if (wmsRawStock.safeFlag != "1")
+ {
+ scanOutMsg.Text = "该条码不是安全库存,且无申请单,禁止出库!";
+ return;
+ }
if (mesBaseBarcodeInfo.PurchaseOrderId == null)
{
wmsRawStock.totalAmount -= outScan;
@@ -2439,6 +2648,7 @@ namespace Khd.Core.Wpf.Form
newWmsRawOutstock.taskType = "1";
newWmsRawOutstock.auditStatus = "1";
newWmsRawOutstock.applyBy = "CtuGun";
+ newWmsRawOutstock.applyDate = DateTime.Now;
newWmsRawOutstock.executeStatus = "2";
newWmsRawOutstock.saleOrderId = mesBaseBarcodeInfo.saleOrderId;
newWmsRawOutstock.updateDate = DateTime.Now;
@@ -2595,8 +2805,8 @@ namespace Khd.Core.Wpf.Form
materialSpec = c.MaterialSpec,
palletInfoCode = b.palletInfoCode,
//instockDate = b.instockDate,
- totalAmount = b.totalAmount,
- frozenAmount = b.frozenAmount,
+ totalAmount = Math.Round((decimal)b.totalAmount, 2),
+ frozenAmount = Math.Round((decimal)b.frozenAmount, 2),
IsSelected = CallSelectedItem.Contains(a.locationId)
};
@@ -2664,157 +2874,179 @@ namespace Khd.Core.Wpf.Form
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService();
var InventoryCheck = dbContext.WmsInventoryCheck
- .Where(t => t.CheckStatus == "0" || t.CheckStatus == "1")
.Where(t => t.InventoryCheckId == inventoryCheckId).FirstOrDefault();
+ if (InventoryCheck == null || InventoryCheck.CheckStatus == "2")
+ {
+ MessageBox.Show("盘点单不存在或已盘点");
+ return;
+ }
BaseEquip agvEquip = SystemData.BaseEquip.First(t => t.objid == 11);
BaseEquip lineEquip = SystemData.BaseEquip.First(t => t.objid == 20);
- if (InventoryCheck != null)
+
+ if (InventoryCheck.InventoryingAmount != 0)
{
- if (InventoryCheck.InventoryingAmount != 0)
+ bool hasTask = dbContext.WcsTask.Where(t => t.taskType == 100).Any();
+ if (!hasTask)
{
- bool hasTask = dbContext.WcsTask.Where(t => t.taskType == 100).Any();
+ hasTask = dbContext.WcsTaskManual.Where(t => t.taskType == 100).Any();
if (!hasTask)
{
- hasTask = dbContext.WcsTaskManual.Where(t => t.taskType == 100).Any();
- if (!hasTask)
- {
- InventoryCheck.InventoriedAmount += InventoryCheck.InventoryingAmount;
- InventoryCheck.InventoryingAmount = 0;
- }
+ InventoryCheck.InventoriedAmount += InventoryCheck.InventoryingAmount;
+ InventoryCheck.InventoryingAmount = 0;
}
}
- if (InventoryCheck.InventoryingAmount == 0)
+ }
+ if (InventoryCheck.InventoryingAmount == 0)
+ {
+ bool hasTask = dbContext.WcsTask.Where(t => t.taskType == 100).Any();
+ if (!hasTask)
{
- bool hasTask = dbContext.WcsTask.Where(t => t.taskType == 100).Any();
+ hasTask = dbContext.WcsTaskManual.Where(t => t.taskType == 100).Any();
if (!hasTask)
{
- hasTask = dbContext.WcsTaskManual.Where(t => t.taskType == 100).Any();
- if (!hasTask)
+ List? locationCodeList = null;
+ if (!string.IsNullOrEmpty(InventoryCheck.MaterialId))
{
- var wmsBaseLocations = dbContext.WmsBaseLocation
- .Where(t => t.ContainerStatus == "1")
- .Where(t => t.locationStatus == "1")
- .OrderBy(t => t.locRow)
- .ThenBy(t => t.locColumn)
- .ToList();
- var wmsInventoryCheckDetails = dbContext.WmsInventoryCheckDetail
- .Where(t => t.InventoryCheckId == InventoryCheck.InventoryCheckId).ToList();
- List locationCodes = wmsInventoryCheckDetails.Select(t => t.LocationCode).Distinct().ToList();
- wmsBaseLocations.RemoveAll(t => locationCodes.Contains(t.locationCode));
- if (wmsBaseLocations.Count > 0)
+ List materialIds = InventoryCheck.MaterialId.Split(';').Select(id => long.Parse(id)).ToList();
+ if(materialIds!=null && materialIds.Count > 0)
{
- List locations = wmsBaseLocations.Select(t => t.locationCode).ToList();
- List wmsRawStocks = dbContext.WmsRawStock.Where(t => t.warehouseId == 512).ToList();
- var wmsRawStock = wmsRawStocks
- .Where(t => locations.Contains(t.locationCode)).ToList();
- List codes = wmsRawStock.Select(t => t.locationCode).Distinct().ToList();
- var bill = from a in wmsBaseLocations
- from b in codes
- where a.locationCode == b
- select new { a };
- var outLocation = bill.OrderBy(t => t.a.locRow).ThenBy(t => t.a.locColumn).Take(6);
- List addList = new List();
- foreach (var item in outLocation)
+ // 盘点指定型号的物料库存的库位
+ locationCodeList = dbContext.WmsRawStock.Where(t => t.warehouseId == 512 && materialIds.Contains((long)t.materialId)).Select(x => x.locationCode).Distinct().ToList();
+ }
+
+ }
+ //所有满足条件的需要盘库的库位
+ var wmsBaseLocations = dbContext.WmsBaseLocation
+ .Where(t => t.ContainerStatus == "1" && t.warehouseId==512)
+ .Where(t => t.locationStatus == "1")
+ .OrderBy(t => t.locRow)
+ .ThenBy(t => t.locColumn)
+ .ToList();
+ if (locationCodeList != null && locationCodeList.Count > 0)
+ {
+ wmsBaseLocations = wmsBaseLocations.Where(x => locationCodeList.Contains(x.locationCode)).ToList();
+ }
+
+ var wmsInventoryCheckDetails = dbContext.WmsInventoryCheckDetail
+ .Where(t => t.InventoryCheckId == InventoryCheck.InventoryCheckId).ToList();
+ // 已经盘点过的库位
+ List locationCodes = wmsInventoryCheckDetails.Select(t => t.LocationCode).Distinct().ToList();
+ wmsBaseLocations.RemoveAll(t => locationCodes.Contains(t.locationCode));
+ if (wmsBaseLocations.Count > 0)
+ {
+ List locations = wmsBaseLocations.Select(t => t.locationCode).ToList();
+
+ List wmsRawStocks = dbContext.WmsRawStock.Where(t => t.warehouseId == 512)
+ .Where(t => locations.Contains(t.locationCode)).ToList();
+
+ // 过滤后需要满足条件的有库存的库位
+ List codes = wmsRawStocks.Select(t => t.locationCode).Distinct().ToList();
+
+ var bill = from a in wmsBaseLocations
+ from b in codes
+ where a.locationCode == b
+ select new { a };
+ var outLocation = bill.OrderBy(t => t.a.locRow).ThenBy(t => t.a.locColumn).Take(6);
+ List addList = new List();
+ foreach (var item in outLocation)
+ {
+ WmsBaseLocation startBaseLocation = item.a;
+ startBaseLocation.locationStatus = "6";
+ //startBaseLocation.ContainerStatus = "2";
+
+ addList.Add(new WcsTaskManual()
{
- WmsBaseLocation startBaseLocation = item.a;
- startBaseLocation.locationStatus = "6";
- startBaseLocation.ContainerStatus = "2";
- addList.Add(new WcsTaskManual()
+ objid = Global.SnowId.NextId(),
+ taskType = 100,
+ containerNo = startBaseLocation.containerCode,
+ currPointId = startBaseLocation.locationId,
+ currPointNo = startBaseLocation.locationCode,
+ nextPointId = agvEquip.objid,
+ nextPointNo = agvEquip.equipNo,
+ endPointId = lineEquip.objid,
+ endPointNo = lineEquip.equipNo,
+ createTime = DateTime.Now,
+ ud1 = startBaseLocation.locColumn,
+ taskStatus = 0,
+ remark = "CTU盘点任务",
+ floorNo = 5,
+ fromFloorNo = 5,
+ useFlag = 1
+ });
+ dbContext.Update(startBaseLocation);
+ }
+ //for (int i = addList.Count + 1; i <= 6; i++)
+ //{
+ // List list = addList.Select(t => t.currPointId).ToList();
+ // WmsBaseLocation? startBaseLocation = wmsBaseLocations.Where(t => !list.Contains(t.locationId)).FirstOrDefault();
+ // if (startBaseLocation != null)
+ // {
+ // startBaseLocation.locationStatus = "6";
+ // startBaseLocation.ContainerStatus = "2";
+ // addList.Add(new WcsTaskManual()
+ // {
+ // objid = Global.SnowId.NextId(),
+ // taskType = 100,
+ // orderId = InventoryCheck.InventoryCheckId,
+ // containerNo = startBaseLocation.containerCode,
+ // currPointId = startBaseLocation.locationId,
+ // currPointNo = startBaseLocation.locationCode,
+ // nextPointId = agvEquip.objid,
+ // nextPointNo = agvEquip.equipNo,
+ // endPointId = lineEquip.objid,
+ // endPointNo = lineEquip.equipNo,
+ // createTime = DateTime.Now,
+ // ud1 = startBaseLocation.locColumn,
+ // taskStatus = 0,
+ // remark = "CTU盘点任务",
+ // floorNo = 5,
+ // fromFloorNo = 5,
+ // useFlag = 1,
+ // });
+ // dbContext.Update(startBaseLocation);
+ // }
+ //}
+ List addCheckDetail = new List();
+ foreach (var item in addList)
+ {
+ List itemList = wmsRawStocks.Where(t => t.locationCode == item.currPointNo).ToList();
+ foreach (var rawItem in itemList)
+ {
+ addCheckDetail.Add(new WmsInventoryCheckDetail
{
- objid = Global.SnowId.NextId(),
- taskType = 100,
- containerNo = startBaseLocation.containerCode,
- currPointId = startBaseLocation.locationId,
- currPointNo = startBaseLocation.locationCode,
- nextPointId = agvEquip.objid,
- nextPointNo = agvEquip.equipNo,
- endPointId = lineEquip.objid,
- endPointNo = lineEquip.equipNo,
- createTime = DateTime.Now,
- ud1 = startBaseLocation.locColumn,
- taskStatus = 0,
- remark = "CTU盘点任务",
- floorNo = 5,
- fromFloorNo = 5,
- useFlag = 1
+ InventoryCheckDetailId = Global.SnowId.NextId(),
+ InventoryCheckId = inventoryCheckId,
+ CheckStatus = "1",
+ CreateBy = "WCS",
+ CreateTime = DateTime.Now,
+ StockAmount = rawItem.totalAmount,
+ RealAmount = rawItem.totalAmount,
+ InventoryCount = 0,
+ LocationCode = rawItem.locationCode,
+ MaterialBatch = rawItem.instockBatch,
+ StockId = 1,
+ StockType = "1",
+ MaterialId = rawItem.materialId,
+ ErpStatus = "0",
+ ErpAmount = 0,
+ CheckType ="1"
});
- dbContext.Update(startBaseLocation);
}
- for (int i = addList.Count + 1; i <= 6; i++)
- {
- List list = addList.Select(t => t.currPointId).ToList();
- WmsBaseLocation? startBaseLocation = wmsBaseLocations.Where(t => !list.Contains(t.locationId)).FirstOrDefault();
- if (startBaseLocation != null)
- {
- startBaseLocation.locationStatus = "6";
- startBaseLocation.ContainerStatus = "2";
- addList.Add(new WcsTaskManual()
- {
- objid = Global.SnowId.NextId(),
- taskType = 100,
- orderId = InventoryCheck.InventoryCheckId,
- containerNo = startBaseLocation.containerCode,
- currPointId = startBaseLocation.locationId,
- currPointNo = startBaseLocation.locationCode,
- nextPointId = agvEquip.objid,
- nextPointNo = agvEquip.equipNo,
- endPointId = lineEquip.objid,
- endPointNo = lineEquip.equipNo,
- createTime = DateTime.Now,
- ud1 = startBaseLocation.locColumn,
- taskStatus = 0,
- remark = "CTU盘点任务",
- floorNo = 5,
- fromFloorNo = 5,
- useFlag = 1,
- });
- dbContext.Update(startBaseLocation);
- }
- }
- List addCheckDetail = new List();
- foreach (var item in addList)
- {
- List itemList = wmsRawStocks.Where(t => t.locationCode == item.currPointNo).ToList();
- foreach (var rawItem in itemList)
- {
- addCheckDetail.Add(new WmsInventoryCheckDetail
- {
- InventoryCheckDetailId = Global.SnowId.NextId(),
- InventoryCheckId = inventoryCheckId,
- CheckStatus = "1",
- CreateBy = "WCS",
- CreateTime = DateTime.Now,
- StockAmount = rawItem.totalAmount,
- RealAmount = rawItem.totalAmount,
- InventoryCount = 0,
- LocationCode = rawItem.locationCode,
- StockId = 1,
- StockType = "1",
- MaterialId = rawItem.materialId,
- ErpStatus = "0",
- ErpAmount = 0,
- });
- }
- }
- InventoryCheck.InventoryingAmount += addList.Count;
- if (InventoryCheck.BeginTime == null)
- {
- InventoryCheck.BeginTime = DateTime.Now;
- InventoryCheck.CheckStatus = "1";
- }
- dbContext.AddRange(addCheckDetail);
- dbContext.AddRange(addList);
- dbContext.SaveChanges();
- HandyControl.Controls.MessageBox.Show("任务创建成功!");
}
- else
+ InventoryCheck.InventoryingAmount += addList.Count;
+ if (InventoryCheck.BeginTime == null)
{
- HandyControl.Controls.MessageBox.Error("无可盘点库位!");
+ InventoryCheck.BeginTime = DateTime.Now;
+ InventoryCheck.CheckStatus = "1";
}
+ dbContext.AddRange(addCheckDetail);
+ dbContext.AddRange(addList);
+ dbContext.SaveChanges();
+ HandyControl.Controls.MessageBox.Show("任务创建成功!");
}
else
{
- HandyControl.Controls.MessageBox.Info("当前有盘点任务正在出库");
+ HandyControl.Controls.MessageBox.Error("无可盘点库位!");
}
}
else
@@ -2824,16 +3056,59 @@ namespace Khd.Core.Wpf.Form
}
else
{
- HandyControl.Controls.MessageBox.Info("盘点中,请等待本次盘点完成!");
+ HandyControl.Controls.MessageBox.Info("当前有盘点任务正在出库");
}
}
else
{
- HandyControl.Controls.MessageBox.Error("当前盘点点不可用!");
+ HandyControl.Controls.MessageBox.Info("盘点中,请等待本次盘点完成!");
}
+
GetInvertoryData();
}
+
+ ///
+ /// 结束盘点
+ ///
+ ///
+ ///
+ private void EndInventory(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ dynamic wmsInventoryCheck = this.InventoryMaterial.SelectedItem;
+ long inventoryCheckId = wmsInventoryCheck.InventoryCheckId;
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ var InventoryCheck = dbContext.WmsInventoryCheck
+ .Where(t => t.InventoryCheckId == inventoryCheckId).FirstOrDefault();
+ if (InventoryCheck.CheckStatus != "2")
+ {
+ InventoryCheck.CheckStatus = "2";
+ InventoryCheck.EndTime = DateTime.Now;
+ }
+ dbContext.WmsInventoryCheck.Update(InventoryCheck);
+ dbContext.SaveChanges();
+ GetInvertoryData();
+ }catch(Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ ///
+ /// 查看盘点详情界面
+ ///
+ ///
+ ///
+ private void OpenInventoryDetails(object sender, RoutedEventArgs e)
+ {
+ dynamic wmsInventoryCheck = this.InventoryMaterial.SelectedItem;
+ long inventoryCheckId = wmsInventoryCheck.InventoryCheckId;
+ InventoryDetails inventoryDetails = new InventoryDetails(_host, inventoryCheckId);
+ inventoryDetails.ShowDialog();
+ }
+
///
/// 叫空料箱
///
@@ -3354,6 +3629,26 @@ namespace Khd.Core.Wpf.Form
BasePlcpoint basePlcpoint = SystemData.BasePlcpoints.First(t => t.plcpointNo == "canReceive");
SystemData.PlcDic[1].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString());
MsgText.Text = "一键收料发送成功";
+ HandyControl.Controls.MessageBox.Show("一键收料发送成功!");
+
+ // 修改所有盘库明细任务状态
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ List list = dbContext.WmsInventoryCheckDetail.Where(t => t.CheckStatus=="1").ToList();
+ if (list != null)
+ {
+ list.ForEach(t => t.CheckStatus = "2");
+ dbContext.UpdateRange(list);
+ }
+ WmsInventoryCheck wmsInventoryCheck = dbContext.WmsInventoryCheck.FirstOrDefault(t => t.CheckStatus == "1");
+ if(wmsInventoryCheck != null)
+ {
+ wmsInventoryCheck.InventoriedAmount = dbContext.WmsInventoryCheckDetail.Where(t => t.InventoryCheckId == wmsInventoryCheck.InventoryCheckId).Select(t=>t.LocationCode).Distinct().Count();
+ wmsInventoryCheck.InventoryingAmount = 0;
+ dbContext.SaveChanges();
+ }
+
+ GetInvertoryData();
}
catch (Exception ex)
{
@@ -4053,66 +4348,9 @@ namespace Khd.Core.Wpf.Form
///
private void AddInventoryButton_Click(object sender, RoutedEventArgs e)
{
- try
- {
- using var scope = _host.Services.CreateScope();
- using var dbContext = scope.ServiceProvider.GetRequiredService();
- var Orders = dbContext.WmsInventoryCheck.Where(t => t.CheckStatus == "0" || t.CheckStatus == "1").ToList();
- if (Orders != null && Orders.Count > 0)
- {
- MessageBoxResult messageBoxResult = HandyControl.Controls.MessageBox.Show("已经有盘库任务是否重新开始一个盘库任务?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question);
- if (messageBoxResult == MessageBoxResult.OK)
- {
- Orders.ForEach(t =>
- {
- t.CheckStatus = "2";
- });
- dbContext.UpdateRange(Orders);
- int locationCount = dbContext.WmsBaseLocation.Where(t => t.warehouseId == 512).Count();
- dbContext.Add(new WmsInventoryCheck()
- {
- CreateTime = DateTime.Now,
- CheckStatus = "0",
- LocationAmount = locationCount,
- InventoriedAmount = 0,
- InventoryingAmount = 0,
- WarehouseId = 512,
- CreateBy = "WCS"
- });
- dbContext.SaveChanges();
- HandyControl.Controls.Growl.Info("创建盘库任务成功!");
- }
- else
- {
- return;
- }
- }
- else
- {
- MessageBoxResult messageBoxResult = HandyControl.Controls.MessageBox.Show("是否创建一个盘库任务?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question);
- if (messageBoxResult == MessageBoxResult.OK)
- {
- int locationCount = dbContext.WmsBaseLocation.Where(t => t.warehouseId == 512).Count();
- dbContext.Add(new WmsInventoryCheck()
- {
- CreateTime = DateTime.Now,
- CheckStatus = "0",
- LocationAmount = locationCount,
- InventoriedAmount = 0,
- InventoryingAmount = 0,
- WarehouseId = 512,
- CreateBy = "WCS"
- });
- dbContext.SaveChanges();
- HandyControl.Controls.Growl.Info("创建盘库任务成功!");
- }
- }
- }
- catch
- {
+ InventoryMaterialWindow window = new InventoryMaterialWindow(_host);
+ window.ShowDialog();
- }
- GetInvertoryData();
}
private void GetInvertoryData()
@@ -4141,6 +4379,10 @@ namespace Khd.Core.Wpf.Form
UpdateBy = t.UpdateBy,
UpdateTime = t.UpdateTime,
WarehouseId = t.WarehouseId,
+ StartContent = t.CheckStatus == "0" ? "开始盘点" : "继续盘点",
+ StartEnable = t.CheckStatus == "2" ? false : true,
+ EndEnable = t.CheckStatus == "2" ? false : true,
+
});
this.InventoryMaterial.Items.Refresh();
@@ -4180,17 +4422,25 @@ namespace Khd.Core.Wpf.Form
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService();
- List wcsTasks = dbContext.WcsTask.Where(t => t.taskType == 30).ToList();
- if (wcsTasks != null && wcsTasks.Count > 0)
- {
- HandyControl.Controls.MessageBox.Show("已经有出库任务请等待出库完成后,再进行继续出库!");
- return;
- }
BaseEquip baseEquip = dbContext.BaseEquip.Where(t => t.objid == 10).First();
- baseEquip.IsOut = 1;
- dbContext.Update(baseEquip);
- dbContext.SaveChanges();
- HandyControl.Controls.MessageBox.Show("继续出库成功!");
+ if (!string.IsNullOrEmpty(baseEquip.endStationCode))
+ {
+ List wcsTasks = dbContext.WcsTask.Where(t => t.taskType == 30).ToList();
+ if (wcsTasks != null && wcsTasks.Count > 0)
+ {
+ scanOutMsg.Text = "已经有出库任务请等待出库完成后,再进行继续出库!";
+ return;
+ }
+
+ baseEquip.IsOut = 1;
+ dbContext.Update(baseEquip);
+ dbContext.SaveChanges();
+ scanOutMsg.Text = "继续出库成功!";
+ }
+ else
+ {
+ scanOutMsg.Text = "当前无正在出库单";
+ }
}
catch
{
@@ -4299,7 +4549,8 @@ namespace Khd.Core.Wpf.Form
{
rawSourceMaterialName.Text = mesBaseMaterialInfo.MaterialName;
rawSourceMaterialSpec.Text = mesBaseMaterialInfo.MaterialSpec;
- this.removeScan.Text = string.Format("{0:0}", wmsRawStock.totalAmount - wmsRawStock.frozenAmount);
+ this.removeScan.Text = string.Format("{0:0.00}", wmsRawStock.totalAmount - wmsRawStock.frozenAmount);
+
removeSourceBox.Focus();
}
}
@@ -4331,6 +4582,7 @@ namespace Khd.Core.Wpf.Form
{
removeSourceMaterialName.Text = "";
removeSourceMaterialSpec.Text = "";
+ this.removeTotalStock.Text = "";
return;
}
string barCode = removeSourceBarCode.Text;
@@ -4351,6 +4603,7 @@ namespace Khd.Core.Wpf.Form
// removeSourceMaterialSpec.Text = "";
// return;
//}
+
var material = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == barCode);
if (material == null)
{
@@ -4372,6 +4625,12 @@ namespace Khd.Core.Wpf.Form
}
}
+ //判断目标库位是否有该物料
+ WmsRawStock? removeStock = dbContext.WmsRawStock.Where(t => t.instockBatch == this.removeSourceBarCode.Text).FirstOrDefault();
+ if (removeStock != null)
+ {
+ this.removeTotalStock.Text = string.Format("{0:0.00}", removeStock.totalAmount);
+ }
}
catch (Exception ex)
{
@@ -4384,7 +4643,7 @@ namespace Khd.Core.Wpf.Form
private void btnRemoveConfirmBox_Click(object sender, RoutedEventArgs e)
{
-
+ this.RemoveMsg.Text = "";
if (string.IsNullOrEmpty(this.rawSourceBox.Text))
{
this.RemoveMsg.Text = "请先选择原托盘!";
@@ -4405,46 +4664,138 @@ namespace Khd.Core.Wpf.Form
this.RemoveMsg.Text = "请先选择移库目标条码!";
return;
}
+ decimal amount = decimal.Parse(this.removeScan.Text);
+ if (amount <= 0)
+ {
+ this.RemoveMsg.Text = "移库数量需要大于0!";
+ return;
+ }
+
+
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService();
+
+ WmsRawStock? sourceWmsRawStock = dbContext.WmsRawStock
+ .Where(t => t.instockBatch == this.rawSourceBarCode.Text).FirstOrDefault();
+ if (sourceWmsRawStock == null)
+ {
+ this.RemoveMsg.Text = "该条码无库存,请核查";
+ return;
+ }
+ if (amount > (sourceWmsRawStock.totalAmount - sourceWmsRawStock.frozenAmount))
+ {
+ this.RemoveMsg.Text = "移库数量不能大于库存数量";
+ return;
+ }
+
try
{
+
WmsBaseLocation removeLocation = dbContext.WmsBaseLocation.Where(t => t.containerCode == this.removeSourceBox.Text).First();
- WmsBaseLocation rawLocation = dbContext.WmsBaseLocation.Where(t => t.containerCode == this.rawSourceBox.Text).First();
+ WmsBaseLocation sourceLocation = dbContext.WmsBaseLocation.Where(t => t.containerCode == this.rawSourceBox.Text).First();
//1.先校验物料类型是否一致
var rawBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == this.rawSourceBarCode.Text);
var removeBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == this.removeSourceBarCode.Text);
if (rawBarcodeInfo.materialId != removeBarcodeInfo.materialId)
{
- this.RemoveMsg.Text = "两个条码物料类型不同,请更换目标条码!";
+ this.RemoveMsg.Text = "两个条码物料类型不同,请更换移库目标条码!";
+ return;
+ }
+ if (rawBarcodeInfo.PurchaseOrderId != removeBarcodeInfo.PurchaseOrderId)
+ {
+ this.RemoveMsg.Text = "两个条码采购订单不同,请更换移库目标条码!";
return;
}
//判断目标库位是否有该物料
- WmsRawStock? targetStock = dbContext.WmsRawStock.Where(t => t.palletInfoCode == this.removeSourceBox.Text && t.materialId == rawBarcodeInfo.materialId).FirstOrDefault();
- if (targetStock == null || (targetStock != null && removeBarcodeInfo.batchFlag == "0"))
+ WmsRawStock? removeStock = dbContext.WmsRawStock.Where(t => t.instockBatch == this.removeSourceBarCode.Text).FirstOrDefault();
+ if (removeStock != null)
{
- // 更新 WmsRawStock 中的记录
- dbContext.WmsRawStock
- .Where(t => t.locationCode == rawLocation.locationCode)
- .Where(t => t.instockBatch == this.rawSourceBarCode.Text)
- .Update(t => new WmsRawStock
- {
- locationCode = removeLocation.locationCode, // 更新 locationCode
- palletInfoCode = removeLocation.containerCode // 更新 palletInfoCode
- });
+ sourceWmsRawStock.totalAmount -= decimal.Parse(this.removeScan.Text);
+ removeStock.totalAmount += decimal.Parse(this.removeScan.Text);
+ dbContext.WmsRawStock.Update(removeStock);
+ dbContext.WmsRawStock.Update(sourceWmsRawStock);
}
else
{
- targetStock.totalAmount += Convert.ToInt32(this.removeScan.Text);
- dbContext.WmsRawStock.Update(targetStock);
- }
- #region 插入移库记录
+ sourceWmsRawStock.totalAmount -= decimal.Parse(this.removeScan.Text);
+ removeStock = new WmsRawStock()
+ {
+ materialId = removeBarcodeInfo.materialId,
+ supplierId = removeBarcodeInfo.manufacturerId,
+ instockBatch = this.removeSourceBarCode.Text,
+ locationCode = removeLocation.locationCode,
+ stockType = "1",
+ palletInfoCode = removeLocation.containerCode,
+ totalAmount = decimal.Parse(this.removeScan.Text),
+ activeFlag = "1",
+ occupyAmount = 0,
+ completeFlag = "1",
+ frozenAmount = 0,
+ instockDate = System.DateTime.Now,
+ rawStockId = Global.SnowId.NextId(),
+ saleOrderId = removeBarcodeInfo.saleOrderId == null ? 0 : removeBarcodeInfo.saleOrderId,
+ warehouseFloor = 5,
+ warehouseId = 512,
+ createBy = "扫描入库",
+ createDate = System.DateTime.Now,
+ safeFlag = removeBarcodeInfo.safeFlag
+ };
+ dbContext.WmsRawStock.Add(removeStock);
+ dbContext.WmsRawStock.Update(sourceWmsRawStock);
+ }
+
+ if (sourceWmsRawStock.totalAmount == 0)
+ {
+ dbContext.WmsRawStock.Remove(sourceWmsRawStock);
+ }
+
+ #region 插入移库记录
+ WmsMove wmsMove = new WmsMove();
+ wmsMove.MoveId = Global.SnowId.NextId();
+ wmsMove.TaskCode = Global.SnowId.NextId().ToString();
+ wmsMove.WarehouseId = removeLocation.warehouseId;
+ wmsMove.OriLocationCode = sourceLocation.locationCode;
+ wmsMove.TargetLocationCode = removeLocation.locationCode;
+ wmsMove.InstockBatch = sourceWmsRawStock.instockBatch;
+ wmsMove.MaterialId = sourceWmsRawStock.materialId;
+ wmsMove.PlanAmount = decimal.Parse(this.removeScan.Text);
+ wmsMove.RealOutstockAmount = decimal.Parse(this.removeScan.Text);
+ wmsMove.RealInstockAmount = decimal.Parse(this.removeScan.Text);
+ wmsMove.OperationType = "1";
+ wmsMove.MoveWay = "1";
+ wmsMove.MoveType = "1";
+ wmsMove.AuditStatus = "1";
+ wmsMove.ExecuteStatus = "2";
+ wmsMove.UpdateBy = "WPF";
+ wmsMove.UpdateDate = DateTime.Now;
+ wmsMove.BeginTime = DateTime.Now;
+ wmsMove.EndTime = DateTime.Now;
+
+ WmsMoveDetail wmsMoveDetail = new WmsMoveDetail();
+ wmsMoveDetail.MoveId = wmsMove.MoveId;
+ wmsMoveDetail.MaterialBarcode = rawBarcodeInfo.barcodeInfo;
+ wmsMoveDetail.InstockBatch = rawBarcodeInfo.batchCode;
+ wmsMoveDetail.MaterialId = (long)rawBarcodeInfo.materialId;
+ wmsMoveDetail.LocationCode = removeLocation.locationCode;
+ wmsMoveDetail.PlanAmount = decimal.Parse(this.removeScan.Text);
+ wmsMoveDetail.RealInstockAmount = decimal.Parse(this.removeScan.Text);
+ wmsMoveDetail.RealAmount = decimal.Parse(this.removeScan.Text);
+ wmsMoveDetail.ExecuteStatus = "2";
+ wmsMoveDetail.ExecuteTime = DateTime.Now;
+ wmsMoveDetail.ExecuteEndTime = DateTime.Now;
+ wmsMoveDetail.ExecutePerson = "WPF";
+ wmsMoveDetail.UpdateBy = "WPF";
+ wmsMoveDetail.UpdateDate = DateTime.Now;
+
+ dbContext.WmsMove.Add(wmsMove);
+ dbContext.WmsMoveDetail.Add(wmsMoveDetail);
#endregion
dbContext.SaveChanges();
- this.RemoveMsg.Text = "移库成功!";
+
+ this.RemoveMsg.Text = $"移库成功!,原料箱库存:{string.Format("{0:0.00}", sourceWmsRawStock.totalAmount)},新料箱库存:{string.Format("{0:0.00}", removeStock.totalAmount)}";
removeSourceBarCode.Text = string.Empty;
removeSourceMaterialName.Text = "";
removeSourceMaterialSpec.Text = "";
@@ -4452,11 +4803,11 @@ namespace Khd.Core.Wpf.Form
rawSourceMaterialName.Text = "";
rawSourceMaterialSpec.Text = "";
this.removeScan.Text = "";
-
+ this.removeTotalStock.Text = "";
}
- catch
+ catch (Exception ex)
{
-
+ Console.Write("移库失败!,异常:" + ex.Message);
}
}
diff --git a/src/Khd.Core.Wpf/Khd.Core.Wpf.csproj b/src/Khd.Core.Wpf/Khd.Core.Wpf.csproj
index 3a5adee..0822264 100644
--- a/src/Khd.Core.Wpf/Khd.Core.Wpf.csproj
+++ b/src/Khd.Core.Wpf/Khd.Core.Wpf.csproj
@@ -478,6 +478,11 @@
Always
+
+
+ Code
+
+
PreserveNewest
diff --git a/src/Khd.Core.Wpf/TaskForm/EmptyCountForm.xaml b/src/Khd.Core.Wpf/TaskForm/EmptyCountForm.xaml
index 2f25711..0bd35bf 100644
--- a/src/Khd.Core.Wpf/TaskForm/EmptyCountForm.xaml
+++ b/src/Khd.Core.Wpf/TaskForm/EmptyCountForm.xaml
@@ -22,7 +22,7 @@
-
+
diff --git a/src/Khd.Core.Wpf/TaskForm/Inventory/AddNewStockForm.xaml b/src/Khd.Core.Wpf/TaskForm/Inventory/AddNewStockForm.xaml
new file mode 100644
index 0000000..5b0b0c7
--- /dev/null
+++ b/src/Khd.Core.Wpf/TaskForm/Inventory/AddNewStockForm.xaml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Khd.Core.Wpf/TaskForm/Inventory/AddNewStockForm.xaml.cs b/src/Khd.Core.Wpf/TaskForm/Inventory/AddNewStockForm.xaml.cs
new file mode 100644
index 0000000..e6ec36a
--- /dev/null
+++ b/src/Khd.Core.Wpf/TaskForm/Inventory/AddNewStockForm.xaml.cs
@@ -0,0 +1,335 @@
+using Khd.Core.Domain.Models;
+using Khd.Core.EntityFramework;
+using Khd.Core.Library.Mapper;
+using Khd.Core.Plc;
+using Khd.Core.Plc.S7;
+using Khd.Core.Wpf.Form;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Khd.Core.Wpf.TaskForm
+{
+ ///
+ /// AddTask.xaml 的交互逻辑
+ ///
+ public partial class AddNewStockForm : Window
+ {
+
+ public delegate void RefreshDelegate(string containerCode);
+ public static event RefreshDelegate? RefreshDelegateEvent;
+
+ private readonly IHost _host;
+ public AddNewStockForm(IHost host,string containerCode)
+ {
+ InitializeComponent();
+ _host = host;
+ txtInBox.Text = containerCode;
+ txtInBarCode.Focus();
+
+ }
+
+ private void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+
+
+ }
+
+ private void UpdateBtn_Click(object sender, RoutedEventArgs e)
+ {
+
+
+ }
+
+
+
+ private void CancelBtn_Click(object sender, RoutedEventArgs e)
+ {
+ this.Close();
+ }
+
+
+ //入库
+ private void InRawBaseLocaltion_Click(object sender, RoutedEventArgs e)
+ {
+ ScanInBox();
+ }
+
+
+ private void ScanInBox()
+ {
+ try
+ {
+
+ if (!string.IsNullOrEmpty(txtInBox.Text) && !string.IsNullOrEmpty(txtInBarCode.Text))
+ {
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ if (txtInScan.Text == "")
+ {
+ HandyControl.Controls.MessageBox.Error("请先输入数量"); return;
+ }
+ decimal amount = decimal.Parse(txtInScan.Text);
+ // 计算入库后当前总数量,仅用来提示使用
+ decimal? totalMessage = 0;
+ if (amount <= 0)
+ {
+ HandyControl.Controls.MessageBox.Error("入库数量需大于0");
+ return;
+ }
+ var material = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == txtInBarCode.Text);
+
+ var container = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == txtInBox.Text && t.warehouseId == 512);
+ List wmsRawStocks = dbContext.WmsRawStock
+ .Where(t => txtInBarCode.Text == t.instockBatch && t.palletInfoCode== txtInBox.Text)
+ .Where(t => t.warehouseFloor == 5 && t.warehouseId == 512).ToList();
+ if (container == null)
+ {
+ txtInBox.Focus();
+ txtInBox.Text = string.Empty;
+ txtInBarCode.Text = string.Empty;
+ txtInScan.Text = string.Empty;
+ HandyControl.Controls.MessageBox.Error("未查询到该容器"); return;
+ }
+ if (material == null)
+ {
+ HandyControl.Controls.MessageBox.Error("未查询到该条码内容");
+ txtInBox.Text = string.Empty;
+ txtInBarCode.Text = string.Empty;
+ txtInScan.Text = string.Empty;
+ txtInBox.Focus();
+ return;
+ }
+
+ if (wmsRawStocks.Count > 0)
+ {
+ if (material.batchFlag != "1")
+ {
+ HandyControl.Controls.MessageBox.Error($"该条码已入库!料箱号为{wmsRawStocks.First().palletInfoCode},库位号为{wmsRawStocks.First().locationCode}");
+ txtInBox.Text = string.Empty;
+ txtInBarCode.Text = string.Empty;
+ txtInScan.Text = string.Empty;
+ txtInBox.Focus();
+ return;
+ }
+ else
+ {
+ WmsRawStock wmsRawStock = wmsRawStocks.First();
+ wmsRawStock.totalAmount += amount;
+ dbContext.WmsRawStock.Update(wmsRawStock);
+
+ var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == txtInBarCode.Text);
+ WmsRawInstock wmsRawInstock = new WmsRawInstock()
+ {
+ taskCode = Global.SnowId.NextId().ToString(),
+ materialBarCode = mesBaseBarcodeInfo.barcodeInfo,
+ materialBatchCode = mesBaseBarcodeInfo.batchCode,
+ applyBy = "WPF",
+ applyDate = System.DateTime.Now,
+ purchaseOrderId = mesBaseBarcodeInfo.PurchaseOrderId,
+
+ beginTime = System.DateTime.Now,
+ endTime = DateTime.Now,
+ locationCode = container.locationCode,
+ executeStatus = "1",
+ instockAmount = amount,
+ instockType = "1",
+ materialId = material.materialId,
+ operationType = "1",
+ palletInfoCode = container.containerCode,
+ poNo = mesBaseBarcodeInfo.poNo,
+ warehouseId = 512
+ };
+
+ dbContext.WmsRawInstock.Add(wmsRawInstock);
+ dbContext.SaveChanges();
+ totalMessage = wmsRawStock.totalAmount;
+ }
+ }
+ else
+ {
+ var newRawStock = new WmsRawStock()
+ {
+ materialId = material.materialId,
+ supplierId = material.manufacturerId,
+ instockBatch = txtInBarCode.Text,
+ locationCode = container.locationCode,
+ stockType = "1",
+ palletInfoCode = container.containerCode,
+ totalAmount = material.batchFlag == "1" ? amount : 1,
+ activeFlag = "1",
+ occupyAmount = 0,
+ completeFlag = "1",
+ frozenAmount = 0,
+ instockDate = System.DateTime.Now,
+ rawStockId = Global.SnowId.NextId(),
+ saleOrderId = material.saleOrderId == null ? 0 : material.saleOrderId,
+ warehouseFloor = 5,
+ warehouseId = 512,
+ createBy = "扫描入库",
+ createDate = System.DateTime.Now,
+ safeFlag = material.safeFlag
+ };
+ dbContext.WmsRawStock.Add(newRawStock);
+
+ var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == txtInBarCode.Text);
+ WmsRawInstock wmsRawInstock = new WmsRawInstock()
+ {
+ taskCode = Global.SnowId.NextId().ToString(),
+ materialBarCode = mesBaseBarcodeInfo.barcodeInfo,
+ materialBatchCode = mesBaseBarcodeInfo.batchCode,
+ applyBy = "WPF",
+ applyDate = System.DateTime.Now,
+ purchaseOrderId = mesBaseBarcodeInfo.PurchaseOrderId,
+
+ beginTime = System.DateTime.Now,
+ endTime = DateTime.Now,
+ locationCode = container.locationCode,
+ executeStatus = "2",
+ instockAmount = amount,
+ instockType = "1",
+ materialId = material.materialId,
+ operationType = "1",
+ palletInfoCode = container.containerCode,
+ poNo = mesBaseBarcodeInfo.poNo,
+ warehouseId = 512
+ };
+ dbContext.WmsRawInstock.Add(wmsRawInstock);
+
+ #region 添加盘点明细
+ WmsInventoryCheck wmsInventoryCheck = dbContext.WmsInventoryCheck.Where(x => x.CheckStatus == "1").FirstOrDefault();
+ if(wmsInventoryCheck != null)
+ {
+ WmsInventoryCheckDetail wmsInventoryCheckDetail= new WmsInventoryCheckDetail
+ {
+ InventoryCheckDetailId = Global.SnowId.NextId(),
+ InventoryCheckId = wmsInventoryCheck.InventoryCheckId,
+ CheckStatus = "2",
+ CreateBy = "WPF",
+ CreateTime = DateTime.Now,
+ StockAmount = newRawStock.totalAmount,
+ RealAmount = newRawStock.totalAmount,
+ InventoryCount = 0,
+ LocationCode = newRawStock.locationCode,
+ MaterialBatch = newRawStock.instockBatch,
+ StockId = 1,
+ StockType = "1",
+ MaterialId = newRawStock.materialId,
+ ErpStatus = "0",
+ ErpAmount = 0,
+ CheckType = "2"
+ };
+ dbContext.WmsInventoryCheckDetail.Add(wmsInventoryCheckDetail);
+
+ }
+ #endregion
+
+
+ dbContext.SaveChanges();
+ totalMessage = newRawStock.totalAmount;
+ }
+ txtInBox.Focus();
+ HandyControl.Controls.MessageBox.Info($"入库成功!当前库存:{totalMessage}");
+ txtInBox.Text = string.Empty;
+ txtInBarCode.Text = string.Empty;
+ txtInScan.Text = string.Empty;
+
+ }
+ else
+ {
+ HandyControl.Controls.MessageBox.Error("请先扫描容器号和条码");
+
+ }
+ }
+ catch (Exception ex)
+ {
+
+ txtInBox.Text = string.Empty;
+ txtInBarCode.Text = string.Empty;
+ txtInScan.Text = string.Empty;
+ HandyControl.Controls.MessageBox.Error("入库失败");
+ txtInBarCode.Focus();
+ }
+ }
+
+
+
+
+
+ ///
+ /// 入库条码改变
+ ///
+ ///
+ ///
+ private void txtInBarCode_TextChanged(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ materialName.Text = string.Empty;
+ materialSpec.Text = string.Empty;
+ string barCode = txtInBarCode.Text;
+ if (barCode.Length < 19) return;
+
+
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+
+ if (!string.IsNullOrEmpty(barCode))
+ {
+
+
+ var material = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == barCode);
+ if (material == null)
+ {
+ HandyControl.Controls.MessageBox.Error("未查询到该条码内容!");
+
+ txtInBarCode.Text = string.Empty;
+ txtInScan.Text = string.Empty;
+ txtInBarCode.Focus();
+ }
+ else
+ {
+ var mesBaseMaterialInfo = dbContext.MesBaseMaterialInfo.FirstOrDefault(t => t.MaterialId == material.materialId);
+ if (mesBaseMaterialInfo == null)
+ {
+ HandyControl.Controls.MessageBox.Error("未查询到该条码绑定的物料信息!");
+
+
+ txtInBarCode.Text = string.Empty;
+ txtInScan.Text = string.Empty;
+ txtInBarCode.Focus();
+ }
+ else
+ {
+
+ txtInScan.Text = (material.batchFlag == "1") ? "" : "1.00";
+ materialName.Text = mesBaseMaterialInfo.MaterialName;
+ materialSpec.Text = mesBaseMaterialInfo.MaterialSpec;
+ if (mesBaseMaterialInfo.BatchFlag == "0")
+ {
+ txtInScan.IsReadOnly = true;
+ }
+ else
+ {
+ txtInScan.IsReadOnly = false;
+ }
+ txtInScan.Focus();
+ }
+ }
+ }
+ }
+ catch
+ {
+
+ }
+ }
+
+
+
+ }
+}
diff --git a/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryDetails.xaml b/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryDetails.xaml
new file mode 100644
index 0000000..cb31449
--- /dev/null
+++ b/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryDetails.xaml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryDetails.xaml.cs b/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryDetails.xaml.cs
new file mode 100644
index 0000000..e5a95e6
--- /dev/null
+++ b/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryDetails.xaml.cs
@@ -0,0 +1,85 @@
+using Khd.Core.Domain.Models;
+using Khd.Core.EntityFramework;
+using Khd.Core.Wpf.TaskForm.Inventory;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media.Media3D;
+
+namespace Khd.Core.Wpf.TaskForm
+{
+ ///
+ /// InventoryTaskForm.xaml 的交互逻辑
+ ///
+ public partial class InventoryDetails : Window
+ {
+ private readonly IHost _host;
+ private readonly long inventoryCheckId = 0;
+
+ public InventoryDetails(IHost host,long id)
+ {
+ InitializeComponent();
+ _host = host;
+ inventoryCheckId = id;
+ }
+
+ //在载入行的时候在行表头添加编号
+ private void dgvMH_LoadingRow(object sender, DataGridRowEventArgs e)
+ {
+ e.Row.Header = (e.Row.GetIndex() + 1).ToString();
+ }
+
+
+ private void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ GetData();
+ }
+ catch
+ {
+ Console.WriteLine("InventoryDetails-Window_Loaded加载失败");
+ }
+ }
+
+ private void GetData()
+ {
+ int amount = 0;
+ if (inventoryCheckId == 0) return;
+ using var scope = _host.Services.CreateScope();
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+
+ List wmsInventoryCheckDetails = dbContext.WmsInventoryCheckDetail
+ .Where(t => t.InventoryCheckId == inventoryCheckId)
+ .ToList();
+ List list = wmsInventoryCheckDetails.Select(t => t.MaterialId).Distinct().ToList();
+ List mesBaseMaterialInfos = dbContext.MesBaseMaterialInfo.Where(t => list.Contains(t.MaterialId)).ToList();
+ this.InventoryDetailsDataGrid.ItemsSource = wmsInventoryCheckDetails.Select(t =>
+ new
+ {
+ Id = ++amount,
+ LocationCode = t.LocationCode,
+ MaterialId = t.MaterialId,
+ MaterialName = mesBaseMaterialInfos.FirstOrDefault(m => m.MaterialId == t.MaterialId)?.MaterialSpec,
+ StockAmount = t.StockAmount,
+ RealAmount = t.RealAmount,
+ UpdateDate = t.UpdateTime,
+ });
+ this.InventoryDetailsDataGrid.Items.Refresh();
+
+
+ }
+
+ private void SearchBtn_Click(object sender, RoutedEventArgs e)
+ {
+ GetData();
+ }
+
+
+ }
+}
diff --git a/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml b/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml
index 55d092c..48a1d0a 100644
--- a/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml
+++ b/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml
@@ -28,23 +28,28 @@
-
+
+
-
-
+
+
+
-
+
+
+
-
-
-
+
+
+
+
+
@@ -73,12 +80,27 @@
-
-
-
+
+
+
+
+
+
diff --git a/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml.cs b/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml.cs
index 5a79511..9e69714 100644
--- a/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml.cs
+++ b/src/Khd.Core.Wpf/TaskForm/Inventory/InventoryTaskForm.xaml.cs
@@ -1,11 +1,17 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
+using Khd.Core.Wpf.Scan;
using Khd.Core.Wpf.TaskForm.Inventory;
+using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
+using System;
using System.Collections.Generic;
using System.Linq;
+using System.Threading;
using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
namespace Khd.Core.Wpf.TaskForm
{
@@ -14,30 +20,80 @@ namespace Khd.Core.Wpf.TaskForm
///
public partial class InventoryTaskForm : Window
{
+
private readonly IHost _host;
public InventoryTaskForm(IHost host)
{
InitializeComponent();
_host = host;
+
+ Thread scanThread = new Thread(ScanMessage);
+ scanThread.IsBackground = true;
+ scanThread.Start();
+ UpdateAmountWindow.RefreshDelegateEvent += GetData;
}
- private void Window_Loaded(object sender, RoutedEventArgs e)
+
+
+ private void ScanMessage()
+ {
+ while (true)
+ {
+ try
+ {
+ if (SystemData.isUpdate)
+ {
+ if (!string.IsNullOrEmpty(SystemData.message))
+ {
+ Dispatcher.Invoke(() =>
+ {
+ var focusedElement = FocusManager.GetFocusedElement(this);
+ if (focusedElement is TextBox textBox)
+ {
+ textBox.Text = SystemData.message;
+ SystemData.isUpdate = false;
+ }
+ });
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Error(ex);
+ }
+ Thread.Sleep(500);
+ }
+ }
+
+
+ private void txtInBox_TextChanged(object sender, RoutedEventArgs e)
+ {
+ if(txtInBox.Text.Length == 15)
+ {
+ GetData(txtInBox.Text);
+ }
+ else
+ {
+ this.InventoryDataGrid.ItemsSource = null;
+ }
+ }
+ private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
using var scope = _host.Services.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService();
var wcsTasks = dbContext.WcsTask.Where(t => t.taskType == 100 && t.taskStatus == 6).ToList();
- if (wcsTasks.Count > 0)
- {
- this.ContainerCodeBox.ItemsSource = wcsTasks.Distinct();
- }
- else
- {
- HandyControl.Controls.MessageBox.Show("未找到盘库已完成的小车任务!");
- this.Close();
- }
+ //if (wcsTasks.Count > 0)
+ //{
+ // this.ContainerCodeBox.ItemsSource = wcsTasks.Distinct();
+ //}
+ //else
+ //{
+ // HandyControl.Controls.MessageBox.Show("未找到盘库已完成的小车任务!");
+ // this.Close();
+ //}
}
catch
{
@@ -45,80 +101,108 @@ namespace Khd.Core.Wpf.TaskForm
}
}
- private void GetData()
+ private void GetData(string containerNo)
{
- if (this.ContainerCodeBox.SelectedItem is WcsTask task)
- {
using var scope = _host.Services.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService();
var wcsTask = dbContext.WcsTask
.Where(t => t.taskType == 100)
- .Where(t => t.containerNo == task.containerNo).FirstOrDefault();
+ .Where(t => t.containerNo == containerNo).FirstOrDefault();
if (wcsTask != null)
{
+ WmsInventoryCheck check = dbContext.WmsInventoryCheck.Where(x => x.CheckStatus == "1").FirstOrDefault();
+ if (check == null)
+ {
+ HandyControl.Controls.MessageBox.Show("当前无正在执行的盘库任务");
+ return;
+ }
var wmsInventoryCheckDetails = dbContext.WmsInventoryCheckDetail
- .Where(t => t.InventoryCheckId == wcsTask.orderId)
+ .Where(t => t.InventoryCheckId == check.InventoryCheckId)
.Where(t => t.LocationCode == wcsTask.currPointNo)
.Where(t => t.CheckStatus == "1")
.ToList();
List list = wmsInventoryCheckDetails.Select(t => t.MaterialId).Distinct().ToList();
List mesBaseMaterialInfos = dbContext.MesBaseMaterialInfo.Where(t => list.Contains(t.MaterialId)).ToList();
- this.InventoryDataGrid.ItemsSource = wmsInventoryCheckDetails.GroupBy(t => t.MaterialId).Select(t =>
- new
- {
- ContainerNo = wcsTask.containerNo,
- MaterialName = mesBaseMaterialInfos.FirstOrDefault(m => m.MaterialId == t.Key)?.MaterialSpec,
- StockAmount = t.Sum(n => n.StockAmount),
- LocationCode = wcsTask.currPointNo,
- MaterialId = t.Key,
- RealAmount = t.Sum(n => n.RealAmount),
- });
- this.InventoryDataGrid.Items.Refresh();
+ //this.InventoryDataGrid.ItemsSource = wmsInventoryCheckDetails.GroupBy(t => t.MaterialId).Select(t =>
+ // new
+ // {
+ // //ContainerNo = wcsTask.containerNo,
+ // MaterialBatch = t.FirstOrDefault(n => n.MaterialId == t.Key)?.MaterialBatch,
+ // MaterialSpec = mesBaseMaterialInfos.FirstOrDefault(m => m.MaterialId == t.Key)?.MaterialSpec,
+ // MaterialName = mesBaseMaterialInfos.FirstOrDefault(m => m.MaterialId == t.Key)?.MaterialName,
+ // StockAmount = t.Sum(n => n.StockAmount),
+ // LocationCode = wcsTask.currPointNo,
+ // MaterialId = t.Key,
+ // //RealAmount = (t.Sum(n => n.RealAmount)).ToString(),
+ // });
+
+ this.InventoryDataGrid.ItemsSource = wmsInventoryCheckDetails.Select(t =>
+ new
+ {
+ //ContainerNo = wcsTask.containerNo,
+ MaterialBatch = t.MaterialBatch,
+ MaterialSpec = mesBaseMaterialInfos.FirstOrDefault(m => m.MaterialId == t.MaterialId)?.MaterialSpec,
+ MaterialName = mesBaseMaterialInfos.FirstOrDefault(m => m.MaterialId == t.MaterialId)?.MaterialName,
+ StockAmount = t.StockAmount,
+ LocationCode = wcsTask.currPointNo,
+ MaterialId = t.MaterialId,
+ //RealAmount = (t.Sum(n => n.RealAmount)).ToString(),
+ });
+
+
+ this.InventoryDataGrid.Items.Refresh();
if (wmsInventoryCheckDetails.Count == 0)
{
HandyControl.Controls.MessageBox.Show("该料箱为空料箱");
}
- }
+ }
+ else
+ {
+ HandyControl.Controls.MessageBox.Show("请扫描盘库任务里面的料箱");
+ }
+
+
+ }
+
+ private void SearchBtn_Click(object sender, RoutedEventArgs e)
+ {
+
+ }
+
+ private void EditBtn_Click(object sender, RoutedEventArgs e)
+ {
+
+ if (!string.IsNullOrEmpty(txtInBox.Text))
+ {
+ AddNewStockForm editForm = new AddNewStockForm(_host, txtInBox.Text);
+
+ editForm.ShowDialog();
+
}
else
{
HandyControl.Controls.MessageBox.Show("请先选择料箱号!");
}
+
}
- private void SearchBtn_Click(object sender, RoutedEventArgs e)
- {
- GetData();
- }
-
- private void EditBtn_Click(object sender, RoutedEventArgs e)
+ private void Update_Click(object sender, RoutedEventArgs e)
{
if (this.InventoryDataGrid.SelectedItem != null)
{
dynamic item = this.InventoryDataGrid.SelectedItem;
- long materialId = item.MaterialId;
- string containerNo = item.ContainerNo;
- string materialName = item.MaterialName;
- string locationCode = item.LocationCode;
- InventoryTaskEditForm editForm = new InventoryTaskEditForm(_host, materialId, containerNo, materialName, locationCode, this);
- this.Hide();
- editForm.ShowDialog();
- GetData();
- }
- else
- {
- if (this.ContainerCodeBox.SelectedItem is WcsTask task)
- {
- InventoryTaskEditForm editForm = new InventoryTaskEditForm(_host, 0, task.containerNo, "", task.currPointNo, this);
- this.Hide();
- editForm.ShowDialog();
- GetData();
- }
- else
- {
- HandyControl.Controls.MessageBox.Show("请先选择料箱号!");
- }
+ UpdateAmountWindow updateStockAmount = new UpdateAmountWindow(_host, item.MaterialBatch, item.LocationCode, txtInBox.Text);
+ updateStockAmount.ShowDialog();
+
+ //long materialId = item.MaterialId;
+ //string containerNo = txtInBox.Text;
+ //string materialName = item.MaterialName;
+ //string locationCode = item.LocationCode;
+ //string realAmount = item.RealAmount;
+
+ //GetData(txtInBox.Text);
}
}
+
}
}
diff --git a/src/Khd.Core.Wpf/TaskForm/Inventory/UpdateAmountWindow.xaml b/src/Khd.Core.Wpf/TaskForm/Inventory/UpdateAmountWindow.xaml
new file mode 100644
index 0000000..82b8890
--- /dev/null
+++ b/src/Khd.Core.Wpf/TaskForm/Inventory/UpdateAmountWindow.xaml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Khd.Core.Wpf/TaskForm/Inventory/UpdateAmountWindow.xaml.cs b/src/Khd.Core.Wpf/TaskForm/Inventory/UpdateAmountWindow.xaml.cs
new file mode 100644
index 0000000..e68f83a
--- /dev/null
+++ b/src/Khd.Core.Wpf/TaskForm/Inventory/UpdateAmountWindow.xaml.cs
@@ -0,0 +1,100 @@
+using Khd.Core.Domain.Models;
+using Khd.Core.EntityFramework;
+using Khd.Core.Library.Mapper;
+using Khd.Core.Plc;
+using Khd.Core.Plc.S7;
+using Khd.Core.Wpf.Form;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Khd.Core.Wpf.TaskForm
+{
+ ///
+ /// AddTask.xaml 的交互逻辑
+ ///
+ public partial class UpdateAmountWindow : Window
+ {
+
+ public delegate void RefreshDelegate(string containerCode);
+ public static event RefreshDelegate? RefreshDelegateEvent;
+
+
+ private string barcodeInfo;
+ private string locationCode;
+ private string containerCode;
+ private readonly IHost _host;
+ public UpdateAmountWindow(IHost host,string barcodeInfo,string locationCode,string containerCode)
+ {
+ InitializeComponent();
+ _host = host;
+ this.barcodeInfo = barcodeInfo;
+ this.locationCode = locationCode;
+ this.containerCode = containerCode;
+ }
+
+ private void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+
+
+ }
+
+ private void UpdateBtn_Click(object sender, RoutedEventArgs e)
+ {
+ string input = this.StockAmount.Text.Trim(); // 去除前后空白
+ if (string.IsNullOrEmpty(input))
+ {
+ MessageBox.Show("数量不能为空,请输入有效数值。");
+ return;
+ }
+
+ decimal stockAmountValue;
+ if (!decimal.TryParse(input, out stockAmountValue))
+ {
+ MessageBox.Show("输入的数值格式不正确,请输入有效的十进制数。");
+ return;
+ }
+
+ //
+ if (stockAmountValue <0)
+ {
+ MessageBox.Show("数值必须大于0");
+ return;
+ }
+ var scope = _host.Services.CreateScope();
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+ var wmsRawStocks = dbContext.WmsRawStock.Where(x => x.locationCode == locationCode && x.instockBatch == barcodeInfo).ToList();
+ WmsRawStock wmsRawStock = wmsRawStocks.FirstOrDefault();
+ if (wmsRawStock != null)
+ {
+ wmsRawStock.totalAmount = stockAmountValue;
+ dbContext.Update(wmsRawStock);
+ // 修改盘库明细
+ WmsInventoryCheckDetail wmsInventoryDetail = dbContext.WmsInventoryCheckDetail.Where(x => x.LocationCode == locationCode && x.MaterialBatch == barcodeInfo && x.CheckStatus=="1").OrderByDescending(X=>X.CreateTime).FirstOrDefault();
+ if(wmsInventoryDetail != null)
+ {
+ wmsInventoryDetail.StockAmount = stockAmountValue;
+ wmsInventoryDetail.RealAmount = stockAmountValue;
+ wmsInventoryDetail.UpdateTime = DateTime.Now;
+ dbContext.Update(wmsInventoryDetail);
+ }
+ dbContext.SaveChanges();
+ this.Close();
+ RefreshDelegateEvent?.Invoke(containerCode);
+ }
+
+
+ }
+
+ private void CancelBtn_Click(object sender, RoutedEventArgs e)
+ {
+ this.Close();
+ }
+
+ }
+}
diff --git a/src/Khd.Core.Wpf/TaskForm/SelectOutRawForm.xaml.cs b/src/Khd.Core.Wpf/TaskForm/SelectOutRawForm.xaml.cs
index 18f5452..0aa5e7d 100644
--- a/src/Khd.Core.Wpf/TaskForm/SelectOutRawForm.xaml.cs
+++ b/src/Khd.Core.Wpf/TaskForm/SelectOutRawForm.xaml.cs
@@ -44,7 +44,6 @@ namespace Khd.Core.Wpf.TaskForm
baseEquip.IsOut = _isOut;
dbContext.BaseEquip.Update(baseEquip);
dbContext.SaveChanges();
- MessageBox.Show("保存成功!");
this.Close();
}
}
diff --git a/src/Khd.Core.Wpf/WindowPage/InventoryMaterialWindow.xaml b/src/Khd.Core.Wpf/WindowPage/InventoryMaterialWindow.xaml
new file mode 100644
index 0000000..03b3ec6
--- /dev/null
+++ b/src/Khd.Core.Wpf/WindowPage/InventoryMaterialWindow.xaml
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Khd.Core.Wpf/WindowPage/InventoryMaterialWindow.xaml.cs b/src/Khd.Core.Wpf/WindowPage/InventoryMaterialWindow.xaml.cs
new file mode 100644
index 0000000..eb668a1
--- /dev/null
+++ b/src/Khd.Core.Wpf/WindowPage/InventoryMaterialWindow.xaml.cs
@@ -0,0 +1,280 @@
+using Khd.Core.Domain.Models;
+using Khd.Core.EntityFramework;
+using Khd.Core.Wpf.dto;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Media.Media3D;
+using System.Windows.Shapes;
+using static Khd.Core.Wpf.Form.FormBoardT;
+
+namespace Khd.Core.Wpf.WindowPage
+{
+ ///
+ /// StockWindow.xaml 的交互逻辑
+ ///
+ public partial class InventoryMaterialWindow : Window
+ {
+ private IHost host = null;
+
+ private ObservableCollection itemsControlItems;
+
+ ///
+ /// 刷新盘库任务列表
+ ///
+ public delegate void RefreshInventoryList();
+ public static event RefreshInventoryList? RefreshInventoryListEvent;
+
+
+ public InventoryMaterialWindow(IHost _host)
+ {
+ host = _host;
+ InitializeComponent();
+ Init();
+ itemsControlItems = new ObservableCollection();
+ itemsControl.ItemsSource = itemsControlItems;
+ }
+
+ public async Task Init()
+ {
+ using var scope = host.Services.CreateScope();
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+ //var location = await dbContext.WmsBaseLocation.Where(x => x.locationId == locationId).FirstOrDefaultAsync();
+
+ var stockList = await dbContext.WmsRawStock.Where(x => x.warehouseId ==512).ToListAsync();
+
+
+ if(stockList != null && stockList.Count > 0)
+ {
+ // 获取所有库存物料 ID
+ var materialIds = stockList.Select(stock => stock.materialId).Distinct().ToList();
+ var materialInfos = await dbContext.MesBaseMaterialInfo
+ .Where(material => materialIds.Contains(material.MaterialId))
+ .ToListAsync();
+ // 将库存物料信息和物料详细信息合并
+ var stockDetails = materialInfos.Select(material => new StockItem
+ {
+ IsSelected = false,
+ materialId = material.MaterialId.ToString(),
+ materialCode = material.MaterialCode,
+ materialName = material.MaterialName,
+ materialSpec = material.MaterialSpec,
+ }).ToList();
+
+
+ StockDataGrid.ItemsSource = stockDetails;
+ }
+
+ }
+
+ private void SearchButton_Click(object sender, RoutedEventArgs e)
+ {
+ string searchStr = SearchTxt.Text;
+ if (string.IsNullOrEmpty(searchStr))
+ {
+ Init();
+ }
+ else
+ {
+ var target = StockDataGrid.ItemsSource.Cast().Where(x => x.materialCode.Contains(searchStr) || x.materialName.Contains(searchStr) || x.materialSpec.Contains(searchStr)).ToList();
+ StockDataGrid.ItemsSource = target;
+ }
+
+ }
+
+
+
+
+ public class StockItem
+ {
+ public bool IsSelected { get; set; }
+ public string materialId { get; set; }
+ public string materialCode { get; set; }
+ public string materialName { get; set; }
+ public string materialSpec { get; set; }
+ }
+
+
+
+ private void CreateInventoryTask_Click(object sender, RoutedEventArgs e)
+ {
+
+ try
+ {
+
+ using var scope = host.Services.CreateScope();
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+
+ int locationCount = 0;
+ if(itemsControlItems.Count == 0)
+ {
+ locationCount = dbContext.WmsBaseLocation.Where(t => t.warehouseId == 512 && t.ContainerStatus == "1" && t.locationStatus=="1").Count();
+ }
+ else
+ {
+ var materialIdList = itemsControlItems.Select(t => long.Parse(t.materialId)).ToList();
+ var locations = dbContext.WmsRawStock.Where(t => materialIdList.Contains((long)t.materialId)).ToList().Select(t=>t.locationCode).Distinct();
+ locationCount = locations.Count();
+ }
+ string materialIds = null;
+ if (itemsControlItems.Count > 0)
+ {
+ materialIds = string.Join(";", itemsControlItems.Select(t => t.materialId));
+ }
+
+ var Orders = dbContext.WmsInventoryCheck.Where(t => t.CheckStatus == "0" || t.CheckStatus == "1").ToList();
+ if (Orders != null && Orders.Count > 0)
+ {
+ MessageBoxResult messageBoxResult = HandyControl.Controls.MessageBox.Show("已经有盘库任务是否继续创建新盘库任务?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question);
+ if (messageBoxResult == MessageBoxResult.OK)
+ {
+ Orders.ForEach(t =>
+ {
+ t.EndTime = DateTime.Now;
+ t.CheckStatus = "2";
+ });
+ dbContext.UpdateRange(Orders);
+
+ dbContext.Add(new WmsInventoryCheck()
+ {
+ CreateTime = DateTime.Now,
+ CheckStatus = "0",
+ LocationAmount = locationCount,
+ InventoriedAmount = 0,
+ InventoryingAmount = 0,
+ WarehouseId = 512,
+ CreateBy = "WCS",
+ MaterialId = materialIds
+ }) ;
+ dbContext.SaveChanges();
+ HandyControl.Controls.Growl.Info("创建盘库任务成功!");
+ }
+ else
+ {
+ return;
+ }
+ }
+ else
+ {
+ MessageBoxResult messageBoxResult = HandyControl.Controls.MessageBox.Show("是否创建一个盘库任务?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question);
+ if (messageBoxResult == MessageBoxResult.OK)
+ {
+
+ dbContext.Add(new WmsInventoryCheck()
+ {
+ CreateTime = DateTime.Now,
+ CheckStatus = "0",
+ LocationAmount = locationCount,
+ InventoriedAmount = 0,
+ InventoryingAmount = 0,
+ WarehouseId = 512,
+ CreateBy = "WCS",
+ MaterialId = materialIds
+ });
+ dbContext.SaveChanges();
+ HandyControl.Controls.Growl.Info("创建盘库任务成功!");
+ }
+ }
+
+ this.Close();
+ //刷新列表
+ RefreshInventoryListEvent?.Invoke();
+
+
+ }
+ catch
+ {
+
+ }
+
+ }
+
+
+
+ ///
+ /// 单选
+ ///
+ ///
+ ///
+ private void CheckPersonBox_Click(object sender, RoutedEventArgs e)
+ {
+
+ if (sender is CheckBox checkbox)
+ {
+ dynamic Currentselected = StockDataGrid.SelectedItem;
+ if (checkbox.IsChecked != null && checkbox.IsChecked.Value)
+ {
+ //if (itemsControlItems != null && itemsControlItems.Count >= 6)
+ //{
+ // MessageBox.Show("最多只能选择6个");
+ // checkbox.IsChecked = false;
+ // return;
+ //}
+
+ // 添加选中项
+ string selectedItem = Currentselected.materialName;
+
+ bool isIn = itemsControlItems.Any(t => t.materialId == Currentselected.materialId);
+ if (!isIn)
+ {
+ itemsControlItems.Add(new StockItem
+ {
+ materialId = Currentselected.materialId,
+ materialCode = Currentselected.materialCode,
+ materialName = Currentselected.materialName,
+ materialSpec = Currentselected.materialSpec,
+ });
+
+ }
+ }
+ else
+ {
+
+ // 删除选中项
+ StockItem model = itemsControlItems.FirstOrDefault(x => x.materialId == Currentselected.materialId);
+ if (model != null)
+ {
+ itemsControlItems.Remove(model);
+ }
+ }
+
+ }
+ }
+
+
+ ///
+ /// 删除选中的值
+ ///
+ ///
+ ///
+ private void DeleteButton_Click(object sender, RoutedEventArgs e)
+ {
+ // 获取点击按钮的实例
+ Button button = sender as Button;
+
+ // 从按钮的 Tag 属性中获取当前数据项
+ StockItem itemToRemove = button.Tag as StockItem;
+
+ if (itemToRemove != null)
+ {
+ // 从集合中移除数据项
+ itemsControlItems.Remove(itemToRemove);
+ }
+ }
+
+
+ }
+}
diff --git a/src/Khd.Core.Wpf/WindowPage/StockWindow.xaml b/src/Khd.Core.Wpf/WindowPage/StockWindow.xaml
new file mode 100644
index 0000000..e3243ce
--- /dev/null
+++ b/src/Khd.Core.Wpf/WindowPage/StockWindow.xaml
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Khd.Core.Wpf/WindowPage/StockWindow.xaml.cs b/src/Khd.Core.Wpf/WindowPage/StockWindow.xaml.cs
new file mode 100644
index 0000000..a37fbbd
--- /dev/null
+++ b/src/Khd.Core.Wpf/WindowPage/StockWindow.xaml.cs
@@ -0,0 +1,75 @@
+using Khd.Core.Domain.Models;
+using Khd.Core.EntityFramework;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace Khd.Core.Wpf.WindowPage
+{
+ ///
+ /// StockWindow.xaml 的交互逻辑
+ ///
+ public partial class StockWindow : Window
+ {
+ private IHost host = null;
+ public StockWindow(IHost _host,long locationId)
+ {
+ host = _host;
+ InitializeComponent();
+ Init(locationId);
+ }
+
+ public async Task Init(long locationId)
+ {
+ using var scope = host.Services.CreateScope();
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+ var location = await dbContext.WmsBaseLocation.Where(x => x.locationId == locationId).FirstOrDefaultAsync();
+ positionRowTxt.Text = location.locRow.ToString();
+ positionColumnTxt.Text = location.locColumn.ToString();
+ positionLayerTxt.Text = location.layerNum.ToString();
+ locationTxt.Text = location.locationCode;
+ palletTxt.Text = location.containerCode;
+
+ var stockList = await dbContext.WmsRawStock.Where(x => x.palletInfoCode == location.containerCode).ToListAsync();
+ if(stockList != null && stockList.Count > 0)
+ {
+ // 获取所有库存物料 ID
+ var materialIds = stockList.Select(stock => stock.materialId).Distinct().ToList();
+ var materialInfos = await dbContext.MesBaseMaterialInfo
+ .Where(material => materialIds.Contains(material.MaterialId))
+ .ToListAsync();
+
+ // 将库存物料信息和物料详细信息合并
+ var stockDetails = from stock in stockList
+ from material in materialInfos
+ where stock.materialId == material.MaterialId
+ select new
+ {
+ materialCode = material.MaterialCode,
+ materialName = material.MaterialName,
+ materialSpec = material.MaterialSpec,
+ totalAmount = stock.totalAmount,
+ frozenAmount = stock.frozenAmount
+
+ };
+
+
+ StockDataGrid.ItemsSource = stockDetails;
+ }
+
+ }
+ }
+}
diff --git a/src/Khd.Core.Wpf/dto/Location.cs b/src/Khd.Core.Wpf/dto/Location.cs
new file mode 100644
index 0000000..5d50a69
--- /dev/null
+++ b/src/Khd.Core.Wpf/dto/Location.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Khd.Core.Wpf.dto
+{
+ public class Location
+ {
+ public long LocationId { get; set; } // 新增 LocationId
+ public string Code { get; set; }
+ public LocationStatus Status { get; set; }
+
+ public Visibility isFreeze { get; set; }
+ }
+
+ public enum LocationStatus
+ {
+ // 在库有库存
+ InAndStock,
+ //// 空料箱在库无库存
+ EmptyInStock,
+ //库外
+ OutOfStock,
+
+ }
+}