فهرست منبع

盘条库:任务状态、任务类型更新

xu.lu 2 سال پیش
والد
کامیت
658aca63d7

+ 6 - 0
盘条库/WCS.Service/WCS.Service.csproj

@@ -33,4 +33,10 @@
   <ItemGroup>
     <ProjectReference Include="..\WCS.WorkEngineering\WCS.WorkEngineering.csproj" />
   </ItemGroup>
+
+  <ItemGroup>
+    <Content Update="appsettings.json">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
 </Project>

+ 6 - 1
盘条库/WCS.WorkEngineering/Extensions/StationExtension.cs

@@ -1,4 +1,6 @@
-using ServiceCenter.Logs;
+using FreeRedis;
+using ServiceCenter.Extensions;
+using ServiceCenter.Logs;
 using ServiceCenter.Redis;
 using WCS.Core;
 using WCS.WorkEngineering.Protocol.Station;
@@ -17,6 +19,9 @@ namespace WCS.WorkEngineering.Extensions
         /// <returns></returns>
         public void 入库站点是否被禁止()
         {
+            //RedisHub.Do(RedisSentinelClient => { 
+            //})
+
             var config = RedisHub.Default.Check("ForbidTubuEnter") ?? throw new Exception("请在Redis中配置检测门禁用");
             var configs = config.Split(",");
             if (configs.Contains(Entity.Code)) throw new KnownException("当前检测门已被禁用,请联系运维人员了解具体情况", LogLevelEnum.High);

+ 2 - 2
盘条库/WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -53,7 +53,7 @@ namespace WCS.WorkEngineering.Extensions
             if (taskInfo.Status is not Entity.TaskStatus.Finish and not Entity.TaskStatus.Cancel) throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
             else // 任务完成或取消,进行相关同步动作
             {
-                WCS_TaskOld taskOld = db.Default.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.ID == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
+                WCS_TaskOld taskOld = db.Default.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.Id == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
                 if (taskOld is null) throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
                 else
                 {
@@ -84,7 +84,7 @@ namespace WCS.WorkEngineering.Extensions
                     taskOld.Device = taskInfo.Device;
                     taskOld.SrmStation = taskInfo.SrmStation;
                     //码垛信息
-                    taskOld.DocID = taskInfo.DocID;
+                    //taskOld.DocID = taskInfo.DocID;
                     taskOld.PalletType = taskInfo.PalletType;
                     taskOld.ProdLine = taskInfo.ProdLine;
                     taskOld.FullQty = taskInfo.FullQty;

+ 2 - 1
盘条库/WCS.WorkEngineering/Protocol/Station/IStation520.cs

@@ -1,11 +1,12 @@
 using WCS.Entity.Protocol.Station;
+using WCS.WorkEngineering.Protocol.RGV;
 
 namespace WCS.WorkEngineering.Protocol.Station
 {
     /// <summary>
     /// DB520
     /// </summary>
-    public interface IStation520 : Station520<StationMode>
+    public interface IStation520 : Station520<StationMode,RGVCmdType>
     {
     }
 }

+ 1 - 1
盘条库/WCS.WorkEngineering/Protocol/Station/IStation523.cs

@@ -5,7 +5,7 @@ namespace WCS.WorkEngineering.Protocol.Station
     /// <summary>
     /// 输送机状态读取协议
     /// </summary>
-    public interface IStation523 : Station523<StationAlarm, StationStatus>
+    public interface IStation523 : Station523<StationAlarm, StationStatus,StationStatus>
     {
     }
 }

+ 3 - 0
盘条库/WCS.WorkEngineering/Protocol/Station/WCS_Station520.cs

@@ -1,4 +1,6 @@
 using System.Runtime.Serialization;
+using WCS.Entity.Protocol.Station;
+using WCS.WorkEngineering.Protocol.RGV;
 
 namespace WCS.WorkEngineering.Protocol.Station
 {
@@ -31,5 +33,6 @@ namespace WCS.WorkEngineering.Protocol.Station
         /// <inheritdoc/>
         [DataMember(Order = 5)]
         public short VoucherNo { get; set; }
+        RGVCmdType Station520<StationMode, RGVCmdType>.CmdType { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
     }
 }

+ 1 - 0
盘条库/WCS.WorkEngineering/Protocol/Station/WCS_Station523.cs

@@ -23,5 +23,6 @@ namespace WCS.WorkEngineering.Protocol.Station
         /// <inheritdoc/>
         [DataMember(Order = 3)]
         public float RunTime { get; set; }
+        public StationStatus Status1 { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
     }
 }

+ 1 - 0
盘条库/WCS.WorkEngineering/ProtocolProxy.cs

@@ -1,6 +1,7 @@
 using MessagePack;
 using Newtonsoft.Json;
 using ServiceCenter;
+using ServiceCenter.Extensions;
 using ServiceCenter.Redis;
 using WCS.Core;
 using WCS.Entity.Protocol.DataStructure;

+ 60 - 26
盘条库/WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -25,11 +25,14 @@ namespace WCS.WorkEngineering.Systems
         protected override bool ParallelDo => true;
         protected override bool SaveLogsToFile => true;
         private List<Station> devs = new List<Station>();
+        private List<Station> devsOut = new List<Station>();
         private List<SRM> srms = new List<SRM>();
         public AgvSystems()
         {
             devs = Device.All.Where(v => v.HasFlag(DeviceFlags.入库, DeviceFlags.巷道口)).Select(v => new Station(v, this.World)).ToList();
             srms = Device.All.Where(v => v.HasProtocol(typeof(ISRM520))).Select(v => new SRM(v, this.World)).ToList();
+
+            devsOut = Device.All.Where(v => v.HasFlag(DeviceFlags.一楼出库口)).Select(v => new Station(v, this.World)).ToList();
         }
         public override void Do(Station obj)
         {
@@ -39,7 +42,7 @@ namespace WCS.WorkEngineering.Systems
                 //获取所有未结束的AGV叫料、搬运任务
                 SqlSugarHelper.Do(db =>
                 {
-                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && (v.TaskType == AGVTaskType.CallMaterial || v.TaskType == AGVTaskType.ForkliftFilling)).SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.AddTime).ToList();
+                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && (v.TaskType == AGVTaskType.CallMaterial || v.TaskType == AGVTaskType.Transport)).SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.AddTime).ToList();
                 });
                 //有需要处理的AGV任务
                 if (agvTaskInfos.Any())
