Răsfoiți Sursa

整体优化

林豪 左 3 ani în urmă
părinte
comite
27ddcb17ae

+ 13 - 26
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -166,12 +166,12 @@ namespace WCS.Service.Extensions
                 }
                 if (dev.Data2.Request != IstationRequest.扫码入库)
                 {
-                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有扫码入库请求--1", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有扫码入库请求--1", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                     continue;
                 };
                 if (dev.Data2.Tasknum > 10000)
                 {
-                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求,但已有任务号", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求,但已有任务号", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                     continue;
                 }
 
@@ -179,15 +179,11 @@ namespace WCS.Service.Extensions
                 var barcode = bcr.Content.Trim('\r');
                 if (barcode == "")
                 {
-                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--扫码失败,内容为空", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--扫码失败,内容为空", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                     continue;
                 };
 
-                list.Add(new FinishTaskList<string>()
-                {
-                    FinishCode = barcode,
-                    Station = dev.Entity.Create<StationDevice>()
-                });
+                list.Add(new FinishTaskList<string>(barcode, dev.Entity.Create<StationDevice>()));
             }
             return list;
         }
@@ -210,20 +206,16 @@ namespace WCS.Service.Extensions
                 }
                 if (dev.Data2.Request != IstationRequest.请求分配目标地址)
                 {
-                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                     continue;
                 };
                 if (dev.Data2.Tasknum < 10000)
                 {
-                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                     continue;
                 }
 
-                list.Add(new FinishTaskList<string>()
-                {
-                    FinishCode = dev.Entity.CODE,
-                    Station = dev.Entity.Create<StationDevice>()
-                });
+                list.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
             }
             return list;
         }
@@ -678,10 +670,12 @@ namespace WCS.Service.Extensions
                 {
                     //判断当前工位是否有完成任务
                     if (taskIds[i] == 0) continue;
-                    //获取当前工位的目标地址
-                    var ELine = i == 0 ? Data.ELine_1.ToString() : Data.ELine_2.ToString();
                     task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
-                    if (task.STATUS != TaskStatus.堆垛机执行 && task.STATUS != TaskStatus.堆垛机完成) continue;
+                    if (task.STATUS != TaskStatus.堆垛机执行 && task.STATUS != TaskStatus.堆垛机完成)
+                    {
+                        InfoLog.INFO_WarnDb($"任务{task.ID},状态位{task.STATUS}", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                        continue;
+                    };
 
                     if (task.STATUS == TaskStatus.堆垛机完成)
                     {
@@ -695,14 +689,11 @@ namespace WCS.Service.Extensions
                         task.ENDTIME = DateTime.Now;
                         task.STATUS = TaskStatus.已完成;
                         task.UPDATETIME = DateTime.Now;
-                        db.Default.SaveChanges();
                     }
                     else if (task.TYPE == TaskType.出库)
                     {
                         task.STATUS = TaskStatus.堆垛机完成;
                         task.UPDATETIME = DateTime.Now;
-                        db.Default.SaveChanges();
-                        Uploader.Upload(db);
                     }
                     else if (task.TYPE == TaskType.移库)
                     {
@@ -710,14 +701,13 @@ namespace WCS.Service.Extensions
                         {
                             task.STATUS = TaskStatus.已完成;
                             task.UPDATETIME = DateTime.Now;
-                            db.Default.SaveChanges();
-                            Uploader.Upload(db);
                         }
                     }
                     else throw new Exception($"[{Entity.CODE}]任务类型错误,{task.ID}");
 
                     task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机执行}]变更为[{task.STATUS}]", this.GetType());
                 }
+                db.Default.SaveChanges();
             });
 
             DB.Do(db =>
@@ -729,13 +719,10 @@ namespace WCS.Service.Extensions
                     //判断当前工位是否有完成任务
                     if (taskIds[i] == 0) continue;
                     //获取当前工位的目标地址
-                    var ELine = i == 0 ? Data.ELine_1.ToString() : Data.ELine_2.ToString();
                     task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
 
                     if (i == 0) Data.FinishedACK_1 = 1;
                     else Data.FinishedACK_2 = 1;
-
-                    task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机执行}]变更为[{task.STATUS}]", this.GetType());
                 }
             });
         }

+ 10 - 0
Projects/永冠OPP/WCS.Service/Extensions/TypeExtension.cs

@@ -24,6 +24,16 @@ namespace WCS.Service.Extensions
             return Convert.ToInt16(value);
         }
 
+        /// <summary>
+        /// 将decimal转换为short
+        /// </summary>
+        /// <param name="txt">需要转换的字符串</param>
+        /// <returns></returns>
+        public static short ToShort(this decimal value)
+        {
+            return Convert.ToInt16(value);
+        }
+
         /// <summary>
         /// 将字符串转换为int
         /// </summary>

+ 6 - 0
Projects/永冠OPP/WCS.Service/Helpers/FinishTaskList.cs

@@ -11,6 +11,12 @@ namespace WCS.Service.Helpers
     /// <typeparam name="T"></typeparam>
     public class FinishTaskList<T>
     {
+        public FinishTaskList(T finishCode, StationDevice station)
+        {
+            FinishCode = finishCode;
+            Station = station;
+        }
+
         /// <summary>
         /// 完成
         /// </summary>

+ 1 - 0
Projects/永冠OPP/WCS.Service/Log/InfoLog.cs

@@ -96,6 +96,7 @@ namespace WCS.Service.Log
         {
             Log.Warn(msg, "INFO_WARN");
             WCS.Service.Helpers.LogHelper.AddWCS_EXCEPTION(msg, code, type.ToString());
+            WMS.TaskException(code, msg);
         }
 
         /// <summary>

+ 1 - 1
Projects/永冠OPP/WCS.Service/WebApi/WMS/WMS.cs

@@ -70,7 +70,7 @@ namespace WCS.Service
             });
             if (!res.ResType)
             {
-                TaskException($"{devCode1} -- {devCode2}", res.ResMessage);
+                TaskException($"G{devCode1}", res.ResMessage);
                 throw new WarnException(res.ResMessage);
             }
             return res.TaskList;

+ 2 - 2
Projects/永冠OPP/WCS.Service/Worker.cs

