林豪 左 vor 1 Jahr
Ursprung
Commit
6ac869d851

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

@@ -63,7 +63,7 @@ namespace WCS.WorkEngineering.Systems
 
                     //是异常任务,查询最近的一条异常任务
                     taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.ID == task.TaskId);
-                    if (taskInfo.Status >= TaskStatus.FinishOfShunt && obj.Data2.TaskNumber != task.TaskId)
+                    if (taskInfo == null || (taskInfo.Status >= TaskStatus.FinishOfShunt && obj.Data2.TaskNumber != task.TaskId))
                     {
                         WmsApi.PalletizingCreateseErrorTasks(obj.Entity.Code, type);
                         return;
@@ -257,7 +257,8 @@ namespace WCS.WorkEngineering.Systems
                         InStock = false,
                         Put = false,
                         IsTruss = false,
-                        MatCodeList = palletizingRow.MatCodeList
+                        MatCodeList = palletizingRow.MatCodeList,
+                        Quantity = palletizingRow.QtyMaxCount
                     };
 
                     var res = db.Insertable(cacheLine).ExecuteReturnEntity();
@@ -297,98 +298,6 @@ namespace WCS.WorkEngineering.Systems
                 taskInfo.InitStackStructure(db);
             }
             return result;
-            ////找到所有当前轮子可以去的垛形
-            //var palletizingList = db.Queryable<WCS_Palletizing>()
-            //    .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
-            //    .Where(x => x.MatCodeList.Contains(taskInfo.MatCode) && !x.Finish).ToList()
-            //    .Where(x => x.Layers.SelectMany(x => x.Rows).Any(r => r.LineCode == null))
-            //    .OrderBy(x => x.AddTime).ToList();
-            ////如果没有对应的垛形信息就初始化一个垛形信息
-            //if (palletizingList.Count <= 0)
-            //{
-            //    taskInfo.InitStackStructure(db);
-            //    return false;
-            //}
-
-            //var b = palletizingList.Select(palletizing => palletizing.Layers
-            //        .Where(x => !x.IsEmpty)
-            //        .Where(x => !x.Finish)
-            //        .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
-            //        .Where(x => x.Rows.Any(r => r is { IsEmpty: false, Finish: false } && r.MatCodeList.Contains(taskInfo.MatCode) && r.CacheLineId == 0))
-            //        .MinBy(x => x.LayerNo)).Where(x => x != null);
-
-            //foreach (var palletizingLayer in b)
-            //{
-            //    //如果没有哪一层需要这个物料号,就初始化一个新的垛形信息
-            //    if (palletizingLayer == null)
-            //    {
-            //        taskInfo.InitStackStructure(db);
-            //        return false;
-            //    }
-
-            //    //再找行:未空置、未结束
-            //    var palletizingRow = palletizingLayer.Rows.Where(x => x is { IsEmpty: false, Finish: false } && x.MatCodeList.Contains(taskInfo.MatCode) && x.CacheLineId == 0)
-            //        .MinBy(x => x.RowNo);
-            //    //如果没有哪一行需要这个物料号,就初始化一个新的垛形信息
-            //    if (palletizingRow == null)
-            //    {
-            //        taskInfo.InitStackStructure(db);
-            //        return false;
-            //    }
-            //    //走到这一步就表示没有哪一段线体缓存了当前物料,需要选一段新的线体进行缓存
-
-            //    //TODO:暂时不处理就近分线的逻辑
-            //    //获取一个当前可以使用的分配锁
-            //    var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
-            //    if (devCode == 0)
-            //    {
-            //        World.Log($"无可用线体:{taskInfo.ID}");
-            //        return false;
-            //    }
-
-            //    //开始初始化缓存位信息
-            //    cacheLine = new WCS_CacheLine()
-            //    {
-            //        LocationNo = devCode,
-            //        AddTime = DateTime.Now,
-            //        PalletizingRowId = palletizingRow.Id,
-            //        InStock = false,
-            //        Put = false,
-            //        IsTruss = false,
-            //        MatCodeList = palletizingRow.MatCodeList
-            //    };
-
-            //    var res = db.Insertable(cacheLine).ExecuteReturnEntity();
-            //    palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
-            //    palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
-            //    palletizingRow.CacheLineId = res.Id;
-            //    palletizingRow.EditTime = DateTime.Now;
-            //    db.Updateable(palletizingRow).ExecuteCommand();
-
-            //    for (var i = 0; i < palletizingRow.Locs.Count; i++)
-            //    {
-            //        var loc = new WCS_CacheLineLoc()
-            //        {
-            //            XYNo = palletizingRow.Locs[i].XYNo,
-            //            InStock = i == 0,
-            //            IsEmpty = palletizingRow.Locs[i].IsEmpty,
-            //            MatCode = palletizingRow.Locs[i].MatCode,
-            //            TaskId = i == 0 ? taskInfo.ID : 0,
-            //            CacheLineId = res.Id
-            //        };
-            //        db.Insertable(loc).ExecuteCommand();
-            //    }
-
-            //    taskInfo.Status = TaskStatus.FinishOfShunt;
-            //    taskInfo.AddrNext = devCode.ToString();
-            //    taskInfo.EditWho = "WCS";
-            //    taskInfo.EditTime = DateTime.Now;
-            //    taskInfo.GoodsType = obj.Data4.Length.ToInt();
-            //    db.Updateable(taskInfo).ExecuteCommand();
-            //    taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-
-            //    return true;
-            //}
 
             #endregion 初始化一个信息的缓存信息
         }

