林豪 左 3 gadi atpakaļ
vecāks
revīzija
74f9257671

+ 6 - 0
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -569,6 +569,12 @@ namespace WCS.Service.Extensions
             if (Data2.WorkMode != RGVMode.自动) throw new WarnException($"RGV状态{Data2.WorkMode},无法执行移动任务");
             if (Data2.SystemStatus != RGVRunStatus.空闲) throw new WarnException($"rgv状态为{Data2.SystemStatus},无法执行移动任务");
             if (Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV有光电,无法执行移动任务");
+            if (Data2.TaskID_1 == addr.Entity.CODE.GetShortCode() && Data.TaskType_1 == RGVTaskType.移动)
+            {
+                InfoLog.INFO_RGVINFO("已有目标地址相同的移动任务");
+                return;
+            }
+
             Data.TaskID_1 = addr.Entity.CODE.GetShortCode();
             Data.TaskType_1 = RGVTaskType.移动;
             Data.DestPosition_1 = addr.Entity.CODE.GetShortCode();

+ 62 - 62
Projects/永冠OPP/WCS.Service/Works/Station/BOPP入库.cs

@@ -15,19 +15,19 @@ using TaskStatus = WCS.Entity.TaskStatus;
 namespace WCS.Service.Works.Station
 {
     /// <summary>
-    ///BOPP扫码入库
+    /// BOPP扫码入库
     /// </summary>
     [WorkTitle(typeof(BOPPHandler), "BOPP扫码入库")]
-    public class BOPP扫码入库 : Work<StationDeviceGroup>
+    public class Bopp扫码入库 : Work<StationDeviceGroup>
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                obj.BcrStationIsForbid();
+                stationDeviceGroup.BcrStationIsForbid();
                 //设备组无论单卷还是双卷都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
+                if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
+                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
 
                 //成功创建的任务
                 var finishTaskList = new List<FinishTaskList<int>>();
@@ -35,32 +35,34 @@ namespace WCS.Service.Works.Station
                 //创建对应的任务
                 DB.Do(db =>
                 {
-                    var devs = obj.GetBcrValid();
-                    devs.Valid();
-                    var infos = devs.GetWMSInTask();
+                    var devise = stationDeviceGroup.GetBcrValid();
+                    devise.Valid();
+                    var infos = devise.GetWMSInTask();
 
-                    foreach (var item in devs)
+                    foreach (var item in devise)
                     {
                         var dev = item.Station;
                         var next = dev.Entity.GetPath("SRM");
                         var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode + "}"));
                         if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
-                            throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
-
-                        var task = new WCS_TASK();
-                        task.BARCODE = info.ContainerCode;
-                        task.TYPE = TaskType.入库;
-                        task.STATUS = TaskStatus.执行中;
-                        task.ADDRFROM = dev.Entity.CODE;
-                        task.ADDRTO = info.EndPostion;
-                        task.STARTTIME = DateTime.Now;
-                        task.UPDATEUSER = "WCS";
-                        task.UPDATETIME = DateTime.Now;
-                        task.WMSTASK = int.Parse(info.WMSTaskNum);
-                        task.TaskGroupKey = info.TaskGroupKey;
-                        task.ADDRNEXT = next.CODE;
-                        task.HEIGHT = dev.Data2.GoodsSize;
-                        task.FLOOR = 2;
+                            throw new WarnException($"生产条码{info?.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
+
+                        var task = new WCS_TASK
+                        {
+                            BARCODE = info?.ContainerCode,
+                            TYPE = TaskType.入库,
+                            STATUS = TaskStatus.执行中,
+                            ADDRFROM = dev.Entity.CODE,
+                            ADDRTO = info?.EndPostion,
+                            STARTTIME = DateTime.Now,
+                            UPDATEUSER = "WCS",
+                            UPDATETIME = DateTime.Now,
+                            WMSTASK = int.Parse(info?.WMSTaskNum!),
+                            TaskGroupKey = info?.TaskGroupKey,
+                            ADDRNEXT = next.CODE,
+                            HEIGHT = dev.Data2.GoodsSize,
+                            FLOOR = 2
+                        };
 
                         db.Default.Set<WCS_TASK>().Add(task);
                         finishTaskList.Add(new FinishTaskList<int>(task.WMSTASK, item.Station));
@@ -102,16 +104,16 @@ namespace WCS.Service.Works.Station
     /// BOPP巷道分配
     /// </summary>
     [WorkTitle(typeof(BOPPHandler), "BOPP巷道分配")]
-    public class BOPP巷道分配 : Work<StationDeviceGroup>
+    public class Bopp巷道分配 : Work<StationDeviceGroup>
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                var code = obj.Entity.CODE;
+                var code = stationDeviceGroup.Entity.CODE;
                 //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
+                if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
+                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
 
                 //成功分配巷道的任务的任务
                 var finishTaskList = new List<FinishTaskList<int>>();
@@ -119,9 +121,9 @@ namespace WCS.Service.Works.Station
                 //变更数据库信息
                 DB.Do(db =>
                 {
-                    var devs = obj.GetAddressValid();
-                    if (!devs.Any()) return; //无可执行任务
-                    var taskList = devs.ValidTaskCheck(db);
+                    var devise = stationDeviceGroup.GetAddressValid();
+                    if (!devise.Any()) return; //无可执行任务
+                    var taskList = devise.ValidTaskCheck(db);
 
                     var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
                     if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
@@ -129,7 +131,7 @@ namespace WCS.Service.Works.Station
 
                     var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
 
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
+                    var tunnelInfos = new List<TunnelInfo>();
                     foreach (var item in tunnels)
                     {
                         //当前巷道的取货点
@@ -150,12 +152,12 @@ namespace WCS.Service.Works.Station
                                       .FirstOrDefault();//去一次重
 
                         if (rgvDeliveryPoint == null) continue;
-                        var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == rgvDeliveryPoint.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
+                        var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == rgvDeliveryPoint.Entity)).MinBy(p => p.CODE);
                         //RGV是否有正在前往这个地址的任务
                         var rgvList = Device.Where(v => v.Is(DF.BOPPRGV)).Select(v => v.Create<RGVDevice>());
                         if (rgvList.Any(v => (!v.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) || !v.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动))
                                             && v.Data2.TaskType_1 == WCS.Entity.Protocol.RGV.RGVTaskType.放货
-                                            && v.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort())) continue;
+                                            && v.Data2.DestPosition_1 == taskInStation?.CODE.Replace("G", "").ToShort())) continue;
                         tunnelInfos.Add(new TunnelInfo
                         {
                             Tunnel = item,
@@ -165,12 +167,11 @@ namespace WCS.Service.Works.Station
                     }
                     //筛选出优先级最高的可用巷道
                     var tunnelInfo = tunnelInfos.Where(v => { try { return (v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程) || v.SRM.Entity.CODE == "SRM1"; } catch { return false; } })
-                                                .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成))
-                                                .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
+                        .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成)).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
                     if (tunnelInfo == null) throw new WarnException("无可用巷道");
 
                     //开始变更任务信息
