林豪 左 2 years ago
parent
commit
53edc1f6d5

+ 37 - 20
ServiceCenter/Redis/RedisHub.cs

@@ -1,4 +1,5 @@
 using FreeRedis;
+using ServiceCenter.Logs;
 
 namespace ServiceCenter.Redis
 {
@@ -160,25 +161,41 @@ namespace ServiceCenter.Redis
             return ctx.Client;
         }
 
-        ///// <summary>
-        /////  执行事务
-        ///// </summary>
-        ///// <param name="act"></param>
-        ///// <exception cref="Exception"></exception>
-        //public void Do(Action<RedisHub> act)
-        //{
-        //    if (!RedisClients.Any()) throw new Exception($"请调用{nameof(CreateContext)}方法设置设置数据库连接");
-        //    var db = new RedisHub();
-        //    try
-        //    {
-        //        act(db);//执行委托
-        //    }
-        //    catch (Exception ex)
-        //    {
-        //        db.Connect.RollbackTran();//回滚事务
-        //        //Console.WriteLine($"事务回滚记录:{ex.Message}:{ex.StackTrace}");
-        //        throw new Exception(ex.Message);
-        //    }
-        //}
+        /// <summary>
+        ///  执行并发锁
+        ///  使用默认连接
+        /// </summary>
+        /// <param name="lockKey">并发锁key</param>
+        /// <param name="act">执行内容</param>
+        /// <exception cref="Exception"></exception>
+        public static void Do(string lockKey, Action<RedisClient> act) => Do(DefaultContextType, lockKey, act);
+
+        /// <summary>
+        ///  执行并发锁
+        ///  指定redis
+        /// </summary>
+        /// <param name="key">连接key</param>
+        /// <param name="lockKey">并发锁key</param>
+        /// <param name="act">执行内容</param>
+        /// <exception cref="Exception"></exception>
+        public static void Do(string key, string lockKey, Action<RedisClient> act)
+        {
+            if (!RedisClients.Any()) throw new Exception($"请调用{nameof(CreateContext)}方法设置设置数据库连接");
+            var redis = Context(key);
+            try
+            {
+                if (redis.Exists(lockKey)) throw new Exception($"重复调用:{lockKey}");
+                redis.Expire(lockKey, 60);
+                act(redis);
+            }
+            catch (Exception ex)
+            {
+                throw new KnownException($"{ex.Message}", LogLevelEnum.Mid);
+            }
+            finally
+            {
+                redis.Del(lockKey);
+            }
+        }
     }
 }

+ 1 - 1
WCS.Entity/WCS_AgvTaskInfo.cs

@@ -182,7 +182,7 @@ namespace WCS.Entity
         ///  放站台前安全交互申请
         /// </summary>
         [Description("取放站台前安全交互申请")]
-        PutRequestOrPermission2 = 40,
+        PutRequestOrPermission = 40,
 
         #endregion 安全交互
 

+ 20 - 0
WCS.WorkEngineering/Extensions/DeviceExtension.cs

@@ -4,6 +4,7 @@ using ServiceCenter.Logs;
 using ServiceCenter.Redis;
 using WCS.Core;
 using WCS.WorkEngineering.Protocol.BCR;
+using WCS.WorkEngineering.Protocol.Robot;
 using WCS.WorkEngineering.Protocol.Station;
 using WCS.WorkEngineering.Protocol.Truss;
 
@@ -241,6 +242,25 @@ namespace WCS.WorkEngineering.Extensions
             return res.ToArray();
         }
 
+        /// <summary>
+        ///  获取缓存列表
+        /// </summary>
+        /// <returns></returns>
+        public static int[] GetTaskNoList(this IRobot531 station525)
+        {
+            var properties = station525.GetType().GetProperties().ToArray();
+            var res = new List<int>();
+            var index = 0;
+            for (var i = 0; i <= 29; i++)
+            {
+                var value = properties[index].GetValue(station525)!.ToInt();
+                res.Add(value);
+                index += 1;
+            }
+
+            return res.ToArray();
+        }
+
         /// <summary>
         ///  通过仓库编码获取对应堆垛机信息
         /// </summary>

