林豪 左 il y a 1 an
Parent
commit
f459bd85a5

+ 15 - 0
ServiceCenter/Extensions/TypeExtension.cs

@@ -174,6 +174,21 @@ namespace ServiceCenter.Extensions
             return d;
         }
 
+        public static object Copy(this object obj, Type type)
+        {
+            var res = Activator.CreateInstance(type);
+            foreach (var p in type.GetProperties())
+            {
+                var p2 = obj.GetType().GetProperty(p.Name);
+                if (p2 != null && p2.PropertyType == p.PropertyType)
+                {
+                    var a = p2.GetValue(obj);
+                    p.SetValue(res, p2.GetValue(obj));
+                }
+            }
+            return res;
+        }
+
         /// <summary>
         /// 获取字典
         /// </summary>

+ 14 - 0
WCS.Core/Device.cs

@@ -101,6 +101,20 @@ namespace WCS.Core
             return ProtocolObjs(world)[protocolType];
         }
 
+        object Copy(object obj, Type type)
+        {
+            var res = Activator.CreateInstance(type);
+            foreach (var p in type.GetProperties())
+            {
+                var p2 = obj.GetType().GetProperty(p.Name);
+                if (p2 != null && p2.PropertyType == p.PropertyType)
+                {
+                    p.SetValue(res, p2.GetValue(obj));
+                }
+            }
+            return res;
+        }
+
         public override string ToString()
         {
             return Code;

+ 2 - 1
WCS.Core/PLC.cs

@@ -31,7 +31,8 @@ namespace WCS.Core
         {
             var p = new Ping();
             var res = p.Send(Entity.IP, timeout);
-            return res.Status == IPStatus.Success;
+            //return res.Status == IPStatus.Success;
+            return true;
         }
     }
 

+ 12 - 0
WCS.Entity/WCS_PalletizingRow.cs

@@ -22,6 +22,18 @@ namespace WCS.Entity
         [SugarColumn(IsNullable = false, ColumnDescription = "码垛层信息表Id")]
         public int PalletizingLayerId { get; set; }
 
+        /// <summary>
+        ///  码垛信息表Id
+        /// </summary>
+        [SugarColumn(IsNullable = false, ColumnDescription = "码垛信息表Id")]
+        public int PalletizingId { get; set; }
+
+        /// <summary>
+        ///  码垛信息
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(PalletizingId))]
+        public WCS_Palletizing Palletizing { get; set; }
+
         /// <summary>
         ///  是否空置
         /// </summary>

+ 72 - 25
业务工程/分拣库/WCS.Entity.Protocol/DataStructure/DeviceDataPack.cs

@@ -1,6 +1,11 @@
 using System;
 using System.Runtime.Serialization;
-using WCS.Entity.Protocol.Protocol.DataStructure;
+using WCS.Entity.Protocol.BCR;
+using WCS.Entity.Protocol.RGV;
+using WCS.Entity.Protocol.Robot;
+using WCS.Entity.Protocol.SRM;
+using WCS.Entity.Protocol.Station;
+using WCS.Entity.Protocol.Truss;
 
 namespace WCS.Entity.Protocol.DataStructure
 {
@@ -14,54 +19,96 @@ namespace WCS.Entity.Protocol.DataStructure
         ///  堆垛机数据集
         /// </summary>
         [DataMember(Order = 0)]
-        public DeviceDataCollection<SRMData> SRMDatas { get; set; }
+        public WCS_BCR80[] BCR80 { get; set; }
 
         /// <summary>
         ///  穿梭车数据集
         /// </summary>
         [DataMember(Order = 1)]
-        public DeviceDataCollection<RGVData> RGVDatas { get; set; }
+        public WCS_BCR81[] BCR81 { get; set; }
 
         /// <summary>
         ///  站台数据集
         /// </summary>
         [DataMember(Order = 2)]
-        public DeviceDataCollection<StationData> StationDatas { get; set; }
+        public WCS_BCR83[] BCR83 { get; set; }
 
-        ///// <summary>
-        /////  扫码器数据
-        ///// </summary>
-        //[DataMember(Order = 3)]
-        //public DeviceDataCollection<BCRData> BcrDatas { get; set; }
-
-        /// <summary>
-        ///  机器人数据集
-        /// </summary>
         [DataMember(Order = 3)]
-        public DeviceDataCollection<RobotData> RobotData { get; set; }
+        public WCS_RGV520[] RGV520 { get; set; }
 
-        /// <summary>
-        ///  机器人数据集
-        /// </summary>
         [DataMember(Order = 4)]
-        public DeviceDataCollection<TrussData> TrussData { get; set; }
+        public WCS_RGV521[] RGV521 { get; set; }
+
+        [DataMember(Order = 5)]
+        public WCS_Robot520[] Robot520 { get; set; }
+
+        [DataMember(Order = 6)]
+        public WCS_Robot521[] Robot521 { get; set; }
+
+        [DataMember(Order = 7)]
+        public WCS_Robot522[] Robot522 { get; set; }
+
+        [DataMember(Order = 8)]
+        public WCS_Robot530[] Robot530 { get; set; }
+
+        [DataMember(Order = 9)]
+        public WCS_Robot531[] Robot531 { get; set; }
+
+        [DataMember(Order = 10)]
+        public WCS_SRM520[] SRM520 { get; set; }
+
+        [DataMember(Order = 11)]
+        public WCS_SRM521[] SRM521 { get; set; }
 
-        ///// <summary>
-        /////  产线数据集
-        ///// </summary>
-        //[DataMember(Order = 5)]
-        //public DeviceDataCollection<ProdLineData> ProdLineData { get; set; }
+        [DataMember(Order = 12)]
+        public WCS_SRM537[] SRM537 { get; set; }
+
+        [DataMember(Order = 13)]
+        public WCS_Station520[] Station520 { get; set; }
+
+        [DataMember(Order = 14)]
+        public WCS_Station521[] Station521 { get; set; }
+
+        [DataMember(Order = 15)]
+        public WCS_Station523[] Station523 { get; set; }
+
+        [DataMember(Order = 16)]
+        public WCS_Station524[] Station524 { get; set; }
+
+        [DataMember(Order = 17)]
+        public WCS_Station525[] Station525 { get; set; }
+
+        [DataMember(Order = 18)]
+        public WCS_Station90[] Station90 { get; set; }
+
+        [DataMember(Order = 19)]
+        public WCS_Station91[] Station91 { get; set; }
+
+        [DataMember(Order = 20)]
+        public WCS_Truss520[] Truss520 { get; set; }
+
+        [DataMember(Order = 21)]
+        public WCS_Truss521[] Truss521 { get; set; }
+
+        [DataMember(Order = 22)]
+        public WCS_Truss523[] Truss523 { get; set; }
+
+        [DataMember(Order = 23)]
+        public WCS_Truss530[] Truss530 { get; set; }
+
+        [DataMember(Order = 24)]
+        public WCS_Truss531[] Truss531 { get; set; }
 
         /// <summary>
         ///  时间
         /// </summary>
-        [DataMember(Order = 5)]
+        [DataMember(Order = 25)]
         public DateTime Frame { get; set; }
 
         /// <summary>
         /// 回放最早时间
         /// </summary>
-        [DataMember(Order = 6)]
+        [DataMember(Order = 26)]
         public int PlaybackSeconds { get; set; }
     }
 }

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Extensions/DeviceExtension.cs