@@ -102,13 +102,13 @@ namespace WCS.Service
                 Device.AddFlag(DF.SRM月台放货, "1520", "1521", "1522", "1523", "1545", "1546", "1451", "1453");
                 Device.AddFlag(DF.SRM涂布取货, "1428", "1429", "1422", "1423", "1424", "1425", "1415", "1416");
                 Device.AddFlag(DF.SRM涂布取货, "1412", "1414", "1406", "1407", "1408", "1409");
+
                 Device.AddFlag(DF.SRM涂布放货, "1283", "1284", "1290", "1291", "1292", "1293", "1299", "1300");
                 Device.AddFlag(DF.SRM涂布放货, "1301", "1302", "1308", "1309", "1310", "1311");
+
                 Device.AddFlag(DF.涂布RGV, "RGV9", "RGV10", "RGV11", "RGV12", "RGV13", "RGV14");
                 Device.AddFlag(DF.涂布RGV取货设备组, "G2", "G3", "G5", "G7", "G9", "G11");
                 Device.AddFlag(DF.涂布RGV放货设备组, "G1", "G4", "G6", "G8", "G10");
-                //Device.AddFlag(DF.涂布出库取货站台, "G5", "G7", "G9", "G11");
-                //Device.AddFlag(DF.涂布入库取货站台, "G2", "G3");
                 Device.AddFlag(DF.涂布出库RGV取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313");
                 Device.AddFlag(DF.涂布入库RGV取货站台, "1391", "1392", "1399", "1400");
                 Device.AddFlag(DF.涂布RGV取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313");

+ 14 - 13
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -166,11 +166,10 @@ namespace WCS.Service.Works.RGV
                         }
 
                         //找到自己的后一个小车
-                        var afterStation = obj.After();
-                        //后面的小车是否在执行任务
-                        if (afterStation.Data2.WorkMode == RGVMode.自动 && afterStation.Data2.SystemStatus == RGVRunStatus.空闲) return;
+                        var afterRgv = obj.After();
+
                         //自己是否阻挡了该小车
-                        if (obj.StopedByMe(afterStation))
+                        if (afterRgv.Data2.WorkMode == RGVMode.自动 && afterRgv.Data2.SystemStatus == RGVRunStatus.空闲 && obj.StopedByMe(afterRgv))
                         {
                             //找到当前所在站台的下一个取货点
                             var beforeStation = Device.Where(v => v.Is(DF.涂布RGV取货设备组) && v.CODE != pickStation.Entity.CODE)
@@ -178,19 +177,21 @@ namespace WCS.Service.Works.RGV
                                           .OrderBy(v => pickStation.Distance(v))
                                           .FirstOrDefault();
 
-                            //if (beforeStation.Entity.CODE == pickStation.Entity.CODE)
-                            //{
-                            //    //取被挡住小车的目标位置的下一个取货点
-                            //    beforeStation = Device.Where(v => v.Is(DF.涂布RGV取货设备组) && v.CODE != beforeStation.Entity.CODE)
-                            //                 .Select(v => v.Create<StationDeviceGroup>())
-                            //                 .OrderBy(v => beforeStation.Distance(v))
-                            //                 .FirstOrDefault();
-                            //}
-
                             //写入移动任务
                             obj.Move(beforeStation);
                             return;
                         }
+                        else
+                        {
+                            //取前一个取货点
+                            pickStation = obj.BeforeStation();
+                            //前一个取货点的小车
+                            var rgv = pickStation.CurrentRGV();
+                            if (rgv == null) //没有小车
+                            {
+                                obj.Move(pickStation);
+                            }
+                        }
                     }
 
                     //是否在一个放货站台

+ 18 - 33
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -41,11 +41,8 @@ namespace WCS.Service.Works.SRM
                     InfoLog.INFO_SRMALARM($"{obj.Entity.CODE}-{obj.Data3.SCAlarm}");
                     return;
                 }
-                if (obj.Data.FinishedACK_1 == 1 || obj.Data.FinishedACK_2 == 1)
-                    throw new WarnException($"堆垛机完成任务WCS反馈信号未清除");
-                if (obj.Data2.VoucherNo_1 != obj.Data.VoucherNo_1 || obj.Data2.VoucherNo_2 != obj.Data.VoucherNo_2)
-                    throw new WarnException($"等待执行{obj.Data.TaskID_1}-{obj.Data.TaskID_2}");
-
+                if (obj.Data.FinishedACK_1 == 1 || obj.Data.FinishedACK_2 == 1) throw new WarnException($"堆垛机完成任务WCS反馈信号未清除");
+                if (obj.Data2.VoucherNo_1 != obj.Data.VoucherNo_1 || obj.Data2.VoucherNo_2 != obj.Data.VoucherNo_2) throw new WarnException($"等待执行{obj.Data.TaskID_1}-{obj.Data.TaskID_2}");
                 //处理堆垛机已完成的任务
                 if (obj.Data2.FinishedTask_1 != 0 || obj.Data2.FinishedTask_2 != 0)
                 {
@@ -90,6 +87,11 @@ namespace WCS.Service.Works.SRM
                         //通过任务的组ID找到本组的所有任务
                         var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == taskGroupKey);
 