-                    foreach (var item in devs)
+                    foreach (var item in devise)
                     {
                         var dev = Device.Find(item.Station.Entity.CODE).Create<StationDevice>();
                         var task = taskList.FirstOrDefault(p => p.ID == dev.Data2.Tasknum);
@@ -197,7 +198,7 @@ namespace WCS.Service.Works.Station
                         var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
                         if (task == null) continue;
                         finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
+                        finishTask.Station.Data.Goodsstart = stationDeviceGroup.Entity.CODE.Replace("G", "").ToShort();
                         finishTask.Station.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
                         finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
                         finishTask.Station.Data.CmdType = IstationCmdType.分配目标地址;
@@ -217,26 +218,26 @@ namespace WCS.Service.Works.Station
     /// 涂布入库旋转台二次分配巷道
     /// </summary>
     [WorkTitle(typeof(BOPPHandler), "BOPP入库旋转台二次分配巷道")]
-    public class BOPP入库旋转台二次分配巷道 : Work<StationDeviceGroup>
+    public class Bopp入库旋转台二次分配巷道 : Work<StationDeviceGroup>
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                var code = obj.Entity.CODE;
+                var code = stationDeviceGroup.Entity.CODE;
 
                 //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
+                if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
+                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
                 //成功分配巷道的任务的任务
                 var finishTaskList = new List<FinishTaskList<int>>();
 
                 //变更数据库信息
                 DB.Do(db =>
                 {
-                    var devs = obj.GetAddressValid();
-                    if (!devs.Any()) return; //无可执行任务
-                    var taskList = devs.ValidTaskCheck(db);
+                    var devise = stationDeviceGroup.GetAddressValid();
+                    if (!devise.Any()) return; //无可执行任务
+                    var taskList = devise.ValidTaskCheck(db);
 
                     var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
                     if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
@@ -244,7 +245,7 @@ namespace WCS.Service.Works.Station
 
                     var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
 
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
+                    var tunnelInfos = new List<TunnelInfo>();
                     foreach (var item in tunnels)
                     {
                         //当前巷道的取货点
@@ -254,11 +255,11 @@ namespace WCS.Service.Works.Station
                                           .ToList();
                         //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
                         var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE)))
-                                              .Where(v => obj.Items.Any(p => p.Entity == v))// 筛选出包含在当前设备组的设备
+                                              .Where(v => stationDeviceGroup.Items.Any(p => p.Entity == v))// 筛选出包含在当前设备组的设备
                                               .Distinct()
                                               .FirstOrDefault();//去一次重
                         if (turntable == null) continue;
-                        var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => allIn.Contains(d.MEMBER.CODE))).OrderBy(p => p.CODE).FirstOrDefault();
+                        var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => allIn.Contains(d.MEMBER.CODE))).MinBy(p => p.CODE);
 
                         tunnelInfos.Add(new TunnelInfo
                         {
@@ -268,12 +269,11 @@ namespace WCS.Service.Works.Station
                         });
                     }
                     //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } })
-                                                .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
+                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } }).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
                     if (tunnelInfo == null) throw new WarnException("无可用巷道");
 
                     //开始变更任务信息
-                    foreach (var item in devs)
+                    foreach (var item in devise)
                     {
                         var dev = Device.Find(item.Station.Entity.CODE).Create<StationDevice>();
                         var task = taskList.FirstOrDefault(p => p.ID == dev.Data2.Tasknum);
@@ -284,9 +284,9 @@ namespace WCS.Service.Works.Station
                         task.ADDRNEXT = dev.Entity.GetPath(task.DEVICE).CODE;
                         task.TaskGroupKey = res.WMSTaskGroupKey;
                         task.ADDRTO = task.DEVICE;
-                        var msg = $"下达从{obj.Entity.CODE}移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
-                        msg += $"[{dev.Data.Tasknum}][{obj.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
-                        task.CreateStatusLog(db, msg, this.GetType());
+                        var msg = $"下达从{stationDeviceGroup.Entity.CODE}移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
+                        msg += $"[{dev.Data.Tasknum}][{stationDeviceGroup.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
+                        task.CreateStatusLog(db, msg, GetType());
                         finishTaskList.Add(new FinishTaskList<int>(task.ID, item.Station));
                     }
                     db.Default.SaveChanges();
@@ -301,7 +301,7 @@ namespace WCS.Service.Works.Station
                         if (task == null) continue;
 
                         finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
+                        finishTask.Station.Data.Goodsstart = stationDeviceGroup.Entity.CODE.Replace("G", "").ToShort();
                         finishTask.Station.Data.Goodsend = finishTask.Station.Entity.GetPath(task.DEVICE).CODE.ToShort();
                         finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
                         finishTask.Station.Data.CmdType = IstationCmdType.分配目标地址;
@@ -313,9 +313,9 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return devCodes.Contains(dev.CODE);
+            return _devCodes.Contains(dev.CODE);
         }
 
-        private List<string> devCodes = new List<string>() { "G1190", "G1199", "G1208", "G1217", "G1225" };
+        private readonly List<string> _devCodes = new() { "G1190", "G1199", "G1208", "G1217", "G1225" };
     }
-}
+}

+ 139 - 149
Projects/永冠OPP/WCS.Service/Works/Station/涂布入库.cs

@@ -19,13 +19,13 @@ namespace WCS.Service.Works.Station
     /// 涂布入库AGV交互
     /// </summary>
     [WorkTitle(typeof(CoatingHandler), "涂布入库AGV交互")]
-    public class 涂布入库AGV交互 : Work<StationDeviceGroup>
+    public class 涂布入库agv交互 : Work<StationDeviceGroup>
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                var station = obj.Entity.CODE;
+                var station = stationDeviceGroup.Entity.CODE;
 
                 #region 处理新增AGV任务
 
@@ -35,113 +35,101 @@ namespace WCS.Service.Works.Station
                     var agvTasks = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库)
                     .Where(v => v.Status < AGVTaskStatus.完成).ToArray();
 
-                    foreach (var agvtask in agvTasks)
+                    foreach (var tasking in agvTasks)
                     {
-                        var position = agvtask.Position;
+                        var position = tasking.Position;
                         if (!ProtocolProxy.AllDatas.ContainsKey(position))
                             ProtocolProxy.AllDatas[position] = new ProdLineData();
                         var pld = ProtocolProxy.AllDatas[position] as ProdLineData;
-                        pld.Frame = LogicHandler.Frame;
+                        pld!.Frame = LogicHandler.Frame;
                         pld.Code = position;
-                        pld.TaskList.Add(agvtask);
+                        pld.TaskList.Add(tasking);
 
-                        if (agvtask.Status == AGVTaskStatus.新建)
+                        if (tasking.Status == AGVTaskStatus.新建)
                         {
-                            //if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
-                            //{
-                            //    InfoLog.INFO_INFO($"{station}手动状态");
-                            //    continue;
-                            //};
                             var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成);
                             //同时最多只能有10个任务被确认
                             if (qty.Count() >= 10)
                             {
-                                InfoLog.INFO_WarnDb($"{obj.Entity.CODE}正在执行的入库任务数量已达{qty.Count()},暂停入库", obj.Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常);
+                                InfoLog.INFO_WarnDb($"{stationDeviceGroup.Entity.CODE}正在执行的入库任务数量已达{qty.Count()},暂停入库", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常);
                                 continue;
-                            };
-
-                            //if (qty.Count(v => v.Station == obj.Entity.CODE) > qty.Count(v => v.Station != obj.Entity.CODE))
-                            //{
-                            //    InfoLog.INFO_INFO($"{station}触发均分");
-                            //    continue;
-                            //}
+                            }
 
