林豪 左 1 рік тому
батько
коміт
d5451a094d

+ 2 - 2
ServiceCenter/Extensions/SqlExtension.cs

@@ -35,7 +35,7 @@ namespace ServiceCenter.Extensions
         /// <returns></returns>
         public static ISugarQueryable<T> UpdLock<T>(this ISugarQueryable<T> obj)
         {
-            return obj.With("WITH(ROWLOCK,UPDLOCK)");
+            return obj.With("WITH(ROWLOCK)");
         }
 
         /// <summary>
@@ -47,7 +47,7 @@ namespace ServiceCenter.Extensions
         /// <returns></returns>
         public static ISugarQueryable<T> ReadPastUpdLock<T>(this ISugarQueryable<T> obj)
         {
-            return obj.With("WITH(READPAST,ROWLOCK,UPDLOCK)");
+            return obj.With("WITH(READPAST,ROWLOCK)");
         }
 
         /// <summary>

+ 1 - 1
WCS.Core/World.cs

@@ -341,7 +341,7 @@ namespace WCS.Core
 
         protected virtual void FrameInfo(WorkTimes wt)
         {
-            if (wt.Total > this.Interval)
+            if (wt.Total > 2000)
             {
                 Console.ForegroundColor = ConsoleColor.Red;
             }

+ 3 - 4
业务工程/分拣库/WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -82,7 +82,7 @@ namespace WCS.WorkEngineering.Systems
                                         {
                                             if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
                                             {
-                                                var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
+                                                var taskInfo = db.Default.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.AgvTaskID == agv.ID);
                                                 if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
                                                 //更新AGV任务状态
                                                 agv.Status = AGVTaskStatus.MissionCompleted;
@@ -137,11 +137,11 @@ namespace WCS.WorkEngineering.Systems
                                 switch (agv.AgvStatus)
                                 {
                                     case AGVTaskStatus.NewBuild when agv.Status == AGVTaskStatus.NewBuild:
-                                        AgvApi.托盘回库(agv.Position, agv.ID.ToString(), agv.Station);
                                         agv.AgvID = agv.ID.ToString();
                                         agv.Status = AGVTaskStatus.Confirm;
                                         agv.AgvStatus = AGVTaskStatus.Confirm;
                                         db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                        AgvApi.托盘回库(agv.Position, agv.ID.ToString(), agv.Station);
                                         break;
                                     //巷道分配
                                     case AGVTaskStatus.RequestOrPermission1 when agv.Status != AGVTaskStatus.Complete1:
@@ -216,8 +216,7 @@ namespace WCS.WorkEngineering.Systems
                                                 agv.Station = devs.MinBy(x => x.Entity.Code).Entity.Code;
                                                 db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                                 World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
-                                                task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station,
-                                                    $"任务分配至:{agv.Station}");
+                                                task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station, $"任务分配至:{agv.Station}");
                                                 World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
                                                 AgvApi.ContinueTask(agv.AgvID, agv.Station);
                                                 World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");

+ 25 - 23
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣主线/满轮主线预写入目标地址.cs

@@ -11,6 +11,7 @@ using WCS.Entity.Protocol.BCR;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.Worlds;
+using wms.service.Service;
 using TaskStatus = WCS.Entity.TaskStatus;
 
 namespace WCS.WorkEngineering.Systems
@@ -38,33 +39,27 @@ namespace WCS.WorkEngineering.Systems
             };
             var dev = new Device<IStation520>(Device.All.First(x => x.Code == devCode), World);
             dev.Data.Mode = StationMode.Automatic;
-            //待处理条码组
+            //从DB83中获取待处理条码组
             var pendingBcrList = obj.Data2.GetBcrCodeList().Where(x => !x.IsNullOrEmpty());
-            //缓存条码组
+            //从DB525获取已处理条码组
             var cacheBcrList = obj.Data3.GetBcrCodeList();
