林豪 左 1 年之前
父節點
當前提交
28643870e2

+ 6 - 0
WCS.Entity/WCS_CacheLineLoc.cs

@@ -74,5 +74,11 @@ namespace WCS.Entity
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDescription = "编辑时间")]
         public DateTime EditTime { get; set; }
+
+        /// <summary>
+        ///  正反面  1正面 2反面
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDescription = "正反面")]
+        public int SideNum { get; set; }
     }
 }

+ 6 - 0
业务工程/分拣库/WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -616,5 +616,11 @@ namespace WCS.WorkEngineering.Extensions
         /// </summary>
         [SugarColumn(ColumnDataType = "int", IsNullable = true, ColumnDescription = "垛型大类")]
         public int StampType { get; set; }
+
+        /// <summary>
+        /// 是否在桁架进行码垛
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDescription = "是否在桁架进行码垛")]
+        public bool IsTruss { get; set; }
     }
 }

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

@@ -48,6 +48,7 @@ namespace WCS.WorkEngineering.Systems
                 World.Log("站台货物信息与实际占用不一致");
                 return;
             }
+
             ;
             if (obj.Data2.Request != 1)
             {
@@ -59,7 +60,10 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var task = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status < TaskStatus.FinishOfShunt) ?? throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
+                var task =
+                    db.Queryable<WCS_TaskInfo>()
+                        .First(v => v.ID == obj.Data2.TaskNumber && v.Status < TaskStatus.FinishOfShunt) ??
+                    throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
                 if (Allot(db, task, obj)) taskInfo = task;
             });
 
@@ -87,7 +91,8 @@ namespace WCS.WorkEngineering.Systems
         /// <param name="taskInfo"></param>
         /// <param name="obj"></param>
         /// <returns></returns>
-        public bool Allot(SqlSugarScopeProvider db, WCS_TaskInfo taskInfo, Device<IStation520, IStation521, IStation523> obj)
+        public bool Allot(SqlSugarScopeProvider db, WCS_TaskInfo taskInfo,
+            Device<IStation520, IStation521, IStation523> obj)
         {
             var nowTime = DateTime.Now;
             taskInfo.Device = obj.Entity.Code switch
@@ -106,20 +111,25 @@ namespace WCS.WorkEngineering.Systems
             {
                 case 9:
                     //是异常工字轮
-                    cacheLineDevList = taskInfo.BarCode.Contains("Error") ? cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架09异常缓存放行点)) : cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架09缓存放行点));
+                    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 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);
 
             //这个任务可以直接去一条线体,不需要新建缓存信息
             //找到这条线体中序号最小的一条位信息 非空置且无货
@@ -130,14 +140,16 @@ namespace WCS.WorkEngineering.Systems
                 cacheLoc.InStock = true;
                 cacheLoc.TaskId = taskInfo.ID;
                 cacheLoc.EditTime = nowTime;
-                db.UpdateableRowLock(cacheLoc).UpdateColumns(x => new { x.InStock, x.TaskId, x.EditTime }).ExecuteCommand();
+                db.UpdateableRowLock(cacheLoc).UpdateColumns(x => new { x.InStock, x.TaskId, x.EditTime })
+                    .ExecuteCommand();
 
                 //WCS任务相关信息
                 taskInfo.Status = TaskStatus.FinishOfShunt;
                 taskInfo.AddrNext = cacheLine.LocationNo.ToString();
                 taskInfo.EditWho = "WCS";
                 taskInfo.EditTime = nowTime;
-                db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.Status, x.AddrNext, x.EditWho, x.EndTime }).ExecuteCommand();
+                db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.Status, x.AddrNext, x.EditWho, x.EndTime })
+                    .ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
 
                 return true;
@@ -148,7 +160,8 @@ namespace WCS.WorkEngineering.Systems
             #region 初始化一个信息的缓存信息
 
             //找到一个可以进行缓存的线体号