-                            //agvtask.Station = obj.Entity.CODE;
-                            agvtask.Status = AGVTaskStatus.执行;
-                            agvtask.UpdateTime = DateTime.Now;
+                            tasking.Status = AGVTaskStatus.执行;
+                            tasking.UpdateTime = DateTime.Now;
                         }
                         //agv到达指定位置给确认后分配站台
-                        else if (agvtask.Status == AGVTaskStatus.执行 && agvtask.AGVStatus== AGVTaskStatus.确认 && string.IsNullOrEmpty(agvtask.Station))
+                        else if (tasking.Status == AGVTaskStatus.执行 && tasking.AGVStatus == AGVTaskStatus.确认 && string.IsNullOrEmpty(tasking.Station))
                         {
                             //判断提升机是否被禁用
-                            obj.BcrStationIsForbid();
+                            stationDeviceGroup.BcrStationIsForbid();
 
-                            if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
+                            if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
                             {
                                 InfoLog.INFO_INFO($"{station}手动状态");
                                 continue;
-                            };
+                            }
 
                             var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成);
-                            if (qty.Count(v => v.Station == obj.Entity.CODE) > qty.Count(v => v.Station != obj.Entity.CODE && !string.IsNullOrEmpty(v.Station)))
+                            if (qty.Count(v => v.Station == stationDeviceGroup.Entity.CODE) > qty.Count(v => v.Station != stationDeviceGroup.Entity.CODE && !string.IsNullOrEmpty(v.Station)))
                             {
                                 InfoLog.INFO_INFO($"{station}触发均分");
                                 continue;
                             }
 
-                            agvtask.Station = obj.Entity.CODE;
-                            agvtask.Status = AGVTaskStatus.执行;
-                            agvtask.UpdateTime = DateTime.Now;
+                            tasking.Station = stationDeviceGroup.Entity.CODE;
+                            tasking.Status = AGVTaskStatus.执行;
+                            tasking.UpdateTime = DateTime.Now;
                             db.Default.SaveChanges();
                         }
-                        else if (agvtask.Status < agvtask.AGVStatus)
+                        else if (tasking.Status < tasking.AGVStatus)
                         {
-                            if (agvtask.Station != obj.Entity.CODE)
+                            if (tasking.Station != stationDeviceGroup.Entity.CODE)
                             {
-                                InfoLog.INFO_INFO($"{obj.Entity.CODE}不是当前站台的AGV任务");
+                                InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}不是当前站台的AGV任务");
                                 continue;
                             }
-                            if (agvtask.AGVStatus == AGVTaskStatus.请求_允许)
+                            if (tasking.AGVStatus == AGVTaskStatus.请求_允许)
                             {
-                                if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
+                                if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
                                 {
                                     InfoLog.INFO_INFO("不在自动状态");
                                     continue;
                                 }
-                                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位)))
+                                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位)))
                                 {
                                     InfoLog.INFO_INFO("设备运行中");
                                     continue;
                                 }
-                                if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.高位)))
+                                if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.高位)))
                                 {
-                                    InfoLog.INFO_WarnDb("不在高位", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    InfoLog.INFO_WarnDb("不在高位", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                     continue;
                                 }
-                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
+                                if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
                                 {
-                                    InfoLog.INFO_WarnDb("AGV请求放货,但有光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    InfoLog.INFO_WarnDb("AGV请求放货,但有光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                     continue;
                                 }
-                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
+                                if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
                                 {
-                                    InfoLog.INFO_WarnDb("AGV放货完成信号未清除", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    InfoLog.INFO_WarnDb("AGV放货完成信号未清除", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                     continue;
                                 }
-                                if (obj.Items.Any(v => v.Data2.Tasknum > 0))
+                                if (stationDeviceGroup.Items.Any(v => v.Data2.Tasknum > 0))
                                 {
-                                    InfoLog.INFO_WarnDb("已有WCS任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    InfoLog.INFO_WarnDb("已有WCS任务号", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                     continue;
                                 }
 
-                                if (db.Default.Set<WCS_AGVTask>().Any(v => v.Station == agvtask.Station && v.Status >= AGVTaskStatus.请求_允许 && v.Status < AGVTaskStatus.完成扫码 && v.ID != agvtask.ID)) //只能允许一个
+                                if (db.Default.Set<WCS_AGVTask>().Any(v => v.Station == tasking.Station && v.Status >= AGVTaskStatus.请求_允许 && v.Status < AGVTaskStatus.完成扫码 && v.ID != tasking.ID)) //只能允许一个
                                 {
-                                    InfoLog.INFO_WarnDb("上一个允许放货的AGV任务未完成", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    InfoLog.INFO_WarnDb("上一个允许放货的AGV任务未完成", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                     continue;
                                 }
                                 //判断1435扫码位置条件
-                                var judge = Device.Find("1435").Device<IStation520,IStation521,IStation523>();
-                                if (obj.Entity.CODE == "G1394")
+                                var judge = Device.Find("1435").Device<IStation520, IStation521, IStation523>();
+                                if (stationDeviceGroup.Entity.CODE == "G1394")
                                 {
                                     if (!judge.Data3.Status.HasFlag(StationStatus.自动))
                                     {
@@ -158,61 +146,61 @@ namespace WCS.Service.Works.Station
                                     //判断是否有货
                                     if (judge.Data2.Status.HasFlag(IstationStatus.光电状态))
                                     {
-                                        InfoLog.INFO_WarnDb("前方有光电,不可放货", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                        InfoLog.INFO_WarnDb("前方有光电,不可放货", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                         continue;
-                                    }               
+                                    }
 
                                     if (judge.Data2.Tasknum > 0)
                                     {
-                                        InfoLog.INFO_WarnDb("已 有WCS任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                        InfoLog.INFO_WarnDb("已 有WCS任务号", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                         continue;
                                     }
                                 }
-                                                                
-                                agvtask.Status = agvtask.AGVStatus;
-                                agvtask.UpdateTime = DateTime.Now;
+
+                                tasking.Status = tasking.AGVStatus;
+                                tasking.UpdateTime = DateTime.Now;
                                 db.Default.SaveChanges();
                             }
-                            else if (agvtask.AGVStatus == AGVTaskStatus.取放完成)
+                            else if (tasking.AGVStatus == AGVTaskStatus.取放完成)
                             {
-                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
+                                if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
                                 {
-                                    InfoLog.INFO_WarnDb("AGV放货完成信号未清楚", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    InfoLog.INFO_WarnDb("AGV放货完成信号未清楚", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                     continue;
                                 }
-                                if (!obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
+                                if (!stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
                                 {
-                                    InfoLog.INFO_WarnDb("放货完成无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    InfoLog.INFO_WarnDb("放货完成无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                     continue;
                                 }
 
-                                agvtask.Status = agvtask.AGVStatus;
-                                agvtask.UpdateTime = DateTime.Now;
+                                tasking.Status = tasking.AGVStatus;
+                                tasking.UpdateTime = DateTime.Now;
                                 db.Default.SaveChanges();
-                                foreach (var dev in obj.Items)
+                                foreach (var dev in stationDeviceGroup.Items)
                                 {
                                     if (dev.Data2.Status.HasFlag(IstationStatus.光电状态))
                                     {
-                                        dev.Data.Goodsnum = (short)agvtask.Goodsnum;
+                                        dev.Data.Goodsnum = (short)tasking.Goodsnum;
                                         dev.Data.Istation521Status = IstationStatus.AGV放货完成信号;
                                     }
                                 }
                             }
-                            else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.完成))
+                            else if (Ltc.Do(tasking, v => v.AGVStatus == AGVTaskStatus.完成))
                             {
-                                agvtask.Status = agvtask.AGVStatus;
-                                agvtask.UpdateTime = DateTime.Now;
+                                tasking.Status = tasking.AGVStatus;
+                                tasking.UpdateTime = DateTime.Now;
                                 db.Default.SaveChanges();
-                                var devs = Device.Find(agvtask.Station).Create<StationDeviceGroup>();
-                                foreach (var dev in devs.Items)
+                                var devise = Device.Find(tasking.Station).Create<StationDeviceGroup>();
+                                foreach (var dev in devise.Items)
                                 {
-                                    dev.Data.Goodscode = agvtask.ID;
+                                    dev.Data.Goodscode = tasking.ID;
                                 }
                             }
-                            else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.取消))
+                            else if (Ltc.Do(tasking, v => v.AGVStatus == AGVTaskStatus.取消))
                             {
-                                agvtask.Status = agvtask.AGVStatus;
-                                agvtask.UpdateTime = DateTime.Now;
+                                tasking.Status = tasking.AGVStatus;
+                                tasking.UpdateTime = DateTime.Now;
                                 db.Default.SaveChanges();
                             }
                         }
@@ -226,7 +214,7 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.CODE == "G1394" || dev.CODE == "G1386";
+            return dev.CODE is "G1394" or "G1386";
         }
     }
 
@@ -240,17 +228,17 @@ namespace WCS.Service.Works.Station
         {
             var timer = new Stopwatch();
             timer.Start();
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                obj.BcrStationIsForbid();
+                stationDeviceGroup.BcrStationIsForbid();
                 //设备组无论单卷还是双卷都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
+                if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
+                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
 
-                if (obj.Entity.CODE == "G1386")
+                if (stationDeviceGroup.Entity.CODE == "G1386")
                 {
-                    if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.低位))) throw new DoException("不在低位");
-                }                
+                    if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.低位))) throw new DoException("不在低位");
+                }
 
                 //成功创建的任务
                 var finishTaskList = new List<FinishTaskList<int>>();
@@ -258,23 +246,23 @@ namespace WCS.Service.Works.Station
                 //创建对应的任务
                 DB.Do(db =>
                 {
-                    var devs = obj.GetBcrValid();
-                    devs.Valid();
-                    var infos = devs.GetWMSInTask();
+                    var devise = stationDeviceGroup.GetBcrValid();
+                    devise.Valid();
+                    var infos = devise.GetWMSInTask();
 
                     WCS_AGVTask agvTask = null;
 
-                    if (!obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.手动入库)))
+                    if (!stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.手动入库)))
                     {
-                        if (obj.Entity.CODE == "G1435")
+                        if (stationDeviceGroup.Entity.CODE == "G1435")
                         {
-                            agvTask = db.Default.Set<WCS_AGVTask>().Where(v => v.Status == AGVTaskStatus.完成 && v.Station == "G1394").FirstOrDefault() ?? throw new WarnException("无完成AGV任务");
+                            agvTask = db.Default.Set<WCS_AGVTask>().FirstOrDefault(v => v.Status == AGVTaskStatus.完成 && v.Station == "G1394") ?? throw new WarnException("无完成AGV任务");
                         }
                         else
                         {
-                            agvTask = db.Default.Set<WCS_AGVTask>().Where(v => v.Status == AGVTaskStatus.完成 && v.Station == obj.Entity.CODE).FirstOrDefault() ?? throw new WarnException("无完成AGV任务");
+                            agvTask = db.Default.Set<WCS_AGVTask>().FirstOrDefault(v => v.Status == AGVTaskStatus.完成 && v.Station == stationDeviceGroup.Entity.CODE) ?? throw new WarnException("无完成AGV任务");
                         }
-                        
+
                         if (agvTask.Status != AGVTaskStatus.完成扫码)
                         {
                             agvTask.Status = AGVTaskStatus.完成扫码;
@@ -282,29 +270,31 @@ namespace WCS.Service.Works.Station
                         }
                     }
 