+                        var taskList = tasks.Select(v => v.Create<Task>());
+                        foreach (var item in taskList)
+                        {
+                        }
+
                         //双工位  货架列单数为一工位取放点  货架列双数为二工位取放点
                         foreach (var task in tasks)
                         {
@@ -240,9 +242,7 @@ namespace WCS.Service.Works.SRM
                     floor = floor % 2 + 1;
                     obj.Entity.Set("LastFloor", floor);
                     if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
-                    //obj.EXOutStock(obj =>
-                    //{
-                    //obj.CheckOutTask();
+
                     //获取当前堆垛机所有的放货点
                     var list = obj.GetDeliveryPoint();
 
@@ -263,8 +263,6 @@ namespace WCS.Service.Works.SRM
                     //没有可用货位
                     if (list.Count == 0) return;
 
-                    //可用设备的编号组
-                    var empties = list.Select(v => v.Entity.CODE).ToArray();
                     //月台所有设备当前有的任务号
                     var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
                     //堆垛机设备
@@ -272,8 +270,8 @@ namespace WCS.Service.Works.SRM
                     DB.Do(db =>
                     {
                         //堆垛机当前是否有正在执行的任务
-                        if (db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行))
-                            throw new WarnException($"[{deviceCode}]有正在执行的出库任务");
+                        if (db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)) throw new WarnException($"[{deviceCode}]有正在执行的出库任务");
+
                         //找出等待执行的出库任务
                         var waitTask = db.Default.Set<WCS_TASK>().Where(v => v.STATUS == TaskStatus.新建)
                                                       .Where(v => v.DEVICE == srm)
@@ -316,9 +314,9 @@ namespace WCS.Service.Works.SRM
 
                         if (tasks.Length == 2)
                         {
-                            var a = tasks.OrderByDescending(v => v.Length).ToArray();
+                            var length = tasks.OrderByDescending(v => v.Length).ToArray();
                             //较大的长度减去较小的长度,差大于两百表示为不同规格产品
-                            if (a[0].Length - a[1].Length > 200)
+                            if (length[0].Length - length[1].Length > 200)
                             {
                                 tasks = tasks.Take(1).ToArray();
                             }
@@ -326,11 +324,6 @@ namespace WCS.Service.Works.SRM
 
                         #endregion 校验两个产品是否为同规格
 
-                        //根据任务的目标地址获取对应的设备组
-                        var devs = Device.Find($"{tasks.OrderBy(v => v.ADDRTO).FirstOrDefault().ADDRTO}").Create<StationDeviceGroup>().Items.OrderByDescending(v => v.Entity.CODE).ToArray();
-                        var dev1 = devs[0];
-                        var dev2 = devs[1];
-
                         for (int i = 0; i < tasks.Length; i++)
                         {
                             var item = tasks[i];
@@ -340,23 +333,15 @@ namespace WCS.Service.Works.SRM
                             task.UPDATETIME = DateTime.Now;
                             task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
                             task.DEVICE = obj.Entity.CODE;
-                            switch (tasks.Length)
+                            task.TaskGroupKey = tasks.Length switch
                             {
-                                case 1:
-                                    task.TaskGroupKey = $"{tasks[0].ID}_0";
-                                    break;
-
-                                case 2:
-                                    task.TaskGroupKey = $"{tasks[0].ID}_{tasks[1].ID}";
-                                    break;
-
-                                default: throw new WarnException($"可用任务数异常{tasks.Length}");
-                            }
+                                1 => $"{tasks[0].ID}_0",
+                                2 => $"{tasks[0].ID}_{tasks[1].ID}",
+                                _ => throw new WarnException($"可用任务数异常{tasks.Length}"),
+                            };
                             var fork = obj.GetFork(item, i);
                             //获取站台及下一个地址
                             task.GetSrmStationAndaddNext(fork);
-                            db.Default.SaveChanges();
-                            Uploader.Upload(db);
                             var msg = "";
                             if (fork == SrmFork.货叉1)
                                 msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_1}-{obj.Data.SCol_1}-{obj.Data.SLayer_1}][{obj.Data.ELine_1}][{obj.Data.VoucherNo_1}]";
@@ -372,9 +357,9 @@ namespace WCS.Service.Works.SRM
                             {
                                 obj.WriteTask2(item, (short)tasks.Length);
                             }
+                            db.Default.SaveChanges();
                         }
                     });
-                    //});
 
                     #endregion 出库
                 }

+ 53 - 49
Projects/永冠OPP/WCS.Service/Works/Station/一楼入库.cs

@@ -45,7 +45,7 @@ namespace WCS.Service.Works.Station
                         foreach (var item in devs)
                         {
                             var dev = item.Station;
-                            var next = dev.Entity.CODE == "1028" ? "1030" : "1031";
+                            var next = dev.Entity.GetPath("SRM").CODE;
                             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}存在未完成任务,请检查是否为标签卡重复使用");
@@ -65,11 +65,7 @@ namespace WCS.Service.Works.Station
                             task.HEIGHT = dev.Data2.GoodsSize;
 
                             db.Default.Set<WCS_TASK>().Add(task);
-                            finishTaskList.Add(new FinishTaskList<int>()
-                            {
-                                FinishCode = task.WMSTASK,
-                                Station = item.Station
-                            });
+                            finishTaskList.Add(new FinishTaskList<int>(task.WMSTASK, item.Station));
 
                             var msg = $"下达从{dev.Entity.CODE}移动至{next}的PLC指令。";
                             msg += $"[{dev.Data.Tasknum}][{dev.Data.Goodsstart}][{dev.Data.Goodsend}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
@@ -120,7 +116,7 @@ namespace WCS.Service.Works.Station
                 if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) return;
 
                 //成功分配巷道的任务的任务
-                var finishTaskList = new List<Tuple<int, StationDevice>>();
+                var finishTaskList = new List<FinishTaskList<int>>();
 
                 //变更数据库信息
                 DB.Do(db =>
@@ -186,7 +182,7 @@ namespace WCS.Service.Works.Station
                         var msg = $"下达从G1030移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
                         msg += $"[{dev.Data.Tasknum}][G1030][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
                         task.CreateStatusLog(db, msg, this.GetType());
-                        finishTaskList.Add(new Tuple<int, StationDevice>(task.ID, item.Entity.Create<StationDevice>()));
+                        finishTaskList.Add(new FinishTaskList<int>(task.ID, item.Entity.Create<StationDevice>()));
                     }
                     db.Default.SaveChanges();
                 });
@@ -196,15 +192,15 @@ namespace WCS.Service.Works.Station
                 {
                     foreach (var finishTask in finishTaskList)
                     {
-                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.Item1);
+                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
                         if (task == null) continue;
 
-                        finishTask.Item2.Data.Tasknum = task.ID;
-                        finishTask.Item2.Data.Goodsstart = 1030;
-                        finishTask.Item2.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
-                        finishTask.Item2.Data.Goodsnum = (short)finishTaskList.Count;
-                        finishTask.Item2.Data.CmdType = IstationCmdType.分配目标地址;
-                        finishTask.Item2.Data.VoucherNo++;
+                        finishTask.Station.Data.Tasknum = task.ID;
+                        finishTask.Station.Data.Goodsstart = 1030;
+                        finishTask.Station.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
+                        finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
+                        finishTask.Station.Data.CmdType = IstationCmdType.分配目标地址;
+                        finishTask.Station.Data.VoucherNo++;
                     }
                 });
             });