@@ -58,20 +61,20 @@ namespace WCS.WorkEngineering.Systems
                                     var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
                                     if (task == null) throw new Exception($"AGV任务{agv.ID}未找到对应WCS任务");
                                     //取货点安全交互
-                                    if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
+                                    if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete)
                                     {
-                                        agv.Status = AGVTaskStatus.Complete2;
+                                        agv.Status = AGVTaskStatus.Complete;
                                         db.Default.Updateable(agv).SplitTable().ExecuteCommand();
                                         task.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
                                         AgvApi.ContinueTask(agv.AgvID, agv.Station);
                                     }
-                                    else if (agv.AgvStatus == AGVTaskStatus.Complete3)
+                                    else if (agv.AgvStatus == AGVTaskStatus.LeaveGet)
                                     {
                                         agv.Status = AGVTaskStatus.Execution;
                                         db.Default.Updateable(agv).SplitTable().ExecuteCommand();
                                         //WmsApi.PinkuInfoManagement(task.ID);
                                     }
-                                    else if (agv.AgvStatus == AGVTaskStatus.WalkIntoStorage && agv.Status != AGVTaskStatus.ExitStorage)
+                                    else if (agv.AgvStatus == AGVTaskStatus.PutRequestOrPermission && agv.Status != AGVTaskStatus.PutRequestOrPermission)
                                     {
                                         string endPos = "";
                                         if (task.AddrTo == "1021" || task.AddrTo == "1022" || task.AddrTo == "1023" || task.AddrTo == "1024")
@@ -82,7 +85,7 @@ namespace WCS.WorkEngineering.Systems
                                         {
                                             endPos = task.AddrTo;
                                         }
-                                        agv.Status = AGVTaskStatus.ExitStorage;
+                                        agv.Status = AGVTaskStatus.PutRequestOrPermission;
                                         db.Default.Updateable(agv).SplitTable().ExecuteCommand();
                                         task.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}放货,目标站台{endPos}");
                                         AgvApi.ContinueTask(agv.AgvID, endPos);
@@ -105,28 +108,43 @@ namespace WCS.WorkEngineering.Systems
                                         }
                                     }
                                 }