@@ -56,7 +56,7 @@ namespace WCS.WorkEngineering.Extensions
                         Port = 102,
                         Rack = 0,
                         Slot = 1,
-                        Type = PLCType.Siemens
+                        //Type = PLCType.Siemens
                     }
                 }
             };

+ 1 - 0
业务工程/分拣库/WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -238,6 +238,7 @@ namespace WCS.WorkEngineering.Extensions
                     {
                         RowNo = item.Key,
                         PalletizingLayerId = palletizingLayer.Id,
+                        PalletizingId = palletizing.Id,
                         WarehouseCode = palletizingLayer.WarehouseCode
                     };
                     palletizingRow = db.Insertable(palletizingRow).ExecuteReturnEntity();

+ 128 - 128
业务工程/分拣库/WCS.WorkEngineering/Systems/DataCollectionSysyem.cs

@@ -14,7 +14,7 @@ namespace WCS.WorkEngineering.Systems
     /// <summary>
     ///  数据采集系统
     /// </summary>
-    //[BelongTo(typeof(DataCollectionWorld))]
+    [BelongTo(typeof(DataCollectionWorld))]
     [Description("数据采集系统")]
     public class DataCollectionSysyem : DeviceSystem<SRM>
     {
@@ -24,16 +24,16 @@ namespace WCS.WorkEngineering.Systems
 
         public DataCollectionSysyem()
         {
-            var gs = Device.All.SelectMany(v => v.Protocols.Select(d => new { DB = $"{d.Value.DBInfo.No}:{d.Value.DBInfo.PLCInfo.IP}", d.Value.Position, TypeStr = d.Key, Dev = v }))
-                .GroupBy(v => v.DB);
-            foreach (var g in gs.Where(x => !x.Key.Contains("10.30.37.211") && !x.Key.Contains("10.30.37.217") && !x.Key.Contains("10.30.37.223")))
-            {
-                var min = g.OrderBy(v => v.Position).First();
-                var max = g.OrderByDescending(v => v.Position).First();
-                var t = Type.GetType(min.TypeStr);
-                min.Dev.Protocol(t, this.World);
-                max.Dev.Protocol(t, this.World);
-            }
+            //var gs = Device.All.SelectMany(v => v.Protocols.Select(d => new { DB = $"{d.Value.DBInfo.No}:{d.Value.DBInfo.PLCInfo.IP}", d.Value.Position, TypeStr = d.Key, Dev = v }))
+            //    .GroupBy(v => v.DB);
+            //foreach (var g in gs.Where(x => !x.Key.Contains("10.30.37.211") && !x.Key.Contains("10.30.37.217") && !x.Key.Contains("10.30.37.223")))
+            //{
+            //    var min = g.OrderBy(v => v.Position).First();
+            //    var max = g.OrderByDescending(v => v.Position).First();
+            //    var t = Type.GetType(min.TypeStr);
+            //    min.Dev.Protocol(t, this.World);
+            //    max.Dev.Protocol(t, this.World);
+            //}
         }
 
         /// <summary>
@@ -55,123 +55,123 @@ namespace WCS.WorkEngineering.Systems
         public override void Do(SRM obj)
         {
             return;
-            var sw = new Stopwatch();
-            sw.Start();
-            try
-            {
-                var sw1 = new Stopwatch();
-                sw1.Start();
-                var gs = AllDatas.GroupBy(v => v.Value.GetType());
-                DeviceDataPack pack = new DeviceDataPack();
-                pack.Frame = DateTime.Now;
-                foreach (var g in gs)
-                {
-                    var value = g.Select(v => v.Value).ToArray();
-                    var etype = g.Key;
-                    var type = typeof(DeviceDataCollection<>).MakeGenericType(etype);
-                    var coll = Activator.CreateInstance(type, DateTime.Now, value);
-                    var p = pack.GetType().GetProperties().First(v => v.PropertyType == type);
-                    p.SetValue(pack, coll);
-                }
-                sw1.Stop();
-                World.Log($"数据解析耗时:{sw1.ElapsedMilliseconds}");
-
-                var sw2 = new Stopwatch();
-                sw2.Start();
-                SqlSugarHelper.Do(_db =>
-                {
-                    try
-                    {
-                        var sw3 = new Stopwatch();
-                        sw3.Start();
-                        var sql = new StringBuilder();
-                        sql.Append("INSERT INTO ");
-                        var db = _db.PLC;
-                        if (pack.SRMDatas != null && pack.SRMDatas.Datas.Any())
-                        {
-                            Parallel.ForEach(pack.SRMDatas.Datas, x =>
-                            {
-                                if (x.D520 != null) Set(sql, x.D520.CreateSql);
-                                if (x.D521 != null) Set(sql, x.D521.CreateSql);
-                                if (x.D537 != null) Set(sql, x.D537.CreateSql);
-                            });
-                        }
-
-                        if (pack.RGVDatas != null && pack.RGVDatas.Datas.Any())
-                        {
-                            Parallel.ForEach(pack.RGVDatas.Datas, x =>
-                            {
-                                if (x.D520 != null) Set(sql, x.D520.CreateSql);
-                                if (x.D521 != null) Set(sql, x.D521.CreateSql);
-                                if (x.D81 != null) Set(sql, x.D81.CreateSql);
-                            });
-                        }
-
-                        if (pack.StationDatas != null && pack.StationDatas.Datas.Any())
-                        {
-                            Parallel.ForEach(pack.StationDatas.Datas, x =>
-                            {
-                                if (x.D520 != null) Set(sql, x.D520.CreateSql);
-                                if (x.D521 != null) Set(sql, x.D521.CreateSql);
-                                if (x.D523 != null) Set(sql, x.D523.CreateSql);
-                                if (x.D90 != null) Set(sql, x.D90.CreateSql);
-                                if (x.D91 != null) Set(sql, x.D91.CreateSql);
-                                if (x.D80 != null) Set(sql, x.D80.CreateSql);
-                                if (x.D81 != null) Set(sql, x.D81.CreateSql);
-                                if (x.D83 != null) Set(sql, x.D83.CreateSql);
-                                if (x.D524 != null) Set(sql, x.D524.CreateSql);
-                                if (x.D525 != null) Set(sql, x.D525.CreateSql);
-                                if (x.D530 != null) Set(sql, x.D530.CreateSql);
-                                if (x.D5531 != null) Set(sql, x.D5531.CreateSql);
-                                if (x.DR530 != null) Set(sql, x.DR530.CreateSql);
-                                if (x.DR531 != null) Set(sql, x.DR531.CreateSql);
-                            });
-                        }
-
-                        if (pack.RobotData != null && pack.RobotData.Datas.Any())
-                        {
-                            Parallel.ForEach(pack.RobotData.Datas, x =>
-                            {
-                                if (x.D520 != null) Set(sql, x.D520.CreateSql);
-                                if (x.D521 != null) Set(sql, x.D521.CreateSql);
-                                if (x.D522 != null) Set(sql, x.D522.CreateSql);
-                            });
-                        }
-
-                        if (pack.TrussData != null && pack.TrussData.Datas.Any())
-                        {
-                            Parallel.ForEach(pack.TrussData.Datas, x =>
-                            {
-                                if (x.D520 != null) Set(sql, x.D520.CreateSql);
-                                if (x.D521 != null) Set(sql, x.D521.CreateSql);
-                                if (x.D523 != null) Set(sql, x.D523.CreateSql);
-                            });
-                        }
-
-                        sw3.Stop();
-                        World.Log($"转换SQL耗时:{sw3.ElapsedMilliseconds}");
-
-                        var sw4 = new Stopwatch();
-                        sw4.Start();
-                        var sqlText = sql.ToString();
-                        db.Ado.ExecuteCommand(sql.ToString());
-                        sw4.Stop();
-                        World.Log($"执行SQL耗时:{sw4.ElapsedMilliseconds}");
-                    }
-                    catch (Exception e)
-                    {
-                        World.Log($"数据采集错误1:{e.StackTrace}"); Console.WriteLine(e);
-                    }
-                });
-                sw2.Stop();
-                World.Log($"数据保存数据库总耗时间:{sw2.ElapsedMilliseconds}");
-            }
-            catch (Exception e)
-            {
-                World.Log($"数据采集错误:{e.StackTrace}");
-            }
-            sw.Stop();
-            World.Log($"数据采集总耗时:{sw.ElapsedMilliseconds}");
+            //var sw = new Stopwatch();
+            //sw.Start();
+            //try
+            //{
+            //    var sw1 = new Stopwatch();
+            //    sw1.Start();
+            //    var gs = AllDatas.GroupBy(v => v.Value.GetType());
+            //    DeviceDataPack pack = new DeviceDataPack();
+            //    pack.Frame = DateTime.Now;
+            //    foreach (var g in gs)
+            //    {
+            //        var value = g.Select(v => v.Value).ToArray();
+            //        var etype = g.Key;
+            //        var type = typeof(DeviceDataCollection<>).MakeGenericType(etype);
+            //        var coll = Activator.CreateInstance(type, DateTime.Now, value);
+            //        var p = pack.GetType().GetProperties().First(v => v.PropertyType == type);
+            //        p.SetValue(pack, coll);
+            //    }
+            //    sw1.Stop();
+            //    World.Log($"数据解析耗时:{sw1.ElapsedMilliseconds}");
+
+            //    var sw2 = new Stopwatch();
+            //    sw2.Start();
+            //    SqlSugarHelper.Do(_db =>
+            //    {
+            //        try
+            //        {
+            //            var sw3 = new Stopwatch();
+            //            sw3.Start();
+            //            var sql = new StringBuilder();
+            //            sql.Append("INSERT INTO ");
+            //            var db = _db.PLC;
+            //            if (pack.SRMDatas != null && pack.SRMDatas.Datas.Any())
+            //            {
+            //                Parallel.ForEach(pack.SRMDatas.Datas, x =>
+            //                {
+            //                    if (x.D520 != null) Set(sql, x.D520.CreateSql);
+            //                    if (x.D521 != null) Set(sql, x.D521.CreateSql);
+            //                    if (x.D537 != null) Set(sql, x.D537.CreateSql);
+            //                });
+            //            }
+
+            //            if (pack.RGVDatas != null && pack.RGVDatas.Datas.Any())
+            //            {
+            //                Parallel.ForEach(pack.RGVDatas.Datas, x =>
+            //                {
+            //                    if (x.D520 != null) Set(sql, x.D520.CreateSql);
+            //                    if (x.D521 != null) Set(sql, x.D521.CreateSql);
+            //                    if (x.D81 != null) Set(sql, x.D81.CreateSql);
+            //                });
+            //            }
+
+            //            if (pack.StationDatas != null && pack.StationDatas.Datas.Any())
+            //            {
+            //                Parallel.ForEach(pack.StationDatas.Datas, x =>
+            //                {
+            //                    if (x.D520 != null) Set(sql, x.D520.CreateSql);
+            //                    if (x.D521 != null) Set(sql, x.D521.CreateSql);
+            //                    if (x.D523 != null) Set(sql, x.D523.CreateSql);
+            //                    if (x.D90 != null) Set(sql, x.D90.CreateSql);
+            //                    if (x.D91 != null) Set(sql, x.D91.CreateSql);
+            //                    if (x.D80 != null) Set(sql, x.D80.CreateSql);
+            //                    if (x.D81 != null) Set(sql, x.D81.CreateSql);
+            //                    if (x.D83 != null) Set(sql, x.D83.CreateSql);
+            //                    if (x.D524 != null) Set(sql, x.D524.CreateSql);
+            //                    if (x.D525 != null) Set(sql, x.D525.CreateSql);
+            //                    if (x.D530 != null) Set(sql, x.D530.CreateSql);
+            //                    if (x.D5531 != null) Set(sql, x.D5531.CreateSql);
+            //                    if (x.DR530 != null) Set(sql, x.DR530.CreateSql);
+            //                    if (x.DR531 != null) Set(sql, x.DR531.CreateSql);
+            //                });
+            //            }
+
+            //            if (pack.RobotData != null && pack.RobotData.Datas.Any())
+            //            {
+            //                Parallel.ForEach(pack.RobotData.Datas, x =>
+            //                {
+            //                    if (x.D520 != null) Set(sql, x.D520.CreateSql);
+            //                    if (x.D521 != null) Set(sql, x.D521.CreateSql);
+            //                    if (x.D522 != null) Set(sql, x.D522.CreateSql);
+            //                });
+            //            }
+
+            //            if (pack.TrussData != null && pack.TrussData.Datas.Any())
+            //            {
+            //                Parallel.ForEach(pack.TrussData.Datas, x =>
+            //                {
+            //                    if (x.D520 != null) Set(sql, x.D520.CreateSql);
+            //                    if (x.D521 != null) Set(sql, x.D521.CreateSql);
+            //                    if (x.D523 != null) Set(sql, x.D523.CreateSql);
+            //                });
+            //            }
+
+            //            sw3.Stop();
+            //            World.Log($"转换SQL耗时:{sw3.ElapsedMilliseconds}");
+
+            //            var sw4 = new Stopwatch();
+            //            sw4.Start();
+            //            var sqlText = sql.ToString();
+            //            db.Ado.ExecuteCommand(sql.ToString());
+            //            sw4.Stop();
+            //            World.Log($"执行SQL耗时:{sw4.ElapsedMilliseconds}");
+            //        }
+            //        catch (Exception e)
+            //        {
+            //            World.Log($"数据采集错误1:{e.StackTrace}"); Console.WriteLine(e);
+            //        }
+            //    });
+            //    sw2.Stop();
+            //    World.Log($"数据保存数据库总耗时间:{sw2.ElapsedMilliseconds}");
+            //}
+            //catch (Exception e)
+            //{
+            //    World.Log($"数据采集错误:{e.StackTrace}");
+            //}
+            //sw.Stop();
+            //World.Log($"数据采集总耗时:{sw.ElapsedMilliseconds}");
         }
 
         public void Set(StringBuilder sql, string cSql)

+ 54 - 57
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/桁架分流点.cs

@@ -125,6 +125,9 @@ namespace WCS.WorkEngineering.Systems
             if (devCode == 0)
             {
                 World.Log($"无可用线体:{taskInfo.ID}");
+                //找一个当前时间最早且已超过25分钟未码垛的码垛信息半托入库
+
+
                 return false;
             }
             var result = false;
@@ -142,70 +145,64 @@ namespace WCS.WorkEngineering.Systems
                 if (result) continue;
 
                 //未结束且包含当前物料编号的层,按层号排序,层号小的优先分配
-                var layers = palletizing.Layers.Where(x => x is { IsEmpty: false, Finish: false })
+                var layer = palletizing.Layers.Where(x => x is { IsEmpty: false, Finish: false })
+                    .Where(x => x.MatCodeList.Contains(taskInfo.MatCode)).MinBy(x => x.LayerNo);
+
+                //未找到可用层,进入下一次迭代
+                if (layer == null) continue;
+                // 当前任务已经分配结束,进入下一次迭代
+
+                //未结束,未预分配缓存线信息且包含当前物料编号的行,行号小的优先分配
+                var rows = layer.Rows.Where(x => x is { IsEmpty: false, Finish: false })
+                    .Where(x => x.CacheLineId == 0)
                     .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
-                    .OrderBy(x => x.LayerNo)
                     .ToList();
+                //未找到可用行,进入下一次迭代
+                if (!rows.Any()) continue;
+                var palletizingRow = rows.MinBy(x => x.RowNo);
 
-                //未找到可用层,进入下一次迭代
-                if (!layers.Any()) continue;
-                foreach (var layer in layers)
+                //开始初始化缓存位信息
+                cacheLine = new WCS_CacheLine()
                 {
-                    //当前任务已经分配结束,进入下一次迭代
-                    if (result) continue;
-
-                    //未结束,未预分配缓存线信息且包含当前物料编号的行,行号小的优先分配
-                    var rows = layer.Rows.Where(x => x is { IsEmpty: false, Finish: false })
-                        .Where(x => x.CacheLineId == 0)
-                        .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
-                        .ToList();
-                    //未找到可用行,进入下一次迭代
-                    if (!rows.Any()) continue;
-                    var palletizingRow = rows.MinBy(x => x.RowNo);
-
-                    //开始初始化缓存位信息
-                    cacheLine = new WCS_CacheLine()
+                    LocationNo = devCode,
+                    AddTime = DateTime.Now,
+                    PalletizingRowId = palletizingRow.Id,
+                    InStock = false,
+                    Put = false,
+                    IsTruss = false,
+                    MatCodeList = palletizingRow.MatCodeList,
+                    Quantity = palletizingRow.QtyMaxCount,
+                    WarehouseCode = taskInfo.WarehouseCode
+                };
+
+                var res = db.Insertable(cacheLine).ExecuteReturnEntity();
+                palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
+                palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
+                palletizingRow.CacheLineId = res.Id;
+                palletizingRow.EditTime = DateTime.Now;
+                db.Updateable(palletizingRow).ExecuteCommand();
+
+                for (var i = 0; i < palletizingRow.Locs.Count; i++)
+                {
+                    var loc = new WCS_CacheLineLoc()
                     {
-                        LocationNo = devCode,
-                        AddTime = DateTime.Now,
-                        PalletizingRowId = palletizingRow.Id,
-                        InStock = false,
-                        Put = false,
-                        IsTruss = false,
-                        MatCodeList = palletizingRow.MatCodeList,
-                        Quantity = palletizingRow.QtyMaxCount,
-                        WarehouseCode = taskInfo.WarehouseCode
+                        XYNo = palletizingRow.Locs[i].XYNo,
+                        InStock = i == 0,
+                        IsEmpty = palletizingRow.Locs[i].IsEmpty,
+                        MatCode = palletizingRow.Locs[i].MatCode,
+                        TaskId = i == 0 ? taskInfo.ID : 0,
+                        CacheLineId = res.Id
                     };
-
-                    var res = db.Insertable(cacheLine).ExecuteReturnEntity();
-                    palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
-                    palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
-                    palletizingRow.CacheLineId = res.Id;
-                    palletizingRow.EditTime = DateTime.Now;
-                    db.Updateable(palletizingRow).ExecuteCommand();
-
-                    for (var i = 0; i < palletizingRow.Locs.Count; i++)
-                    {
-                        var loc = new WCS_CacheLineLoc()
-                        {
-                            XYNo = palletizingRow.Locs[i].XYNo,
-                            InStock = i == 0,
-                            IsEmpty = palletizingRow.Locs[i].IsEmpty,
-                            MatCode = palletizingRow.Locs[i].MatCode,
-                            TaskId = i == 0 ? taskInfo.ID : 0,
-                            CacheLineId = res.Id
-                        };
-                        db.Insertable(loc).ExecuteCommand();
-                    }
-
-                    taskInfo.Status = TaskStatus.FinishOfShunt;
-                    taskInfo.AddrNext = devCode.ToString();
-                    taskInfo.EditWho = "WCS";
-                    taskInfo.EditTime = DateTime.Now;
-                    db.Updateable(taskInfo).ExecuteCommand();
-                    taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-                    result = true;
+                    db.Insertable(loc).ExecuteCommand();
                 }
+
+                taskInfo.Status = TaskStatus.FinishOfShunt;
+                taskInfo.AddrNext = devCode.ToString();
+                taskInfo.EditWho = "WCS";
+                taskInfo.EditTime = DateTime.Now;
+                db.Updateable(taskInfo).ExecuteCommand();
+                taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
+                result = true;
             }
 
             if (!result)