+            //筛选出未处理条码组
             var codes = pendingBcrList.Where(x => !cacheBcrList.Contains(x));
             World.Log($"扫码器:{JsonConvert.SerializeObject(pendingBcrList)}");
             World.Log($"缓存信息:{JsonConvert.SerializeObject(cacheBcrList)}");
             //循环处理所有缓存条码组中没有的条码
             foreach (var bcrCode in codes)
             {
-                //取出预分配地址,并计算相关信息
-                var key = $"AllocationWarehouseSort:{bcrCode}";
-                var value = RedisHub.WMS.Get(key);
-                if (value == null)
-                {
-                    World.Log($"{bcrCode}:找不到分库记录", LogLevelEnum.High);
-                    continue;
-                }
-                var mainlineDiversion = JsonConvert.DeserializeObject<MainlineDiversion>(value);
-                var srmCode = mainlineDiversion.WarehouseCode.WarehouseToSrm();
-                var path = DevicePath.GetPath(obj.Entity.Code, srmCode);
-                if (path == null || path is { Points.Count: < 2 })
-                {
-                    World.Log($"{bcrCode}:路径错误,当前位置{obj.Entity.Code},目标位置:{srmCode}", LogLevelEnum.High);
-                    continue;
-                }
-                var next = path.Points[1].Code;
+                ////取出预分配地址,并计算相关信息
+                //var key = $"AllocationWarehouseSort:{bcrCode}";
+                //var value = RedisHub.WMS.Get(key);
+                //if (value == null)
+                //{
+                //    World.Log($"{bcrCode}:找不到分库记录", LogLevelEnum.High);
+                //    continue;
+                //}
+                //var mainlineDiversion = JsonConvert.DeserializeObject<MainlineDiversion>(value);
+
                 WCS_TaskInfo taskInfo = null;
 
                 try
@@ -72,10 +67,10 @@ namespace WCS.WorkEngineering.Systems
                     SqlSugarHelper.Do(_db =>
                     {
                         var db = _db.Default;
-                        var task = db.Queryable<WCS_TaskInfo>().NoLock().Single(x => x.BarCode == bcrCode && x.ID == mainlineDiversion.TaskId && x.Status == TaskStatus.NewBuild);
+                        var task = db.Queryable<WCS_TaskInfo>().NoLock().Single(x => x.BarCode == bcrCode && x.Status == TaskStatus.NewBuild);
                         if (task == null)
                         {
-                            World.Log($"{bcrCode}:找不到匹配任务--{value}", LogLevelEnum.High);
+                            World.Log($"{bcrCode}:找不到匹配的新建任务", LogLevelEnum.High);
                             return;
                         }
                         taskInfo = task;
@@ -83,10 +78,17 @@ namespace WCS.WorkEngineering.Systems
                 }
                 catch (Exception e)
                 {
-                    World.Log($"{bcrCode}:----{e.Message}-{value}", LogLevelEnum.High);
+                    World.Log($"{bcrCode}:----{e.Message}", LogLevelEnum.High);
                     continue;
                 }
-
+                var srmCode = taskInfo.WarehouseCode.WarehouseToSrm();
+                var path = DevicePath.GetPath(obj.Entity.Code, srmCode);
+                if (path == null || path is { Points.Count: < 2 })
+                {
+                    World.Log($"{bcrCode}:路径错误,当前位置{obj.Entity.Code},目标位置:{srmCode}", LogLevelEnum.High);
+                    continue;
+                }
+                var next = path.Points[1].Code;
                 if (taskInfo == null) continue;
                 //开始赋值
                 obj.Data3.GetType().GetProperty($"BcrCode{obj.Data3.NextIndex}").SetValue(obj.Data3, bcrCode);

+ 2 - 2
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs

@@ -68,12 +68,12 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status < TaskStatus.FinishOfShunt && !v.BarCode.Contains("Error"));
+                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.ID == obj.Data2.TaskNumber && v.Status < TaskStatus.FinishOfShunt && !v.BarCode.Contains("Error"));
                 if (obj.Data2.TaskNumber == 1)
                 {
                     var type = goodsType.ToString();
                     //找到一条起点是当前位置且状态小于2的任务
-                    taskInfo = db.Queryable<WCS_TaskInfo>().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code && x.BarCode.Contains("Error") && x.AddrNext == null && x.GoodsType == goodsType);
+                    taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code && x.BarCode.Contains("Error") && x.AddrNext == null && x.GoodsType == goodsType);
                     if (taskInfo == null)
                     {
                         WmsApi.PalletizingCreateseErrorTasks(obj.Entity.Code, type);

+ 7 - 8
业务工程/分拣库/WCS.WorkEngineering/Systems/机台叫料生成AGV任务.cs

@@ -20,8 +20,6 @@ namespace WCS.WorkEngineering.Systems
     {
         protected override bool ParallelDo => true;
 
-        
-
         public override void Do(Device<IStation520, IStation521, IStation523> obj)
         {
             if (!obj.Data3.Status.HasFlag(StationStatus.Auto))
@@ -57,6 +55,7 @@ namespace WCS.WorkEngineering.Systems
                     World.Log($"未找到对应任务[{obj.Data.TaskNumber}],请检查该任务状态与更新状态是否均为输送机执行中", LogLevelEnum.High);
                     return;
                 }
+                var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only);
 
                 //开始创建AGV任务
                 var agvTask = db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
@@ -72,7 +71,8 @@ namespace WCS.WorkEngineering.Systems
                         Position = task.WorkBench,
                         Station = task.SrmStation,
                         AddWho = "WCS",
-                        AddTime = DateTime.Now
+                        AddTime = DateTime.Now,
+                        AgvID = agvId
                     }).SplitTable().ExecuteCommand();
                     World.Log($"{task.ID}未找到对应的AGV任务");
                     return;