-            var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
+            var devCode = cacheLineDevList.Select(x => x.Code.ToShort())
+                .FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
             if (devCode == 0)
             {
                 World.Log($"无可用线体:{taskInfo.ID}", LogLevelEnum.Mid);
@@ -157,28 +170,36 @@ namespace WCS.WorkEngineering.Systems
                 //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
                 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.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();
+                cacheLineList = db.Queryable<WCS.Entity.WCS_CacheLine>()
+                    .Where(x => x.WarehouseCode == taskInfo.WarehouseCode && x.IsTruss).ToList();
 
                 if (palletizing == null || cacheLineList.Any()) return false;
                 {
-                    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.HasFlag(TrussCmdType.End1)))
+                    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.HasFlag(TrussCmdType.End1)))
                     {
                         //如果找到的最早的一个托盘超六小时了,就直接强制结盘
-                        dev.Data.CmdType = palletizing.AddTime < DateTime.Now.AddHours(-6) ? TrussCmdType.End1 : TrussCmdType.Two;
+                        dev.Data.CmdType = palletizing.AddTime < DateTime.Now.AddHours(-6)
+                            ? TrussCmdType.End1
+                            : 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)
+                .Where(x => (!x.Finish /*|| (x.Finish && x.isItHalf)*/) && x.MatCodeList.Contains(taskInfo.MatCode) &&
+                            x.WarehouseCode == taskInfo.WarehouseCode)
                 .OrderBy(x => x.AddTime)
                 .ToList();
 
@@ -248,8 +269,11 @@ namespace WCS.WorkEngineering.Systems
                             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);
+                    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("无可用的二次码垛工位");
@@ -261,11 +285,14 @@ namespace WCS.WorkEngineering.Systems
                         World.Log($"有正目标地址是{JsonConvert.SerializeObject(twoDevs)}的未结束二次码垛任务,无可用的二次码垛工位");
                         continue;
                     }
+
                     palletizing.EditTime = nowTime;
                     palletizing.Finish = false;
                     palletizing.PalletizingStation = twoDevs.FirstOrDefault();
                     palletizing.TaskAddNext ??= devCode.ToString();
-                    db.UpdateableRowLock(palletizing).UpdateColumns(x => new { x.EditTime, x.Finish, x.PalletizingStation, x.TaskAddNext }).ExecuteCommand();
+                    db.UpdateableRowLock(palletizing)
+                        .UpdateColumns(x => new { x.EditTime, x.Finish, x.PalletizingStation, x.TaskAddNext })
+                        .ExecuteCommand();
                 }
 
                 if (palletizing.TaskAddNext == null)
@@ -273,8 +300,10 @@ namespace WCS.WorkEngineering.Systems
                     palletizing.TaskAddNext = devCode.ToString();
                     db.Updateable(palletizing).UpdateColumns(x => new { x.TaskAddNext }).ExecuteCommand();
                 }
+
                 var res = db.InsertableRowLock(cacheLine).ExecuteReturnEntity();
-                palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
+                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 = nowTime;
@@ -288,6 +317,7 @@ namespace WCS.WorkEngineering.Systems
                     TaskId = i == 0 ? taskInfo.ID : 0,
                     CacheLineId = res.Id,
                     AddTime = nowTime,
+                    SideNum = t.SideNum,
                     EditTime = nowTime
                 }).ToList();
 
@@ -295,9 +325,11 @@ namespace WCS.WorkEngineering.Systems
                 taskInfo.AddrNext = devCode.ToString();
                 taskInfo.EditWho = "WCS";
                 taskInfo.EditTime = nowTime;
-                db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.Status, x.AddrNext, x.EditWho, x.EditTime }).ExecuteCommand();
+                db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.Status, x.AddrNext, x.EditWho, x.EditTime })
+                    .ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-                db.UpdateableRowLock(palletizingRow).UpdateColumns(x => new { x.CacheLineId, x.EditTime }).ExecuteCommand();
+                db.UpdateableRowLock(palletizingRow).UpdateColumns(x => new { x.CacheLineId, x.EditTime })
+                    .ExecuteCommand();
                 db.InsertableRowLock(createCacheLoc).ExecuteCommand();
 
                 result = true;