-                                else if (agv.TaskType == AGVTaskType.ForkliftFilling)//搬运任务,判断是WCS还是WMS创建
+                                else if (agv.TaskType == AGVTaskType.Transport)//搬运任务,判断是WCS还是WMS创建
                                 {   //终点安全交互                                 
                                     if (agv.WorkShop == 111)
                                     {
                                         var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
                                         if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");                                        
-                                        if (agv.AgvStatus == AGVTaskStatus.Complete3 && agv.AgvStatus != AGVTaskStatus.Execution)
+                                        if (agv.AgvStatus == AGVTaskStatus.LeaveGet && agv.AgvStatus != AGVTaskStatus.Execution)
                                         {
                                             agv.Status = AGVTaskStatus.Execution;
                                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();
                                             WmsApi.PinkuInfoManagement(taskInfo.ID);
                                         }
-                                        else if (agv.AgvStatus == AGVTaskStatus.WalkIntoStorage && agv.Status != AGVTaskStatus.ExitStorage)
+                                        else if (agv.AgvStatus == AGVTaskStatus.PutRequestOrPermission && agv.Status != AGVTaskStatus.PutRequestOrPermission)
                                         {
-                                            agv.Status = AGVTaskStatus.ExitStorage;
+                                            agv.Status = AGVTaskStatus.PutRequestOrPermission;
                                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                            taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}放货,目标站台{agv.Position}");
-                                            AgvApi.ContinueTask(agv.AgvID, agv.Position);
+                                            string endPos = "";
+                                            if (agv.Position == "1012" || agv.Position == "1014" || agv.Position == "1016")
+                                            {
+                                                endPos = "PT" + agv.Position;
+                                            }
+                                            else
+                                            {
+                                                endPos = agv.Position;
+                                            }
+                                            taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}放货,目标站台{endPos}");
+                                            AgvApi.ContinueTask(agv.AgvID, endPos);
                                         }
                                         //完成任务
                                         else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
-                                        {                                            
+                                        {
+                                            if (agv.Position == "1002" || agv.Position == "1004" || agv.Position == "1006" || agv.Position == "1008")
+                                            {
+                                                //写入货架信号
+                                                var dev = devsOut.Find(v => v.Entity.Code == agv.Position);
+                                                dev.Data.GoodsStart = agv.Position.ToShort();
+                                            }
                                             //更新AGV任务状态
                                             agv.Status = AGVTaskStatus.MissionCompleted;
                                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();
@@ -142,22 +160,32 @@ namespace WCS.WorkEngineering.Systems
                                     else if(agv.WorkShop == 222)
                                     {
                                         //取货点安全交互
-                                        if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
+                                        if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete)
                                         {
                                             //var dev = devs.Find(v => v.Entity.Code == agv.Position);
                                             //if (dev.Data.VoucherNo != dev.Data2.VoucherNo) throw new Exception($"AGV请求取货,但{dev.Entity.Code}凭证号不一致");
                                             //if (!dev.Data3.Status.HasFlag(StationStatus.Auto)) throw new Exception($"AGV请求取货,但{dev.Entity.Code}不在自动状态");
                                             //if (!(dev.Data3.Status.HasFlag(StationStatus.PH_Status) && !dev.Data3.Status.HasFlag(StationStatus.OT_Status))) throw new Exception($"AGV请求取货,但{dev.Entity.Code}光电状态不满足");
                                             //if (dev.Data3.Status.HasFlag(StationStatus.Run)) throw new Exception($"AGV请求取货,但{dev.Entity.Code}在运行状态");
-                                            agv.Status = AGVTaskStatus.Complete2;
+                                            string startPos = agv.Station;
+                                            if (agv.Station == "1011" || agv.Station == "1013" || agv.Station == "1015" || agv.Station == "1021" || agv.Station == "1022" || agv.Station == "1023" || agv.Station == "1024")
+                                            {
+                                                startPos = "PT" + agv.Station;
+                                            }
+                                            agv.Status = AGVTaskStatus.Complete;
                                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();                                            
                                             AgvApi.ContinueTask(agv.AgvID, agv.Station);
                                         }
-                                        else if (agv.AgvStatus == AGVTaskStatus.WalkIntoStorage && agv.Status != AGVTaskStatus.ExitStorage)
+                                        else if (agv.AgvStatus == AGVTaskStatus.PutRequestOrPermission && agv.Status != AGVTaskStatus.PutRequestOrPermission)
                                         {
-                                            agv.Status = AGVTaskStatus.ExitStorage;
+                                            string endPos = agv.Position;
+                                            if (agv.Position == "1012" || agv.Position == "1014" || agv.Position == "1016")
+                                            {
+                                                endPos = "PT" + agv.Position;
+                                            }
+                                            agv.Status = AGVTaskStatus.PutRequestOrPermission;
                                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();                                           
-                                            AgvApi.ContinueTask(agv.AgvID, agv.Position);
+                                            AgvApi.ContinueTask(agv.AgvID, endPos);
                                         }
                                         //完成任务
                                         else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
@@ -165,6 +193,12 @@ namespace WCS.WorkEngineering.Systems
                                             //任务完成清除货架信号
                                             var dev = devs.Find(v => v.Entity.Code == agv.Station);
                                             dev.Data.GoodsStart = 0;
+                                            if (agv.Position == "1002" || agv.Position == "1004" || agv.Position == "1006" || agv.Position == "1008")
+                                            {
+                                                //写入货架信号
+                                                var dev1 = devsOut.Find(v => v.Entity.Code == agv.Position);
+                                                dev1.Data.GoodsStart = agv.Position.ToShort();
+                                            }
                                             //更新AGV任务状态
                                             agv.Status = AGVTaskStatus.MissionCompleted;
                                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();
@@ -176,9 +210,9 @@ namespace WCS.WorkEngineering.Systems
                                         var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
                                         if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
                                         //取货点安全交互
-                                        if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
+                                        if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete)
                                         {
-                                            agv.Status = AGVTaskStatus.Complete2;
+                                            agv.Status = AGVTaskStatus.Complete;
                                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();
                                             string startPos = "";
                                             if (taskInfo.AddrFrom == "1021"  || taskInfo.AddrFrom == "1022" || taskInfo.AddrFrom == "1023" || taskInfo.AddrFrom == "1024")
@@ -192,7 +226,7 @@ namespace WCS.WorkEngineering.Systems
                                             taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}在站台{startPos}取货");
                                             AgvApi.ContinueTask(agv.AgvID, startPos);
                                         }