@@ -83,11 +83,9 @@ namespace WCS.WorkEngineering.Systems
                     World.Log($"AGV任务{agvTask.ID}状态不是新建", LogLevelEnum.High);
                     return;
                 }
-
-                var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only);
-
-                var res = AgvApi.机台叫料(obj.Entity.Code, task.WorkBench, agvId);
-                agvTask.AgvID = agvId;
+                agvId = agvTask.AgvID;
+               
+                //agvTask.AgvID = agvId;
                 agvTask.Status = AGVTaskStatus.Confirm;
                 agvTask.AgvStatus = AGVTaskStatus.Confirm;
                 db.UpdateableRowLock(agvTask).UpdateColumns(x => new { x.AgvID, x.Status, x.AgvStatus }).SplitTable(x => x.Take(2)).ExecuteCommand();
@@ -97,6 +95,7 @@ namespace WCS.WorkEngineering.Systems
                 task.EditWho = "WCS";
                 db.Updateable(task).UpdateColumns(x => new { x.Status, x.AgvTaskID, x.EditTime, x.EditWho }).ExecuteCommand();
                 task.AddWCS_TASK_DTL(db, obj.Entity.Code, "AGV", $"任务下发至AGV{agvId}");
+                var res = AgvApi.机台叫料(obj.Entity.Code, task.WorkBench, agvId);
             });
         }
 

+ 2 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/环形库分配货位.cs

@@ -15,12 +15,13 @@ using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.WebApi.Models.WMS.Response;
+using WCS.WorkEngineering.Worlds;
 using WCS.WorkEngineering.Worlds.环形库.环形库;
 using TaskStatus = WCS.Entity.TaskStatus;
 
 namespace WCS.WorkEngineering.Systems.环形库
 {
-    [BelongTo(typeof(RingWorld1))]
+    [BelongTo(typeof(SortingBranchWorld))]
     [Description("机械臂")]
     public class 环形库分配货位 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
     {

+ 110 - 2
业务工程/分拣库/WCS.WorkEngineering/Systems/码垛区域生成空托盘任务.cs

@@ -1,5 +1,6 @@
 using ServiceCenter.Extensions;
 using ServiceCenter.SqlSugars;
+using SqlSugar;
 using System.ComponentModel;
 using WCS.Core;
 using WCS.Entity;
@@ -22,8 +23,6 @@ namespace WCS.WorkEngineering.Systems
     {
         protected override bool ParallelDo => true;
 
-        
-
         public override void Do(Device<IStation520> objDev)
         {
             var lastIsTruss = objDev.Entity.GetFlag<bool>("LastIsTruss");
@@ -119,6 +118,21 @@ namespace WCS.WorkEngineering.Systems
                         var ringTask = db.Queryable<WCS_TaskInfo>().NoLock().First(x => x.Type == TaskType.OutDepot && x.Status <= TaskStatus.WaitingToExecute && x.SrmStation == obj.Entity.Code);
                         if (ringTask == null)
                         {
+                            var code = obj.Entity.Code.GetWareCode();
+                            var wareHouse = db.Queryable<BaseWarehouse>().First(x => x.Code == code);
+                            if (wareHouse == null)
+                            {
+                                World.Log($"无对应仓库--[{code}]");
+                                return;
+                            }
+                            //检查是否有满跺记录
+                            var ringPalletizingInfo = db.Queryable<BillRingPalletizingInfo>().Where(x => x.WareHouseId == wareHouse.Id && x.HaveQty > 0 && !x.Out).ToList()
+                                                                                             .OrderBy(x => x.AddTime).FirstOrDefault(x => x.HaveQty == x.HWCountQty || x.AddTime < DateTime.Now.AddHours(-6));
+                            if (ringPalletizingInfo == null)
+                            {
+                                World.Log("无满跺码垛信息");
+                                return;
+                            }
                             //开始申请码垛任务
                             var resData = WmsApi.ApplyPalletizingStockOut(obj.Entity.Code, obj.Entity.Sources.Single(x => x.HasFlag(DeviceFlags.Robot)).Code);
                             if (resData.ResCode != ResponseStatusCodeEnum.Sucess)
@@ -173,4 +187,98 @@ namespace WCS.WorkEngineering.Systems
             return dev.Code == nameof(PalletizCreateEmptyTray);
         }
     }
+
+    //
+    // 摘要:
+    //     环形库码垛缓存信息
+    [Tenant("fj")]
+    [SugarTable("Bill_RingPalletizingInfo")]
+    public class BillRingPalletizingInfo : BaseModel
+    {
+        //
+        // 摘要:
+        //     仓库ID
+        [SugarColumn(IsNullable = false, ColumnDescription = "仓库ID")]
+        public long WareHouseId { get; set; }
+
+        //
+        // 摘要:
+        //     任务
+        [Navigate(NavigateType.OneToOne, "WareHouseId")]
+        public BaseWarehouse WareHouse { get; set; }
+
+        //
+        // 摘要:
+        //     垛形主表ID
+        [SugarColumn(IsNullable = false, ColumnDescription = "垛形主表ID")]
+        public long BomSetGrpId { get; set; }
+
+        //
+        // 摘要:
+        //     工字轮个数
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "工字轮个数")]
+        public int HWCountQty { get; set; }
+
+        //
+        // 摘要:
+        //     BomCode(投料信息)/物料号
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = false, ColumnDescription = "BomCode(投料信息)")]
+        public string BomCode { get; set; }
+
+        //
+        // 摘要:
+        //     已有工字轮个数
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "已有工字轮个数")]
+        public int HaveQty { get; set; }
+
+        //
+        // 摘要:
+        //     是否出库
+        [SugarColumn(IsNullable = false, ColumnDescription = "是否出库")]
+        public bool Out { get; set; }
+
+        //
+        // 摘要:
+        //     上一次分配时的放置位信息
+        [SugarColumn(ColumnDataType = "int", IsNullable = true)]
+        public int LastXYNO { get; set; }
+    }
+
+    //
+    // 摘要:
+    //     仓库表
+    [Tenant("fj")]
+    [SugarTable("Base_Warehouse")]
+    public class BaseWarehouse : BaseModel
+    {
+        //
+        // 摘要:
+        //     是否停用
+        [SugarColumn(ColumnDataType = "int", IsNullable = false)]
+        public int IsStop { get; set; }
+
+        //
+        // 摘要:
+        //     编号
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = false)]
+        public string Code { get; set; }
+
+        //
+        // 摘要:
+        //     名称
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = false)]
+        public string Name { get; set; }
+
+        ////
+        //// 摘要:
+        ////     类型
+        //[SugarColumn(IsNullable = false)]
+        //public FjLocationType TypeNum { get; set; }
+
+        //
+        // 摘要:
+        //     ConfigId
+        [SugarColumn(ColumnName = "ConfigId", ColumnDescription = "ConfigId")]
+        public long ConfigId { get; set; }
+    }
 }