-                    foreach (var item in devs)
+                    foreach (var item in devise)
                     {
                         var dev = item.Station;
                         var next = dev.Entity.GetPath("SRM");
                         var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode + "}"));
                         if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
-                            throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
-
-                        var task = new WCS_TASK();
-                        task.BARCODE = info.ContainerCode;
-                        task.TYPE = TaskType.入库;
-                        task.STATUS = TaskStatus.执行中;
-                        task.ADDRFROM = dev.Entity.CODE;
-                        task.ADDRTO = info.EndPostion;
-                        task.STARTTIME = DateTime.Now;
-                        task.UPDATEUSER = "WCS";
-                        task.UPDATETIME = DateTime.Now;
-                        task.WMSTASK = int.Parse(info.WMSTaskNum);
-                        task.TaskGroupKey = info.TaskGroupKey;
-                        task.ADDRNEXT = next.CODE;
-                        task.HEIGHT = dev.Data2.GoodsSize;
-                        task.AgvTask = agvTask == null ? 0 : agvTask.ID;
-                        task.FLOOR = 2;
+                            throw new WarnException($"生产条码{info?.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
+
+                        var task = new WCS_TASK
+                        {
+                            BARCODE = info?.ContainerCode,
+                            TYPE = TaskType.入库,
+                            STATUS = TaskStatus.执行中,
+                            ADDRFROM = dev.Entity.CODE,
+                            ADDRTO = info?.EndPostion,
+                            STARTTIME = DateTime.Now,
+                            UPDATEUSER = "WCS",
+                            UPDATETIME = DateTime.Now,
+                            WMSTASK = int.Parse(info?.WMSTaskNum!),
+                            TaskGroupKey = info?.TaskGroupKey,
+                            ADDRNEXT = next.CODE,
+                            HEIGHT = dev.Data2.GoodsSize,
+                            AgvTask = agvTask?.ID ?? 0,
+                            FLOOR = 2
+                        };
 
                         db.Default.Set<WCS_TASK>().Add(task);
                         finishTaskList.Add(new FinishTaskList<int>(task.WMSTASK, item.Station));
@@ -335,13 +325,13 @@ namespace WCS.Service.Works.Station
                 });
 
                 timer.Stop();
-                InfoLog.INFO_TIMING($"{obj.Entity.CODE}--扫码入库,耗时{timer.ElapsedMilliseconds}");
+                InfoLog.INFO_TIMING($"{stationDeviceGroup.Entity.CODE}--扫码入库,耗时{timer.ElapsedMilliseconds}");
             });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.CODE == "G1386" || dev.CODE == "G1435";
+            return dev.CODE is "G1386" or "G1435";
         }
     }
 
@@ -353,17 +343,17 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                var key = $"WCS:Lock:CoatingAllocationTunnel";
+                const string key = $"WCS:Lock:CoatingAllocationTunnel";
                 try
                 {
                     if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"[CoatingAllocationTunnel]--触发并发管控");
                     ProtocolProxy.YG150Redis.Set(key, key);
-                    var code = obj.Entity.CODE;
+                    var code = stationDeviceGroup.Entity.CODE;
                     //两个设备都必须满足的条件
-                    if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务,凭证号不一致");
-                    if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行状态");
+                    if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务,凭证号不一致");
+                    if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行状态");
 
                     //成功分配巷道的任务的任务
                     var finishTaskList = new List<FinishTaskList<int>>();