@@ -212,42 +208,59 @@ namespace WCS.Service.Works.Station
     }
 
     [WorkTitle(typeof(ProductHandler), "一楼RGV放货结束分配目标地址")]
-    internal class 一楼RGV放货结束分配目标地址 : DeviceWork<StationDevice>
+    internal class 一楼RGV放货结束分配目标地址 : Work<StationDeviceGroup>
     {
-        protected override void Do(StationDevice obj)
+        protected override void Do(StationDeviceGroup obj)
         {
             obj.EX(obj =>
             {
-                var code = obj.Entity.CODE;
-                obj.WhetherToExecute(IstationRequest.请求分配目标地址);
+                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("运行中");
+                var finishTaskList = new List<FinishTaskList<int>>();
+                var devs = new List<FinishTaskList<string>>();
+                foreach (var dev in obj.Items)
+                {
+                    if (dev.Data2.Request != IstationRequest.请求分配目标地址)
+                    {
+                        InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-分配目标地址--2");
+                        continue;
+                    }
+                    if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+                    {
+                        InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                        continue;
+                    }
+                    devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                }
 
                 DB.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == obj.Data2.Tasknum);
-                    switch (task.ADDRFROM)
+                    foreach (var dev in devs)
                     {
-                        case "1028":
-                            break;
-
-                        case "1029":
-                            break;
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum);
+                        var next = dev.Station.Entity.GetPath(task.ADDRTO);
+                        task.ADDRNEXT = next.CODE;
 
-                        default:
-                            break;
+                        var msg = $"下达从{dev.Station.Data.Goodsstart}移动至{dev.Station.Data.Goodsend}的PLC指令";
+                        msg += $"[{dev.Station.Data.Tasknum}][{dev.Station.Data.Goodsstart}][{dev.Station.Data.Goodsend}][{dev.Station.Data.VoucherNo}[{dev.Station.Data2.VoucherNo}]";
+                        task.CreateStatusLog(db, msg, this.GetType());
+                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
                     }
-                    var next = obj.Entity.GetPath(task.ADDRTO);
-
-                    task.ADDRNEXT = next.CODE;
                     db.Default.SaveChanges();
-                    var msg = $"下达从{obj.Data.Goodsstart}移动至{obj.Data.Goodsend}的PLC指令";
-                    msg += $"[{obj.Data.Tasknum}][{obj.Data.Goodsstart}][{obj.Data.Goodsend}][{obj.Data.VoucherNo}[{obj.Data2.VoucherNo}]";
-                    task.CreateStatusLog(db, msg, this.GetType());
+                });
 
-                    obj.Data.Tasknum = task.ID;
-                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
-                    obj.Data.Goodsend = next.CODE.ToShort();
-                    obj.Data.CmdType = IstationCmdType.分配目标地址;
-                    obj.Data.VoucherNo++;
+                DB.Do(db =>
+                {
+                    foreach (var finish in finishTaskList)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finish.FinishCode);
+                        if (task == null) continue;
+                        finish.Station.Data.Tasknum = task.ID;
+                        finish.Station.Data.Goodsstart = obj.Entity.CODE.ToShort();
+                        finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
+                        finish.Station.Data.CmdType = IstationCmdType.分配目标地址;
+                        finish.Station.Data.VoucherNo++;
+                    }
                 });
             });
         }
@@ -257,15 +270,6 @@ namespace WCS.Service.Works.Station
             return devCodes.Contains(dev.CODE);
         }
 
-        private List<string> devCodes = new List<string>() {
-            "1035",
-            "1036",
-            "1044",
-            "1045",
-            "1053",
-            "1054",
-            "1062",
-            "1063",
-        };
+        private List<string> devCodes = new List<string>() { "G1035", "G1044", "G1053", "G1062" };
     }
 }

+ 94 - 42
Projects/永冠OPP/WCS.Service/Works/Station/一楼出库.cs

@@ -1,55 +1,85 @@
 using DBHelper;
+using System.Collections.Generic;
 using System.Linq;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Service.Extensions;
+using WCS.Service.Helpers;
+using WCS.Service.Log;
 
 namespace WCS.Service.Works.Station
 {
     [WorkTitle(typeof(ProductHandler), "一楼出库堆垛机放货完成后分配下一个地址")]
-    public class 一楼出库 : DeviceWork<StationDevice>
+    public class 一楼出库 : Work<StationDeviceGroup>
     {
-        protected override void Do(StationDevice obj)
+        protected override void Do(StationDeviceGroup obj)
         {
             obj.EX(obj =>
             {
-                //正在运行
-                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("运行中");
-                //上一次的任务还未执行
-                if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行");
-                //没有光电
-                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电"); ;
-                //没有请求
-                if (obj.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址) throw new WarnException($"有光电无堆垛机放货完成请求");
+                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
+                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
+
+                //成功处理的任务
+                var finishTaskList = new List<FinishTaskList<int>>();
 
-                //找到当前站台为当前设备且任务为堆垛机完成的任务
                 DB.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == obj.Entity.CODE && 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("任务异常,同组任务状态不为堆垛机完成或执行中");
-                    if (task == null) throw new WarnException("WCS无该任务信息");
-                    if (task.SRMSTATION != obj.Entity.CODE && task.STATUS != TaskStatus.堆垛机完成) throw new WarnException("任务状态不是堆垛机完成");
-                    task.STATUS = TaskStatus.执行中;
+                    var devs = new List<FinishTaskList<string>>();
+                    foreach (var dev in obj.Items)
+                    {
+                        //没有请求
+                        if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址)
+                        {
+                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-堆垛机放货完成请求--4");
+                            continue;
+                        }
+                        //没有光电
+                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        };
+                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                    }
+
+                    foreach (var dev in devs)
+                    {
+                        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());
+                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station.Entity.Create<StationDevice>()));
+                    }
                     db.Default.SaveChanges();