+ 69 - 20
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架.cs

@@ -45,14 +45,16 @@ namespace WCS.WorkEngineering.Systems
                         //先更新对应的位信息
                         try
                         {
-                            foreach (var loc in pr.Locs)
+                            var index = 0;
+                            foreach (var loc in pr.Locs.Where(x => !x.IsEmpty).OrderBy(x => x.XYNo))
                             {
-                                var cacheLoc = cacheLine.Locations.Single(x => x.XYNo == loc.XYNo);
+                                var cacheLoc = cacheLine.Locations[index];
                                 cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
                                 loc.TaskId = cacheLoc.TaskId;
                                 loc.Finish = true;
                                 db.Updateable(loc).ExecuteCommand();
                                 db.Deleteable(cacheLoc);
+                                index++;
                             }
                         }
                         catch (Exception a)
@@ -134,11 +136,21 @@ namespace WCS.WorkEngineering.Systems
                 if (!devCode.Any()) throw new KnownException($"无可用放货码垛位,请检查实际有货位置的光电是否正常", LogLevelEnum.Mid);
                 palletizingLsit = palletizingLsit.Where(x => devCode.Contains(x.PalletizingStation)).ToList(); //可以放货的目标托盘
                 //可以取货的码垛信息
-                var pickUpCode = _pickUpDevices.Select(x => x.Key.Entity.Code);
+                var pickUpCode = _pickUpDevices.Select(x => x.Key.Entity.Code.ToShort());
+                //从缓存线信息找到可以取货的缓存线
+                var cacheLines = db.Queryable<WCS_CacheLine>().Where(x => pickUpCode.Contains(x.LocationNo)).ToList().Where(
+                    x =>
+                    {
+                        return pickUpDevices.Any(p => p.key == x.LocationNo.ToString() && p.Count == x.Quantity);
+                    });
+                //找到可用缓存线可以去的码垛信息
                 palletizingLsit = palletizingLsit.Where(x => x.Layers
                     .Where(w => !w.Finish)
                     .SelectMany(w => w.Rows)
-                    .Where(v => !v.Finish).Any(w => pickUpCode.Contains(w.LineCode))).ToList();
+                    .Where(v => !v.Finish).Any(w =>
+                    {
+                        return cacheLines.Any(a => a.MatCodeList == w.MatCodeList && a.Quantity == w.QtyMaxCount);
+                    })).ToList();
                 if (!palletizingLsit.Any()) throw new KnownException($"没有可用取货点,码垛信息是否正常", LogLevelEnum.Mid);
 
                 foreach (var palletizingInfo in palletizingLsit)
@@ -147,35 +159,72 @@ namespace WCS.WorkEngineering.Systems
                     if (palletizingInfo == null || (palletizingRowList != null && palletizing != null)) continue;
 
                     //筛选出已经预锁的行
-                    var palletizingRow = palletizingInfo.Layers.Where(x => !x.Finish)
-                        .MinBy(x => x.LayerNo)
+                    var palletizingRow = palletizingInfo.Layers
+                        .Where(x => x is { Finish: false, IsEmpty: false }) //不空且未结束的层
+                        .MinBy(x => x.LayerNo) //取最下层
                         .Rows