-                                        else if (agv.AgvStatus == AGVTaskStatus.Complete3)
+                                        else if (agv.AgvStatus == AGVTaskStatus.LeaveGet)
                                         {
                                             agv.Status = AGVTaskStatus.Execution;
                                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();
@@ -258,20 +292,20 @@ namespace WCS.WorkEngineering.Systems
                                 if (task == null) throw new Exception($"AGV任务{agv.ID}未找到对应WCS任务");
                                 #region 开始跟据AGV状态做出处理                                
                                 //agv取货完成 
-                                if (agv.AgvStatus == AGVTaskStatus.Complete3 && agv.Status != AGVTaskStatus.Execution)
+                                if (agv.AgvStatus == AGVTaskStatus.LeaveGet && agv.Status != AGVTaskStatus.Execution)
                                 {                                   
                                     agv.Status = AGVTaskStatus.Execution;
                                     db.Default.Updateable(agv).SplitTable().ExecuteCommand();
                                     //通知WMS取货完成                        
                                     WmsApi.PinkuInfoManagement(task.ID);
                                 }
-                                else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
+                                else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete)
                                 {                                   
-                                    agv.Status = AGVTaskStatus.Complete2;
+                                    agv.Status = AGVTaskStatus.Complete;
                                     db.Default.Updateable(agv).SplitTable().ExecuteCommand();                                    
                                 }
                                 //放货点安全交互
