林豪 左 2 jaren geleden
bovenliggende
commit
0d5efe658c

+ 2 - 20
成品库/WCS.WorkEngineering/Extensions/DeviceExtension.cs

@@ -182,7 +182,7 @@ namespace WCS.WorkEngineering.Extensions
         /// <returns></returns>
         public static string GetBCRCode(this IBCR81 bCR)
         {
-            var barcode = bCR.Content.Trim('\0');
+            var barcode = bCR.Content.Trim('\0').Trim();
             if (barcode.IsNullOrWhiteSpace()) throw new KnownException($"扫码失败,内容为空", LogLevelEnum.High);
             return barcode;
         }
@@ -238,25 +238,7 @@ namespace WCS.WorkEngineering.Extensions
 
         巷道 = 1L << 14,
         堆垛机 = 1L << 15,
-        输送机 = 1L << 16,
-
-        #region 一轨双车堆垛机
-
-        一列堆垛机 = 1L << 23,
-        二列堆垛机 = 1L << 24,
-
-        #endregion 一轨双车堆垛机
-
-        RGV = 1L << 25,
-        桁架 = 1L << 26,
-        一楼扫码 = 1L << 27,
-        满轮主线第一次扫码 = 1L << 28,
-        主线分流点 = 1L << 29,
-        一楼叠盘机 = 1L << 30,
-        环形库分流点 = 1L << 31,
-        桁架分流点 = 1L << 32,
-        桁架缓存放行点 = 1L << 33,
-        桁架取货点 = 1L << 34
+        输送机 = 1L << 16
     }
 
     /// <summary>