-                        .Where(x => x is { Finish: false, IsEmpty: false, LineCode: not null })
-                        .Where(x =>
-                        {
-                            var devs = pickUpDevices.Where(p => p.Count == x.QtyMaxCount).Select(v => v.key);
-                            return devs.Contains(x.LineCode);
-                        })
-                        .OrderBy(x => x.RowNo)
-                        .Take(2)
-                        .ToList();
+                        .Where(x => x is { Finish: false, IsEmpty: false, LineCode: null }) //不空且未结束的行
+                        .Where(x => cacheLines.Any(a => a.MatCodeList == x.MatCodeList && a.Quantity == x.QtyMaxCount)); //获取可以取货的码垛信息行
 
                     //无可用行,进入下一次迭代
                     if (!palletizingRow.Any()) continue;
+                    var rowIds = new List<int>();
+                    //跟据缓存信息找到对应的可用取货行
+                    var rowList = cacheLines.Select(x =>
+                    {
+                        var b = palletizingRow.Where(w => !rowIds.Contains(w.Id) && x.MatCodeList == w.MatCodeList && x.Quantity == w.QtyMaxCount).OrderBy(o => o.RowNo).FirstOrDefault();
+                        if (b != null)
+                        {
+                            rowIds.Add(b.Id);
+                            return new
+                            {
+                                CacheLineId = x.Id,
+                                RowId = b.Id,
+                                x.LocationNo,
+                                b.RowNo
+                            };
+                        }
+                        return new
+                        {
+                            CacheLineId = 0,
+                            RowId = 0,
+                            x.LocationNo,
+                            RowNo = 0
+                        };
+                    }).Where(x => x.CacheLineId != 0).OrderBy(x => x.RowNo).Take(2).ToList();
 
                     //两个任务取货线体号相同时,只执行一个任务
-                    if (palletizingRow.Count == 2 && palletizingRow[0].LineCode == palletizingRow[1].LineCode) palletizingRow = palletizingRow!.Take(1).ToList();
+                    if (rowList.Count == 2 && rowList[0].LocationNo == rowList[1].LocationNo) rowList = rowList!.Take(1).ToList();
                     //两个行号,差值大于一时,只执行一个任务
-                    if (palletizingRow.Count == 2 && palletizingRow[0].RowNo + 1 != palletizingRow[1].RowNo) palletizingRow = palletizingRow!.Take(1).ToList();
+                    if (rowList.Count == 2 && rowList[0].RowNo + 1 != rowList[1].RowNo) rowList = rowList!.Take(1).ToList();
+
+                    var palletizingRows = new List<WCS_PalletizingRow>();
 
-                    //对行对应的缓存信息进行预释放处理
-                    foreach (var cacheLine in palletizingRow.Select(wcsPalletizingRow => db.Queryable<WCS_CacheLine>().Single(x => x.Id == wcsPalletizingRow.CacheLineId)))
+                    foreach (var row in rowList)
                     {
+                        //锁定缓存线
+                        var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == row.CacheLineId);
                         cacheLine.IsTruss = true;
+                        cacheLine.PalletizingRowId = row.RowId;
                         db.Updateable(cacheLine).ExecuteCommand();
+                        //解锁原有码垛信息
+                        var oldRow = db.Queryable<WCS_PalletizingRow>().First(x => x.CacheLineId == row.CacheLineId);
+                        if (oldRow != null)
+                        {
+                            oldRow.CacheLineId = 0;
+                            oldRow.LineCode = null;
+                            db.Updateable(oldRow).ExecuteCommand();
+                        }
+
+                        //锁定现有码垛信息
+                        var wcsRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).First(x => x.Id == row.RowId);
+                        wcsRow.CacheLineId = row.CacheLineId;
+                        wcsRow.LineCode = row.LocationNo.ToString();
+                        db.Updateable(wcsRow).ExecuteCommand();
+                        palletizingRows.Add(wcsRow);
                     }
 
-                    palletizingRowList = palletizingRow;
+                    palletizingRowList = palletizingRows.OrderBy(x => x.RowNo).ToList();
                     palletizing = palletizingInfo;
                 }
             });

+ 4 - 3
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架缓存放行点.cs

@@ -85,9 +85,10 @@ namespace WCS.WorkEngineering.Systems
                     lineCache.Put = true;
                     db.Updateable(lineCache).ExecuteCommand();
 
-                    var pr = db.Queryable<WCS_PalletizingRow>().Single(x => x.Id == lineCache.PalletizingRowId);
-                    pr.LineCode = lineCache.LocationNo.ToString();
-                    db.Updateable(pr).ExecuteCommand();
+                    //TODO:此处不绑定码垛信息的行
+                    //var pr = db.Queryable<WCS_PalletizingRow>().Single(x => x.Id == lineCache.PalletizingRowId);
+                    //pr.LineCode = lineCache.LocationNo.ToString();
+                    //db.Updateable(pr).ExecuteCommand();
                 }
 
                 var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.FinishOfShunt) ?? throw new KnownException("未找到对应的WCS任务", LogLevelEnum.Mid);