-                                else if (agv.AgvStatus == AGVTaskStatus.WalkIntoStorage && agv.Status != AGVTaskStatus.ExitStorage)
+                                else if (agv.AgvStatus == AGVTaskStatus.PutRequestOrPermission && agv.Status != AGVTaskStatus.PutRequestOrPermission)
                                 {
                                     if (agv.Position.IsNullOrEmpty()) throw new Exception($"无有效放货地址");
                                     var dev = devs.Find(v => v.Entity.Code == agv.Position);
@@ -279,7 +313,7 @@ namespace WCS.WorkEngineering.Systems
                                     if (!dev.Data3.Status.HasFlag(StationStatus.Auto)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}不在自动状态");
                                     if (dev.Data3.Status.HasFlag(StationStatus.PH_Status) || dev.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new Exception($"AGV请求放货,{dev.Entity.Code}不满足放货条件,请检查光电状态");
                                     if (dev.Data3.Status.HasFlag(StationStatus.Run)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}在运行状态");
-                                    agv.Status = AGVTaskStatus.ExitStorage;
+                                    agv.Status = AGVTaskStatus.PutRequestOrPermission;
                                     db.Default.Updateable(agv).SplitTable().ExecuteCommand();
                                     //调继续执行任务接口
                                     AgvApi.ContinueTask(agv.AgvID, agv.Position);

+ 6 - 4
盘条库/WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -59,13 +59,14 @@ namespace WCS.WorkEngineering.Systems
                                     {
                                         string nextPos = "";
                                         int i = 0;
+                                        //缓存区A、B到1017检测门,C、D到1018检测门,叫料区入库到1018检测门
                                         if (task.AddrFrom.Contains("A") || task.AddrFrom.Contains("B"))
                                         {
                                             nextPos = "1017";
                                         }
                                         else if (task.BarCode.StartsWith("PT"))
                                         {
-                                            nextPos = "1017";
+                                            nextPos = "1018";
                                             i = 1;
                                         }
                                         else
@@ -156,7 +157,7 @@ namespace WCS.WorkEngineering.Systems
                                         var agvTask = new WCS_AgvTaskInfo()
                                         {
                                             ID = db.GetAGVTaskId(),
-                                            TaskType = AGVTaskType.ForkliftFilling,
+                                            TaskType = AGVTaskType.Transport,
                                             Status = AGVTaskStatus.NewBuild,
                                             Station = task.AddrFrom,
                                             Position = task.AddrTo,
@@ -190,7 +191,7 @@ namespace WCS.WorkEngineering.Systems
                 #region 下发agv任务
                 SqlSugarHelper.Do(db =>
                 {
-                    var agvTasks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && (t.TaskType == AGVTaskType.EnterDepot || t.TaskType == AGVTaskType.ForkliftFilling)).SplitTable(v => v.Take(2)).ToList();
+                    var agvTasks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && (t.TaskType == AGVTaskType.EnterDepot || t.TaskType == AGVTaskType.Transport)).SplitTable(v => v.Take(2)).ToList();
                     if (agvTasks.Count > 0)
                     {
                         foreach (var agv in agvTasks)
@@ -204,6 +205,7 @@ namespace WCS.WorkEngineering.Systems
                                     var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();
                                     if (wcs == null) throw new Exception($"未找到对应的WCS任务");
                                     string startPos = "";
+                                    //叫料区入库1019-1024
                                     if (agv.WorkShop == 1)
                                     {
                                         if (wcs.AddrFrom == "1021" || wcs.AddrFrom == "1022" || wcs.AddrFrom == "1023" || wcs.AddrFrom == "1024")
@@ -230,7 +232,7 @@ namespace WCS.WorkEngineering.Systems
                                     db.Default.Updateable(wcs).ExecuteCommand();
                                     wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");
                                 }
-                                else if (agv.TaskType == AGVTaskType.ForkliftFilling)//搬运任务下发agv
+                                else if (agv.TaskType == AGVTaskType.Transport)//搬运任务下发agv
                                 {
                                     if (agv.WorkShop == 111)
                                     {

+ 8 - 1
盘条库/WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -3,6 +3,7 @@ using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
+using System.Threading.Tasks;
 using WCS.Core;
 using WCS.Entity;
 using WCS.WorkEngineering.Extensions;
@@ -116,6 +117,7 @@ namespace WCS.WorkEngineering.Systems
                                     task.Status = Entity.TaskStatus.ConveyorExecution;
                                     var dev = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation), this.World);
                                     dev.Data.TaskNumber = task.ID;
+                                    dev.Data.GoodsStart = 0;//货架信号(0表示无货架)
                                     dev.Data.VoucherNo++;
                                     db.Default.Updateable(task).ExecuteCommand();
                                     task.AddWCS_TASK_DTL(db, task.SrmStation, "出库任务到达放货站台");
@@ -125,6 +127,7 @@ namespace WCS.WorkEngineering.Systems
                                     task.Status = Entity.TaskStatus.ConveyorExecution;
                                     var dev1 = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation), this.World);
                                     dev1.Data.TaskNumber = task.ID;
+                                    dev1.Data.GoodsStart = 0;
                                     dev1.Data.VoucherNo++;
                                     db.Default.Updateable(task).ExecuteCommand();
                                     task.AddWCS_TASK_DTL(db, task.SrmStation, "出库任务到达放货站台");
@@ -261,6 +264,8 @@ namespace WCS.WorkEngineering.Systems
 
                 WCS_TaskInfo taskInfo = null;
                 Station station = null;
+
+            
                 SqlSugarHelper.Do(db =>
                 {
                     //根据有货设备的任务号获取所有类型为入库状态为输送机执行中的任务
@@ -269,8 +274,9 @@ namespace WCS.WorkEngineering.Systems
                                                                               && arrIn.Select(p => p.Data2.TaskNumber).Contains(v.ID));
                     if(tasks == null) throw new KnownException($"{obj.Entity.Code}未找到满足条件的入库任务", LogLevelEnum.High);
                     //按条件先后排序获取一条排序后第一条结果1.优先级2.堆垛机当前所在巷道 TODO:待验证排序结果
+                   
                     var task = tasks.OrderByDescending(v => v.Priority)
-                                    .OrderBy(v => v.AddrNext == "TY" + obj.Data2.Res4 ? 0 : 1).First() ?? throw new KnownException($"{obj.Entity.Code}未找到入库任务", LogLevelEnum.High);
+                                    .OrderBy(v => (v.AddrNext == ("TY" + obj.Data2.Res4.ToString())) ? 0 : 1).First() ?? throw new KnownException($"{obj.Entity.Code}未找到入库任务", LogLevelEnum.High);
 
                     //获取任务所有设备                   
                     station = arrIn.First(v => v.Data2.TaskNumber == task.ID);
@@ -316,6 +322,7 @@ namespace WCS.WorkEngineering.Systems
                 //获取可以放货的设备集合
                 arrOut = arrOut.Where(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) //有货架
                                                 && !v.Data3.Status.HasFlag(StationStatus.OT_Status)//货架无货
+                                                && v.Data.GoodsStart != 0 //根据信号判断是有货架
                                                 && !v.Data3.Status.HasFlag(StationStatus.Run) //未运行                                                
                                                 && !v.Data3.Status.HasFlag(StationStatus.UnassignedTask) //未分配任务
                                                 && v.Data3.Status.HasFlag(StationStatus.Auto)).ToList(); //自动

+ 2 - 0
盘条库/WCS.WorkEngineering/Systems/一楼入库巷道分配处理系统.cs

@@ -77,7 +77,9 @@ namespace WCS.WorkEngineering.Systems
                     var agvTask = db.Queryable<WCS_AgvTaskInfo>().SplitTable().First(v => v.AgvStatus == AGVTaskStatus.RequestOrPermission1 && v.Status != AGVTaskStatus.Complete1 && v.Position == obj.Entity.Code);
                     if (agvTask == null) throw new KnownException($"未找到对应agv任务,条码{barcode}", LogLevelEnum.High);
                     taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agvTask.ID) ?? throw new KnownException($"未找到agv任务{agvTask.ID}对应WCS任务", LogLevelEnum.High);
+                    
                     if (taskInfo.BarCode.StartsWith("PT") && taskInfo.BarCode != barcode) throw new KnownException($"条码{barcode}读取有误,请检查条码", LogLevelEnum.High);
+                    //if (db.Queryable<WCS_TaskInfo>().Any(v => v.BarCode == barcode)) throw new KnownException($"已存在该条码{barcode},请检查扫码是否异常", LogLevelEnum.High);
                     taskInfo.BarCode = barcode;
 
                     //分配巷道,agv目标站台

+ 12 - 2
盘条库/WCS.WorkEngineering/Systems/一楼出库工位处理系统.cs

@@ -7,6 +7,7 @@ using WCS.Entity;
 using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.Protocol.Station;
 using WCS.WorkEngineering.WebApi.Controllers;
+using WCS.WorkEngineering.WebApi.Models.AGV.Response;
 using WCS.WorkEngineering.Worlds;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 
@@ -42,7 +43,7 @@ namespace WCS.WorkEngineering.Systems
                         var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.ConveyorExecution) ?? throw new KnownException("无可执行任务", LogLevelEnum.Mid);
                         var agv = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(v => v.Take(2)).First(v => v.ID == task.AgvTaskID && v.Status == AGVTaskStatus.NewBuild) ?? throw new KnownException("未找到对应的AGV任务", LogLevelEnum.Mid);
                         string endPos = "";
-                        if (task.AddrFrom == "1021" || task.AddrFrom == "1022" || task.AddrFrom == "1023" || task.AddrFrom == "1024")
+                        if (task.AddrTo == "1021" || task.AddrTo == "1022" || task.AddrTo == "1023" || task.AddrTo == "1024")
                         {
                             endPos = "PT" + task.AddrTo;
                         }
@@ -50,7 +51,16 @@ namespace WCS.WorkEngineering.Systems
                         {
                             endPos = task.AddrTo;
                         }
-                        var res = AgvApi.叫料出库("PT",agv.Station,endPos, Guid.NewGuid().ToString().Replace("-", ""), "1");
+
+                        GenAgvSchedulingTaskResponse res = null;
+                        if (endPos.Contains("A") || endPos.Contains("B") || endPos.Contains("C") || endPos.Contains("D"))
+                        {
+                             res = AgvApi.搬运_wmsStart("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1");
+                        }
+                        else
+                        {
+                             res = AgvApi.叫料出库("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1");
+                        }                       
                         agv.Status = AGVTaskStatus.Confirm;
                         agv.AgvID = res.data;
                         db.Default.Updateable(agv).SplitTable().ExecuteCommand();

+ 50 - 30
盘条库/WCS.WorkEngineering/Systems/货架调度处理系统.cs

@@ -2,6 +2,7 @@
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
+using System.Threading.Tasks;
 using WCS.Core;
 using WCS.Entity;
 using WCS.WorkEngineering.Extensions;
@@ -39,7 +40,8 @@ namespace WCS.WorkEngineering.Systems
             try
             {
                 //入库口货架调度
-                if (obj.Entity.Code == "1001")
+                //if (obj.Entity.Code == "1001")
+                if (obj.Entity.HasFlag(DeviceFlags.入库))
                 {
                     if (devsIn.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
                         return;
@@ -96,7 +98,8 @@ namespace WCS.WorkEngineering.Systems
                         #endregion
                     });
                 }
-                else if (obj.Entity.Code == "1002")//叫料口货架调度
+                //if (obj.Entity.Code == "1002")//叫料口货架调度
+                else if (obj.Entity.HasFlag(DeviceFlags.出库))
                 {
                     ////叫料
                     //if (!devsCallOut.Any(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.PH_Status)))
@@ -114,15 +117,31 @@ namespace WCS.WorkEngineering.Systems
                             foreach (var item in devsOut)
                             {
                                 if (db.Queryable<WCS_TaskInfo>().Any(v => v.Status == Entity.TaskStatus.WaitingToExecute && v.SrmStation == item.Entity.Code) && !item.Data3.Status.HasFlag(StationStatus.PH_Status)
-                                                                     && !item.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code))                               
+                                                                     && !item.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code))
                                 {
                                     //入库口没有空货架可用,通知WMS生成搬运任务
-                                    if (devsIn.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
-                                    {
+                                    //if (devsIn.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
+                                    //{
                                         var res = WmsApi.PinKuCarryOutTask(item.Entity.Code);
                                         continue;
-                                    }
+                                    //}
                                 }
+
+                                //if (!(db.Queryable<WCS_TaskInfo>().Any(v => v.Status == Entity.TaskStatus.WaitingToExecute && v.SrmStation == item.Entity.Code) && !item.Data3.Status.HasFlag(StationStatus.PH_Status)
+                                //                                     && !item.Data3.Status.HasFlag(StationStatus.OT_Status)
+                                //                                     && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code)))
+                                //{
+                                //    throw new KnownException($"{item.Entity.Code}上不满足搬运条件申请", LogLevelEnum.High);
+                                //}
+                                //else
+                                //{
+                                //    //入库口没有空货架可用,通知WMS生成搬运任务
+                                //    if (devsIn.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
+                                //    {
+                                //        var res = WmsApi.PinKuCarryOutTask(item.Entity.Code);
+                                //        continue;
+                                //    }
+                                //}
                             }
                         }
                     });