+ 28 - 9
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架.cs

@@ -7,6 +7,7 @@ using WCS.Entity;
 using WCS.Entity.Protocol.Station;
 using WCS.Entity.Protocol.Truss;
 using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.Worlds;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 
@@ -37,23 +38,30 @@ namespace WCS.WorkEngineering.Systems
                 {
                     var db = _db.Default;
                     List<int> ids = new List<int>() { obj.Data2.PalletizingRowId1, obj.Data2.PalletizingRowId2 };
-                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.CacheLine, c => c.Locations).Includes(x => x.Locs).Where(x => ids.Contains(x.Id)).ToList();
+                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.CacheLine, c => c.Locations)
+                                                                                                .Includes(x => x.Locs)
+                                                                                                .Includes(x => x.Palletizing).Where(x => ids.Contains(x.Id)).ToList();
+                    List<WCS_CacheLine> deleteCacheLine = new List<WCS_CacheLine>();
+                    List<WCS_PalletizingRow> upDateableRow = new List<WCS_PalletizingRow>();
+                    List<WCS_PalletizingLoc> upDateableLoc = new List<WCS_PalletizingLoc>();
+                    List<WCS_CacheLineLoc> deleteLoc = new List<WCS_CacheLineLoc>();
                     //更新行数据
-                    foreach (var pr in palletizingRow)
+                    foreach (var row in palletizingRow)
                     {
-                        var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == pr.CacheLine.Id);
+                        var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == row.CacheLine.Id);
                         //先更新对应的位信息
                         try
                         {
                             var index = 0;
-                            foreach (var loc in pr.Locs.Where(x => !x.IsEmpty).OrderBy(x => x.XYNo))
+                            foreach (var loc in row.Locs.Where(x => !x.IsEmpty).OrderBy(x => x.XYNo))
                             {
                                 var cacheLoc = cacheLine.Locations[index];
                                 cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
                                 loc.TaskId = cacheLoc.TaskId;
                                 loc.Finish = true;
-                                db.Updateable(loc).ExecuteCommand();
-                                db.Deleteable(cacheLoc);
+
+                                upDateableLoc.Add(loc);
+                                deleteLoc.Add(cacheLoc);
                                 index++;
                             }
                         }