@@ -371,13 +361,14 @@ namespace WCS.Service.Works.Station
                     //变更数据库信息
                     DB.Do(db =>
                     {
-                        var devs = obj.Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Request == IstationRequest.请求分配目标地址)
+                        var devise = stationDeviceGroup.Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Request == IstationRequest.请求分配目标地址)
                                                .Where(v => v.Data2.Tasknum > 10000 && v.Data2.Goodsend != 0);
-                        if (!devs.Any()) return; //无可执行任务
-                        var taskIds = devs.Select(dev => dev.Data2.Tasknum).ToList();
+                        var enumerable = devise as Device<IStation520, IStation521, IStation523>[] ?? devise.ToArray();
+                        if (!enumerable.Any()) return; //无可执行任务
+                        var taskIds = enumerable.Select(dev => dev.Data2.Tasknum).ToList();
                         var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
 
-                        taskList.ValidTaskCheck(devs.Count(), db);
+                        taskList.ValidTaskCheck(enumerable.Count(), db);
 
                         var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
                         if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
@@ -385,7 +376,7 @@ namespace WCS.Service.Works.Station
 
                         var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
 
-                        List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
+                        var tunnelInfos = new List<TunnelInfo>();
                         foreach (var item in tunnels)
                         {
                             //当前巷道的取货点
@@ -406,7 +397,7 @@ namespace WCS.Service.Works.Station
                                           .Distinct()
                                           .FirstOrDefault();//去一次重
                             if (rgvDeliveryPoint == null) continue;
-                            var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == rgvDeliveryPoint.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
+                            var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == rgvDeliveryPoint.Entity)).MinBy(p => p.CODE);
                             //只能有一组任务的下一个地址是交货点
                             if (db.Default.Set<WCS_TASK>().Any(v => v.ADDRNEXT == taskInStation.CODE)) continue;
 
@@ -414,7 +405,7 @@ namespace WCS.Service.Works.Station
                             var rgvList = Device.Where(v => v.Is(DF.涂布RGV)).Select(v => v.Create<RGVDevice>());
                             if (rgvList.Any(v => (!v.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) || !v.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动))
                                                 && v.Data2.TaskType_1 == WCS.Entity.Protocol.RGV.RGVTaskType.放货
-                                                && v.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort())) continue;
+                                                && v.Data2.DestPosition_1 == taskInStation?.CODE.Replace("G", "").ToShort())) continue;
 
                             tunnelInfos.Add(new TunnelInfo
                             {
@@ -425,12 +416,11 @@ namespace WCS.Service.Works.Station
                         }
                         //筛选出优先级最高的可用巷道
                         var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程; } catch { return false; } })
-                                                    .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成))
-                                                    .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
+                            .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成)).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
                         if (tunnelInfo == null) throw new WarnException("无可用巷道");
 
                         //开始变更任务信息
-                        foreach (var item in devs)
+                        foreach (var item in enumerable)
                         {
                             var dev = item.Entity.Create<StationDevice>();
                             var task = taskList.FirstOrDefault(p => p.ID == dev.Data2.Tasknum);
@@ -441,8 +431,8 @@ namespace WCS.Service.Works.Station
                             task.ADDRNEXT = tunnelInfo.taskIN.CODE;
                             task.TaskGroupKey = res.WMSTaskGroupKey;
                             task.ADDRTO = task.DEVICE;
-                            var msg = $"下达从{obj.Entity.CODE}移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
-                            msg += $"[{dev.Data.Tasknum}][{obj.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
+                            var msg = $"下达从{stationDeviceGroup.Entity.CODE}移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
+                            msg += $"[{dev.Data.Tasknum}][{stationDeviceGroup.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
                             task.CreateStatusLog(db, msg, this.GetType());
                             finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
                         }
@@ -458,7 +448,7 @@ namespace WCS.Service.Works.Station
                             if (task == null) continue;
 
                             finishTask.Station.Data.Tasknum = task.ID;
-                            finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
+                            finishTask.Station.Data.Goodsstart = stationDeviceGroup.Entity.CODE.Replace("G", "").ToShort();
                             finishTask.Station.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
                             finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
                             finishTask.Station.Data.CmdType = IstationCmdType.分配目标地址;
@@ -475,7 +465,7 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.CODE == "G2" || dev.CODE == "G3";
+            return dev.CODE is "G2" or "G3";
         }
     }
 
@@ -487,26 +477,27 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                var code = obj.Entity.CODE;
+                var code = stationDeviceGroup.Entity.CODE;
 
                 //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
+                if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务--凭证号不一致");
+                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
                 //成功分配巷道的任务的任务
                 var finishTaskList = new List<FinishTaskList<int>>();
 
                 //变更数据库信息
                 DB.Do(db =>
                 {
-                    var devs = obj.Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Request == IstationRequest.请求分配目标地址)
+                    var devise = stationDeviceGroup.Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Request == IstationRequest.请求分配目标地址)
                                            .Where(v => v.Data2.Tasknum > 10000);
-                    if (!devs.Any()) return; //无可执行任务
-                    var taskIds = devs.Select(dev => dev.Data2.Tasknum).ToList();
+                    var enumerable = devise as Device<IStation520, IStation521, IStation523>[] ?? devise.ToArray();
+                    if (!enumerable.Any()) return; //无可执行任务
+                    var taskIds = enumerable.Select(dev => dev.Data2.Tasknum).ToList();
                     var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
 
-                    taskList.ValidTaskCheck(devs.Count(), db);
+                    taskList.ValidTaskCheck(enumerable.Count(), db);
 
                     var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
                     if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
@@ -514,7 +505,7 @@ namespace WCS.Service.Works.Station
 
                     var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
 
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
+                    var tunnelInfos = new List<TunnelInfo>();
                     foreach (var item in tunnels)
                     {
                         //当前巷道的取货点
@@ -524,11 +515,11 @@ namespace WCS.Service.Works.Station
                                           .ToList();
                         //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
                         var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE)))
-                                              .Where(v => obj.Items.Any(p => p.Entity == v))// 筛选出包含在当前设备组的设备
+                                              .Where(v => stationDeviceGroup.Items.Any(p => p.Entity == v))// 筛选出包含在当前设备组的设备
                                               .Distinct()
                                               .FirstOrDefault();//去一次重
                         if (turntable == null) continue;
-                        var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == turntable)).OrderBy(p => p.CODE).FirstOrDefault();
+                        var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == turntable)).MinBy(p => p.CODE);
 
                         tunnelInfos.Add(new TunnelInfo
                         {
@@ -538,12 +529,11 @@ namespace WCS.Service.Works.Station
                         });
                     }
                     //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } })
-                                                .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
+                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } }).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
                     if (tunnelInfo == null) throw new WarnException("无可用巷道");
 
                     //开始变更任务信息
-                    foreach (var item in devs)
+                    foreach (var item in enumerable)
                     {
                         var dev = item.Entity.Create<StationDevice>();
                         var task = taskList.FirstOrDefault(p => p.ID == dev.Data2.Tasknum);
@@ -554,8 +544,8 @@ namespace WCS.Service.Works.Station
                         task.ADDRNEXT = dev.Entity.GetPath(task.DEVICE).CODE;
                         task.TaskGroupKey = res.WMSTaskGroupKey;
                         task.ADDRTO = task.DEVICE;
-                        var msg = $"下达从{obj.Entity.CODE}移动至{task.ADDRNEXT}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
-                        msg += $"[{dev.Data.Tasknum}][{obj.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
+                        var msg = $"下达从{stationDeviceGroup.Entity.CODE}移动至{task.ADDRNEXT}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
+                        msg += $"[{dev.Data.Tasknum}][{stationDeviceGroup.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
                         task.CreateStatusLog(db, msg, this.GetType());
                         finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
                     }