+ 7 - 8
业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/机械臂cs.cs

@@ -128,10 +128,6 @@ namespace WCS.WorkEngineering.Systems
             if (obj.Data2.RobotMode != RobotMode.Automatic) throw new KnownException($"robot处于{obj.Data2.RobotMode.GetDescription()}模式", LogLevelEnum.Low);
             if (obj.Data2.RunStatus != RobotRunStatus.Idle) throw new KnownException($"robot处于{obj.Data2.RunStatus.GetDescription()}状态", LogLevelEnum.High);
 
-            //上一个周期是不是出库任务 第一次获取返回结果会是false
-            var lastIsOut = obj.Entity.GetFlag<bool>("LastIsOut");
-            obj.Entity.SetFlag("LastIsOut", !lastIsOut);
-
             //判断是否有任务是机器人执行中
             //再检查是否有等待执行的货物
             SqlSugarHelper.Do(db =>
@@ -141,14 +137,17 @@ namespace WCS.WorkEngineering.Systems
                 //任务集合是否有处于堆垛机执行状态的任务
                 if (tasks.Any(v => v.Status == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High);
             });
-
+            //获取入库次数
+            var inQuantity = obj.Entity.GetFlag<int>("InQuantity");
+            var inMaxQuantity = 3;
             //入库任务优先 或 上一个周期是出库任务并且出库任务无优先
-            if (lastIsOut) //入库任务
+            if (inQuantity <= inMaxQuantity) //入库任务
             {
                 //判断本次优先执行楼层,并设置下次执行时优先楼层
                 var floor = obj.Entity.GetFlag<int>("FloorIn");
                 floor = floor % 2 + 1;
                 obj.Entity.SetFlag("FloorIn", floor);
+                obj.Entity.SetFlag("InQuantity", inQuantity == inMaxQuantity ? 0 : inQuantity + 1);
 
                 //获取当前机械臂所有的取货站台
                 var pickUpDevices = obj.Entity.Sources.Where(x => x.HasFlag(DeviceFlags.输送机)).Where(x => x.DeviceGroup.Any()).Select(
@@ -277,7 +276,7 @@ namespace WCS.WorkEngineering.Systems
                         throw new KnownException($"无法执行多个任务", LogLevelEnum.Mid);
                 }
             }
-            else if (!lastIsOut) //出库任务
+            else //出库任务
             {
                 //判断本次优先执行楼层,并设置下次执行时优先楼层
                 var floor = obj.Entity.GetFlag<int>("FloorOut");
@@ -289,7 +288,7 @@ namespace WCS.WorkEngineering.Systems
                 if (!arrOut.Any()) throw new KnownException($"机械臂{obj.Entity.Code}无放货路径点", LogLevelEnum.High);
 
                 //获取可以放货的设备集合
-                arrOut = arrOut.Where(v => v.Data3.Status.HasFlag(StationStatus.PH_Status)/* && v.Data.TaskNumber == 0 && v.Data.GoodsEnd == 0*/).ToList();//有光电
+                arrOut = arrOut.Where(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && v.Data.TaskNumber == 0 && v.Data.GoodsEnd == 0).ToList();//有光电
                 if (!arrOut.Any()) throw new KnownException($"[{obj.Entity.Code}]等待出库任务输送到位", LogLevelEnum.Mid);
 
                 var taskInfoList = new List<WCS_TaskInfo>();

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/WorkStart.cs

@@ -573,7 +573,7 @@ namespace WCS.WorkEngineering
                 { DeviceFlags.拆盘机09, new List<string>(){ "1606" } },
                 { DeviceFlags.拆盘机非09, new List<string>(){ "1602" } },
                 { DeviceFlags.桁架码垛位, new List<string>(){ "1670", "1671", "1672", "1673", "1674", "1675","1664","1662","1665" } },
-                { DeviceFlags.环形库码垛工位, new List<string>(){ "1666","1661" } },
+                { DeviceFlags.环形库码垛工位, new List<string>(){ "1666"/*,"1661"*/ } },
                 { DeviceFlags.AGV取货站台口, new List<string>(){ "2533", "2534", "2734" } },
                 { DeviceFlags.Robot, new List<string>(){ "Robot1" } },
         };