林豪 左 1 year ago
parent
commit
e41a054b4d

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

@@ -158,7 +158,7 @@ namespace WCS.WorkEngineering.Systems
 
 
                                                 case "1S":
                                                 case "1S":
                                                     positionList.AddRange(new List<string>() { "2701", "2705", "2709", "2713"/*"2501", "2505", "2509", "2513"*/ });
                                                     positionList.AddRange(new List<string>() { "2701", "2705", "2709", "2713"/*"2501", "2505", "2509", "2513"*/ });
-                                                    break;
+                                                    break; 
 
 
                                                 case "2N":
                                                 case "2N":
                                                     positionList.AddRange(new List<string>() { "2901", "2905", "2909", "2913" });
                                                     positionList.AddRange(new List<string>() { "2901", "2905", "2909", "2913" });

+ 229 - 0
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/桁架分流点.cs

@@ -58,6 +58,7 @@ namespace WCS.WorkEngineering.Systems
             return dev.HasFlag(Extensions.DeviceFlags.桁架分流点);
             return dev.HasFlag(Extensions.DeviceFlags.桁架分流点);
         }
         }
 
 
+
         /// <summary>
         /// <summary>
         ///  计算去向
         ///  计算去向
         /// </summary>
         /// </summary>
@@ -284,5 +285,233 @@ namespace WCS.WorkEngineering.Systems
 
 
             #endregion 初始化一个信息的缓存信息
             #endregion 初始化一个信息的缓存信息
         }
         }