@@ -571,7 +561,7 @@ namespace WCS.Service.Works.Station
                         if (task == null) continue;
 
                         finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
+                        finishTask.Station.Data.Goodsstart = stationDeviceGroup.Entity.CODE.Replace("G", "").ToShort();
                         finishTask.Station.Data.Goodsend = finishTask.Station.Entity.GetPath(task.DEVICE).CODE.ToShort();
                         finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
                         finishTask.Station.Data.CmdType = IstationCmdType.分配目标地址;
@@ -583,14 +573,14 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return devCodes.Contains(dev.CODE);
+            return _devCodes.Contains(dev.CODE);
         }
 
-        private List<string> devCodes = new List<string>() {
+        private readonly List<string> _devCodes = new() {
             "G1404",
             "G1413",
             "G1420",
             "G1429",
         };
     }
-}
+}

+ 124 - 125
Projects/永冠OPP/WCS.Service/Works/Station/涂布出库.cs

@@ -22,41 +22,41 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待执行任务,凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
+                if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待执行任务,凭证号不一致");
+                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
                 //成功处理的任务
                 var finishTaskList = new List<FinishTaskList<int>>();
 
                 DB.Do(db =>
                 {
-                    var devs = new List<FinishTaskList<string>>();
-                    foreach (var dev in obj.Items)
+                    var devise = new List<FinishTaskList<string>>();
+                    foreach (var dev in stationDeviceGroup.Items)
                     {
                         //没有请求
                         if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址)
                         {
-                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-堆垛机放货完成请求--4");
+                            InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-堆垛机放货完成请求--4");
                             continue;
                         }
                         //没有光电
                         if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
                         {
-                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                             continue;
                         };
-                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                        devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
                     }
 
-                    foreach (var dev in devs)
+                    foreach (var dev in devise)
                     {
                         var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == dev.FinishCode && v.STATUS == TaskStatus.堆垛机完成) ?? throw new WarnException("无任务");
                         var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
                         if (tasks.Any(v => v.STATUS != TaskStatus.堆垛机完成 && v.STATUS != TaskStatus.执行中)) throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中");
 
                         task.STATUS = TaskStatus.执行中;
-                        task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
+                        task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{stationDeviceGroup.Entity.CODE}", this.GetType());
                         finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
                     }
                     db.Default.SaveChanges();
@@ -81,10 +81,10 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return devCodes.Contains(dev.CODE);
+            return _devCodes.Contains(dev.CODE);
         }
 
-        private List<string> devCodes = new List<string>() { "G1283", "G1290", "G1292", "G1299", "G1301", "G1308", "G1310" };
+        private readonly List<string> _devCodes = new() { "G1283", "G1290", "G1292", "G1299", "G1301", "G1308", "G1310" };
     }
 
     /// <summary>
@@ -95,52 +95,46 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
-                var key = $"WCS:Lock:CoatingAllocationOutboundDeliveryPoint";
+                const string key = $"WCS:Lock:CoatingAllocationOutboundDeliveryPoint";
                 try
                 {
                     if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"[CoatingAllocationOutboundDeliveryPoint]--触发并发管控");
                     ProtocolProxy.YG150Redis.Set(key, key);
-                    if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务,凭证号不一致");
-                    if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
+                    if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务,凭证号不一致");
+                    if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
 
                     var finishTaskList = new List<FinishTaskList<int>>();
 
                     DB.Do(db =>
                     {
-                        var devs = new List<FinishTaskList<string>>();
-                        foreach (var dev in obj.Items)
+                        var devise = new List<FinishTaskList<string>>();
+                        foreach (var dev in stationDeviceGroup.Items)
                         {
                             if (dev.Data2.Request != IstationRequest.请求分配目标地址)
                             {
-                                InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-分配目标地址--2");
+                                InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-分配目标地址--2");
                                 continue;
                             }
                             if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
                             {
-                                InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                 continue;
                             }
                             if (dev.Data2.Tasknum < 10000)
                             {
-                                InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                 continue;
                             }
-                            devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                            devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
                         }
-                        //var G1 = Device.Find("G1").Create<StationDeviceGroup>();
-                        ////只能有一组任务的下一个地址是交货点同时,放货点必须无货
-                        //if (db.Default.Set<WCS_TASK>().Count(v => v.ADDRNEXT == "G1") >= 2 ||
-                        //    G1.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位)
-                        //                    || v.Data2.Status.HasFlag(IstationStatus.光电状态)
-                        //                    || v.Data2.Tasknum > 10000
-                        //                    || !v.Data3.Status.HasFlag(StationStatus.自动))) return;
-                        foreach (var dev in devs)
+
+                        foreach (var dev in devise)
                         {
                             var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum) ?? throw new WarnException("无任务");
                             var tasks = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == task.TaskGroupKey);
-                            if (tasks != devs.Count) throw new WarnException($"可执行任务数{devs.Count},实际任务数{tasks}");
+                            if (tasks != devise.Count) throw new WarnException($"可执行任务数{devise.Count},实际任务数{tasks}");
 
                             task.ADDRNEXT = "G1";
                             task.CreateStatusLog(db, $"分配目标地址{task.ADDRNEXT}", this.GetType());
@@ -174,10 +168,10 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return devCodes.Contains(dev.CODE);
+            return _devCodes.Contains(dev.CODE);
         }
 
-        private List<string> devCodes = new List<string>() { "G5", "G7", "G9", "G11" };
+        private readonly List<string> _devCodes = new() { "G5", "G7", "G9", "G11" };
     }
 
     /// <summary>
@@ -188,21 +182,21 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
                 //必须满足的条件