+ 9 - 7
WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -36,9 +36,11 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Station obj)
         {
+            
+
             if (obj.Entity.HasFlag(DeviceFlags.出库))
             {
-                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
+                var agvTaskInfos = new List<WCS_AgvTaskInfo>();
                 //获取所有未结束的叫料及背负式补空AGV任务
                 SqlSugarHelper.Do(db =>
                 {
@@ -50,7 +52,7 @@ namespace WCS.WorkEngineering.Systems
                 if (agvTaskInfos.Any())
                 {
                     this.ExRecord(obj.Entity.Code, "可用出库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
-                    List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
+                    var taskInfos = new List<WCS_TaskInfo>();
 
                     foreach (var agv in agvTaskInfos)
                     {
@@ -59,10 +61,10 @@ namespace WCS.WorkEngineering.Systems
                             SqlSugarHelper.Do(db =>
                             {
                                 //取货点安全交互
-                                if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
+                                if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.RequestOrPermission2)
                                 {
                                     var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                                    agv.Status = AGVTaskStatus.Complete2;
+                                    agv.Status = AGVTaskStatus.RequestOrPermission2;
                                     db.Default.Updateable(agv).SplitTable().ExecuteCommand();
                                     taskInfo.AddWCS_TASK_DTL(db.Default, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
                                     AgvApi.ContinueTask(agv.AgvID, agv.Station);
@@ -187,7 +189,7 @@ namespace WCS.WorkEngineering.Systems
                                                                                                .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code));
                                     this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},放货站台{nextPos}");
 
-                                    bool flag = false;
+                                    var flag = false;
                                     if (((task.BusType == "二楼湿拉线退料回立库" || task.BusType == "二楼湿拉线余料回立库") && task.Floor == 2))
                                     {
                                         flag = true;
@@ -229,7 +231,7 @@ namespace WCS.WorkEngineering.Systems
                                     AgvApi.ContinueTask(agv.AgvID, nextPos.Entity.Code);
                                 }
                                 //放货站点安全交互
-                                else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
+                                else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.RequestOrPermission2)
                                 {
                                     if (agv.Position.IsNullOrEmpty()) throw new Exception($"无有效放货地址");
                                     var dev = devs.Find(v => v.Entity.Code == agv.Position);
@@ -239,7 +241,7 @@ namespace WCS.WorkEngineering.Systems
                                     if (dev.Data3.Status.HasFlag(StationStatus.PH_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}光电有货");
                                     if (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;
+                                    agv.Status = AGVTaskStatus.RequestOrPermission2;
                                     db.Default.Updateable(agv).SplitTable().ExecuteCommand();
 
                                     //调继续执行任务接口

+ 0 - 0
WCS.WorkEngineering/Systems/分线计算09.cs → WCS.WorkEngineering/Systems/分拣主线/分线计算09.cs


+ 4 - 4
WCS.WorkEngineering/Systems/码垛区补空托盘任务生成.cs → WCS.WorkEngineering/Systems/桁架码垛/桁架码垛区补空托盘任务生成.cs

@@ -11,11 +11,11 @@ using TaskStatus = WCS.Entity.TaskStatus;
 namespace WCS.WorkEngineering.Systems
 {
     /// <summary>
-    ///  码垛区补空托盘任务生成
+    ///  桁架码垛区补空托盘任务生成
     /// </summary>
     [BelongTo(typeof(MainWorld))]
-    [Description("码垛区补空托盘任务生成")]
-    public class 码垛区补空托盘任务生成 : DeviceSystem<Device<IStation520>>
+    [Description("桁架码垛区补空托盘任务生成")]
+    public class 桁架码垛区补空托盘任务生成 : DeviceSystem<Device<IStation520>>
     {
         protected override bool ParallelDo => true;
 
@@ -53,7 +53,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            return dev.Code == nameof(码垛区补空托盘任务生成);
+            return dev.Code == nameof(桁架码垛区补空托盘任务生成);
         }
     }
 }

+ 2 - 2
WCS.WorkEngineering/Systems/码垛工位任务结束处理09.cs → WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs

@@ -16,9 +16,9 @@ namespace WCS.WorkEngineering.Systems
     /// <summary>
     ///  码垛工位处理
     /// </summary>
-    [BelongTo(typeof(MainWorld))]
+    [BelongTo(typeof(SortingPalletizingWorld))]
     [Description("码垛工位任务结束处理09")]
-    public class 码垛工位任务结束处理09 : DeviceSystem<Device<IStation520, IStation521, IStation523, ITruss530, ITruss531>>
+    public class 桁架码垛工位任务结束处理 : DeviceSystem<Device<IStation520, IStation521, IStation523, ITruss530, ITruss531>>
     {
         protected override bool ParallelDo => true;
 

+ 59 - 0
WCS.WorkEngineering/Systems/环形库/环形库码垛区补空托盘任务生成.cs

@@ -0,0 +1,59 @@
+using PlcSiemens.Core.Extension;
+using ServiceCenter.Extensions;
+using ServiceCenter.SqlSugars;
+using System.ComponentModel;
+using WCS.Core;
+using WCS.Entity;
+using WCS.WorkEngineering.Protocol.Station;
+using WCS.WorkEngineering.Worlds;
+using TaskStatus = WCS.Entity.TaskStatus;
+
+namespace WCS.WorkEngineering.Systems
+{
+    /// <summary>
+    ///  环形库码垛区补空托盘任务生成
+    /// </summary>
+    [BelongTo(typeof(RingWorld))]
+    [Description("环形库码垛区补空托盘任务生成")]
+    public class 环形库码垛区补空托盘任务生成 : DeviceSystem<Device<IStation520>>
+    {
+        protected override bool ParallelDo => true;
+
+        protected override bool SaveLogsToFile => true;
+
+        public override void Do(Device<IStation520> obj)
+        {
+            WCS_Palletizing palletizing = null;
+            SqlSugarHelper.Do(_db =>
+            {
+                var db = _db.Default;
+                //取一个时间最靠前的,没有绑定码垛工位的码垛记录
+                var palletizingInfo = db.Queryable<WCS_Palletizing>().First(x => x.PalletizingStation == null);
+                if (palletizingInfo == null) return;
+                var palleTask = db.Queryable<WCS_TaskInfo>().First(x => x.ID == palletizingInfo.TaskId && (x.Status == TaskStatus.FinishOfShunt || x.Status == TaskStatus.ConveyorExecution));
+                if (palleTask == null) return;
+                //获取可以使用的放货站台信息
+                var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palleTask.AddrNext).Targets.FirstOrDefault().Targets.FirstOrDefault().Targets;
+                if (taskAddNext == null) return;
+                var devs = Device.All.Where(x => taskAddNext.Contains(x)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).ToList();
+                //取一个可用用于码垛的地方
+                var dev = devs.FirstOrDefault(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status));
+                if (dev == null) return;
+
+                palletizingInfo.PalletizingStation = dev.Entity.Code;
+                db.Updateable(palletizingInfo).ExecuteCommand();
+                palletizing = palletizingInfo;
+            });
+            if (palletizing == null) return;
+            //TODO:取货地址暂时写死,后续依靠任务进行计算
+            var dev = Device.All.Where(x => x.Code == "1606").Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
+            dev.Data.TaskNumber = palletizing.Id;
+            dev.Data.GoodsEnd = palletizing.PalletizingStation!.ToShort();
+        }
+
+        public override bool Select(Device dev)
+        {
+            return dev.Code == nameof(环形库码垛区补空托盘任务生成);
+        }
+    }
+}

+ 0 - 32
WCS.WorkEngineering/Systems/环形库/环形库码垛工位获取托盘.cs

@@ -1,32 +0,0 @@
-using System.ComponentModel;
-using WCS.Core;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.WebApi.Controllers;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-
-namespace WCS.WorkEngineering.Systems.环形库
-{
-    /// <summary>
-    ///  环形库码垛工位获取托盘
-    /// </summary>
-    [BelongTo(typeof(RingWorld))]
-    [Description("环形库码垛工位获取托盘")]
-    public class 环形库码垛工位获取托盘 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523> obj)
-        {
-            //获取目标地址当前位置的出库任务
-            //WmsApi.ApplyPalletizingStockOut()
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.环形库码垛工位);
-        }
-    }
-}

+ 64 - 0
WCS.WorkEngineering/Systems/环形库/环形库码垛结束.cs

@@ -0,0 +1,64 @@
+using ServiceCenter.Extensions;
+using ServiceCenter.SqlSugars;
+using System.ComponentModel;
+using WCS.Core;
+using WCS.Entity;
+using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.Protocol.Robot;
+using WCS.WorkEngineering.Protocol.Station;
+using WCS.WorkEngineering.WebApi.Controllers;
+using WCS.WorkEngineering.Worlds;
+using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
+
+namespace WCS.WorkEngineering.Systems.环形库
+{
+    /// <summary>
+    ///  环形库码垛结束
+    /// </summary>
+    [BelongTo(typeof(RingWorld))]
+    [Description("环形库码垛结束")]
+    public class 环形库码垛结束 : DeviceSystem<Device<IStation520, IStation521, IStation523, IRobot530, IRobot531>>
+    {
+        protected override bool ParallelDo => true;
+
+        protected override bool SaveLogsToFile => true;
+
+        public override void Do(Device<IStation520, IStation521, IStation523, IRobot530, IRobot531> obj)
+        {
+            if (!obj.Data5.CmdType.HasFlag(RobotCmdType.End)) obj.Data4.CmdType = 0;
+            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
+            if (obj.Data5.MaxQuantity != obj.Data5.Quantity || obj.Data5.Quantity == 0 || obj.Data5.MaxQuantity == 0) return;
+            if (!obj.Data5.CmdType.HasFlag(RobotCmdType.End)) return;
+            WCS_TaskInfo task = null;
+            //找到对应的码垛数据
+            SqlSugarHelper.Do(_db =>
+            {
+                var db = _db.Default;
+
+                var TaskNoList = obj.Data5.GetTaskNoList().ToList();
+                var tasks = db.Queryable<WCS_TaskOld>().SplitTable(x => x.Take(2)).Where(x => TaskNoList.Contains(x.Id)).ToList();
+
+                var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == "TPA0000001" && x.Status == Entity.TaskStatus.WaitingToExecute);
+                if (taskInfo == null)
+                {
+                    //开始绑盘
+                    WmsApi.BingPallet("TPA0000001", tasks.Select(x => x.BarCode).ToList(), tasks.First().WarehouseCode, obj.Entity.Code);
+                    return;
+                }
+                if (taskInfo.Status != Entity.TaskStatus.WaitingToExecute) return;
+
+                task = taskInfo;
+            });
+            if (task == null) return;
+            obj.Data.TaskNumber = task.ID;
+            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+            obj.Data.GoodsEnd = task.AddrNext.ToShort();
+            obj.Data4.CmdType = RobotCmdType.End;
+        }
+
+        public override bool Select(Device dev)
+        {
+            return dev.HasFlag(DeviceFlags.环形库码垛工位);
+        }
+    }
+}

+ 45 - 164
WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -1,9 +1,6 @@
 using Microsoft.AspNetCore.Mvc;
-using Newtonsoft.Json;
-using ServiceCenter.Logs;
 using ServiceCenter.Redis;
 using ServiceCenter.SqlSugars;
-using WCS.Core;
 using WCS.Entity;
 using WCS.WorkEngineering.WebApi.Models.AGV;
 using WCS.WorkEngineering.WebApi.Models.AGV.Request;
@@ -54,113 +51,6 @@ namespace WCS.WorkEngineering.WebApi.Controllers
             }
         }
 
-        /// <summary>
-        ///  背负式AGV请求出库任务
-        /// </summary>
-        /// <param name="reqDto">请求参数</param>
-        /// <returns></returns>
-        [HttpPost]
-        public ApplyEmptySpoolResponse ApplyEmptySpool([FromBody] AgvFillEmptySpaceRequest reqDto)
-        {
-            var key = $"WCS:Lock:AGV:{nameof(ApplyEmptySpool)}";
-            var agvFill = new ApplyEmptySpoolResponse();
-            try
-            {
-                if (RedisHub.Default.Get(key) != null)
-                {
-                    agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                    agvFill.ResMsg = $"[{nameof(ApplyEmptySpool)}]--触发并发管控";
-                }
-                else
-                {
-                    RedisHub.Default.Set(key, nameof(ApplyEmptySpool));
-                    LogHub.InterfacePublish(nameof(ApplyEmptySpool), $"传入参数--{JsonConvert.SerializeObject(reqDto)}");
-
-                    try
-                    {
-                        agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                        if (!World.IsStart)
-                        {
-                            agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                            agvFill.ResMsg = "WCS初始化中";
-                            return agvFill;
-                        }
-                        //var obj = World.GetSystemInstance<GetDeviceSystem>().Invoke("输送机") as List<Station>;
-
-                        //// 检测三个站台是否有货
-                        //obj = obj.Where(v => v.Entity.Code is "1012" or "1014" or "1016").Where(v => v.Data3.Status.HasFlag(StationStatus.PH_Status)).ToList();
-                        //if (!obj.Any())
-                        //{
-                        //    agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                        //    agvFill.ResMsg = "无空轮";
-                        //    return agvFill;
-                        //}
-                        SqlSugarHelper.Do(db =>
-                        {
-                            //var res = WmsApi.GetTunnelEmptyConCount();
-
-                            var agvStations = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2))
-                                              .Where(v => v.Status < AGVTaskStatus.Complete3 && v.TaskType == AGVTaskType.CallForMaterial).Select(v => v.Station).ToList();
-                            //obj = obj.Where(v => !agvStations.Contains(v.Entity.Code)).ToList();
-                            //if (!obj.Any())
-                            //{
-                            //    agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                            //    agvFill.ResMsg = "无可用取货站点";
-                            //    return;
-                            //}
-
-                            //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();
-                            //var dev = obj.MinBy(v => stationNo.IndexOf(v.Entity.Code));
-                            //var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == dev.Data.TaskNumber) ?? throw new Exception("无有效任务");
-                            //var id = db.GetAGVTaskId();
-                            //var agv = new WCS_AgvTaskInfo()
-                            //{
-                            //    ID = id,
-                            //    AgvID = $"HJBK{id}{task.ID}",
-                            //    TaskType = AGVTaskType.CallForMaterial,
-                            //    Status = AGVTaskStatus.NewBuild,
-                            //    Station = dev.Entity.Code,
-                            //    AddWho = "WCS"
-                            //};
-                            ////创建对应的AGV任务
-                            //db.Default.Insertable(agv).SplitTable().ExecuteCommand();
-
-                            //task.AgvTaskID = agv.ID;
-                            //task.Status = Entity.TaskStatus.AGVExecution;
-                            //db.Default.Updateable(task).ExecuteCommand();
-                            //task.AddWCS_TASK_DTL(db, dev.Entity.Code, "AGV", "agv执行中");
-
-                            //agvFill.LocCode = dev.Entity.Code;
-                            //agvFill.SpoolType = "4";
-                            //agvFill.ResMsg = "";
-                            //agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.Sucess;
-                            //agvFill.TaskCode = agv.AgvID;
-                        });
-                    }
-                    catch (Exception ex)
-                    {
-                        agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                        agvFill.ResMsg = ex.Message;
-                    }
-                    LogHub.InterfacePublish(nameof(ApplyEmptySpool), $"返回参数{JsonConvert.SerializeObject(agvFill)}");
-                }
-            }
-            finally
-            {
-                RedisHub.Default.Del(key);
-            }
-            return agvFill;
-        }
-
         /// <summary>
         /// AGV执行回调
         /// </summary>