@@ -62,16 +70,27 @@ namespace WCS.WorkEngineering.Systems
                             Console.WriteLine(a);
                             throw;
                         }
-                        pr.Finish = true;
-                        db.Updateable(pr).ExecuteCommand();
-                        db.Deleteable(cacheLine).ExecuteCommand();
+                        row.Finish = true;
+                        upDateableRow.Add(row);
+                        deleteCacheLine.Add(cacheLine);
                     }
                     //更新层数据
                     var layerId = palletizingRow.FirstOrDefault().PalletizingLayerId;
                     var layer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows).Single(x => x.Id == layerId);
                     if (!layer.Rows.All(x => x.Finish)) return;
                     layer.Finish = true;
+
+                    db.Updateable(upDateableLoc).ExecuteCommand();
+                    db.Deleteable(deleteLoc).ExecuteCommand();
+                    db.Updateable(upDateableRow).ExecuteCommand();
+                    db.Deleteable(deleteCacheLine).ExecuteCommand();
                     db.Updateable(layer).ExecuteCommand();
+
+                    //码垛完成后开始绑定托盘
+                    var palletizing = upDateableRow.First().Palletizing;
+                    var taskId = upDateableRow.SelectMany(x => x.Locs).Select(x => x.TaskId).ToList();
+                    var taskList = db.Queryable<WCS_TaskInfo>().Where(x => taskId.Any(t => t == x.ID)).Select(x => x.BarCode).ToList();
+                    var res = WmsApi.BingPallet(palletizing.PalleCode, taskList, palletizing.WarehouseCode, palletizing.PalletizingStation);
                 });
 
                 obj.Data.CmdType = 1;

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛半托入库.cs