+
+
+        ///// <summary>
+        /////  计算去向
+        ///// </summary>
+        ///// <param name="db"></param>
+        ///// <param name="taskInfo"></param>
+        ///// <param name="obj"></param>
+        ///// <returns></returns>
+        //public bool Allot(SqlSugarScopeProvider db, WCS_TaskInfo taskInfo, Device<IStation520, IStation521, IStation523> obj)
+        //{
+        //    taskInfo.Device = obj.Entity.Code switch
+        //    {
+        //        "455" => "Truss1",
+        //        "655" => "Truss1",
+        //        "855" => "Truss2",
+        //        "1055" => "Truss2",
+        //        "1255" => "Truss3",
+        //        "1455" => "Truss3",
+        //        _ => "Error"
+        //    };
+        //    //获取当前货物类型可以到达的桁架缓存放行点信息
+        //    var cacheLineDevList = obj.Entity.Targets.Where(x => x.HasFlag(DeviceFlags.桁架缓存放行点)); //当前地址可以到达的所有桁架缓存放行点信息
+        //    switch (taskInfo.GoodsType)
+        //    {
+        //        case 9:
+        //            //是异常工字轮
+        //            cacheLineDevList = taskInfo.BarCode.Contains("Error") ? cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架09异常缓存放行点)) : cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架09缓存放行点));
+        //            break;
+
+        //        case 18:
+        //            cacheLineDevList = cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架18缓存放行点));
+        //            break;
+        //    }
+        //    var cacheLineCodes = cacheLineDevList.Select(x => x.Code.ToShort());
+        //    var cacheLineList = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).ToList();
+
+        //    #region 跟据缓存信息寻找可以到达的缓存点
+
+        //    //找到当前任务可用的缓存线信息
+        //    var cacheLine = cacheLineList.Where(x => x.Locations.Any(l => l is { InStock: false, IsEmpty: false })).FirstOrDefault(x => cacheLineCodes.Contains(x.LocationNo) && x.MatCodeList.Contains(taskInfo.MatCode) && !x.InStock);
+
+        //    //这个任务可以直接去一条线体,不需要新建缓存信息
+        //    //找到这条线体中序号最小的一条位信息 非空置且无货
+        //    var cacheLoc = cacheLine?.Locations.Where(x => x is { InStock: false, IsEmpty: false }).MinBy(x => x.XYNo);
+        //    if (cacheLoc != null)
+        //    {
+        //        cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
+        //        cacheLoc.InStock = true;
+        //        cacheLoc.TaskId = taskInfo.ID;
+        //        cacheLoc.EditTime = DateTime.Now;
+        //        db.Updateable(cacheLoc).ExecuteCommand();
+
+        //        //WCS任务相关信息
+        //        taskInfo.Status = TaskStatus.FinishOfShunt;
+        //        taskInfo.AddrNext = cacheLine.LocationNo.ToString();
+        //        taskInfo.EditWho = "WCS";
+        //        taskInfo.EditTime = DateTime.Now;
+        //        db.Updateable(taskInfo).ExecuteCommand();
+        //        taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
+
+        //        return true;
+        //    }
+
+        //    #endregion 跟据缓存信息寻找可以到达的缓存点
+
+        //    #region 初始化一个信息的缓存信息
+
+        //    //找到一个可以进行缓存的线体号
+        //    var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
+        //    if (devCode == 0)
+        //    {
+        //        World.Log($"无可用线体:{taskInfo.ID}");
+        //        //var endTime = DateTime.Now.AddMinutes(-10);
+        //        ////找一个当前时间最早且已超过25分钟未码垛的码垛信息半托入库
+        //        ////未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
+        //        //var palletizing = db.Queryable<WCS_Palletizing>()
+        //        //    .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
+        //        //    .Where(x => !x.Finish && x.WarehouseCode == taskInfo.WarehouseCode && x.Layers.Any(l => l.Rows.Any(r => r.Finish)))
+        //        //    .Where(x => x.EditTime < endTime).ToList()
+        //        //    .MinBy(x => x.AddTime);
+        //        //cacheLineList = db.Queryable<WCS.Entity.WCS_CacheLine>().Where(x => x.WarehouseCode == taskInfo.WarehouseCode && x.IsTruss).ToList();
+
+        //        //if (palletizing != null && !cacheLineList.Any())
+        //        //{
+        //        //    var dev = Device.All.Where(x => x.Code == palletizing.PalletizingStation).Select(x => new Device<ITruss530>(x, World)).FirstOrDefault();
+        //        //    if (dev != null && !dev.Data.CmdType.HasFlag(TrussCmdType.Two))
+        //        //    {
+        //        //        dev.Data.CmdType = TrussCmdType.Two;
+        //        //    }
+        //        //}
+        //        return false;
+        //    }
+        //    var result = false;
+
+        //    //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
+        //    var palletizingList = db.Queryable<WCS_Palletizing>()
+        //        .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
+        //        .Where(x => (!x.Finish || (x.Finish && x.isItHalf)) && x.MatCodeList.Contains(taskInfo.MatCode) && x.WarehouseCode == taskInfo.WarehouseCode)
+        //        .OrderBy(x => x.AddTime)
+        //        .ToList();
+
+        //    foreach (var palletizing in palletizingList)
+        //    {
+        //        //当前任务已经分配结束,进入下一次迭代
+        //        if (result) continue;
+
+        //        //未结束且包含当前物料编号的层,按层号排序,层号小的优先分配
+        //        var layer = palletizing.Layers.Where(x => x is { IsEmpty: false, Finish: false })
+        //            .Where(x => x.MatCodeList.Contains(taskInfo.MatCode)).MinBy(x => x.LayerNo);
+
+        //        //未找到可用层,进入下一次迭代
+        //        if (layer == null) continue;
+        //        // 当前任务已经分配结束,进入下一次迭代
+
+        //        //未结束,未预分配缓存线信息且包含当前物料编号的行,行号小的优先分配
+        //        var rows = layer.Rows.Where(x => x is { IsEmpty: false, Finish: false })
+        //            .Where(x => x.CacheLineId == 0)
+        //            .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
+        //            .ToList();
+        //        //未找到可用行,进入下一次迭代
+        //        if (!rows.Any()) continue;
+        //        var palletizingRow = rows.MinBy(x => x.RowNo);
+
+        //        //开始初始化缓存位信息
+        //        cacheLine = new WCS.Entity.WCS_CacheLine()
+        //        {
+        //            LocationNo = devCode,
+        //            AddTime = DateTime.Now,
+        //            PalletizingRowId = palletizingRow.Id,
+        //            InStock = false,
+        //            Put = false,
+        //            IsTruss = false,
+        //            MatCodeList = palletizingRow.MatCodeList,
+        //            Quantity = palletizingRow.QtyMaxCount,
+        //            WarehouseCode = taskInfo.WarehouseCode
+        //        };
+
+        //        if (palletizing.isItHalf) //当前任务被分配到了二次码垛托盘上了。
+        //        {
+        //            var twoDevCode = new List<string>();
+        //            switch (obj.Entity.Code)
+        //            {
+        //                case "455":
+        //                    twoDevCode.AddRange(new List<string>() { "1674", "1675" });
+        //                    break;
+
+        //                case "655":
+        //                    twoDevCode.AddRange(new List<string>() { "", "" });
+        //                    break;
+
+        //                case "855":
+        //                    twoDevCode.AddRange(new List<string>() { "1700", "1701" });
+        //                    break;
+
+        //                case "1055":
+        //                    twoDevCode.AddRange(new List<string>() { "1715", "1716" });
+        //                    break;
+
+        //                case "1255":
+        //                    twoDevCode.AddRange(new List<string>() { "", "" });
+        //                    break;
+
+        //                case "1455":
+        //                    twoDevCode.AddRange(new List<string>() { "", "" });
+        //                    break;
+        //            }
+        //            //找到一个对应的空置码垛位
+        //            var twoDevs = Device.All.Where(x => twoDevCode.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).Where(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status)).Select(x => x.Entity.Code);
+        //            if (twoDevs.Any())
+        //            {
+        //                World.Log("无可用的二次码垛工位");
+        //                continue;
+        //            }
+
+        //            if (db.Queryable<WCS_Palletizing>().Any(x => !x.Finish && twoDevs.Contains(x.PalletizingStation)))
+        //            {
+        //                World.Log($"有正目标地址是{JsonConvert.SerializeObject(twoDevs)}的未结束二次码垛任务,无可用的二次码垛工位");
+        //                continue;
+        //            }
+        //            palletizing.EditTime = DateTime.Now;
+        //            palletizing.Finish = false;
+        //            palletizing.PalletizingStation = twoDevs.FirstOrDefault();
+        //            palletizing.TaskAddNext ??= devCode.ToString();
+        //            db.Updateable(palletizing).ExecuteCommand();
+        //        }
+
+        //        if (palletizing.TaskAddNext == null)
+        //        {
+        //            palletizing.TaskAddNext = devCode.ToString();
+        //            db.Updateable(palletizing).ExecuteCommand();
+        //        }
+        //        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;
+
+        //        var createCacheLoc = palletizingRow.Locs.Select((t, i) => new WCS_CacheLineLoc()
+        //        {
+        //            XYNo = t.XYNo,
+        //            InStock = i == 0,
+        //            IsEmpty = t.IsEmpty,
+        //            MatCode = t.MatCode,
+        //            TaskId = i == 0 ? taskInfo.ID : 0,
+        //            CacheLineId = res.Id
+        //        }).ToList();
+
+        //        taskInfo.Status = TaskStatus.FinishOfShunt;
+        //        taskInfo.AddrNext = devCode.ToString();
+        //        taskInfo.EditWho = "WCS";
+        //        taskInfo.EditTime = DateTime.Now;
+        //        db.Updateable(taskInfo).ExecuteCommand();
+        //        taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
+        //        db.Updateable(palletizingRow).ExecuteCommand();
+        //        db.Insertable(createCacheLoc).ExecuteCommand();
+
+        //        result = true;
+        //    }
+
+        //    if (!result)
+        //    {
+        //        taskInfo.InitStackStructure(db);
+        //    }
+        //    return result;
+
+        //    #endregion 初始化一个信息的缓存信息
+        //}
     }
     }
 }
 }