@@ -174,67 +64,62 @@ namespace WCS.WorkEngineering.WebApi.Controllers
 
             try
             {
-                if (RedisHub.Default.Exists(key))
-                {
-                    res.code = AgvResponseCode.Error;
-                    res.message = $"[{nameof(AgvCallback)}]--触发并发管控";
-                    return res;
-                }
-                RedisHub.Default.Expire(key, 60);
-
-                SqlSugarHelper.Do(db =>
+                RedisHub.Do(key, redis =>
                 {
-                    //跟据AGVid找到对应的AGV任务
-                    var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2))
-                        .First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
-                    if (agvTask == null)
-                    {
-                        res.code = AgvResponseCode.Fail;
-                        res.message = "未找到对应的AGV任务";
-                        return;
-                    }
-                    switch (reqDto.method)
+                    SqlSugarHelper.Do(db =>
                     {
-                        case "applyContinue": //表示请求巷道
-                            agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission1;
-                            break;
+                        //跟据AGVid找到对应的AGV任务
+                        var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2))
+                            .First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
+                        if (agvTask == null)
+                        {
+                            res.code = AgvResponseCode.Fail;
+                            res.message = "未找到对应的AGV任务";
+                            return;
+                        }
+                        switch (reqDto.method)
+                        {
+                            case "applyContinue": //表示请求巷道
+                                agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission1;
+                                break;
 
-                        case "applySecurity": //表示请求放货或取货
-                            agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission2;
-                            break;
+                            case "applySecurity": //表示请求放货或取货
+                                agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission2;
+                                break;
 
-                        case "hjend_2": //补空任务完成
-                            agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                            break;
+                            case "hjend_2": //补空任务完成
+                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                break;
 
-                        case "endhjBM": //取满任务完成
-                            agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                            break;
+                            case "endhjBM": //取满任务完成
+                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                break;
 
-                        case "end": //二楼出满任务完成
-                            agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                            break;
+                            case "end": //二楼出满任务完成
+                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                break;
 
-                        case "tcEnd": //机台补空任务完成
-                            agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                            break;
+                            case "tcEnd": //机台补空任务完成
+                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                break;
 
-                        case "exc_end": //异常信息上抛-值不匹配
-                            agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                            break;
+                            case "exc_end": //异常信息上抛-值不匹配
+                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                break;
 
-                        case "outbin": //小车退出取货位
-                            agvTask.AgvStatus = AGVTaskStatus.Complete3;
-                            break;
+                            case "outbin": //小车退出取货位
+                                agvTask.AgvStatus = AGVTaskStatus.LeaveGet;
+                                break;
 
-                        case "cancel": //取消任务
-                            //agvTask.AgvStatus = AGVTaskStatus.Cancel;
-                            break;
-                    }
+                            case "cancel": //取消任务
+                                           //agvTask.AgvStatus = AGVTaskStatus.Cancel;
+                                break;
+                        }
 
-                    db.Default.Updateable(agvTask).SplitTable().ExecuteCommand();
-                    res.code = AgvResponseCode.Success;
-                    res.message = "成功";
+                        db.Default.Updateable(agvTask).SplitTable().ExecuteCommand();
+                        res.code = AgvResponseCode.Success;
+                        res.message = "成功";
+                    });
                 });
             }
             catch (Exception ex)