@@ -54,7 +54,7 @@ namespace WCS.WorkEngineering.Systems.桁架码垛
                     if (obj.Data5.CmdType.HasFlag(TrussCmdType.End1))
                     {
                         //开始绑盘
-                        WmsApi.BingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code, true, "强制码垛结束");
+                        WmsApi.BingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
                     }
                     else
                     {

+ 8 - 16
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs

@@ -51,27 +51,19 @@ namespace WCS.WorkEngineering.Systems
                 var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == palletizing.PalleCode && x.Type == TaskType.EnterDepot && x.Status == TaskStatus.WaitingToExecute);
                 if (taskInfo == null)
                 {
-                    if (obj.Data5.CmdType.HasFlag(TrussCmdType.End1))
-                    {
-                        //开始绑盘
-                        WmsApi.BingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code, true, "强制码垛结束");
-                    }
-                    else
-                    {
-                        //开始绑盘
-                        WmsApi.BingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
-                    }
+                    if (obj.Data5.CmdType.HasFlag(TrussCmdType.End1)) WmsApi.ForceFinishBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
+                    else WmsApi.FinishBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
                     return;
                 }
                 if (taskInfo.Status != TaskStatus.WaitingToExecute) return;
 
-                foreach (var item in taskList)
+                Parallel.ForEach(taskList, x =>
                 {
-                    item.Status = TaskStatus.Finish;
-                    item.EndTime = DateTime.Now;
-                    db.Updateable(item).ExecuteCommand();
-                    item.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
-                }
+                    x.Status = TaskStatus.Finish;
+                    x.EndTime = DateTime.Now;
+                    db.Updateable(x).ExecuteCommand();
+                    x.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
+                });
 
                 palletizing.Finish = true;
                 db.Updateable(palletizing).ExecuteCommand();

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/环形库码垛结束.cs