-                    task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
-                    //开始写入目标地址
-                    obj.Data.Tasknum = task.ID;
-                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
-                    obj.Data.Goodsend = task.ADDRNEXT.ToShort();
-                    obj.Data.Goodsnum = (short)tasks.Count();
-                    obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
-                    obj.Data.VoucherNo++;
+                });
+
+                DB.Do(db =>
+                {
+                    foreach (var finish in finishTaskList)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finish.FinishCode);
+                        if (task == null) continue;
+                        finish.Station.Data.Tasknum = task.ID;
+                        finish.Station.Data.Goodsstart = obj.Entity.CODE.ToShort();
+                        finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
+                        finish.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
+                        finish.Station.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
+                        finish.Station.Data.VoucherNo++;
+                    }
                 });
             });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.Is(DF.SRM月台放货);
+            return devCodes.Contains(dev.CODE);
         }
+
+        //月台堆垛机放货设备组
+        private List<string> devCodes = new List<string>() { "G1473", "G1474", "G1493", "G1491", "G1520", "G1522", "G1545", "G1451" };
     }
 
     [WorkTitle(typeof(ProductHandler), "月台出货口完成任务")]
@@ -59,27 +89,47 @@ namespace WCS.Service.Works.Station
         {
             obj.EX(obj =>
             {
-                //找到当前站台为当前设备且任务为堆垛机完成的任务
+                //当前组有一个运行的设备就停止执行
+                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
+                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("设备停止运行,但有光电"); //此处逻辑为货物离开后报完成
+                                                                                                                           //成功处理的任务
+                var finishTaskList = new List<FinishTaskList<int>>();
                 DB.Do(db =>
                 {
+                    var devs = new List<FinishTaskList<string>>();
                     foreach (var dev in obj.Items)
                     {
-                        //当前组有一个运行的设备就停止执行
-                        if (dev.Data3.Status.HasFlag(StationStatus.运行状态位)) continue;
-                        if (dev.Data2.Status.HasFlag(IstationStatus.光电状态)) continue;
-                        if (dev.Data2.Tasknum < 10000) continue;
-                        if (dev.Data2.Request != IstationRequest.月台出库口任务完成) continue;
-                        if (dev.Data2.Tasknum < 10000) continue;
+                        if (dev.Data2.Request != IstationRequest.月台出库口任务完成)
+                        {
+                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-月台出库口任务完成--3");
+                            continue;
+                        }
+                        if (dev.Data2.Tasknum < 10000)
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        };
+                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                    }
+                    foreach (var dev in devs)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().Where(v => v.ID == dev.Station.Data2.Tasknum).FirstOrDefault();
+                        if (task.STATUS == TaskStatus.新建) throw new WarnException($"{task.ID}任务状态错误");
 
-                        var task = db.Default.Set<WCS_TASK>().Where(v => v.ID == dev.Data2.Tasknum).FirstOrDefault();
-                        if (task.STATUS == TaskStatus.新建)
-                            throw new WarnException($"{task.ID}任务状态错误");
                         task.STATUS = TaskStatus.已完成;
                         task.ENDTIME = System.DateTime.Now;
-                        db.Default.SaveChanges();
-                        task.CreateStatusLog(db, $"状态由[{TaskStatus.执行中}]变更为[{task.STATUS}]-{dev.Entity.CODE}", this.GetType());
-                        dev.Data.CmdType = IstationCmdType.月台出库口任务完成;
-                        dev.Data.VoucherNo++;
+                        task.UPDATEUSER = "WCS";
+                        task.CreateStatusLog(db, $"状态由[{TaskStatus.执行中}]变更为[{task.STATUS}]-{dev.FinishCode}", this.GetType());
+                    }
+                    db.Default.SaveChanges();
+                });
+                DB.Do(db =>
+                {
+                    foreach (var finish in finishTaskList)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finish.FinishCode);
+                        finish.Station.Data.CmdType = IstationCmdType.月台出库口任务完成;
+                        finish.Station.Data.VoucherNo++;
                     }
                 });
             });
@@ -87,7 +137,9 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.Is(DF.月台);
+            return devCodes.Contains(dev.CODE);
         }
+
+        private List<string> devCodes = new List<string>() { "G1469", "G1561", "G1538", "G1574", "G1509" };
     }
 }

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

@@ -47,51 +47,85 @@ namespace WCS.Service.Works.Station
 
                         if (agvtask.Status == AGVTaskStatus.新建)
                         {
-                            if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) continue;
+                            if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
+                            {
+                                InfoLog.INFO_INFO($"{station}手动状态");
+                                continue;
+                            };
                             //TODO:暂时不管控产线任务数
                             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},暂停入库", obj.Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常);
+                                continue;
+                            };
 
-                            if (qty.Count() >= 10) //同时最多只能有10个任务被确认
+                            if (qty.Count(v => v.Station == obj.Entity.CODE) > qty.Count(v => v.Station != obj.Entity.CODE))
                             {
-                                throw new Exception($"{obj.Entity.CODE}正在执行的入库任务数量已达{qty},暂停入库");
+                                InfoLog.INFO_INFO($"{station}触发均分");
+                                continue;
                             }
 
-                            if (qty.Count(v => v.Station == obj.Entity.CODE) > qty.Count(v => v.Station != obj.Entity.CODE)) continue;
-
                             agvtask.Station = obj.Entity.CODE;
                             agvtask.Status = AGVTaskStatus.确认;
                             agvtask.UpdateTime = DateTime.Now;
