林豪 左 11 月之前
父节点
当前提交
90f7831ca9

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

@@ -8,6 +8,7 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.WebApi.Models.WMS.Request;
 using WCS.WorkEngineering.Worlds;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
@@ -102,7 +103,7 @@ namespace WCS.WorkEngineering.Systems
                                     db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.Status, x.AgvTaskID }).ExecuteCommand();
                                     task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化单独返皮盘任务");
                                 }
-                                else if(task.BusType==TaskBusType.芯股用空托盘入库.GetDescription())
+                                else if (task.BusType == TaskBusType.芯股用空托盘入库.GetDescription())
                                 {
                                     return;
                                 }
@@ -146,7 +147,7 @@ namespace WCS.WorkEngineering.Systems
 
                             case TaskType.OutDepot:
                                 {
-                                    if (task.Device.Contains("Robot"))
+                                    if (task.Device.Contains("Robot")) //机器人任务
                                     {
                                         var lastTask = db.Default.Queryable<WCS_TaskInfo>().NoLock().First(x => x.Type == TaskType.OutDepot && x.AddrTo == task.AddrTo && x.Status > TaskStatus.WaitingToExecute && x.Status < TaskStatus.Finish);
                                         if (lastTask != null)
@@ -164,7 +165,123 @@ namespace WCS.WorkEngineering.Systems
                                         task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
                                         isEnd = true;
                                     }
-                                    else
+                                    else if (task.Device == "FJXG") //芯股仓库的任务
+                                    {
+                                        if (task.LastInteractionPoint != "3") //车间叫料任务,此值为3时是单独取满任务
+                                        {
+                                            var sta = GetAgvStation(task, db); //芯股任务,取货站台就是芯股站台
+                                            var agv = new WCS_AgvTaskInfo()
+                                            {
+                                                ID = db.GetAgvTaskId(),
+                                                TaskType = AGVTaskType.EnterDepot,
+                                                Status = AGVTaskStatus.NewBuild,
+                                                TaskId = task.ID,
+                                                Position = task.WorkBench,
+                                                Station = sta,
+                                                AddWho = "WCS",
+                                                AddTime = DateTime.Now
+                                            };
+                                            db.Default.InsertableRowLock(agv).SplitTable().ExecuteCommand();
+                                        }
+                                        var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) + task.ID;
+                                        var agvTask = new WCS_AgvTaskInfo()
+                                        {
+                                            ID = db.GetAgvTaskId(),
+                                            TaskType = AGVTaskType.CallMaterial,
+                                            Status = AGVTaskStatus.NewBuild,
+                                            TaskId = task.ID,
+                                            Position = task.WorkBench,
+                                            Station = task.AddrFrom,
+                                            AddWho = "WCS",
+                                            AddTime = DateTime.Now,
+                                            AgvID = agvId
+                                        };
+                                        //开始处理车间叫料AGV任务任务
+                                        db.Default.InsertableRowLock(agvTask).SplitTable().ExecuteCommand();
+                                        agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
+                                        if (agvTask.Status != AGVTaskStatus.NewBuild)
+                                        {
+                                            World.Log($"AGV任务{agvTask.ID}状态不是新建", LogLevelEnum.High);
+                                            return;
+                                        }
+                                        agvId = agvTask.AgvID;
+                                        agvTask.Status = AGVTaskStatus.Confirm;
+                                        agvTask.AgvStatus = AGVTaskStatus.Confirm;
+                                        db.Default.UpdateableRowLock(agvTask).UpdateColumns(x => new { x.AgvID, x.Status, x.AgvStatus }).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                        task.Status = TaskStatus.AGVExecution;
+                                        task.AgvTaskID = agvTask.ID;
+                                        task.EditTime = DateTime.Now;
+                                        task.EditWho = "WCS";
+                                        db.Default.Updateable(task).UpdateColumns(x => new { x.Status, x.AgvTaskID, x.EditTime, x.EditWho }).ExecuteCommand();
+                                        task.AddWCS_TASK_DTL(db.Default, task.AddrFrom, "AGV", $"任务下发至AGV{agvId}");
+                                        var res = AgvApi.机台叫料(task.AddrFrom, task.WorkBench, agvId);
+
+                                        isEnd = true;
+                                    }
+                                    else if (task.BusType == TaskBusType.芯股站台送空托.GetDescription())
+                                    {
+                                        if (task.SrmStation == "1")
+                                        {
+                                            var srmStation = new string[2];
+                                            switch (task.Device)
+                                            {
+                                                case "SRM1":
+                                                    srmStation[0] = "2534";
+                                                    srmStation[1] = "2533";
+                                                    break;
+
+                                                case "SRM2":
+                                                    srmStation[0] = "2734";
+                                                    srmStation[1] = "2733";
+                                                    break;
+
+                                                case "SRM3":
+                                                    srmStation[0] = "2934";
+                                                    srmStation[1] = "2933";
+                                                    break;
+
+                                                case "SRM4":
+                                                    srmStation[0] = "3134";
+                                                    srmStation[1] = "3133";
+
+                                                    break;
+
+                                                case "SRM5":
+                                                    srmStation[0] = "3334";
+                                                    srmStation[1] = "3333";
+                                                    break;
+
+                                                case "SRM6":
+                                                    srmStation[0] = "3534";
+                                                    srmStation[1] = "3533";
+                                                    break;
+                                            }
+
+                                            //开始计算当前这个任务要从哪个站台出
+                                            //计算两个站台小于取货完成数量的AGV任务
+                                            var agv1 = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.Status <= TaskStatus.StackerExecution && x.AddrTo == srmStation[0]).Count();
+                                            var agv2 = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.Status <= TaskStatus.StackerExecution && x.AddrTo == srmStation[1]).Count();
+                                            task.SrmStation = "";
+                                            task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
+                                        }
+                                        if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
+                                        {
+                                            if (task.Device.IsNullOrEmpty())
+                                            {
+                                                task.Device = "SRM" + task.Tunnel.GetLastDigit();
+                                            }
+                                            //获取堆垛机到目标地址的路径信息
+                                            var path = DevicePath.GetPath(task.Device, task.AddrTo);
+                                            task.SrmStation = path.Points[1].Code;
+                                        }
+
+                                        //更新任务状态
+                                        task.Status = Entity.TaskStatus.WaitingToExecute;
+                                        db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.SrmStation, x.AddrTo, x.Status }).ExecuteCommand();
+                                        task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
+                                        isEnd = true;
+                                    }
+                                    else //立库出库任务
                                     {
                                         if (task.SrmStation == "1")
                                         {

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

@@ -142,6 +142,22 @@ namespace WCS.WorkEngineering.Systems
                                     taskNumber = task.ID;
                                     World.Log($"任务处理:当前任务为环形库区域补空托任务");
                                 }
+                                else //默认除了桁架码垛工位与环形库码垛工位外的任务就只有芯股用空托入库了
+                                {
+                                    //开始处理对应的入库任务信息
+                                    var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.Type == TaskType.EnterDepot && x.ID == obj.Data2.TaskNumber && x.AddrNext == obj.Data2.DestPosition.ToString());
+                                    if (task == null)
+                                    {
+                                        World.Log($"未找到对应的空托入库任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
+                                        return;
+                                    }
+
+                                    task.BarCode = bcrCode;
+                                    db.UpdateableRowLock(task).UpdateColumns(x => new { x.BarCode }).ExecuteCommand();
+                                    task.AddWCS_TASK_DTL(db, obj.Entity.Code, obj.Data2.DestPosition.ToString(), $"空托入库任务绑定条码信息{bcrCode}");
+                                    taskNumber = task.ID;
+                                    World.Log($"任务处理:当前任务为芯股用空托入库");
+                                }
                             });
                             if (taskNumber == 0)
                             {
@@ -200,6 +216,16 @@ namespace WCS.WorkEngineering.Systems
                                             World.Log($"任务处理:当前任务为环形库区域补空托任务");
                                         }
                                     }