@@ -51,7 +51,7 @@ namespace WCS.WorkEngineering.Systems.环形库
                     //开始获取当前位置的空托盘搬运任务信息
                     var cbrCode = db.Queryable<WCS_TaskInfo>().First(x => x.Status == TaskStatus.RgvCompleted && x.AddrTo == obj.Entity.Code);
                     //开始绑盘
-                    WmsApi.BingPallet(cbrCode.BarCode, tasks.Select(x => x.BarCode).ToList(), obj.Entity.Code.GetWareCode(), obj.Entity.Code);
+                    WmsApi.FinishBingPallet(cbrCode.BarCode, tasks.Select(x => x.BarCode).ToList(), obj.Entity.Code.GetWareCode(), obj.Entity.Code);
                     return;
                 }
 

+ 38 - 3
业务工程/分拣库/WCS.WorkEngineering/WebApi/Controllers/WmsApi.cs

@@ -372,6 +372,39 @@ namespace WCS.WorkEngineering.WebApi.Controllers
             return res;
         }
 
+        /// <summary>
+        ///  正常结盘
+        /// </summary>
+        /// <param name="palletCode"></param>
+        /// <param name="taskCodes"></param>
+        /// <param name="warehouseCode"></param>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        /// <exception cref="KnownException"></exception>
+        public static SRes FinishBingPallet(string palletCode, List<string> taskCodes, string warehouseCode, string loc) => BingPallet(palletCode, taskCodes, warehouseCode, loc, false, "", true, false);
+
+        /// <summary>
+        ///  需要二次绑盘的结盘
+        /// </summary>
+        /// <param name="palletCode"></param>
+        /// <param name="taskCodes"></param>
+        /// <param name="warehouseCode"></param>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        /// <exception cref="KnownException"></exception>
+        public static SRes SecondaryBingPallet(string palletCode, List<string> taskCodes, string warehouseCode, string loc) => BingPallet(palletCode, taskCodes, warehouseCode, loc, false, "二次绑盘", true, true);
+
+        /// <summary>
+        ///  异常结盘
+        /// </summary>
+        /// <param name="palletCode"></param>
+        /// <param name="taskCodes"></param>
+        /// <param name="warehouseCode"></param>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        /// <exception cref="KnownException"></exception>
+        public static SRes ForceFinishBingPallet(string palletCode, List<string> taskCodes, string warehouseCode, string loc) => BingPallet(palletCode, taskCodes, warehouseCode, loc, true, "强制码垛结束", true, false);
+
         /// <summary>
         ///  绑盘
         /// </summary>
@@ -381,7 +414,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <param name="loc"></param>
         /// <returns></returns>
         /// <exception cref="KnownException"></exception>
-        public static SRes BingPallet(string palletCode, List<string> taskCodes, string warehouseCode, string loc) => BingPallet(palletCode, taskCodes, warehouseCode, loc, false, "");
+        public static SRes BingPallet(string palletCode, List<string> taskCodes, string warehouseCode, string loc) => BingPallet(palletCode, taskCodes, warehouseCode, loc, false, "", false, false);
 
         /// <summary>
         ///  绑盘
@@ -394,7 +427,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <param name="failReason"></param>
         /// <returns></returns>
         /// <exception cref="KnownException"></exception>