@@ -307,236 +339,10 @@ namespace WCS.WorkEngineering.Systems
             {
                 taskInfo.InitStackStructure(db, World);
             }
+
             return result;
 
             #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 初始化一个信息的缓存信息
-        //}
     }
 }

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

@@ -59,6 +59,7 @@ namespace WCS.WorkEngineering.Systems
 
             var isPut = false;
             var nextAdd = GetNext(obj);
+            var goodsType = obj.Data4.Length.ToInt();
             int taskId = 0;
             SqlSugarHelper.Do(_db =>
             {
@@ -66,7 +67,6 @@ namespace WCS.WorkEngineering.Systems
                 var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status < TaskStatus.FinishOfShunt && !v.BarCode.Contains("Error"));
                 if (obj.Data2.TaskNumber == 1)
                 {
-                    var goodsType = obj.Data4.Length.ToInt();
                     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);
@@ -83,13 +83,13 @@ namespace WCS.WorkEngineering.Systems
                 }
                 else if (taskInfo == null)
                 {
-                    World.Log($"未找到对应的WCS任务{obj.Data2.TaskNumber}",LogLevelEnum.Mid);
+                    World.Log($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
                     return;
                 }
 
                 if (!taskInfo.BarCode.Contains("Error"))
                 {
-                    switch (obj.Data4.Length.ToInt())
+                    switch (goodsType)
 
                     {
                         case 9:
@@ -137,15 +137,35 @@ namespace WCS.WorkEngineering.Systems
                         break;
                 };
 
+                var isTruss = false; //表示这个工字轮是要去桁架区域码垛的,默认不作处理
+                if (goodsType == 18)
+                {
+                    //判断这个垛型是否是到桁架区域进行码垛
+                    isTruss = db.Queryable<BillBomsetgrp>().First(x => x.BomCode.Contains(taskInfo.MatCode)).IsTruss;
+                    if (isTruss)
+                    {
+                        nextAdd = obj.Entity.Code switch
+                        {
+                            "418" => 455,
+                            "618" => 655,
+                            "818" => 855,
+                            "1018" => 1055,
+                            "1218" => 1255,
+                            "1418" => 1455,
+                            _ => 9999
+                        };
+                    }
+                }
+
                 taskId = taskInfo.ID;
-                if (obj.Data4.Length.ToInt() != 9) //09工字轮在环形库分流点只分配下一个地址,不作任何变更
+                if (goodsType != 9 && !isTruss) //09工字轮在环形库分流点只分配下一个地址,不作任何变更
                 {
                     taskInfo.AddrNext = nextAdd.ToString();
                     taskInfo.Status = TaskStatus.FinishOfShunt;
                     taskInfo.EditTime = DateTime.Now;
                     taskInfo.WarehouseCode = taskInfo.WarehouseCode.Contains("R") ? taskInfo.WarehouseCode : taskInfo.WarehouseCode + "R";
                     taskInfo.AddrTo = "Robot";
-                    taskInfo.GoodsType = obj.Data4.Length.ToInt();
+                    taskInfo.GoodsType = goodsType;
                     db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.AddrNext, x.Status, x.EditTime, x.WarehouseCode, x.AddrTo, x.GoodsType }).ExecuteCommand();
                     taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "工字轮完成环形库分流");
                 }
@@ -153,7 +173,7 @@ namespace WCS.WorkEngineering.Systems
                 {
                     taskInfo.AddrNext = nextAdd.ToString();
                     taskInfo.EditTime = DateTime.Now;
-                    taskInfo.GoodsType = obj.Data4.Length.ToInt();
+                    taskInfo.GoodsType = goodsType;
                     db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.AddrNext, x.EditTime, x.GoodsType }).ExecuteCommand();
                     taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "工字轮途径环形库分流点");
                 }
@@ -166,6 +186,7 @@ namespace WCS.WorkEngineering.Systems
             obj.Data.GoodsStart = obj.Entity.Code.ToShort();
             obj.Data.GoodsEnd = nextAdd;
             obj.Data.GoodsEnd = nextAdd;