+ 7 - 2
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs

@@ -48,7 +48,7 @@ namespace WCS.WorkEngineering.Systems
                 {
                 {
                     if (taskList.Count != TaskNoList.Count) throw new KnownException($"任务数量不一致!,请检查托盘任务信息", LogLevelEnum.Mid);
                     if (taskList.Count != TaskNoList.Count) throw new KnownException($"任务数量不一致!,请检查托盘任务信息", LogLevelEnum.Mid);
                 }
                 }
-                var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == palletizing.PalleCode && x.Type == TaskType.EnterDepot && x.Status == TaskStatus.WaitingToExecute);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == palletizing.PalleCode && x.Type == TaskType.EnterDepot);
                 if (taskInfo == null)
                 if (taskInfo == null)
                 {
                 {
                     if (obj.Data5.CmdType.HasFlag(TrussCmdType.Two)) WmsApi.SecondaryBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
                     if (obj.Data5.CmdType.HasFlag(TrussCmdType.Two)) WmsApi.SecondaryBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
@@ -56,7 +56,12 @@ namespace WCS.WorkEngineering.Systems
                     else WmsApi.FinishBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
                     else WmsApi.FinishBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
                     return;
                     return;
                 }
                 }
-                if (taskInfo.Status != TaskStatus.WaitingToExecute) return;
+
+                if (taskInfo.Status != TaskStatus.WaitingToExecute)
+                {
+                    if (taskInfo.Status == TaskStatus.NewBuild) throw new KnownException($"等待入库任务{taskInfo.ID}初始化完成", LogLevelEnum.Low);
+                    return;
+                }
 
 
                 foreach (var x in taskList)
                 foreach (var x in taskList)
                 {
                 {