@@ -152,38 +171,39 @@ namespace WCS.WorkEngineering.Systems
                         continue;
                     }
                     else
-                    {
-                        //判断需要架子的出库口
-                        foreach (var i in devsOut)
-                        {
-                            //出库口没有货架且没有到此处的搬运任务
-                            if (!i.Data3.Status.HasFlag(StationStatus.PH_Status) && !i.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == i.Entity.Code) 
-                                && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Station == item.Entity.Code))
-                            {                           
-                                //创建agv搬运任务
-                                SqlSugarHelper.Do(db =>
+                    {                                               
+                            //判断需要架子的出库口
+                            foreach (var i in devsOut)
+                            {
+                                //出库口没有货架且没有到此处的搬运任务
+                                if (!i.Data3.Status.HasFlag(StationStatus.PH_Status) && !i.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == i.Entity.Code)
+                                    && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Station == item.Entity.Code))
                                 {
-                                    var agvTask = new WCS_AgvTaskInfo()
+                                    //创建agv搬运任务
+                                    SqlSugarHelper.Do(db =>
                                     {
-                                        ID = db.GetAGVTaskId(),
-                                        TaskType = AGVTaskType.ForkliftFilling,
-                                        Status = AGVTaskStatus.NewBuild,
-                                        Station = item.Entity.Code,
-                                        Position = i.Entity.Code,
-                                        WorkShop = 222,
-                                        AddWho = "WCS",
-                                    };
-                                    db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
-                                });
-                            }
-                        }
+                                        var agvTask = new WCS_AgvTaskInfo()
+                                        {
+                                            ID = db.GetAGVTaskId(),
+                                            TaskType = AGVTaskType.Transport,
+                                            Status = AGVTaskStatus.NewBuild,
+                                            Station = item.Entity.Code,
+                                            Position = i.Entity.Code,
+                                            WorkShop = 222,
+                                            AddWho = "WCS",
+                                        };
+                                        db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
+                                    });
+                                }
+                            }                                            
                     }
                 }
             }
         }
         public override bool Select(Device dev)
         {
-            return dev.HasFlag(DeviceFlags.货架调度);  
+            //return dev.HasFlag(DeviceFlags.货架调度);  
+            return dev.Code is "1001" or "1002";
         }
     }  
 }

