林豪 左 2 jaren geleden
bovenliggende
commit
f4c2f95c86

+ 7 - 1
WCS.Entity/WCS_AgvTaskInfo.cs

@@ -194,6 +194,12 @@ namespace WCS.Entity
         /// 叫料
         /// </summary>
         [Description("叫料")]
-        CallForMaterial = 2
+        CallForMaterial = 2,
+
+        /// <summary>
+        ///  叉车机台补空任务
+        /// </summary>
+        [Description("叉车机台补空任务")]
+        ForkliftFilling = 3
     }
 }

+ 2 - 2
WCS.Entity/WCS_TaskInfo.cs

@@ -283,9 +283,9 @@ namespace WCS.Entity
         TransferDepot = 3,
 
         /// <summary>
-        /// 输送
+        ///  搬运
         /// </summary>
-        [Description("输送")]
+        [Description("搬运")]
         Delivery = 5,
     }
 

+ 6 - 2
WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -1,6 +1,7 @@
 using ServiceCenter.SqlSugars;
 using WCS.Core;
 using WCS.Entity;
+using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.Worlds.Logs;
 
 namespace WCS.WorkEngineering.Extensions
@@ -99,8 +100,11 @@ namespace WCS.WorkEngineering.Extensions
                     taskOld.ManualRemarks = taskInfo.ManualRemarks;
 
                     //更新任务历史表,删除任务当前表
-                    db.Default.Updateable(taskOld).AddQueue();
-                    db.Default.Deleteable(taskInfo).AddQueue();
+                    db.Default.Updateable(taskOld).ExecuteCommand();
+                    db.Default.Deleteable(taskInfo).ExecuteCommand();
+
+                    //通知WMS任务完成
+                    WmsApi.CompleteTask(taskOld.ID);
                 }
             }
         }

+ 70 - 7
WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -28,10 +28,35 @@ namespace WCS.WorkEngineering.Systems
         {
             SqlSugarHelper.Do(db =>
             {
-                #region 处理所有新建出库任务
-
                 List<WCS_TaskInfo> tasks = new List<WCS_TaskInfo>();
 
+                #region 处理所有的新增入库任务
+
+                tasks = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild && t.Type == TaskType.EnterDepot).ToList();
+
+                if (tasks.Count > 0)
+                {
+                    tasks.ForEach(task =>
+                    {
+                        //开始处理
+                        task.Status = Entity.TaskStatus.WaitingToExecute;
+                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化入库任务信息,并创建AGV任务中间表");
+                        db.Default.Insertable(new WCS_AgvTaskInfo()
+                        {
+                            ID = task.ID,
+                            TaskType = AGVTaskType.EnterDepot,
+                            Status = AGVTaskStatus.NewBuild,
+                            Station = task.WorkBench,
+                            AddWho = "WCS"
+                        }).SplitTable().ExecuteCommand();
+                        db.Default.Updateable(task).AddQueue();
+                    });
+                }
+
+                #endregion 处理所有的新增入库任务
+
+                #region 处理所有新建出库任务
+
                 //获取所有新建状态的出库任务
                 tasks = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild && t.Type == TaskType.OutDepot).ToList();
                 if (tasks.Count > 0)
@@ -51,9 +76,9 @@ namespace WCS.WorkEngineering.Systems
 
                 #endregion 处理所有新建出库任务
 
-                #region 处理所有的新增入库任务
+                #region 处理所有的搬运任务
 
-                tasks = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild).ToList();
+                tasks = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild && t.Type == TaskType.Delivery).ToList();
 
                 if (tasks.Count > 0)
                 {
@@ -61,11 +86,11 @@ namespace WCS.WorkEngineering.Systems
                     {
                         //开始处理
                         task.Status = Entity.TaskStatus.WaitingToExecute;
-                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化入库任务信息,并创建AGV任务中间表");
+                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化搬运任务信息,并创建AGV任务中间表");
                         db.Default.Insertable(new WCS_AgvTaskInfo()
                         {
                             ID = task.ID,
-                            TaskType = AGVTaskType.EnterDepot,
+                            TaskType = AGVTaskType.ForkliftFilling,
                             Status = AGVTaskStatus.NewBuild,
                             Station = task.WorkBench,
                             AddWho = "WCS"
@@ -74,7 +99,7 @@ namespace WCS.WorkEngineering.Systems
                     });
                 }
 
-                #endregion 处理所有的新增入库任务
+                #endregion 处理所有的搬运任务
 
                 db.Default.SaveQueues();
             });
@@ -116,6 +141,44 @@ namespace WCS.WorkEngineering.Systems
             });
 
             #endregion 下发入库AGV任务