+                                    else
+                                    {
+                                        var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.ID == obj.Data.TaskNumber);
+                                        taskInfo.Status = TaskStatus.RgvCompleted;
+                                        taskInfo.EditTime = DateTime.Now;
+                                        taskInfo.LastInteractionPoint = obj.Entity.Code;
+                                        db.Updateable(taskInfo).UpdateColumns(x => new { x.Status, x.EditTime, x.LastInteractionPoint }).ExecuteCommand();
+                                        taskInfo.AddWCS_TASK_DTL(db, taskInfo.AddrTo, $"RGV任务执行结束");
+                                        World.Log($"任务处理:当前任务为芯股用空托入库");
+                                    }
                                 });
 
                                 if (startPosition.Data.TaskNumber == obj.Data.TaskNumber) //初始化起始点信息
@@ -214,7 +240,7 @@ namespace WCS.WorkEngineering.Systems
                                 {
                                     if (destPosition.HasFlag(DeviceFlags.桁架码垛位))
                                     {
-                                        var dest = new Device<ITruss530,ITruss531>(destPosition!, World);
+                                        var dest = new Device<ITruss530, ITruss531>(destPosition!, World);
                                         if (dest.Data2.MaxQuantity == 0)
                                         {
                                             dest.Data.MaxQuantity = countQty;
@@ -223,11 +249,11 @@ namespace WCS.WorkEngineering.Systems
                                             dest.Data.VoucherNo++;
                                             World.Log($"任务处理:写入码垛信息-码垛位[{dest.Entity.Code}]最大码垛数量[{dest.Data.MaxQuantity}]已码数量[{dest.Data.Quantity}]垛形[{dest.Data.Type}]凭证号[{dest.Data.VoucherNo}]");
                                         }
-                                        else {
-                                            World.Log($"桁架垛型信息未清除,无法写入新垛型信息请检查确认,最大码垛数量[{dest.Data.MaxQuantity}]已码数量[{dest.Data.Quantity}]垛形[{dest.Data.Type}]凭证号[{dest.Data.VoucherNo}]",LogLevelEnum.Mid);
+                                        else
+                                        {
+                                            World.Log($"桁架垛型信息未清除,无法写入新垛型信息请检查确认,最大码垛数量[{dest.Data.MaxQuantity}]已码数量[{dest.Data.Quantity}]垛形[{dest.Data.Type}]凭证号[{dest.Data.VoucherNo}]", LogLevelEnum.Mid);
                                             return;
                                         }
-                                        
                                     }
                                     else if (destPosition.HasFlag(DeviceFlags.环形库码垛工位))
                                     {

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

@@ -294,12 +294,12 @@ namespace WCS.WorkEngineering.Systems
                                                                                   && (v.Type == TaskType.EnterDepot || v.Type == TaskType.EmptyInit)).ToList();
                     if (!tasks.Any()) throw new KnownException("无可用任务", LogLevelEnum.Mid);
 
-                    //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层 TODO:待验证排序结果
+                    //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层
                     var task = tasks.OrderByDescending(v => v.Priority).ThenByDescending(v => v.Floor == floor ? 1 : 0).First() ?? throw new KnownException($"{obj.Entity.Code}未找到入库任务", LogLevelEnum.High);
 
                     //获取任务所有设备
                     station = arrIn.First(v => (v.Data.TaskNumber == task.ID) || (v.Data2.TaskNumber == task.ID));
-                    //获取当前货物巷道
+                    //获取当前货
                     var res = WmsApi.GetLocalIn(task.ID, task.Device, station.Entity.Code, task.Height);
                     if (res.ResCode != ResponseStatusCodeEnum.Sucess)
                     {
@@ -414,4 +414,4 @@ namespace WCS.WorkEngineering.Systems
             return dev.Code is "SRM1" or "SRM2" or "SRM3" or "SRM4" or "SRM5" or "SRM6";
         }
     }
-}
+}

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