+ 0 - 274
成品库/WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -1,274 +0,0 @@
-using PlcSiemens.Core.Extension;
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.SRM;
-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>
-    ///  Agv交互系统
-    /// </summary>
-    [BelongTo(typeof(MainWorld))]
-    [Description("Agv交互系统")]
-    public class AgvSystems : DeviceSystem<Station>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        private List<Station> devs = 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();
-        }
-
-        public override void Do(Station obj)
-        {
-            if (obj.Entity.HasFlag(DeviceFlags.出库))
-            {
-                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
-                //获取所有未结束的叫料及背负式补空AGV任务
-                SqlSugarHelper.Do(db =>
-                {
-                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => (v.TaskType == AGVTaskType.CallMaterial || v.TaskType == AGVTaskType.CallForMaterial || v.TaskType == AGVTaskType.ForkliftFilling))
-                                                                         .Where(v => v.Status < AGVTaskStatus.MissionCompleted)
-                                                                         .SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.AddTime).ToList();
-                });
-                //有需要处理的AGV任务
-                if (agvTaskInfos.Any())
-                {
-                    this.ExRecord(obj.Entity.Code, "可用出库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
-                    List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
-
-                    foreach (var agv in agvTaskInfos)
-                    {
-                        try
-                        {
-                            SqlSugarHelper.Do(db =>
-                            {
-                                //取货点安全交互
-                                if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
-                                {
-                                    var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                                    agv.Status = AGVTaskStatus.Complete2;
-                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                    taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
-                                    AgvApi.ContinueTask(agv.AgvID, agv.Station);
-                                }
-                                //完成任务
-                                else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
-                                {
-                                    if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
-                                    {
-                                        var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                                        if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
-                                        //更新AGV任务状态
-                                        agv.Status = AGVTaskStatus.MissionCompleted;
-                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                        //更新WCS任务状态
-                                        taskInfo.Status = Entity.TaskStatus.Finish;
-                                        taskInfo.EedTime = DateTime.Now;
-                                        db.Default.Updateable(taskInfo).ExecuteCommand();
-                                        taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成");
-                                        taskInfo.CompleteOrCancelTasks(db);
-                                        taskInfos.Add(taskInfo);
-                                    }
-                                    else
-                                    {
-                                        agv.Status = AGVTaskStatus.MissionCompleted;
-                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                    }
-                                }
-                            });
-                        }
-                        catch (Exception ex)
-                        {
-                            World.Log(ex.Message, LogLevelEnum.Mid);
-                            this.ExRecord(obj.Entity.Code, ex.Message);
-                            continue;
-                        }
-                    }
-
-                    foreach (var item in taskInfos)
-                    {
-                        WmsApi.CompleteTask(item.ID);
-                    }
-                }
-            }
-            else if (obj.Entity.HasFlag(DeviceFlags.入库))
-            {
-                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
-                //获取所有未结束的入库AGV任务
-                SqlSugarHelper.Do(db =>
-                {
-                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot).SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.EditTime).ToList();
-                });
-
-                if (agvTaskInfos.Any())
-                {
-                    this.ExRecord(obj.Entity.Code, "可用入库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
-                    foreach (var agv in agvTaskInfos)
-                    {
-                        try
-                        {
-                            SqlSugarHelper.Do(db =>
-                            {
-                                //找到对应WCS任务
-                                var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                                if (task == null) throw new Exception($"AGV任务{agv.ID}未找到对应WCS任务");
-
-                                #region 开始跟据AGV状态做出处理
-
-                                //巷道分配
-                                if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission1 && agv.Status != AGVTaskStatus.Complete1)
-                                {
-                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}开始进行巷道分配");
-                                    //向WMS获取巷道优先级
-                                    var res = WmsApi.GetTunnelPriorityList(task.ID);
-                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},WMS返回巷道优先级{res.ResData}");
-                                    var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList();
-
-                                    //开始获取堆垛机与可用站台信息
-                                    SRM srm = null;
-                                    List<Station> stations = new List<Station>();
-                                    if (task.Floor == 1) //一楼
-                                    {
-                                        //一楼三个入库口
-                                        stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015").ToList();
-                                        //筛选出可用站台
-                                        stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StationStatus.Auto))
-                                                           .Where(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status))
-                                                           .Where(v => !v.Data3.Status.HasFlag(StationStatus.Run)).ToList(); // 筛选出可用站台
-                                        this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
-                                        //可用堆垛机
-                                        srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
-                                                      .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
-                                                      .Select(v => new SRM(v, this.World)) //转换为SRM
-                                                      .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
-                                                      .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
-                                                      .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
-                                    }
-                                    else //二楼
-                                    {
-                                        //二楼三个入库口
-                                        stations = devs.Where(v => v.Entity.Code is "1021" or "1023" or "1025").ToList();
-                                        //筛选出可用站台
-                                        stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StationStatus.Auto))
-                                                           .Where(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status))
-                                                           .Where(v => !v.Data3.Status.HasFlag(StationStatus.Run)).ToList(); // 筛选出可用站台
-                                        this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
-                                        //可用堆垛机
-                                        srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
-                                                      .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
-                                                      .Select(v => new SRM(v, this.World)) //转换为SRM
-                                                      .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
-                                                      .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
-                                                      .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
-                                    }
-                                    if (srm == null) throw new Exception($"agv任务{agv.ID}无可用堆垛机");
-
-                                    //筛选出堆垛机的放货站台
-                                    var nextPos = stations.FirstOrDefault(v => v.Entity.Sources.Where(t => t.IsTunnel()).Select(t => t.Sources).SelectMany(v => v) //获取所有巷道
-                                                                                               .Where(t => t.HasProtocol(typeof(ISRM520)))//筛选出堆垛机
-                                                                                               .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code));
-                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},放货站台{nextPos}");
-
-                                    bool flag = false;
-                                    if (((task.BusType == "二楼湿拉线退料回立库" || task.BusType == "二楼湿拉线余料回立库") && task.Floor == 2))
-                                    {
-                                        flag = true;
-                                        nextPos.Entity.Code = "1025";
-                                    }
-                                    var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == nextPos.Entity.Code).SplitTable(v => v.Take(2)).ToList();
-                                    if (agvs.Any())
-                                    {
-                                        var msg = "已无可用放货站台,任务正在执行中:";
-                                        foreach (var ag in agvs)
-                                        {
-                                            msg = msg + $"[任务号:{ag.ID},目标地址:{ag.Position}]";
-                                        }
-                                        throw new Exception(msg);
-                                    }
-
-                                    //更新AGV任务状态
-                                    agv.Status = AGVTaskStatus.Complete1;
-                                    agv.Position = flag == true ? "1025" : nextPos.Entity.Code;
-                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                    //更新WCS任务状态
-                                    if (flag)
-                                    {
-                                        srm.Entity.Code = "SRM3";
-                                        task.Device = srm.Entity.Code;
-                                        task.Tunnel = "3";
-                                        task.AddrNext = "1025";
-                                    }
-                                    else
-                                    {
-                                        task.Device = srm.Entity.Code;
-                                        task.Tunnel = task.Device.GetLastDigit().ToString();
-                                        task.AddrNext = agv.Position;
-                                    }
-                                    db.Default.Updateable(task).ExecuteCommand();
-                                    task.AddWCS_TASK_DTL(db, "AGV巷道分配点", nextPos.Entity.Code, $"任务分配至堆垛机:{srm.Entity.Code}");
-                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}分配至堆垛机:{srm.Entity.Code}");
-                                    //调继续执行任务接口
-                                    AgvApi.ContinueTask(agv.AgvID, nextPos.Entity.Code);
-                                }
-                                //放货站点安全交互
-                                else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
-                                {
-                                    if (agv.Position.IsNullOrEmpty()) throw new Exception($"无有效放货地址");
-                                    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)) 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;
-                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-
-                                    //调继续执行任务接口
-                                    AgvApi.ContinueTask(agv.AgvID, dev.Entity.Code);
-
-                                    dev.Data.TaskNumber = task.ID;
-                                }
-                                //完成任务
-                                else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
-                                {
-                                    agv.Status = AGVTaskStatus.MissionCompleted;
-                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                }
-
-                                #endregion 开始跟据AGV状态做出处理
-                            });
-                        }
-                        catch (Exception ex)
-                        {
-                            World.Log(ex.Message, LogLevelEnum.Mid);
-                            this.ExRecord(obj.Entity.Code, ex.Message);
-                            continue;
-                        }
-                    }
-                }
-            }
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.Code is "1011" or "1012";
-        }
-    }
-}