+
+            #region 移动任务处理
+
+            SqlSugarHelper.Do(db =>
+            {
+                var agvTasks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && t.TaskType == AGVTaskType.ForkliftFilling).SplitTable(v => v.Take(1)).ToList();
+
+                if (agvTasks.Count > 0)
+                {
+                    foreach (var agv in agvTasks)
+                    {
+                        //开始处理
+                        GenAgvSchedulingTaskResponse res = new GenAgvSchedulingTaskResponse();
+                        try
+                        {
+                            //获取对应wcs任务
+                            var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();
+                            //下发AGV任务
+                            res = AgvApi.机台补空(agv.Station, Guid.NewGuid().ToString().Replace("-", ""), "1");
+                            agv.Status = AGVTaskStatus.Confirm;
+                            agv.AgvID = res.data;
+                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                            wcs.Status = Entity.TaskStatus.AGVExecution;
+                            wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV,AGV任务号:{res.data}");
+                            db.Default.Updateable(wcs).AddQueue();
+                        }
+                        catch (Exception ex)
+                        {
+                            World.Log(ex.Message, Worlds.Logs.LogLevelEnum.Mid);
+                            continue;
+                        }
+                    }
+                }
+
+                db.Default.SaveQueues();
+            });
+
+            #endregion 移动任务处理
         }
 
         public override bool Select(Device dev)

+ 1 - 2
WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -94,9 +94,8 @@ namespace WCS.WorkEngineering.Systems
                               break;
                       }
 
-                      db.Default.Updateable(task).AddQueue();
+                      db.Default.Updateable(task).ExecuteCommand();
                       task.CompleteOrCancelTasks(db, World);
-                      db.Default.SaveQueues();
                   });
                 if (!result) throw new KnownException("数据库提交事务错误", LogLevelEnum.High);
                 // 写入信号

+ 21 - 1
WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -1,4 +1,5 @@
 using Microsoft.AspNetCore.Mvc;
+using PlcSiemens.Core.Extension;
 using ServiceCenter.SqlSugars;
 using WCS.Core;
 using WCS.Entity;
@@ -77,8 +78,23 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                 return agvFill;
             }
 
-            var
+            var res = WmsApi.GetTunnelEmptyConCount();
 
+            foreach (var item in res.ResDataList)
+            {
+                var station = Device.All.Where(v => v.Code == "TY" + item.Tunnel.ToString())
+                                        .Select(v => v.Targets).SelectMany(v => v)
+                                        .Where(v => v.HasProtocol(typeof(IStation520)))
+                                        .Where(v => v.Code is "1012" or "1014" or "1016")
+                                        .FirstOrDefault();
+                item.Tunnel = station.ToInt();
+            }
+            var stationNo = res.ResDataList.OrderBy(v => v.Count).Select(v => v.Tunnel.ToString()).ToList();
+            agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.Sucess;
+            agvFill.LocCode = obj.MinBy(v => stationNo.IndexOf(v.Entity.Code)).Entity.Code;
+            agvFill.SpoolType = "4";
+            agvFill.ResMsg = "";
+            return agvFill;
         }
 
         /// <summary>
@@ -121,6 +137,10 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                             agvTask.Status = AGVTaskStatus.MissionCompleted;
                             break;
 
+                        case "tcEnd": //机台补空任务完成
+                            agvTask.Status = AGVTaskStatus.MissionCompleted;
+                            break;
+
                         case "applyEmpty": //申请补空任务
                             db.Default.Insertable(new WCS_AgvTaskInfo()
                             {

+ 36 - 0
WCS.WorkEngineering/WebApi/Controllers/WmsApi.cs

@@ -128,6 +128,42 @@ namespace WCS.WorkEngineering.WebApi.Controllers
             return res;
         }
 
+        /// <summary>
+        ///  获取各巷道剩余空轮数量
+        /// </summary>
+        /// <returns></returns>
+        /// <exception cref="KnownException"></exception>
+        public static SRes<GetTunnelEmptyConResponse> GetTunnelEmptyConCount()
+        {
+            var res = APICaller.CallApi2<SRes<GetTunnelEmptyConResponse>>(WMSUrl + "/api/Hj/GetTunnelEmptyConCount", new GetTunnelEmptyConCountRequest { });
+            if (res.ResCode != ResponseStatusCodeEnum.Sucess)
+            {
+                throw new KnownException(res.ResMsg, LogLevelEnum.High);
+            }
+            return res;
+        }
+
+        /// <summary>
+        ///  完成任务
+        /// </summary>
+        /// <param name="taskNo"></param>
+        /// <returns></returns>
+        /// <exception cref="KnownException"></exception>
+        public static SRes<int> CompleteTask(int taskNo)
+        {
+            var res = APICaller.CallApi2<SRes<int>>(WMSUrl + "/api/Hj/CompleteTask", new CompleteTaskRequest
+            {
+                TaskNum = taskNo,
+                OperationType = Models.WMS.Request.CompleteTask.自动完成,
+                WCSUpdateName = "WCS"
+            });
+            if (res.ResCode != ResponseStatusCodeEnum.Sucess)
+            {
+                throw new KnownException(res.ResMsg, LogLevelEnum.High);
+            }
+            return res;
+        }
+
         /// <summary>
         /// 向WMS获取入库任务 一次单卷
         /// </summary>

+ 5 - 0
WCS.WorkEngineering/WebApi/Models/WMS/Response/SRes.cs

@@ -43,6 +43,11 @@ namespace WCS.WorkEngineering.WebApi.Models.WMS.Response
         /// 数据实体
         /// </summary>
         public T ResData { get; set; }
+
+        /// <summary>
+        ///  集合数据实体
+        /// </summary>
+        public List<T> ResDataList { get; set; }
     }
 
     public enum ResponseStatusCodeEnum