@@ -55,7 +55,7 @@ namespace WCS.WorkEngineering.Systems
                     World.Log($"未找到对应任务[{obj.Data.TaskNumber}],请检查该任务状态与更新状态是否均为输送机执行中", LogLevelEnum.High);
                     return;
                 }
-                var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only);
+                var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) + task.ID;
 
                 //开始创建AGV任务
                 var agvTask = db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
@@ -84,7 +84,7 @@ namespace WCS.WorkEngineering.Systems
                     return;
                 }
                 agvId = agvTask.AgvID;
-               
+
                 //agvTask.AgvID = agvId;
                 agvTask.Status = AGVTaskStatus.Confirm;
                 agvTask.AgvStatus = AGVTaskStatus.Confirm;
@@ -104,4 +104,4 @@ namespace WCS.WorkEngineering.Systems
             return dev.HasFlag(DeviceFlags.AGV取货站台口);
         }
     }
-}
+}

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

@@ -25,10 +25,11 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Device<IStation520> objDev)
         {
-            var lastIsTruss = objDev.Entity.GetFlag<bool>("LastIsTruss");
-            objDev.Entity.SetFlag("LastIsTruss", !lastIsTruss);
-            if (lastIsTruss)
+            var lastIsTruss = objDev.Entity.GetFlag<int>("LastIsTruss");
+
+            if (lastIsTruss == 0) //桁架用空托
             {
+                objDev.Entity.SetFlag("LastIsTruss", 1);
                 WCS_Palletizing palletizing = null;
                 SqlSugarHelper.Do(_db =>
                 {
@@ -100,8 +101,85 @@ namespace WCS.WorkEngineering.Systems
                 dev.Data.TaskNumber = palletizing.Id;
                 dev.Data.GoodsEnd = palletizing.PalletizingStation!.ToShort();
             }
-            else
+            else if (lastIsTruss == 1)//芯股用空托
+            {
+                objDev.Entity.SetFlag("LastIsTruss", 2);
+                SqlSugarHelper.Do(db =>
+                {
+                    var taskInfo = db.Default.Queryable<WCS_TaskInfo>().Where(x => x.Status == TaskStatus.NewBuild && x.BusType == "芯股用空托盘入库").ToList();
+                    var isEnd = false;
+                    foreach (var info in taskInfo)
+                    {
+                        if (isEnd) return;
+                        try
+                        {
+                            //通过仓库号获取对应的拆盘机位置
+                            info.AddrFrom = info.WarehouseCode switch
+                            {
+                                "1N" => "1602",
+                                "1S" => "1612",
+                                "2N" => "1622",
+                                "2S" => "1632",
+                                "3N" => "1642",
+                                "3S" => "1652",
+                                _ => "9999"
+                            };
+                            info.Device = info.WarehouseCode switch
+                            {
+                                "1N" => "SRM1",
+                                "1S" => "SRM2",
+                                "2N" => "SRM3",
+                                "2S" => "SRM4",
+                                "3N" => "SRM5",
+                                "3S" => "SRM6",
+                                _ => info.Device
+                            };
+
+                            info.AddrNext = info.WarehouseCode switch
+                            {
+                                "1N" => "1604",
+                                "1S" => "1614",
+                                "2N" => "1624",
+                                "2S" => "1634",
+                                "3N" => "1644",
+                                "3S" => "1654",
+                                _ => info.AddrNext
+                            };
+                            info.SrmStation = info.WarehouseCode switch
+                            {
+                                "1N" => "1603",
+                                "1S" => "1613",
+                                "2N" => "1623",
+                                "2S" => "1633",
+                                "3N" => "1643",
+                                "3S" => "1653",
+                                _ => info.SrmStation
+                            };
+                            var dev = Device.All.Where(x => x.Code == info.AddrFrom).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
+                            if (dev.Data.TaskNumber != 0 || dev.Data.GoodsEnd != 0)
+                            {
+                                World.Log($"{dev.Entity.Code}有残留任务信息 {dev.Data.TaskNumber} - {dev.Data.GoodsEnd} ,请确认处理!");
+                                return;
+                            }
+                            info.AddrTo = "SRM";
+                            info.Height = 1;
+                            info.Status = TaskStatus.WaitingToExecute;
+                            db.Default.UpdateableRowLock(info).UpdateColumns(x => new { x.AddrFrom, x.Device, x.AddrNext, x.SrmStation, x.Status, x.AddrTo, x.Height }).ExecuteCommand();
+                            info.AddWCS_TASK_DTL(db.Default, info.Device, $"初始化芯股用空托盘入库任务信息");
+                            dev.Data.TaskNumber = info.ID;
+                            dev.Data.GoodsEnd = info.AddrNext.ToShort();
+                            isEnd = true;
+                        }
+                        catch (Exception e)
+                        {
+                            World.Log(e.Message);
+                        }
+                    }
+                });
+            }
+            else //机械臂用空托
             {
+                objDev.Entity.SetFlag("LastIsTruss", 0);
                 var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.环形库码垛工位)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World));
                 devs = devs.Where(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status));
                 WCS_TaskInfo deliveryTask = null;