-        public static SRes BingPallet(string palletCode, List<string> taskCodes, string warehouseCode, string loc, bool isFail, string failReason)
+        public static SRes BingPallet(string palletCode, List<string> taskCodes, string warehouseCode, string loc, bool isFail, string failReason, bool isFinish, bool isItHalf)
         {
             var res = APICaller.CallApi<SRes>(WmsUrl + "/api/FJ/BingPallet", new FJBingPalletRequest
             {
@@ -403,7 +436,9 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                 WarehouseCode = warehouseCode,
                 loc = loc,
                 IsFail = isFail,
-                FailReason = failReason
+                FailReason = failReason,
+                IsFinish = isFinish,
+                IsItHalf = isItHalf
             });
             if (res.ResCode != ResponseStatusCodeEnum.Sucess)
             {

+ 10 - 0
业务工程/分拣库/WCS.WorkEngineering/WebApi/Models/WMS/Request/FJBingPalletRequest.cs

@@ -38,5 +38,15 @@ namespace WCS.WorkEngineering.WebApi.Models.WMS.Request
         ///  异常原因
         /// </summary>
         public string FailReason { get; set; }
+
+        /// <summary>
+        ///  是否结束
+        /// </summary>
+        public bool IsFinish { get; set; }
+
+        /// <summary>
+        ///  是否为半跺入库
+        /// </summary>
+        public bool IsItHalf { get; set; }
     }
 }

+ 159 - 85
业务工程/分拣库/WCS.WorkEngineering/数据采集.cs

@@ -1,4 +1,5 @@
 using FreeRedis;
+using ServiceCenter.Extensions;
 using System.ComponentModel;
 using System.Diagnostics;
 using WCS.Core;