+ 2 - 2
业务工程/分拣库/WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -63,7 +63,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         {
             var key = $"WCS:Lock:AGV:{nameof(AgvCallback)}";
             var res = new AgvCallbackResponse() { code = AgvResponseCode.Success, message = "失败" };
-            LogHub.InterfacePublish(nameof(AgvCallback), $"传入参数--reqCode:{reqDto.reqCode}--taskCode:{reqDto.taskCode}--method:{reqDto.method}");
+            //LogHub.InterfacePublish(nameof(AgvCallback), $"传入参数--reqCode:{reqDto.reqCode}--taskCode:{reqDto.taskCode}--method:{reqDto.method}");
             try
             {
                 RedisHub.Do(key, redis =>
@@ -122,7 +122,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                 res.code = AgvResponseCode.Error;
                 res.message = ex.Message;
             }
-            LogHub.InterfacePublish(nameof(AgvCallback), $"返回结果--reqCode:{reqDto.reqCode}--code:{res.code}--message:{res.message}--taskCode:{reqDto.taskCode}");
+            //LogHub.InterfacePublish(nameof(AgvCallback), $"返回结果--reqCode:{reqDto.reqCode}--code:{res.code}--message:{res.message}--taskCode:{reqDto.taskCode}");
             return res;
         }
     }

+ 14 - 13
业务工程/分拣库/WCS.WorkEngineering/Worlds/MainWorld.cs

@@ -48,19 +48,20 @@ namespace WCS.WorkEngineering.Worlds
         /// </summary>
         protected override void AfterUpdate(List<WorkTimes> list)
         {
-            //通过异步处理,加快周期速度
-            Task.Run(() =>
-            {
-                try
-                {
-                    LogHub.WorldPublish(Logs, this.GetType().Name);
-                }
-                catch (Exception e)
-                {
-                    //Console.WriteLine(e);
-                    //throw;
-                }
-            });
+            LogHub.WorldPublish(Logs, this.GetType().Name);
+            ////通过异步处理,加快周期速度
+            //Task.Run(() =>
+            //{
+            //    try
+            //    {
+
+            //    }
+            //    catch (Exception e)
+            //    {
+            //        //Console.WriteLine(e);
+            //        //throw;
+            //    }
+            //});
         }