-                            db.Default.SaveChanges();
                         }
                         else if (agvtask.Status == AGVTaskStatus.确认 && agvtask.Status > agvtask.AGVStatus)
                         {
-                            //TODO:暂时直接执行,不再管控,后续如有需求,再行启用
-                            //if (agvtask.Station != obj.Entity.CODE) continue;
-                            //if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.高位))) continue;
-                            //if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) continue;
-                            //if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) continue;
-                            //if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) continue;
-                            //if (obj.Items.Any(v => v.Data2.Tasknum > 10000)) continue;
-
-                            //暂时管控同一时间被执行的任务数为1
-                            //if (db.Default.Set<WCS_AGVTask>().Count(v => v.Status == AGVTaskStatus.执行 && v.Station == obj.Entity.CODE && v.ID != agvtask.ID) >= 2) continue;
                             agvtask.Status = AGVTaskStatus.执行;
                             agvtask.UpdateTime = DateTime.Now;
                             db.Default.SaveChanges();
                         }
                         else if (agvtask.Status < agvtask.AGVStatus)
                         {
-                            if (agvtask.Station != obj.Entity.CODE) continue;
+                            if (agvtask.Station != obj.Entity.CODE)
+                            {
+                                InfoLog.INFO_INFO($"{obj.Entity.CODE}不是当前站台的AGV任务");
+                                continue;
+                            }
                             if (agvtask.AGVStatus == AGVTaskStatus.请求_允许)
                             {
-                                if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.高位))) continue;
-                                if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) continue;
-                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) continue;
-                                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) continue;
-                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号))) continue;
-                                if (obj.Items.Any(v => v.Data2.Tasknum > 10000)) continue;
-                                if (db.Default.Set<WCS_AGVTask>().Any(v => v.Station == agvtask.Station && v.Status == agvtask.AGVStatus && v.ID != agvtask.ID)) continue; //只能有一个AGV请求
-                                if (db.Default.Set<WCS_AGVTask>().Any(v => v.Station == agvtask.Station && v.Status == AGVTaskStatus.请求_允许 && v.ID != agvtask.ID)) continue; //只能允许一个
+                                if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
+                                {
+                                    InfoLog.INFO_INFO("不在自动状态");
+                                    continue;
+                                }
+                                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位)))
+                                {
+                                    InfoLog.INFO_INFO("设备运行中");
+                                    continue;
+                                }
+                                if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.高位)))
+                                {
+                                    InfoLog.INFO_WarnDb("不在高位", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
+                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
+                                {
+                                    InfoLog.INFO_WarnDb("AGV请求放货,但有光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
+                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
+                                {
+                                    InfoLog.INFO_WarnDb("AGV放货完成信号未清楚", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
+                                if (obj.Items.Any(v => v.Data2.Tasknum > 10000))
+                                {
+                                    InfoLog.INFO_WarnDb("已有WCS任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
+                                if (db.Default.Set<WCS_AGVTask>().Any(v => v.Station == agvtask.Station && v.Status == agvtask.AGVStatus && v.ID != agvtask.ID))//只能有一个AGV请求
+                                {
+                                    InfoLog.INFO_WarnDb("只能允许一个AGV任务放货", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
+                                if (db.Default.Set<WCS_AGVTask>().Any(v => v.Station == agvtask.Station && v.Status == AGVTaskStatus.请求_允许 && v.ID != agvtask.ID)) //只能允许一个
+                                {
+                                    InfoLog.INFO_WarnDb("上一个允许放货的AGV任务未完成", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
 
                                 agvtask.Status = agvtask.AGVStatus;
                                 agvtask.UpdateTime = DateTime.Now;
@@ -99,8 +133,16 @@ 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("放货完成设备无光电");
+                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
+                                {
+                                    InfoLog.INFO_WarnDb("AGV放货完成信号未清楚", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
+                                if (!obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
+                                {
+                                    InfoLog.INFO_WarnDb("放货完成无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
 
                                 agvtask.Status = agvtask.AGVStatus;
                                 agvtask.UpdateTime = DateTime.Now;
@@ -116,8 +158,6 @@ namespace WCS.Service.Works.Station
                             }
                             else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.完成))
                             {
-                                //if (agvtask.Status != AGVTaskStatus.取放完成) throw new WarnException("RGV未上报取放完成状态,不允许跳状态");
-
                                 agvtask.Status = agvtask.AGVStatus;
                                 agvtask.UpdateTime = DateTime.Now;
                                 db.Default.SaveChanges();
@@ -135,6 +175,7 @@ namespace WCS.Service.Works.Station
                             }
                         }
                     }
+                    db.Default.SaveChanges();
                 });
 
                 #endregion 处理新增AGV任务
@@ -143,7 +184,6 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            //return dev.CODE == "G1386";
             return dev.CODE == "G1394" || dev.CODE == "G1386";
         }
     }
@@ -207,7 +247,7 @@ namespace WCS.Service.Works.Station
                         task.AgvTask = agvTask.ID;
 
                         db.Default.Set<WCS_TASK>().Add(task);
-                        finishTaskList.Add(new FinishTaskList<int> { FinishCode = task.WMSTASK, Station = item.Station });
+                        finishTaskList.Add(new FinishTaskList<int>(task.WMSTASK, item.Station));
 
                         var msg = $"下达从{dev.Entity.CODE}移动至{next}的PLC指令。";
                         msg += $"[{dev.Data.Tasknum}][{dev.Data.Goodsstart}][{dev.Data.Goodsend}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
@@ -242,7 +282,6 @@ namespace WCS.Service.Works.Station
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
             return dev.CODE == "G1386" || dev.CODE == "G1394";
-            //return dev.CODE == "1386" || dev.CODE == "1387" || dev.CODE == "1394" || dev.CODE == "1395";
         }
     }
 
@@ -263,11 +302,11 @@ namespace WCS.Service.Works.Station
                     ProtocolProxy.YG150Redis.Set(key, key);
                     var code = obj.Entity.CODE;
                     //两个设备都必须满足的条件
-                    if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) return;
-                    if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) return;
+                    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("运行状态");
 
                     //成功分配巷道的任务的任务
-                    var finishTaskList = new List<Tuple<int, StationDevice>>();
+                    var finishTaskList = new List<FinishTaskList<int>>();
 
                     //变更数据库信息
                     DB.Do(db =>
@@ -332,7 +371,7 @@ namespace WCS.Service.Works.Station
                         //开始变更任务信息
                         foreach (var item in devs)
                         {
-                            var dev = Device.Find(item.Entity.CODE).Create<StationDevice>();
+                            var dev = item.Entity.Create<StationDevice>();
                             var task = taskList.FirstOrDefault(p => p.ID == dev.Data2.Tasknum);
                             if (task == null) throw new WarnException($"WCS无该任务{dev.Data2.Tasknum}--{dev.Entity.CODE}");
 
@@ -344,7 +383,7 @@ namespace WCS.Service.Works.Station
                             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());
-                            finishTaskList.Add(new Tuple<int, StationDevice>(task.ID, item.Entity.Create<StationDevice>()));
+                            finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
                         }
                         db.Default.SaveChanges();
                     });
@@ -354,15 +393,15 @@ namespace WCS.Service.Works.Station
                     {
                         foreach (var finishTask in finishTaskList)
                         {
-                            var task = db.Default.Set<WCS_TASK>().Find(finishTask.Item1);
+                            var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
                             if (task == null) continue;
 
-                            finishTask.Item2.Data.Tasknum = task.ID;
-                            finishTask.Item2.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
-                            finishTask.Item2.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
-                            finishTask.Item2.Data.Goodsnum = (short)finishTaskList.Count;
-                            finishTask.Item2.Data.CmdType = IstationCmdType.分配目标地址;
-                            finishTask.Item2.Data.VoucherNo++;
+                            finishTask.Station.Data.Tasknum = task.ID;
+                            finishTask.Station.Data.Goodsstart = obj.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.分配目标地址;
+                            finishTask.Station.Data.VoucherNo++;
                         }
                     });
                 }