+ 1 - 1
盘条库/WCS.WorkEngineering/WCS.WorkEngineering.csproj

@@ -23,7 +23,7 @@
   <ItemGroup>
     <PackageReference Include="MessagePack" Version="2.5.108" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.5" />
-    <PackageReference Include="ServiceCenter" Version="1.0.5" />
+    <PackageReference Include="ServiceCenter" Version="1.0.5.2" />
   </ItemGroup>
 
 </Project>

+ 2 - 1
盘条库/WCS.WorkEngineering/WebApi/Controllers/AgvApi.cs

@@ -1,4 +1,5 @@
-using ServiceCenter.Logs;
+using ServiceCenter.Extensions;
+using ServiceCenter.Logs;
 using ServiceCenter.Redis;
 using ServiceCenter.WebApi;
 using WCS.WorkEngineering.WebApi.Models.AGV;

+ 2 - 2
盘条库/WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -130,7 +130,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                                     //    break;
                                     //入库任务、叫料任务、搬运任务
                                     case "outbin": //入库小车取货后退出取货位
-                                        agvTask.AgvStatus = AGVTaskStatus.Complete3;
+                                        agvTask.AgvStatus = AGVTaskStatus.LeaveGet;
                                         break;
 
                                     case "applyContinue": //表示请求巷道