+ 1 - 1
成品库/WCS.WorkEngineering/Systems/DeviceWriteSystem.cs

@@ -9,7 +9,7 @@ namespace WCS.WorkEngineering.Systems
     /// <summary>
     ///  设备信息写入接口
     /// </summary>
-    //[BelongTo(typeof(MainWorld))]
+    [BelongTo(typeof(MainWorld))]
     public class DeviceWriteSystem : ServiceSystem<DeviceWriteInfo>
     {
         /// <summary>

+ 26 - 4
成品库/WCS.WorkEngineering/Systems/堆垛机.cs

@@ -9,6 +9,7 @@ using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.Protocol.SRM;
 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;
 using KnownException = ServiceCenter.Logs.KnownException;
@@ -324,6 +325,31 @@ namespace WCS.WorkEngineering.Systems
                                                                   .First();
                    if (task == null) throw new KnownException($"{obj.Entity.Code}未找到出库任务", LogLevelEnum.High);
                    var taskId = task.ID;
+
+                   //判断是否是二深位任务
+                   var addrFrom = task.AddrFrom.Split("-");
+                   if (addrFrom[4] == "02")
+                   {
+                       var res = WmsApi.AddWcsMoveTask(task.ID);
+                       switch (res.ResData.ResType)
+                       {
+                           case WmsApiMoveTask.允许2升位执行:
+                               break;
+
+                           case WmsApiMoveTask.执行移库任务:
+                               throw new KnownException($"堆垛机{obj.Entity.Code}需要先执行移库任务", LogLevelEnum.Mid);
+
+                           case WmsApiMoveTask.一深位有出库任务:
+                               task = db.Default.Queryable<WCS_TaskInfo>()
+                                                .Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
+                                                .Where(v => allOutCode.Contains(v.SrmStation) && v.AddrFrom == res.ResData.CellNo)
+                                                .First() ?? throw new KnownException($"请尽快搬离{obj.Entity.Code}二楼出库口满轮,当前堆垛机出库任务呗阻塞", LogLevelEnum.Mid);
+                               break;
+                       };
+                       if (res.ResData.ResType == WmsApiMoveTask.执行移库任务) return;
+                       if (res.ResData.ResType == WmsApiMoveTask.一深位有出库任务 && res.ResData.CellNo != task.AddrFrom) return;
+                   }
+
                    task.Status = TaskStatus.StackerExecution;
                    task.LastInteractionPoint = task.Device;
                    task.EditWho = "WCS";
@@ -353,10 +379,6 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            if (dev.Code is "SRM1" or "SRM2")
-            {
-                var a = 1;
-            }
             return dev.HasProtocol(typeof(ISRM520));
         }
     }