-                if (obj.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
+                if (stationDeviceGroup.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("凭证号不一致");
+                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
 
                 //成功处理的任务
                 var finishTaskList = new List<FinishTaskList<int>>();
 
                 DB.Do(db =>
                 {
-                    var devs = new List<FinishTaskList<string>>();
+                    var devise = new List<FinishTaskList<string>>();
 
                     //获取需要执行的设备信息
-                    foreach (var dev in obj.Items)
+                    foreach (var dev in stationDeviceGroup.Items)
                     {
                         if (!dev.Data3.Status.HasFlag(StationStatus.低位))
                         {
@@ -216,52 +210,57 @@ namespace WCS.Service.Works.Station
                         }
                         if (dev.Data2.Request != IstationRequest.请求分配目标地址)
                         {
-                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                             continue;
                         };
                         if (dev.Data2.Tasknum < 10000)
                         {
-                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                             continue;
                         }
 
-                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                        devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
                     }
 
-                    if (!devs.Any()) return; //无可执行任务
-                                             //验证可执行任务数与有效任务数是否一致
-                    var taskIds = devs.Select(dev => dev.Station.Data2.Tasknum).ToList();
+                    if (!devise.Any()) return; //无可执行任务
+                                               //验证可执行任务数与有效任务数是否一致
+                    var taskIds = devise.Select(dev => dev.Station.Data2.Tasknum).ToList();
                     var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
 
                     var task1 = taskList.FirstOrDefault();
                     var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == task1.TaskGroupKey && v.TYPE == TaskType.出库);
                     //开始检查任务数是否匹配
-                    if (devs.Count != taskCount) throw new WarnException($"可执行数{devs.Count},任务组任务数{taskCount},数量不匹配,{task1.ID}-{task1.TaskGroupKey}");
+                    if (devise.Count != taskCount) throw new WarnException($"可执行数{devise.Count},任务组任务数{taskCount},数量不匹配,{task1?.ID}-{task1?.TaskGroupKey}");
 
                     var stationList = new List<FinishTaskList<WCS_TASK>>();
 
                     //开始处理需要分配目标地址的设备
-                    foreach (var dev in devs)
+                    foreach (var dev in devise)
                     {
                         var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum) ?? throw new WarnException($"WCS无[{dev.Station.Data2.Tasknum}]任务信息");
                         var addNext = "";
-                        if (dev.Station.Entity.CODE == "1340")
-                        {
-                            var Station1343 = Device.Find("1343").Create<StationDevice>();
-                            addNext = "1343";
-                            if (!Station1343.Data3.Status.HasFlag(StationStatus.自动) || Station1343.Data2.Tasknum > 10000)
-                                addNext = "1340";
-                        }
-                        else if (dev.Station.Entity.CODE == "1341")
+                        switch (dev.Station.Entity.CODE)
                         {
-                            var Station1344 = Device.Find("1344").Create<StationDevice>();
-                            addNext = "1344";
-                            if (!Station1344.Data3.Status.HasFlag(StationStatus.自动) || Station1344.Data2.Tasknum > 10000)
-                                addNext = "1341";
+                            case "1340":
+                                {
+                                    var station1343 = Device.Find("1343").Create<StationDevice>();
+                                    addNext = "1343";
+                                    if (!station1343.Data3.Status.HasFlag(StationStatus.自动) || station1343.Data2.Tasknum > 10000)
+                                        addNext = "1340";
+                                    break;
+                                }
+                            case "1341":
+                                {
+                                    var station1344 = Device.Find("1344").Create<StationDevice>();
+                                    addNext = "1344";
+                                    if (!station1344.Data3.Status.HasFlag(StationStatus.自动) || station1344.Data2.Tasknum > 10000)
+                                        addNext = "1341";
+                                    break;
+                                }
                         }
 
                         task.ADDRNEXT = addNext;
-                        task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
+                        task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{stationDeviceGroup.Entity.CODE}", this.GetType());
                         finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
                         stationList.Add(new FinishTaskList<WCS_TASK>(task, dev.Station));
                     }
@@ -273,20 +272,25 @@ namespace WCS.Service.Works.Station
                         stationList = stationList.OrderBy(v => v.FinishCode.ADDRNEXT.ToShort()).ToList();
                         var task3 = stationList[0];
                         var task4 = stationList[1];
-                        if (task3.FinishCode.ADDRNEXT == "1343" && task4.FinishCode.ADDRNEXT == "1344")
-                        {
-                        }
-                        else if (task3.FinishCode.ADDRNEXT == "1340" && task4.FinishCode.ADDRNEXT == "1341")
+                        switch (task3.FinishCode.ADDRNEXT)
                         {
-                        }
-                        else
-                        {
-                            var devs1 = stationList.Select(v => v.Station);
-                            foreach (var dev in devs1)
-                            {
-                                if (!dev.Data3.Status.HasFlag(StationStatus.自动)) throw new WarnException($"{dev.Entity.CODE}--不是自动");
-                                if (dev.Data2.Tasknum > 10000) throw new WarnException($"{dev.Entity.CODE}--已有任务");
-                            }
+                            case "1343" when task4.FinishCode.ADDRNEXT == "1344":
+                                break;
+
+                            case "1340" when task4.FinishCode.ADDRNEXT == "1341":
+                                break;
+
+                            default:
+                                {
+                                    var devise1 = stationList.Select(v => v.Station);
+                                    foreach (var dev in devise1)
+                                    {
+                                        if (!dev.Data3.Status.HasFlag(StationStatus.自动)) throw new WarnException($"{dev.Entity.CODE}--不是自动");
+                                        if (dev.Data2.Tasknum > 10000) throw new WarnException($"{dev.Entity.CODE}--已有任务");
+                                    }
+
+                                    break;
+                                }
                         }
                     }
 
@@ -328,50 +332,49 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
             {
                 //必须满足的条件
-                if (obj.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
+                if (stationDeviceGroup.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("凭证号不一致");
+                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
 
                 //成功处理的任务
-                var finishTaskList = new List<FinishTaskList<int>>();
 
                 DB.Do(db =>
                 {
-                    var devs = new List<FinishTaskList<string>>();
+                    var devise = new List<FinishTaskList<string>>();
 
                     //获取需要执行的设备信息
-                    foreach (var dev in obj.Items)
+                    foreach (var dev in stationDeviceGroup.Items)
                     {
                         if (dev.Data2.Request != IstationRequest.请求分配目标地址)
                         {
-                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-分配目标地址--2");
+                            InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-分配目标地址--2");
                             continue;
                         }
                         if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
                         {
-                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                             continue;
                         }
                         if (dev.Data2.Tasknum < 10000)
                         {
-                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                             continue;
                         }
-                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                        devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
                     }
 
-                    if (!devs.Any()) return;//无可执行任务
-                                            //验证可执行任务数与有效任务数是否一致
-                    var taskIds = devs.Select(dev => dev.Station.Data2.Tasknum).ToList();
+                    if (!devise.Any()) return;//无可执行任务
+                                              //验证可执行任务数与有效任务数是否一致
+                    var taskIds = devise.Select(dev => dev.Station.Data2.Tasknum).ToList();
                     var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
                     var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == taskList.FirstOrDefault().TaskGroupKey && v.TYPE == TaskType.出库);
 
-                    if (devs.Count != taskCount) throw new WarnException($"可执行数{devs.Count},任务组任务数{taskCount},数量不匹配");
+                    if (devise.Count != taskCount) throw new WarnException($"可执行数{devise.Count},任务组任务数{taskCount},数量不匹配");
 
                     //开始处理需要分配目标地址的设备
-                    foreach (var dev in devs)
+                    foreach (var dev in devise)
                     {
                         var task = db.Default.Set<WCS_TASK>().Find(dev.Station.Data2.Tasknum);
                         if (task == null) throw new WarnException("WCS无该任务信息");
@@ -398,10 +401,8 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
+            obj.EX(stationDeviceGroup =>
              {
-                 var station = obj.Entity.CODE;
-
                  #region 处理新增叫料任务
 
                  DB.Do(db =>
@@ -410,25 +411,24 @@ namespace WCS.Service.Works.Station
                      var agvTasks = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料)
                      .Where(v => v.Status < AGVTaskStatus.完成).ToArray();
 
-                     foreach (var agvtask in agvTasks)
+                     foreach (var tasking in agvTasks)
                      {
-                         var position = agvtask.Position;
+                         var position = tasking.Position;
                          if (!ProtocolProxy.AllDatas.ContainsKey(position))
                              ProtocolProxy.AllDatas[position] = new ProdLineData();
                          var pld = ProtocolProxy.AllDatas[position] as ProdLineData;
-                         pld.Frame = LogicHandler.Frame;
+                         pld!.Frame = LogicHandler.Frame;
                          pld.Code = position;
-                         pld.TaskList.Add(agvtask);
+                         pld.TaskList.Add(tasking);
 
-                         if (agvtask.Status == AGVTaskStatus.新建)
+                         if (tasking.Status == AGVTaskStatus.新建)
                          {
-                             if (obj.Entity.CODE != "G1340") continue;
-                             var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成)
-                            .Where(v => v.Position == agvtask.Position).Count();
+                             if (stationDeviceGroup.Entity.CODE != "G1340") continue;
+                             var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成).Count(v => v.Position == tasking.Position);
 
                              if (qty >= 4)
                              {
-                                 InfoLog.INFO_WarnDb($"{agvtask.Position}正在执行的叫料任务数量已达{qty},暂停出库", obj.Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常);
+                                 InfoLog.INFO_WarnDb($"{tasking.Position}正在执行的叫料任务数量已达{qty},暂停出库", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常);
                                  continue;
                              };
 
@@ -436,11 +436,11 @@ namespace WCS.Service.Works.Station
                              List<I_WCS_GetOutTaskResponseSingle> res;
                              try
                              {
-                                 res = WMS.GetOutTask(agvtask.Position.Replace("_OUT", ""), "G1340");
+                                 res = WMS.GetOutTask(tasking.Position.Replace("_OUT", ""), "G1340");
                              }
                              catch (WarnException ex)
                              {
-                                 InfoLog.INFO_WarnDb($"{ex.Message}", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                 InfoLog.INFO_WarnDb($"{ex.Message}", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                  continue;
                              };
 
@@ -448,7 +448,7 @@ namespace WCS.Service.Works.Station
                              {
                                  var srm = Device.Find(outTask.TunnelNum).ROUTES.Where(v => v.NEXT.IsSC()).Select(v => v.NEXT).FirstOrDefault();
 
-                                 var loc = string.Format("{0}-{1}-{2}", outTask.Row, outTask.Colomn, outTask.Layer);
+                                 var loc = $"{outTask.Row}-{outTask.Colomn}-{outTask.Layer}";
 
                                  var task = new WCS_TASK
                                  {
@@ -461,29 +461,28 @@ namespace WCS.Service.Works.Station
                                      WMSTASK = int.Parse(outTask.WMSTaskNum),
                                      UPDATEUSER = "WCS",
                                      SRMSTATION = "",
-                                     DEVICE = srm.CODE,
-                                     //ADDRCURRENT = loc,
-                                     AgvTask = agvtask.ID,
+                                     DEVICE = srm?.CODE,
+                                     AgvTask = tasking.ID,
                                      Length = outTask.Length,
                                      FLOOR = 2
                                  };
                                  db.Default.Set<WCS_TASK>().Add(task);
-                                 agvtask.Status = AGVTaskStatus.确认;
-                                 agvtask.UpdateTime = DateTime.Now;
+                                 tasking.Status = AGVTaskStatus.确认;
+                                 tasking.UpdateTime = DateTime.Now;
                                  db.Default.SaveChanges();
                              });
                              return;
                          }
-                         else if (agvtask.AGVStatus == AGVTaskStatus.完成)
+                         else if (tasking.AGVStatus == AGVTaskStatus.完成)
                          {
-                             agvtask.Status = agvtask.AGVStatus;
-                             agvtask.UpdateTime = DateTime.Now;
+                             tasking.Status = tasking.AGVStatus;
+                             tasking.UpdateTime = DateTime.Now;
                              db.Default.SaveChanges();
                          }
-                         else if (agvtask.AGVStatus == AGVTaskStatus.取消)
+                         else if (tasking.AGVStatus == AGVTaskStatus.取消)
                          {
-                             agvtask.Status = agvtask.AGVStatus;
-                             agvtask.UpdateTime = DateTime.Now;
+                             tasking.Status = tasking.AGVStatus;
+                             tasking.UpdateTime = DateTime.Now;
                              db.Default.SaveChanges();
                          }
                      }
@@ -492,12 +491,12 @@ namespace WCS.Service.Works.Station
                  #endregion 处理新增叫料任务
 
                  //空闲自动,停止运行
-                 if (obj.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("等待执行任务");
-                 if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) return;
-                 if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException("设备运行中");
+                 if (stationDeviceGroup.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("等待执行任务");
+                 if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) return;
+                 if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException("设备运行中");
 
                  var taskIds = new List<int>();
-                 obj.Items.ToList().ForEach(dev => taskIds.Add(dev.Data2.Tasknum));
+                 stationDeviceGroup.Items.ToList().ForEach(dev => taskIds.Add(dev.Data2.Tasknum));
                  DB.Do(db =>
                  {
                      var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID));
@@ -512,7 +511,7 @@ namespace WCS.Service.Works.Station
 
                      if (agvtask.Status == AGVTaskStatus.确认)
                      {
-                         if (!obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.高位))) throw new WarnException("不在高位");
+                         if (!stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.高位))) throw new WarnException("不在高位");
                          var flag = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料)
                          .Where(v => v.Status > AGVTaskStatus.确认 && v.Status < AGVTaskStatus.取放完成).Count();
                          if (flag >= 2) throw new Exception("有2未完成的AGV出库任务");
@@ -524,7 +523,7 @@ namespace WCS.Service.Works.Station
                                      task.ENDTIME = DateTime.Now;
                                  });
 
-                         agvtask.Station = obj.Entity.CODE;
+                         agvtask.Station = stationDeviceGroup.Entity.CODE;
                          agvtask.Status = AGVTaskStatus.执行;
                          agvtask.UpdateTime = DateTime.Now;
                          db.Default.SaveChanges();
@@ -533,10 +532,10 @@ namespace WCS.Service.Works.Station
                      {
                          if (agvtask.AGVStatus == AGVTaskStatus.请求_允许)
                          {
-                             if (!obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.高位))) throw new WarnException("不在高位");
+                             if (!stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.高位))) throw new WarnException("不在高位");
                              if (agvtask.Status < AGVTaskStatus.执行) throw new WarnException($"AGV状态错误-{agvtask.Status}");