@@ -142,7 +142,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                                         break;
 
                                     case "applyQuqPut": //表示请求放货
-                                        agvTask.AgvStatus = AGVTaskStatus.WalkIntoStorage;
+                                        agvTask.AgvStatus = AGVTaskStatus.PutRequestOrPermission;
                                         break;
 
                                     case "finishIn": //入库任务完成

+ 2 - 1
盘条库/WCS.WorkEngineering/WebApi/Controllers/IwmsApi.cs

@@ -1,4 +1,5 @@
-using ServiceCenter.Logs;
+using ServiceCenter.Extensions;
+using ServiceCenter.Logs;
 using ServiceCenter.Redis;
 using ServiceCenter.WebApi;
 using WCS.WorkEngineering.WebApi.Models.AGV;

+ 1 - 16
盘条库/WCS.WorkEngineering/WorkStart.cs

@@ -69,22 +69,7 @@ namespace WCS.WorkEngineering
             #endregion 扫码器
 
             #region 外检信息
-
-            //List<ShapeInfo> shapeInfo = new List<ShapeInfo>
-            //{
-            //    new ShapeInfo(new int[] { 1017,1018 }, "10.30.35.21")
-            //};
-
-            //foreach (var item in shapeInfo)
-            //{
-            //    for (int i = 0; i < item.DeviceNo.Length; i++)
-            //    {
-            //        var conv = Device.All.FirstOrDefault(x => x.Code == item.DeviceNo[i].ToString());
-            //        conv.AddFlag(DeviceFlags.外检);
-            //        int pos = i * 14;
-            //        conv.AddProtocol<IStation91>(pos, 91, item.IP);
-            //    }
-            //}
+           
 
             #endregion 外检信息