@@ -137,7 +215,7 @@ namespace WCS.WorkEngineering.Systems
                             var resData = WmsApi.ApplyPalletizingStockOut(obj.Entity.Code, obj.Entity.Sources.Single(x => x.HasFlag(DeviceFlags.Robot)).Code);
                             if (resData.ResCode != ResponseStatusCodeEnum.Sucess)
                             {
-                                World.Log(resData.ResMsg,ServiceCenter.Logs.LogLevelEnum.Mid);
+                                World.Log(resData.ResMsg, ServiceCenter.Logs.LogLevelEnum.Mid);
                             }
                             return;
                         }
@@ -281,4 +359,4 @@ namespace WCS.WorkEngineering.Systems
         [SugarColumn(ColumnName = "ConfigId", ColumnDescription = "ConfigId")]
         public long ConfigId { get; set; }
     }
-}
+}

+ 8 - 2
业务工程/分拣库/WCS.WorkEngineering/WebApi/Models/WMS/Request/FJBuildEmptyPalletsStockRequest.cs

@@ -144,6 +144,12 @@ namespace WCS.WorkEngineering.WebApi.Models.WMS.Request
         ///  芯股用空托盘入库
         /// </summary>
         [Description("芯股用空托盘入库")]
-        芯股用空托盘入库 = 14
+        芯股用空托盘入库 = 14,
+
+        /// <summary>
+        ///  芯股站台送空托
+        /// </summary>
+        [Description("芯股站台送空托")]
+        芯股站台送空托 = 15
     }
-}
+}