@@ -392,10 +431,10 @@ namespace WCS.Service.Works.Station
                 var code = obj.Entity.CODE;
 
                 //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) return;
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) return;
+                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("运行中");
                 //成功分配巷道的任务的任务
-                var finishTaskList = new List<Tuple<int, StationDevice>>();
+                var finishTaskList = new List<FinishTaskList<int>>();
 
                 //变更数据库信息
                 DB.Do(db =>
@@ -445,7 +484,7 @@ namespace WCS.Service.Works.Station
                     //开始变更任务信息
                     foreach (var item in devs)
                     {
-                        var dev = Device.Find(item.Entity.CODE).Create<StationDevice>();
+                        var dev = item.Entity.Create<StationDevice>();
                         var task = taskList.FirstOrDefault(p => p.ID == dev.Data2.Tasknum);
                         if (task == null) throw new WarnException($"WCS无该任务{dev.Data2.Tasknum}--{dev.Entity.CODE}");
 
@@ -457,7 +496,7 @@ namespace WCS.Service.Works.Station
                         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());
-                        finishTaskList.Add(new Tuple<int, StationDevice>(task.ID, item.Entity.Create<StationDevice>()));
+                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
                     }
                     db.Default.SaveChanges();
                 });
@@ -467,15 +506,15 @@ namespace WCS.Service.Works.Station
                 {
                     foreach (var finishTask in finishTaskList)
                     {
-                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.Item1);
+                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
                         if (task == null) continue;
 
-                        finishTask.Item2.Data.Tasknum = task.ID;
-                        finishTask.Item2.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
-                        finishTask.Item2.Data.Goodsend = finishTask.Item2.Entity.GetPath(task.DEVICE).CODE.ToShort();
-                        finishTask.Item2.Data.Goodsnum = (short)finishTaskList.Count;
-                        finishTask.Item2.Data.CmdType = IstationCmdType.分配目标地址;
-                        finishTask.Item2.Data.VoucherNo++;
+                        finishTask.Station.Data.Tasknum = task.ID;
+                        finishTask.Station.Data.Goodsstart = obj.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.分配目标地址;
+                        finishTask.Station.Data.VoucherNo++;
                     }
                 });
             });

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

@@ -17,90 +17,150 @@ namespace WCS.Service.Works.Station
     /// 涂布堆垛机放货分配目标地址
     /// </summary>
     [WorkTitle(typeof(CoatingHandler), "涂布堆垛机放货分配目标地址")]
-    public class 涂布堆垛机放货分配目标地址 : DeviceWork<StationDevice>
+    public class 涂布堆垛机放货分配目标地址 : Work<StationDeviceGroup>
     {
-        protected override void Do(StationDevice obj)
+        protected override void Do(StationDeviceGroup obj)
         {
             obj.EX(obj =>
             {
-                //正在运行
-                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("运行中");
-                //上一次的任务还未执行
-                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
-                    throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行");
-                //没有光电
-                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电"); ;
-                //没有请求
-                if (obj.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址)
-                    throw new WarnException($"有光电无堆垛机放货完成请求");
-                //找到当前站台为当前设备且任务为堆垛机完成的任务
+                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("运行中");
+                //成功处理的任务
+                var finishTaskList = new List<FinishTaskList<int>>();
+
                 DB.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == obj.Entity.CODE && v.STATUS == TaskStatus.堆垛机完成);
-                    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("任务异常,同组任务状态不为堆垛机完成或执行中");
-                    if (task == null) throw new WarnException("WCS无该任务信息");
-                    if (task.SRMSTATION != obj.Entity.CODE && task.STATUS != TaskStatus.堆垛机完成) throw new WarnException("任务状态不是堆垛机完成");
-                    task.STATUS = TaskStatus.执行中;
+                    var devs = new List<FinishTaskList<string>>();
+                    foreach (var dev in obj.Items)
+                    {
+                        //没有请求
+                        if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址)
+                        {
+                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-堆垛机放货完成请求--4");
+                            continue;
+                        }
+                        //没有光电
+                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        };
+                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                    }
+
+                    foreach (var dev in devs)
+                    {
+                        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());
+                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
+                    }
                     db.Default.SaveChanges();
-                    task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
-                    //开始写入目标地址
-                    obj.Data.Tasknum = task.ID;
-                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
-                    obj.Data.Goodsnum = (short)tasks.Count();
-                    obj.Data.Goodsend = task.ADDRNEXT.ToShort();
-                    obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
-                    obj.Data.VoucherNo++;
+                });
+
+                DB.Do(db =>
+                {
+                    foreach (var finish in finishTaskList)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finish.FinishCode);
+                        if (task == null) continue;
+                        finish.Station.Data.Tasknum = task.ID;
+                        finish.Station.Data.Goodsstart = obj.Entity.CODE.ToShort();
+                        finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
+                        finish.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
+                        finish.Station.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
+                        finish.Station.Data.VoucherNo++;
+                    }
                 });
             });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.Is(DF.SRM涂布放货);
+            return devCodes.Contains(dev.CODE);
         }
+
+        private List<string> devCodes = new List<string>() { "G1283", "G1290", "G1299", "G1301", "G1308", "G1310" };
     }
 
     /// <summary>
     /// 涂布出库分配出库口
     /// </summary>
     [WorkTitle(typeof(CoatingHandler), "涂布出库分配出库口")]