@@ -17,7 +18,7 @@ namespace WCS.WorkEngineering.Systems
         {
             var gs = Device.All.SelectMany(v => v.Protocols.Select(d => new { DB = $"{d.Value.DBInfo.No}:{d.Value.DBInfo.PLCInfo.IP}", d.Value.Position, TypeStr = d.Key, Dev = v }))
                  .GroupBy(v => v.DB);
-            foreach (var g in gs)
+            foreach (var g in gs.Where(x => !x.Key.Contains("10.30.37.211")))
             {
                 var min = g.OrderBy(v => v.Position).First();
                 var max = g.OrderByDescending(v => v.Position).First();
@@ -41,87 +42,13 @@ namespace WCS.WorkEngineering.Systems
             var ps = pack.GetType().GetProperties();
             foreach (var p in ps)
             {
-                if (!p.PropertyType.IsClass) continue;
-                var prs = p.PropertyType.GetProperties();
-                foreach (var pr in prs)
+                if (!p.PropertyType.IsArray)
+                    continue;
+                var dev = p.PropertyType.GetElementType();
+                if (dev.GetInterfaces().Any(v => v.GetInterfaces().Any(d => d.Name == "IProtocol")))
                 {
-                    if (!pr.PropertyType.IsArray) continue;
-                    var yt = pr.PropertyType.GetElementType();
-                    if (yt.IsClass)
-                    {
-                        var pros = yt.GetProperties();
-                        foreach (var pro in pros)
-                        {
-                            if (pro.PropertyType == typeof(DateTime)) continue;
-                            if (pro.PropertyType != typeof(string))
-                            {
-                                var protType = GetProtocolType(pro.PropertyType);
-                                var dev = Device.All
-                                    .Where(v => v.HasProtocol(protType)).Select(v =>
-                                    {
-                                        try
-                                        {
-                                            var obj = Activator.CreateInstance(pro.PropertyType);
-                                            pro.PropertyType.GetProperty("Code").SetValue(obj, v.Code);
-                                            var value = v.Protocol(protType, World).Copy(pro);
-                                            t.GetProperty("Data").SetValue(obj, value);
-                                            return obj;
-                                        }
-                                        catch (Exception ex)
-                                        {
-                                            return null;
-                                        }
-                                    }).First(v => v != null);
-
-                                var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
-                                m = m.MakeGenericMethod(yt);
-                                var arr2 = m.Invoke(null, new object[] { dev });
-
-                                m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
-                                m = m.MakeGenericMethod(yt);
-                                var arr3 = m.Invoke(null, new object[] { arr2 });
-                                p.SetValue(pack, arr3);
-                            }
-                            else
-                            {
-                            }
-                        }
-
-                        //var entType = yt.GetGenericArguments()[0];
-                        //var protType = GetProtocolType(entType);
-                        //var arr = Device.All.Where(v => v.HasProtocol(protType))
-                        //    .Select(v =>
-                        //    {
-                        //        try
-                        //        {
-                        //            var obj = Activator.CreateInstance(yt);
-                        //            yt.GetProperty("Code").SetValue(obj, v.Code);
-                        //            //var value = v.Protocol(protType, World).Copy(entType);
-                        //            //t.GetProperty("Data").SetValue(obj, value);
-                        //            return obj;
-                        //        }
-                        //        catch (Exception ex)
-                        //        {
-                        //            return null;
-                        //        }
-                        //    }).Where(v => v != null).ToArray();
-
-                        //var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
-                        //m = m.MakeGenericMethod(yt);
-                        //var arr2 = m.Invoke(null, new object[] { arr });
-
-                        //m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
-                        //m = m.MakeGenericMethod(yt);
-                        //var arr3 = m.Invoke(null, new object[] { arr2 });
-                        //p.SetValue(pack, arr3);
-                    }
-                }
-
-                var t = p.PropertyType.GetElementType();
-                if (t.IsGenericType)
-                {
-                    var entType = t.GetGenericArguments()[0];
-                    var protType = GetProtocolType(entType);
+                    var t = p.PropertyType.GetElementType();
+                    var protType = GetProtocolType(t);
                     var arr = Device.All.Where(v => v.HasProtocol(protType))
                     .Select(v =>
                     {
@@ -129,7 +56,7 @@ namespace WCS.WorkEngineering.Systems
                         {
                             var obj = Activator.CreateInstance(t);
                             t.GetProperty("Code").SetValue(obj, v.Code);
-                            //var value = v.Protocol(protType, World).Copy(entType);
+                            var value = v.Protocol(protType, World).Copy(t);
                             //t.GetProperty("Data").SetValue(obj, value);
                             return obj;
                         }
@@ -150,12 +77,159 @@ namespace WCS.WorkEngineering.Systems
                 }
             }
 
-            //Redis.RPush("Packs", pack);
-            //if (Redis.LLen("Packs") > 50000)
+            Redis.RPush("Packs", pack);
+            if (Redis.LLen("Packs") > 50000)
+            {
+                Redis.LTrim("Packs", 5000, -1);
+            }
+
+            sw.Stop();
+            list.Add(new WorkTimes { Total = sw.ElapsedMilliseconds, Key = "采集数据" });
+            //var sw = new Stopwatch();
+            //sw.Start();
+            //var pack = new DeviceDataPack();
+            //pack.Frame = DateTime.Now;
+            //var ps = pack.GetType().GetProperties();
+            //foreach (var p in ps)
             //{
-            //    Redis.LTrim("Packs", 5000, -1);
+            //    if (!p.PropertyType.IsClass) continue;
+
+            //    var packAct = Activator.CreateInstance(p.PropertyType);
+            //    var prs = p.PropertyType.GetProperties();
+            //    foreach (var pr in prs)
+            //    {
+            //        if (!pr.PropertyType.IsArray) continue;
+
+            //        var yt = pr.PropertyType.GetElementType();
+            //        if (yt.IsClass)
+            //        {
+            //            var pros = yt.GetProperties();
+            //            //var entType = yt.GetGenericArguments()[0];
+            //            //var protType = GetProtocolType(entType);
+            //            var dataAct = Activator.CreateInstance(yt);
+            //            Parallel.ForEach(pros, pro =>
+            //            {
+            //                try
+            //                {
+            //                    if (pro.PropertyType != typeof(DateTime))
+            //                    {
+            //                        if (pro.PropertyType != typeof(string))
+            //                        {
+            //                            var protType = GetProtocolType(pro.PropertyType);
+            //                            var dev = Device.All
+            //                                .Where(v => v.HasProtocol(protType)).Select(v =>
+            //                                {
+            //                                    try
+            //                                    {
+            //                                        var obj = Activator.CreateInstance(pro.PropertyType);
+            //                                        pro.PropertyType.GetProperty("Code").SetValue(obj, v.Code);
+            //                                        var a = v.Protocol(protType, World);
+            //                                        var value = v.Protocol(protType, World).Copy(pro.PropertyType);
+            //                                        pro.SetValue(obj, value);
+            //                                        return obj;
+            //                                    }
+            //                                    catch (Exception ex)
+            //                                    {
+            //                                        return null;
+            //                                    }
+            //                                }).FirstOrDefault(v => v != null);
+
+            //                            if (dev != null)
+            //                            {
+            //                                pro.SetValue(dataAct, dev);
+            //                            }
+            //                        }
+            //                        else
+            //                        {
+            //                        }
+            //                    }
+            //                }
+            //                catch (Exception e)
+            //                {
+            //                    Console.WriteLine(e);
+            //                }
+            //            });
+
+            //            var a = 1;
+
+            //            //var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
+            //            //m = m.MakeGenericMethod(yt);
+            //            //var arr2 = m.Invoke(null, new object[] { datasAct });
+
+            //            //m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
+            //            //m = m.MakeGenericMethod(yt);
+            //            //var arr3 = m.Invoke(null, new object[] { arr2 });
+            //            //p.SetValue(pack, arr3);
+
+            //            //var entType = yt.GetGenericArguments()[0];
+            //            //var protType = GetProtocolType(entType);
+            //            //var arr = Device.All.Where(v => v.HasProtocol(protType))
+            //            //    .Select(v =>
+            //            //    {
+            //            //        try
+            //            //        {
+            //            //            var obj = Activator.CreateInstance(yt);
+            //            //            yt.GetProperty("Code").SetValue(obj, v.Code);
+            //            //            //var value = v.Protocol(protType, World).Copy(entType);
+            //            //            //t.GetProperty("Data").SetValue(obj, value);
+            //            //            return obj;
+            //            //        }
+            //            //        catch (Exception ex)
+            //            //        {
+            //            //            return null;
+            //            //        }
+            //            //    }).Where(v => v != null).ToArray();
+
+            //            //var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
+            //            //m = m.MakeGenericMethod(yt);
+            //            //var arr2 = m.Invoke(null, new object[] { arr });
+
+            //            //m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
+            //            //m = m.MakeGenericMethod(yt);
+            //            //var arr3 = m.Invoke(null, new object[] { arr2 });
+            //            //p.SetValue(pack, arr3);
+            //        }
+            //    }
+
+            //    //var t = p.PropertyType.GetElementType();
+            //    //if (t.IsGenericType)
+            //    //{
+            //    //    var entType = t.GetGenericArguments()[0];
+            //    //    var protType = GetProtocolType(entType);
+            //    //    var arr = Device.All.Where(v => v.HasProtocol(protType))
+            //    //    .Select(v =>
+            //    //    {
+            //    //        try
+            //    //        {
+            //    //            var obj = Activator.CreateInstance(t);
+            //    //            t.GetProperty("Code").SetValue(obj, v.Code);
+            //    //            //var value = v.Protocol(protType, World).Copy(entType);
+            //    //            //t.GetProperty("Data").SetValue(obj, value);
+            //    //            return obj;
+            //    //        }
+            //    //        catch (Exception ex)
+            //    //        {
+            //    //            return null;
+            //    //        }
+            //    //    }).Where(v => v != null).ToArray();
+
+            //    //    var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
+            //    //    m = m.MakeGenericMethod(t);
+            //    //    var arr2 = m.Invoke(null, new object[] { arr });
+
+            //    //    m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
+            //    //    m = m.MakeGenericMethod(t);
+            //    //    var arr3 = m.Invoke(null, new object[] { arr2 });
+            //    //    p.SetValue(pack, arr3);
+            //    //}
             //}
 
+            ////Redis.RPush("Packs", pack);
+            ////if (Redis.LLen("Packs") > 50000)
+            ////{
+            ////    Redis.LTrim("Packs", 5000, -1);
+            ////}
+
             //sw.Stop();
             //list.Add(new WorkTimes { Total = sw.ElapsedMilliseconds, Key = "采集数据" });
         }