@@ -242,10 +127,6 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                 res.code = AgvResponseCode.Error;
                 res.message = ex.Message;
             }
-            finally
-            {
-                RedisHub.Default.Del(key);
-            }
 
             return res;
         }

+ 17 - 11
WCS.WorkEngineering/WorkStart.cs

@@ -28,7 +28,7 @@ namespace WCS.WorkEngineering
         {
             #region 无交互触发设备
 
-            var devs = new List<string>() { nameof(分线计算09), nameof(码垛区补空托盘任务生成) };
+            var devs = new List<string>() { nameof(分线计算09), nameof(环形库码垛区补空托盘任务生成), nameof(桁架码垛区补空托盘任务生成) };
             foreach (var conv in devs.Select(code => new Device(code)))
             {
                 conv.AddProtocol<IStation520>(0, 520, "1");
@@ -296,28 +296,34 @@ namespace WCS.WorkEngineering
                 conv.AddProtocol<ITruss523>(0, 523, item.Ip);
             }
 
-            var tuples1 = new List<Tuple<string, List<Tuple<int, int>>>>
+            var tuples1 = new List<Tuple<string, List<int>>>
             {
-                new("10.30.37.211",new List<Tuple<int, int>>()
-                {
-                    new(1661, 1690),
-                })
+                //桁架
+                new("10.30.37.211",new  List<int>(){1662,1663,1664,1665,1670,1671,1672,1673,1674,1675,1677,1678,1679,1680,1685,1686,1687,1688,1689,1690}),
+                //机械臂
+                new("10.30.37.230",new  List<int>(){ 1666, 1661}),
             };
 
             foreach (var item in tuples1)
             {
                 var db530 = 0;
                 var db531 = 0;
-                foreach (var item1 in item.Item2)
+                foreach (var conv in item.Item2.Select(item1 => Device.All.FirstOrDefault(x => x.Code == item1.ToString())))
                 {
-                    for (var i = item1.Item1; i <= item1.Item2; i++)
+                    if (item.Item1 == "10.30.37.211")
                     {
-                        var conv = Device.All.FirstOrDefault(x => x.Code == i.ToString());
-                        conv.AddProtocol<ITruss530>(db530, 530, item.Item1);
-                        conv.AddProtocol<ITruss531>(db531, 531, item.Item1);
+                        conv!.AddProtocol<ITruss530>(db530, 530, item.Item1);
+                        conv!.AddProtocol<ITruss531>(db531, 531, item.Item1);
                         db530 += 8;
                         db531 += 250;
                     }
+                    else
+                    {
+                        conv!.AddProtocol<IRobot530>(db530, 530, item.Item1);
+                        conv!.AddProtocol<IRobot531>(db531, 531, item.Item1);
+                        db530 += 8;
+                        db531 += 130;
+                    }
                 }
             }