-    public class 涂布出库分配出库口 : DeviceWork<StationDevice>
+    public class 涂布出库分配出库口 : Work<StationDeviceGroup>
     {
-        protected override void Do(StationDevice obj)
+        protected override void Do(StationDeviceGroup obj)
         {
             obj.EX(obj =>
             {
-                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
-                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("设备运行中");
-                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
-                    throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行--凭证号不一致[{obj.Data.VoucherNo}][{obj.Data2.VoucherNo}]");
-                if (obj.Data2.Tasknum < 10000) throw new DoException("无任务");
-                if (obj.Data2.Request != IstationRequest.请求分配目标地址) throw new WarnException("有任务无请求");
+                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("运行中");
+
+                var finishTaskList = new List<FinishTaskList<int>>();
 
                 DB.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().Find(obj.Data2.Tasknum);
-                    if (task == null) throw new WarnException("WCS无该任务信息");
-                    task.ADDRNEXT = "G1";
+                    var devs = new List<FinishTaskList<string>>();
+                    foreach (var dev in obj.Items)
+                    {
+                        if (dev.Data2.Request != IstationRequest.请求分配目标地址)
+                        {
+                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-分配目标地址--2");
+                            continue;
+                        }
+                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        }
+                        if (dev.Data2.Tasknum < 10000)
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        }
+                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
+                    }
+
+                    foreach (var dev in devs)
+                    {
+                        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}");
+
+                        task.ADDRNEXT = "G1";
+                        task.CreateStatusLog(db, $"分配目标地址{task.ADDRNEXT}", this.GetType());
+                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
+                    }
                     db.Default.SaveChanges();
-                    task.CreateStatusLog(db, $"分配目标地址{task.ADDRNEXT}", this.GetType());
-                    //开始写入目标地址
-                    obj.Data.Tasknum = task.ID;
-                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
-                    obj.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
-                    obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
-                    obj.Data.GoodsSize = (short)task.Length;
-                    obj.Data.VoucherNo++;
+                });
+
+                DB.Do(db =>
+                {
+                    foreach (var finish in finishTaskList)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finish.FinishCode);
+                        if (task == null) continue;
+                        finish.Station.Data.Tasknum = task.ID;
+                        finish.Station.Data.Goodsstart = obj.Entity.CODE.ToShort();
+                        finish.Station.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
+                        finish.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
+                        finish.Station.Data.GoodsSize = task.Length.ToShort();
+                        finish.Station.Data.CmdType = IstationCmdType.分配目标地址;
+                        finish.Station.Data.VoucherNo++;
+                    }
                 });
             });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.Is(DF.涂布出库RGV取货站台);
+            return devCodes.Contains(dev.CODE);
         }
+
+        private List<string> devCodes = new List<string>() { "G5", "G7", "G9", "G11" };
     }
 
     /// <summary>
@@ -115,11 +175,7 @@ namespace WCS.Service.Works.Station
             {
                 //必须满足的条件
                 if (obj.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位)))
-                {
-                    InfoLog.INFO_INFO("设备运行中");
-                    return;
-                }
+                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
 
                 //成功处理的任务
                 var finishTaskList = new List<FinishTaskList<int>>();
@@ -143,24 +199,20 @@ namespace WCS.Service.Works.Station
                         }
                         if (dev.Data2.Request != IstationRequest.请求分配目标地址)
                         {
-                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                             continue;
                         };
                         if (dev.Data2.Tasknum < 10000)
                         {
-                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                             continue;
                         }
 
-                        devs.Add(new FinishTaskList<string>()
-                        {
-                            FinishCode = dev.Entity.CODE,
-                            Station = dev.Entity.Create<StationDevice>()
-                        });
+                        devs.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();
                     var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
 
@@ -191,11 +243,7 @@ namespace WCS.Service.Works.Station
 
                         task.ADDRNEXT = addNext;
                         task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
-                        finishTaskList.Add(new FinishTaskList<int>()
-                        {
-                            FinishCode = task.ID,
-                            Station = dev.Station
-                        });
+                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
                     }
                     db.Default.SaveChanges();
                 });
@@ -228,35 +276,68 @@ namespace WCS.Service.Works.Station
     /// 涂布出库返回任务长度
     /// </summary>
     [WorkTitle(typeof(CoatingHandler), "涂布出库返回任务长度")]
-    public class 涂布出库返回任务长度 : DeviceWork<StationDevice>
+    public class 涂布出库返回任务长度 : Work<StationDeviceGroup>
     {
-        protected override void Do(StationDevice obj)
+        protected override void Do(StationDeviceGroup obj)
         {
             obj.EX(obj =>
             {
-                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
-                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("设备运行中");
-                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
-                    throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行--凭证号不一致[{obj.Data.VoucherNo}][{obj.Data2.VoucherNo}]");
-                if (obj.Data2.Tasknum < 10000) throw new DoException("无任务");
-                if (obj.Data2.Request != IstationRequest.请求分配目标地址) throw new WarnException("有任务无请求");
+                //必须满足的条件
+                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("设备运行中");
+
+                //成功处理的任务
+                var finishTaskList = new List<FinishTaskList<int>>();
 
                 DB.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().Find(obj.Data2.Tasknum);
-                    if (task == null) throw new WarnException("WCS无该任务信息");
+                    var devs = new List<FinishTaskList<string>>();
 
-                    //开始写入目标地址
-                    obj.Data.CmdType = IstationCmdType.分配目标地址;
-                    obj.Data.GoodsSize = (short)task.Length;
-                    obj.Data.VoucherNo++;
+                    //获取需要执行的设备信息
+                    foreach (var dev in obj.Items)
+                    {
+                        if (dev.Data2.Request != IstationRequest.请求分配目标地址)
+                        {
+                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-分配目标地址--2");
+                            continue;
+                        }
+                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        }
+                        if (dev.Data2.Tasknum < 10000)
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        }
+                        devs.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();
+                    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},数量不匹配");
+
+                    //开始处理需要分配目标地址的设备
+                    foreach (var dev in devs)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().Find(dev.Station.Data2.Tasknum);
+                        if (task == null) throw new WarnException("WCS无该任务信息");
+
+                        dev.Station.Data.GoodsSize = task.Length.ToShort();
+                        dev.Station.Data.VoucherNo++;
+                    }
                 });
             });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.CODE == "1334" || dev.CODE == "1335";
+            return dev.CODE == "G1334";
         }
     }