+ 113 - 0
成品库/WCS.WorkEngineering/Systems/扫码入库.cs

@@ -0,0 +1,113 @@
+using ServiceCenter.Extensions;
+using ServiceCenter.SqlSugars;
+using System.ComponentModel;
+using WCS.Core;
+using WCS.Entity;
+using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.Protocol.BCR;
+using WCS.WorkEngineering.Protocol.SRM;
+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(MainWorld))]
+    [Description("扫码入库")]
+    public class 扫码入库 : DeviceSystem<Device<IStation520, IStation521, IStation523, IStation91, IBCR81>>
+    {
+        protected override bool ParallelDo => true;
+
+        protected override bool SaveLogsToFile => true;
+
+        private List<Station> devs = new List<Station>();
+        private List<SRM> srms = new List<SRM>();
+
+        public 扫码入库()
+        {
+            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();
+        }
+
+        public override void Do(Device<IStation520, IStation521, IStation523, IStation91, IBCR81> obj)
+        {
+            obj.入库站点是否被禁止();
+            obj.入库站点是否满足执行条件();
+
+            //开始读取条码
+            var bcr = obj.Data5.GetBCRCode();
+            WCS_TaskInfo task = null;
+            SqlSugarHelper.Do(_db =>
+            {
+                var db = _db.Default;
+                //找到对应任务
+                var taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.BarCode == bcr);
+                //未找到对应任务
+                if (taskInfo == null)
+                {
+                    //向WMS申请入库任务
+                    var res = WmsApi.I_WCS_GetInTask(bcr, obj.Entity.Code);
+                    return;
+                }
+
+                //任务生成
+                if (taskInfo.Status == Entity.TaskStatus.NewBuild)
+                {
+                    //开始获取堆垛机与可用站台信息
+                    var res = WmsApi.GetTunnelPriorityList(task.ID);
+                    var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList();
+                    SRM srm = null;
+                    List<Station> stations = new List<Station>();
+                    //成品库背面堆垛机取货点
+                    stations = devs.Where(v => v.Entity.Code is "" or "" or "").ToList();
+                    //筛选出可用站台c
+                    stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StationStatus.Auto))
+                                       .Where(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status))
+                                       .Where(v => !v.Data3.Status.HasFlag(StationStatus.Run)).ToList(); // 筛选出可用站台
+                    //可用堆垛机
+                    srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
+                                  .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
+                                  .Select(v => new SRM(v, this.World)) //转换为SRM
+                                  .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
+                                  .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
+                                  .MinBy(v => tunnelNo.IndexOf(v.Entity.Code)); //按照巷道优先级排序
+                    if (srm == null) throw new Exception($"任务{taskInfo.ID}无可用堆垛机");
+
+                    //筛选出堆垛机的取货站台
+                    var nextPos = stations.FirstOrDefault(v => v.Entity.Sources.Where(t => t.IsTunnel()).Select(t => t.Sources).SelectMany(v => v) //获取所有巷道
+                                                                               .Where(t => t.HasProtocol(typeof(ISRM520)))//筛选出堆垛机
+                                                                               .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code));
+                    //堆垛机的可用取货站台
+                    taskInfo.SrmStation = nextPos.Entity.Code;
+                    taskInfo.AddrNext = nextPos.Entity.Sources.First().Code;
+                    taskInfo.Device = srm.Entity.Code;
+                    taskInfo.Tunnel = taskInfo.SrmStation.GetLastDigit().ToString();
+                    taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
+                    taskInfo.EditWho = "WCS";
+                    taskInfo.EditTime = DateTime.Now;
+                    db.Updateable(taskInfo).ExecuteCommand();
+                    taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"完成巷道分配,分配至{taskInfo.Device}");
+                    taskInfo.updateRedisHash();
+                    task = taskInfo;
+                }
+                else return;
+            });
+
+            if (task == null) return;
+
+            obj.Data.TaskNumber = task.ID;
+            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+            obj.Data.GoodsEnd = task.AddrNext.ToShort();
+            obj.Data.VoucherNo++;
+        }
+
+        public override bool Select(Device dev)
+        {
+            return dev.HasFlag(DeviceFlags.扫码);
+        }
+    }
+}