-                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV取货完成信号))) throw new WarnException("任务清零信号未清除");
-                             if (!obj.Items.Any(v => v.Data2.Tasknum > 10000 && v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("没有设备有任务且有光电");
+                             if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV取货完成信号))) throw new WarnException("任务清零信号未清除");
+                             if (!stationDeviceGroup.Items.Any(v => v.Data2.Tasknum > 10000 && v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("没有设备有任务且有光电");
 
                              agvtask.Status = agvtask.AGVStatus;
                              agvtask.UpdateTime = DateTime.Now;
@@ -544,15 +543,15 @@ namespace WCS.Service.Works.Station
                          }
                          else if (agvtask.AGVStatus == AGVTaskStatus.取放完成)
                          {
-                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV取货完成信号))) throw new WarnException("任务清零信号未清除");
-                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new WarnException("AGV取货完成后依然有光电信号");
+                             if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV取货完成信号))) throw new WarnException("任务清零信号未清除");
+                             if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new WarnException("AGV取货完成后依然有光电信号");
                              if (agvtask.Status < AGVTaskStatus.请求_允许) throw new WarnException("AGV任务状态有误");
 
                              agvtask.Status = agvtask.AGVStatus;
                              agvtask.UpdateTime = DateTime.Now;
                              db.Default.SaveChanges();
 
-                             foreach (var dev in obj.Items)
+                             foreach (var dev in stationDeviceGroup.Items)
                              {
                                  dev.Data.Istation521Status = IstationStatus.AGV取货完成信号;
                              }