+
             obj.Data.VoucherNo++;
             World.Log($"执行记录:任务号[{taskId}]-[{obj.Data.VoucherNo}]");
         }

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

@@ -107,6 +107,7 @@ namespace WCS.WorkEngineering.Systems
 
             WCS_TaskInfo task = null;
             short nextAdd = 0;
+            int isSideNum = 0;
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
@@ -140,6 +141,8 @@ namespace WCS.WorkEngineering.Systems
                 }
 
                 var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.FinishOfShunt) ?? throw new KnownException("未找到对应的WCS任务", LogLevelEnum.Mid);
+                var location = lineCache.Locations.First(x => x.TaskId == taskInfo.ID);
+                isSideNum = location.SideNum;
                 taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
                 //taskInfo.AddrNext = obj.Entity.Targets.FirstOrDefault().Code;
                 taskInfo.EditWho = "WCS";
@@ -154,6 +157,10 @@ namespace WCS.WorkEngineering.Systems
             obj.Data.TaskNumber = obj.Data2.TaskNumber;
             obj.Data.GoodsStart = obj.Entity.Code.ToShort();
             obj.Data.GoodsEnd = nextAdd;
+            if (isSideNum == 2)
+            {
+                obj.Data.CmdType = StationCmd.Res6;
+            }
             obj.Data.VoucherNo++;
         }
 

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/环形库码垛结束.cs

@@ -19,7 +19,7 @@ namespace WCS.WorkEngineering.Systems.环形库
     /// <summary>
     ///  环形库码垛结束
     /// </summary>
-    [BelongTo(typeof(RingWorld))]
+    [BelongTo(typeof(MainWorld))]
     [Description("环形库码垛结束")]
     public class 环形库码垛结束 : DeviceSystem<Device<IStation520, IStation521, IStation523, IRobot530, IRobot531>>
     {

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

@@ -430,7 +430,7 @@ namespace WCS.WorkEngineering
                 //三台堆垛机IP主机位分别是 41、49、57、65、73、81
                 srm.AddProtocol<ISRM520>(0, 520, $"10.30.37.{ip}");
                 srm.AddProtocol<ISRM521>(0, 521, $"10.30.37.{ip}");
-                srm.AddProtocol<ISRM537>(0, 537, $"10.30.37.{ip}");
+                srm.AddProtocol<ISRM523>(0, 537, $"10.30.37.{ip}");
 
                 //增加巷道
                 var tunnel = new Device($"TY{i + 1}");
@@ -1092,7 +1092,7 @@ namespace WCS.WorkEngineering
                     , "866", "880", "894", "908", "922", "936", "1066", "1080", "1094", "1108", "1122", "1136",
                      "1266", "1280", "1294", "1308", "1322", "1336",  "1466", "1480", "1494", "1508", "1522", "1536" } },
                 { DeviceFlags.桁架09异常缓存放行点, new List<string>(){ "591", "791", "991" , "1191" , "1391" , "1591" } },
-                { DeviceFlags.桁架18缓存放行点, new List<string>(){ "550", "564", "578", "750", "764", "778", "950", "964", "978" , "1150", "1164", "1178" /*, "1350", "1364", "1378" , "1450", "1464", "1478"*/ } },
+                { DeviceFlags.桁架18缓存放行点, new List<string>(){ "550", "564", "578", "750", "764", "778", "950", "964", "978" , "1150", "1164", "1178", "1350", "1364", "1378", "1550", "1564", "1578" } },
                 { DeviceFlags.桁架取货点, new List<string>(){ "461", "475", "489", "503", "517", "531", "545", "559", "573", "586", "661", "675", "689", "703", "717", "731", "745", "759", "773", "786",
                      "861", "875", "889", "903", "917", "931", "945", "959", "973", "986", "1061", "1075", "1089", "1103", "1117", "1131", "1145", "1159", "1173", "1186",
                      "1261", "1275", "1289", "1303", "1317", "1331", "1345", "1359", "1373", "1386" , "1461", "1475", "1489", "1503", "1517", "1531", "1545", "1559", "1573", "1586" } },