+ 6 - 3
成品库/WCS.WorkEngineering/WebApi/Controllers/WmsApi.cs

@@ -249,9 +249,9 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <param name="getTunnel"></param>
         /// <returns></returns>
         /// <exception cref="Exception"></exception>
-        public static I_WCS_GetInTaskResponse I_WCS_GetInTask(string barcode, string devCode, bool getTunnel = false)
+        public static SRes I_WCS_GetInTask(string barcode, string devCode, bool getTunnel = false)
         {
-            var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(WMSUrl + "/api/Task/I_WCS_GetInTask", new List<I_WCS_GetInTaskRequest>()
+            var res = APICaller.CallApi<SRes>(WMSUrl + "/api/Task/I_WCS_GetInTask", new List<I_WCS_GetInTaskRequest>()
             {
                 new I_WCS_GetInTaskRequest(){
                      ContainerBarCode = barcode,
@@ -260,7 +260,10 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                      Memo1 = getTunnel ? "1" : "" //1:分巷道  2:分货位
                 }
             });
-            if (!res.ResType) throw new KnownException(res.ResMessage, LogLevelEnum.High);
+            if (res.ResCode != ResponseStatusCodeEnum.Sucess)
+            {
+                throw new KnownException(res.ResMsg, LogLevelEnum.High);
+            }
 
             return res;
         }

+ 32 - 141
成品库/WCS.WorkEngineering/WorkStart.cs

@@ -36,13 +36,13 @@ namespace WCS.WorkEngineering
 
             List<Tuple<string, List<Tuple<int, int>>>> tuples = new List<Tuple<string, List<Tuple<int, int>>>>()
             {
-                new Tuple<string, List<Tuple<int, int>>>("10.30.37.89",new List<Tuple<int, int>>()
-                {
-                    new Tuple<int, int>(1601, 1620),
-                    new Tuple<int, int>(2501, 2540),
+                //new Tuple<string, List<Tuple<int, int>>>("10.30.37.89",new List<Tuple<int, int>>()
+                //{
+                //    new Tuple<int, int>(1601, 1620),
+                //    new Tuple<int, int>(2501, 2540),
 
-                    new Tuple<int, int>(2701, 2740),
-                })
+                //    new Tuple<int, int>(2701, 2740),
+                //})
             };
 
             foreach (var item in tuples)
@@ -70,122 +70,13 @@ namespace WCS.WorkEngineering
 
             #endregion 托盘线输送线
 
-            #region 满轮输送线
-
-            #region DB523,所有线体都会有DB523
-
-            List<Tuple<string, List<Tuple<int, int>>>> MLtuples523 = new List<Tuple<string, List<Tuple<int, int>>>>()
-            {
-                new Tuple<string, List<Tuple<int, int>>>("10.30.37.166",new List<Tuple<int, int>>()
-                {
-                    new Tuple<int, int>(1, 110),
-                    new Tuple<int, int>(401, 586),
-                })
-            };
-
-            foreach (var item in MLtuples523)
-            {
-                var db523 = 0;
-                var db524 = 0;
-                foreach (var item1 in item.Item2)
-                {
-                    for (int i = item1.Item1; i <= item1.Item2; i++)
-                    {
-                        var conv = new Device(i.ToString());
-                        conv.AddFlag(DeviceFlags.输送机);
-                        conv.AddProtocol<IStation523>(db523, 523, item.Item1);
-                        conv.AddProtocol<IStation524>(db524, 524, item.Item1);
-                        if (i == 475)
-                        {
-                            var a = 0;
-                        }
-                        db523 = db523 + 12;
-                        db524 = db524 + 16;
-                    }
-                }
-            }
-
-            #endregion DB523,所有线体都会有DB523
-
-            #region 520、521 交互线体会有520、521
-
-            //Item2表示线体号集合,Item1表示IP
-            List<Tuple<string, List<int>>> MLtuples520 = new List<Tuple<string, List<int>>>()
-            {
-                new Tuple<string, List<int>>("10.30.37.166",new List<int>(){1,22,41,61,418,426,435,444,455,466,480,494})
-            };
-
-            foreach (var item in MLtuples520)
-            {
-                var db520 = 0;
-                var db521 = 0;
-
-                foreach (var item1 in item.Item2)
-                {
-                    var device = Device.All.FirstOrDefault(v => v.Code == item1.ToString());
-
-                    device.AddProtocol<IStation520>(db520, 520, item.Item1);
-                    device.AddProtocol<IStation521>(db521, 521, item.Item1);
-                    db520 = db520 + 14;
-                    db521 = db521 + 16;
-                }
-            }
-
-            #endregion 520、521 交互线体会有520、521
-
-            #region 满轮扫码器
-
-            //Item2表示线体号集合,Item1表示IP
-            List<Tuple<string, List<int>>> MLtuples83 = new List<Tuple<string, List<int>>>()
-            {
-                new Tuple<string, List<int>>("10.30.37.166",new List<int>(){1,22,41,61})
-            };
-
-            foreach (var item in MLtuples83)
-            {
-                var db83 = 0;
-
-                foreach (var item1 in item.Item2)
-                {
-                    var device = Device.All.FirstOrDefault(v => v.Code == item1.ToString());
-                    device.AddProtocol<IBCR83>(db83, 83, item.Item1);
-                    db83 = db83 + 604;
-                }
-            }
-
-            #endregion 满轮扫码器
-
-            #region 外检信息
-
-            //Item2表示线体号集合,Item1表示IP
-            List<Tuple<string, List<int>>> MLtuples91 = new List<Tuple<string, List<int>>>()
-            {
-                new Tuple<string, List<int>>("10.30.37.166",new List<int>(){418})
-            };
-
-            foreach (var item in MLtuples91)
-            {
-                var db91 = 0;
-
-                foreach (var item1 in item.Item2)
-                {
-                    var device = Device.All.FirstOrDefault(v => v.Code == item1.ToString());
-                    device.AddProtocol<IStation91>(db91, 91, item.Item1);
-                    db91 = db91 + 14;
-                }
-            }
-
-            #endregion 外检信息
-
-            #endregion 满轮输送线
-
             #endregion 基本信息
 
             #region 托盘线扫码器
 
             List<BcrInfo> bcrInfo = new List<BcrInfo>
             {
-                new BcrInfo(new int[] {2532, 2732 }, "10.30.37.89")
+                //new BcrInfo(new int[] {2532, 2732 }, "10.30.37.89")
             };
 
             foreach (var item in bcrInfo)
@@ -205,7 +96,7 @@ namespace WCS.WorkEngineering
 
             List<ShapeInfo> shapeInfo = new List<ShapeInfo>
             {
-                new ShapeInfo(new int[] { 2732,2532 }, "10.30.37.89")
+                //new ShapeInfo(new int[] { 2732,2532 }, "10.30.37.89")
             };
 
             foreach (var item in shapeInfo)
@@ -250,7 +141,7 @@ namespace WCS.WorkEngineering
 
             List<TrussSegmentInfo> TrussInfo = new List<TrussSegmentInfo>
             {
-                new TrussSegmentInfo( 1, "10.30.37.211"),
+                //new TrussSegmentInfo( 1, "10.30.37.211"),
             };
 
             foreach (var item in TrussInfo)
@@ -291,22 +182,22 @@ namespace WCS.WorkEngineering
 
             List<RouteInfo> routeInfos = new List<RouteInfo>
             {
-                new RouteInfo("SRM1", new string[] { "TY1" }),
-                new RouteInfo("SRM2", new string[] { "TY2" }),
-                //巷道对应堆垛机 及 一楼出库点
-                new RouteInfo("TY1", new string[] { "SRM1","2532"}),
-                new RouteInfo("TY2", new string[] { "SRM2","2732" }),
-
-                //一楼入库点
-                new RouteInfo("2532", new string[] { "TY1" }),
-                new RouteInfo("2732", new string[] { "TY2" }),
-                new RouteInfo("2527", new string[] { "TY1" }),
-                new RouteInfo("2528", new string[] { "TY1" }),
-                new RouteInfo("2727", new string[] { "TY2" }),
-                new RouteInfo("2728", new string[] { "TY2" }),
-
-                //分流点路径配置
-                new RouteInfo("455", new string[] { "466", "480", "494", "508","522","536"}),
+                //    new RouteInfo("SRM1", new string[] { "TY1" }),
+                //    new RouteInfo("SRM2", new string[] { "TY2" }),
+                //    //巷道对应堆垛机 及 一楼出库点
+                //    new RouteInfo("TY1", new string[] { "SRM1","2532"}),
+                //    new RouteInfo("TY2", new string[] { "SRM2","2732" }),
+
+                //    //一楼入库点
+                //    new RouteInfo("2532", new string[] { "TY1" }),
+                //    new RouteInfo("2732", new string[] { "TY2" }),
+                //    new RouteInfo("2527", new string[] { "TY1" }),
+                //    new RouteInfo("2528", new string[] { "TY1" }),
+                //    new RouteInfo("2727", new string[] { "TY2" }),
+                //    new RouteInfo("2728", new string[] { "TY2" }),
+
+                //    //分流点路径配置
+                //    new RouteInfo("455", new string[] { "466", "480", "494", "508","522","536"}),
             };
 
             foreach (var item in routeInfos)
@@ -334,13 +225,13 @@ namespace WCS.WorkEngineering
                 //{ DeviceFlags.二列堆垛机, new List<string>() { "SRM2"/*, "SRM4", "SRM6"*/ } },
                 //{ DeviceFlags.一楼扫码,new List<string>(){ "2532","2732"} },
                 //{ DeviceFlags.一楼叠盘机,new List<string>() { "2527","2528","2727","2728"} },
-                { DeviceFlags.主线分流点,new List<string>() { "22","41","61"} },
-                { DeviceFlags.满轮主线第一次扫码,new List<string>() { "1"} },
-                { DeviceFlags.环形库分流点,new List<string>(){ "418"} },
-                { DeviceFlags.桁架分流点,new List<string>() { "455" } },
-                { DeviceFlags.桁架缓存放行点, new List<string>(){ "466", "480", "494", "508","522","536" } },
-                { DeviceFlags.桁架取货点, new List<string>(){ "461", "475", "489", "503","517","531" } }
-        };
+                //{ DeviceFlags.主线分流点,new List<string>() { "22","41","61"} },
+                //{ DeviceFlags.满轮主线第一次扫码,new List<string>() { "1"} },
+                //{ DeviceFlags.环形库分流点,new List<string>(){ "418"} },
+                //{ DeviceFlags.桁架分流点,new List<string>() { "455" } },
+                //{ DeviceFlags.桁架缓存放行点, new List<string>(){ "466", "480", "494", "508","522","536" } },
+                //{ DeviceFlags.桁架取货点, new List<string>(){ "461", "475", "489", "503","517","531" } }
+            };
 
             devices.ForEach(item =>
             {