林豪 左 há 3 anos atrás
pai
commit
4485c8fd1c
33 ficheiros alterados com 337 adições e 2912 exclusões
  1. 4 4
      DBHelper-SqlSugar/DB.cs
  2. 5 1
      DBHelper-SqlSugar/DBHelper-SqlSugar.csproj
  3. 24 12
      Projects/永冠OPP/WCS.Service/DeviceExtentions.cs
  4. 10 226
      Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs
  5. 8 23
      Projects/永冠OPP/WCS.Service/Extensions/TaskExtension.cs
  6. 4 4
      Projects/永冠OPP/WCS.Service/Extensions/WCS_TaskExtensions.cs
  7. 7 8
      Projects/永冠OPP/WCS.Service/Handlers/DataClearHandler.cs
  8. 2 2
      Projects/永冠OPP/WCS.Service/Handlers/UploadHandler.cs
  9. 4 4
      Projects/永冠OPP/WCS.Service/Handlers/WorkHandler.cs
  10. 9 11
      Projects/永冠OPP/WCS.Service/Helpers/LogHelper.cs
  11. 4 6
      Projects/永冠OPP/WCS.Service/Helpers/SystemConfigHelpers.cs
  12. 6 6
      Projects/永冠OPP/WCS.Service/Uploader.cs
  13. 8 8
      Projects/永冠OPP/WCS.Service/WCS.Service.csproj
  14. 12 14
      Projects/永冠OPP/WCS.Service/WebApi/APICaller.cs
  15. 23 34
      Projects/永冠OPP/WCS.Service/WebApi/WCSApi.cs
  16. 16 22
      Projects/永冠OPP/WCS.Service/WebApi/WMS/WMS.cs
  17. 17 2
      Projects/永冠OPP/WCS.Service/Worker.cs
  18. 2 355
      Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs
  19. 1 372
      Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs
  20. 2 264
      Projects/永冠OPP/WCS.Service/Works/Station/BOPP入库.cs
  21. 4 313
      Projects/永冠OPP/WCS.Service/Works/Station/一楼入库.cs
  22. 1 169
      Projects/永冠OPP/WCS.Service/Works/Station/一楼出库.cs
  23. 4 442
      Projects/永冠OPP/WCS.Service/Works/Station/涂布入库.cs
  24. 2 480
      Projects/永冠OPP/WCS.Service/Works/Station/涂布出库.cs
  25. 1 1
      Projects/永冠OPP/WCS.Service/appsettings.json
  26. 8 1
      WCS Pedestal.sln
  27. 25 11
      WCS.Entity/OBJ.cs
  28. 12 14
      WCS.Entity/WCS_CMD.cs
  29. 19 20
      WCS.Entity/WCS_DATABLOCK.cs
  30. 21 41
      WCS.Entity/WCS_DEVICE.cs
  31. 27 0
      WCS.Entity/WCS_DEVICEPROTOCOL.cs
  32. 18 28
      WCS.Entity/WCS_PLC.cs
  33. 27 14
      WCS.Entity/WCS_ROUTE.cs

+ 4 - 4
DBHelper-SqlSugar/DB.cs

@@ -15,7 +15,7 @@ namespace DBHelper_SqlSugar
         /// <summary>
         /// 上下文集合
         /// </summary>
-        private readonly List<ContextList> _contexts = new List<ContextList>();
+        private static List<ContextList> _contexts = new List<ContextList>();
 
         /// <summary>
         /// 默认上下文类类型
@@ -78,14 +78,14 @@ namespace DBHelper_SqlSugar
         /// </summary>
         /// <param name="type"></param>
         /// <returns></returns>
-        public SqlSugarClient CreateContext(ConnectionConfig config, string key)
+        public static SqlSugarClient CreateContext(ConnectionConfig config, string key)
         {
             var ctx = _contexts.FirstOrDefault(v => v.Key == key);
             if (ctx != null) return ctx.Client;
             ctx = new ContextList(key, new SqlSugarClient(new ConnectionConfig()
             {
-                ConnectionString = "连接符字串",
-                DbType = DbType.SqlServer,
+                ConnectionString = config.ConnectionString,
+                DbType = config.DbType,
                 IsAutoCloseConnection = true
             }), config);
 

+ 5 - 1
DBHelper-SqlSugar/DBHelper-SqlSugar.csproj

@@ -4,11 +4,15 @@
     <TargetFramework>netstandard2.1</TargetFramework>
     <RootNamespace>DBHelper_SqlSugar</RootNamespace>
     <Nullable>enable</Nullable>
+    <Version>1.0.0.1</Version>
   </PropertyGroup>
 
   <ItemGroup>
     <PackageReference Include="Logs" Version="1.0.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.0.9.1" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\开源\Src\Asp.NetCore2\SqlSugar\SqlSugar.csproj" />
   </ItemGroup>
 
 </Project>

+ 24 - 12
Projects/永冠OPP/WCS.Service/DeviceExtentions.cs

@@ -1,4 +1,4 @@
-using DBHelper;
+using DBHelper_SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -147,17 +147,29 @@ namespace WCS.Service
 
     public static class TaskExtentions
     {
-        public static string AddrCurrent(this WCS_TASK source, DB db)
+        public static string AddrCurrent(this WCS_TASK source, Db db)
         {
-            var q = db.Default.Set<WCS_Station520>().Where(v => v.ISLAST && v.Tasknum == source.ID).Select(v => new { type = 1, v.DEVICE.CODE });
-            q = q.Union(db.Default.Set<WCS_RGV521>().Where(v => v.ISLAST && (v.TaskID_1 == source.ID || v.TaskID_2 == source.ID)).Select(v => new { type = 2, v.DEVICE.CODE }));
-            //q = q.Union(db.Default.Set<WCS_SC521>().Where(v => v.ISLAST && v.TaskID == source.ID).Select(v => new { type = 2, v.DEVICE.CODE }));
-            //q = q.Union(db.Default.Set<WCS_Robot>().Where(v => v.ISLAST && v.TaskID == source.ID).Select(v => new { type = 2, v.DEVICE.CODE }));
-
-            var res = q.OrderBy(v => v.type).FirstOrDefault();
-            if (res == null)
-                return "";
-            return res.CODE;
+            var q1 = db.Default.Queryable<WCS_Station520>().Where(v => v.ISLAST && v.Tasknum == source.ID).Select(v => new TemporaryModel
+            {
+                TYPE = 1,
+                CODE = v.DEVICE.CODE
+            });
+            var q2 = db.Default.Queryable<WCS_RGV521>().Where(v => v.ISLAST && (v.TaskID_1 == source.ID || v.TaskID_2 == source.ID)).Select(v => new TemporaryModel
+            {
+                TYPE = 2,
+                CODE = v.DEVICE.CODE
+            });
+            var q = db.Default.UnionAll(q1, q2);
+
+            var res = q.OrderBy(v => v.TYPE).First();
+            return res == null ? "" : res.CODE;
         }
     }
-}
+
+    public class TemporaryModel
+    {
+        public int TYPE { get; set; }
+
+        public string CODE { get; set; }
+    }
+}

+ 10 - 226
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -1,4 +1,4 @@
-using DBHelper;
+using Logs;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -6,7 +6,6 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Entity.Protocol.RGV;
-using WCS.Service.Helpers;
 
 namespace WCS.Service.Extensions
 {
@@ -18,11 +17,11 @@ namespace WCS.Service.Extensions
         /// <summary>
         /// 当前设备可用的RGV
         /// </summary>
-        private static List<RGVDevice> AllRGVList;
+        private static readonly List<RGVDevice> AllRgvList;
 
         static StationDeviceGroup()
         {
-            AllRGVList = Device.Where(v => v.IsRGV() && v.CODE != "RGV8").Select(v => v.Create<RGVDevice>()).ToList();
+            AllRgvList = Device.Where(v => v.IsRGV() && v.CODE != "RGV8").Select(v => v.Create<RGVDevice>()).ToList();
         }
 
         public StationDeviceGroup(WCS_DEVICE entity) : base(entity)
@@ -67,19 +66,7 @@ namespace WCS.Service.Extensions
         {
             get
             {
-                return AllRGVList.Where(v => v.LocationList.Any(p => p.Entity == Entity) && v.Data2.WorkMode != 0).ToList();
-            }
-        }
-
-        /// <summary>
-        /// 当前设备环穿组
-        /// </summary>
-        private List<StationLocation> LoncationList
-        {
-            get
-            {
-                var dev = StationLocation.ALLlocations.FirstOrDefault(v => v.Station == Entity.CODE);
-                return StationLocation.ALLlocations.Where(v => v.PLC == dev.PLC).ToList();
+                return AllRgvList.Where(v => v.LocationList.Any(p => p.Entity == Entity) && v.Data2.WorkMode != 0).ToList();
             }
         }
 
@@ -90,7 +77,7 @@ namespace WCS.Service.Extensions
         {
             get
             {
-                return StationLocation.ALLlocations.FirstOrDefault(v => v.Station == Entity.CODE).Location;
+                return StationLocation.ALLlocations.FirstOrDefault(v => v.Station == Entity.CODE)!.Location;
             }
         }
 
@@ -101,7 +88,7 @@ namespace WCS.Service.Extensions
         {
             get
             {
-                return StationLocation.ALLlocations.FirstOrDefault(v => v.Station == Entity.CODE).Length;
+                return StationLocation.ALLlocations.FirstOrDefault(v => v.Station == Entity.CODE)!.Length;
             }
         }
 
@@ -126,7 +113,7 @@ namespace WCS.Service.Extensions
         /// </summary>
         /// <param name="obj"></param>
         /// <returns></returns>
-        public List<Device<IStation520, IStation521, IStation523>> RGVGetTaskedDevice()
+        public List<Device<IStation520, IStation521, IStation523>> RgvGetTaskedDevice()
         {
             var a = Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Tasknum > 10000)
                         .Where(v => v.Entity.CODE.ToShort() != v.Data2.Goodsend && v.Data2.Goodsend != 0)
@@ -134,85 +121,13 @@ namespace WCS.Service.Extensions
             return a.Count == 0 ? null : a;
         }
 
-        /// <summary>
-        /// 入库位置获取需要生产任务的设备及条码信息
-        /// </summary>
-        /// <returns></returns>
-        public List<FinishTaskList<string>> GetBcrValid()
-        {
-            var list = new List<FinishTaskList<string>>();
-
-            //获取需要执行的设备信息
-            foreach (var dev in Items)
-            {
-                if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
-                {
-                    InfoLog.INFO_INFO($"{dev.Entity.CODE}--没有光电");
-                    continue;
-                }
-                if (dev.Data2.Request != IstationRequest.扫码入库)
-                {
-                    //InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有扫码入库请求--1", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
-                    continue;
-                };
-                if (dev.Data2.Tasknum > 10000)
-                {
-                    //InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求,但已有任务号", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
-                    continue;
-                }
-
-                var bcr = dev.Entity.BCR();
-                var barcode = bcr.Content.Trim('\r');
-                if (barcode == "")
-                {
-                    //InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--扫码失败,内容为空", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
-                    continue;
-                };
-
-                list.Add(new FinishTaskList<string>(barcode, dev.Entity.Create<StationDevice>()));
-            }
-            return list;
-        }
-
-        /// <summary>
-        /// 获取下一个地址的有效设备
-        /// </summary>
-        /// <returns></returns>
-        public List<FinishTaskList<string>> GetAddressValid()
-        {
-            var list = new List<FinishTaskList<string>>();
-
-            //获取需要执行的设备信息
-            foreach (var dev in Items)
-            {
-                if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
-                {
-                    InfoLog.INFO_INFO($"{dev.Entity.CODE}--没有光电");
-                    continue;
-                }
-                if (dev.Data2.Request != IstationRequest.请求分配目标地址)
-                {
-                    //InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
-                    continue;
-                };
-                if (dev.Data2.Tasknum < 10000)
-                {
-                    //InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
-                    continue;
-                }
-
-                list.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
-            }
-            return list;
-        }
-
         /// <summary>
         /// 最近的RGV
         /// </summary>
         /// <returns></returns>
-        public RGVDevice RecentRGV()
+        public RGVDevice RecentRgv()
         {
-            return RgvList.OrderBy(v => v.Distance(this)).FirstOrDefault();
+            return RgvList.MinBy(v => v.Distance(this));
         }
 
         /// <summary>
@@ -667,70 +582,6 @@ namespace WCS.Service.Extensions
         public void FinishedTaskHandle()
         {
             WCS_TASK task = new WCS_TASK();
-
-            DB.Do(db =>
-            {
-                var taskIds = new List<int>() { Data2.FinishedTask_1, Data2.FinishedTask_2 }.ToArray();
-
-                for (int i = 0; i < taskIds.Length; i++)
-                {
-                    //判断当前工位是否有完成任务
-                    if (taskIds[i] == 0) continue;
-                    task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
-                    if (task.STATUS != TaskStatus.堆垛机执行 && task.STATUS != TaskStatus.堆垛机完成)
-                    {
-                        //InfoLog.INFO_WarnDb($"任务{task.ID},状态位{task.STATUS}", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
-                        continue;
-                    };
-
-                    if (task.STATUS == TaskStatus.堆垛机完成)
-                    {
-                        if (i == 0) Data.FinishedACK_1 = 1;
-                        else Data.FinishedACK_2 = 1;
-                        throw new DoException("二次处理堆垛机完成任务");
-                    }
-
-                    if (task.TYPE == TaskType.入库)
-                    {
-                        task.ENDTIME = DateTime.Now;
-                        task.STATUS = TaskStatus.已完成;
-                        task.UPDATETIME = DateTime.Now;
-                    }
-                    else if (task.TYPE == TaskType.出库)
-                    {
-                        task.STATUS = TaskStatus.堆垛机完成;
-                        task.UPDATETIME = DateTime.Now;
-                    }
-                    else if (task.TYPE == TaskType.移库)
-                    {
-                        if (task.STATUS == TaskStatus.堆垛机执行)
-                        {
-                            task.STATUS = TaskStatus.已完成;
-                            task.UPDATETIME = DateTime.Now;
-                        }
-                    }
-                    else throw new Exception($"[{Entity.CODE}]任务类型错误,{task.ID}");
-
-                    task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机执行}]变更为[{task.STATUS}]", this.GetType());
-                }
-                db.Default.SaveChanges();
-            });
-
-            DB.Do(db =>
-            {
-                var taskIds = new List<int>() { Data2.FinishedTask_1, Data2.FinishedTask_2 }.ToArray();
-
-                for (int i = 0; i < taskIds.Length; i++)
-                {
-                    //判断当前工位是否有完成任务
-                    if (taskIds[i] == 0) continue;
-                    //获取当前工位的目标地址
-                    task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
-
-                    if (i == 0) Data.FinishedACK_1 = 1;
-                    else Data.FinishedACK_2 = 1;
-                }
-            });
         }
 
         /// <summary>
@@ -874,73 +725,6 @@ namespace WCS.Service.Extensions
         /// </summary>
         public void CheckOutTask()
         {
-            //检查同组堆垛机是否有正在执行出库任务的
-            DB.Do(db =>
-            {
-                try
-                {
-                    var srm = Device.Find("SRM4").Create<SRMDevice>();
-                    var task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM4" && v.TYPE == TaskType.出库);
-                    switch (Entity.CODE)
-                    {
-                        case "SRM3":
-                            if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM4" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM3正在执行出库任务");
-                            break;
-
-                        case "SRM4":
-                            srm = Device.Find("SRM3").Create<SRMDevice>();
-                            task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM3" && v.TYPE == TaskType.出库);
-                            if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM3" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM3正在执行出库任务");
-                            break;
-
-                        case "SRM5":
-                            srm = Device.Find("SRM6").Create<SRMDevice>();
-                            task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM6" && v.TYPE == TaskType.出库);
-                            if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM6" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM6正在执行出库任务");
-                            break;
-
-                        case "SRM6":
-                            srm = Device.Find("SRM5").Create<SRMDevice>();
-                            task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM5" && v.TYPE == TaskType.出库);
-                            if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM5" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM5正在执行出库任务");
-                            break;
-
-                        case "SRM7":
-                            srm = Device.Find("SRM8").Create<SRMDevice>();
-                            task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM8" && v.TYPE == TaskType.出库);
-                            if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM8" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM7正在执行出库任务");
-                            break;
-
-                        case "SRM8":
-                            srm = Device.Find("SRM7").Create<SRMDevice>();
-                            task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM7" && v.TYPE == TaskType.出库);
-                            if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM7" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM8正在执行出库任务");
-                            break;
-                    }
-                }
-                catch (Exception)
-                {
-                    //InfoLog.INFO_WarnDb(e.Message, Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
-                }
-            });
         }
     }
 
@@ -981,7 +765,7 @@ namespace WCS.Service.Extensions
             InfoLog.INFO_WARN($"[{Entity.CODE}]--{ex.Message}");
             if (ex.Message.Contains("The database operation was expected")) return;
 
-            LogHelper.AddWCS_EXCEPTION(ex.Message, Entity.CODE, WCS_EXCEPTIONTYPE.无.ToString());
+            Helpers.LogHelper.AddWCS_EXCEPTION(ex.Message, Entity.CODE, WCS_EXCEPTIONTYPE.无.ToString());
             //排除部分频繁触发的异常上报
             if (ex.Message.Contains("触发并发管控")) return;
 

+ 8 - 23
Projects/永冠OPP/WCS.Service/Extensions/TaskExtension.cs

@@ -1,10 +1,9 @@
-using DBHelper;
+using DBHelper_SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using WCS.Core;
 using WCS.Entity;
-using WCS.Entity.Protocol.SRM;
 using WCS.Service.Helpers;
 
 namespace WCS.Service.Extensions
@@ -86,10 +85,10 @@ namespace WCS.Service.Extensions
         /// <param name="tasks"></param>
         /// <param name="executable"></param>
         /// <param name="db"></param>
-        public static void ValidTaskCheck(this List<WCS_TASK> tasks, int executable, DB db)
+        public static void ValidTaskCheck(this List<WCS_TASK> tasks, int executable, Db db)
         {
             var task = tasks.FirstOrDefault();
-            var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == task.TaskGroupKey && v.TYPE == TaskType.入库);
+            var taskCount = db.Default.Queryable<WCS_TASK>().Count(v => v.TaskGroupKey == task.TaskGroupKey && v.TYPE == TaskType.入库);
             //开始检查任务数是否匹配
             if (executable != taskCount) throw new WarnException($"可执行数{executable},任务组任务数{taskCount},数量不匹配,{task.ID}-{task.TaskGroupKey}");
         }
@@ -100,34 +99,20 @@ namespace WCS.Service.Extensions
         /// <param name="tasks"></param>
         /// <param name="executable"></param>
         /// <param name="db"></param>
-        public static List<WCS_TASK> ValidTaskCheck(this List<FinishTaskList<string>> devs, DB db)
+        public static List<WCS_TASK> ValidTaskCheck(this List<FinishTaskList<string>> devs, Db db)
         {
             var taskIds = devs.Select(v => v.Station.Data2.Tasknum).ToList();
-            var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
+            var taskList = db.Default.Queryable<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
             var task = taskList.FirstOrDefault() ?? throw new WarnException($"ValidTaskCheck 无任务"); ;
-            var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == task.TaskGroupKey && v.TYPE == TaskType.入库);
+            var taskCount = db.Default.Queryable<WCS_TASK>().Count(v => v.TaskGroupKey == task.TaskGroupKey && v.TYPE == TaskType.入库);
             //开始检查任务数是否匹配
             if (devs.Count != taskCount) throw new WarnException($"可执行数{devs.Count},任务组任务数{taskCount},数量不匹配,{task.ID}-{task.TaskGroupKey}");
             return taskList;
         }
 
-        public static List<WCS_TASK> GetSrmValidTaskList(this IGrouping<string, WCS_TASK>[] taksList,SRMDevice srm, int index = 0)
+        public static List<WCS_TASK> GetSrmValidTaskList(this IGrouping<string, WCS_TASK>[] taksList, SRMDevice srm, int index = 0)
         {
             return taksList[index].ToList();
-            //if (!taksList.Any() || index > (taksList.Length - 1)) throw new DoException("无可执行出库任务");
-            //var outDepot = taksList[index];
-            //WCS_TASK task=null;
-            //DB.Do(db =>
-            //{
-            //    task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.STATUS == TaskStatus.新建 && v.ADDRTO == outDepot.Key && v.Priority > 0 && v.DEVICE != srm.Entity.CODE);
-            //});
-            //if (task == null) return outDepot.ToList(); // 没有优先
-            //var dev = Device.Find(task.DEVICE).Create<SRMDevice>();
-            //if (dev.Data2.SRMMode == SCMode.远程 && dev.Data2.SRMStatus == SCRunStatus.空闲)
-            //{
-            //    taksList.GetSrmValidTaskList(srm, index++);
-            //}
-            //return outDepot.ToList(); //优先任务对应的堆垛机没有空闲
         }
     }
 
@@ -171,4 +156,4 @@ namespace WCS.Service.Extensions
             Layer = addrFrom[2].ToShort();
         }
     }
-}
+}

+ 4 - 4
Projects/永冠OPP/WCS.Service/Extensions/WCS_TaskExtensions.cs

@@ -1,4 +1,4 @@
-using DBHelper;
+using DBHelper_SqlSugar;
 using System;
 using WCS.Entity;
 using WCS.Entity.Protocol;
@@ -13,7 +13,7 @@ namespace WCS.Service.Extensions
         /// <param name="task">对应任务</param>
         /// <param name="db">db链接, 没有从新构造一个db的原因是为了保证状态记录的增加与任务状态的变更是同步的</param>
         /// <param name="msg">需要记录的消息</param>
-        public static void CreateStatusLog(this WCS_TASK task, DB db, string msg, Type cl)
+        public static void CreateStatusLog(this WCS_TASK task, Db db, string msg, Type cl)
         {
             try
             {
@@ -27,7 +27,7 @@ namespace WCS.Service.Extensions
                     UPDATEUSER = "WCS",
                     msg = msg,
                 };
-                db.Default.Add(statusLog);
+                db.Default.Insertable(statusLog).ExecuteCommand();
             }
             catch (Exception e)
             {
@@ -35,4 +35,4 @@ namespace WCS.Service.Extensions
             }
         }
     }
-}
+}

+ 7 - 8
Projects/永冠OPP/WCS.Service/Handlers/DataClearHandler.cs

@@ -1,5 +1,4 @@
-using DBHelper;
-using Microsoft.EntityFrameworkCore;
+using DBHelper_SqlSugar;
 using System;
 using System.ComponentModel;
 using WCS.Core;
@@ -21,9 +20,9 @@ namespace WCS.Service
             if ((DateTime.Now - last).TotalMilliseconds < 1000 * 60 * 60 * 24)
                 return;
             last = DateTime.Now;
-            DB.Do(db =>
+            Db.Do(db =>
             {
-                db.Default.Database.ExecuteSqlRaw("delete WCS_EXCEPTION where datediff(dd,UPDATETIME,getdate())>7");
+                db.Default.Ado.UseStoredProcedure().ExecuteCommand("delete WCS_EXCEPTION where datediff(dd, UPDATETIME, getdate()) > 7");
 
                 var ps = db.Default.GetType().GetProperties();
                 foreach (var p in ps)
@@ -34,7 +33,7 @@ namespace WCS.Service
                     if (!tType.IsSubclassOf(typeof(WCS_PROTOCOLDATA)))
                         continue;
                     var sSql = $"Delete {tType.Name} where datediff(dd,Frame,getdate())>7";
-                    db.Default.Database.ExecuteSqlRaw(sSql);
+                    db.Default.Ado.UseStoredProcedure().ExecuteCommand(sSql);
                     DBHelper.DbLog.DB_CLEAN(sSql);
                 }
 
@@ -45,10 +44,10 @@ namespace WCS.Service
                                 ID,BARCODE,TYPE,STATUS,ADDRFROM,ADDRTO,ADDRNEXT,TUNNEL,FLOOR,DEVICE,SRMSTATION,CREATETIME,
                                 STARTTIME,ENDTIME,DOCID,PALLETTYPE,PRODLINE,FULLQTY,HEIGHT,WMSTASK,TaskGroupKey,UPLOADED,AgvTask,
                                 Priority,ManualRemarks,ENABLED,UPDATEUSER,UPDATETIME,Length,MaterialCode FROM WCS_TASK WHERE STATUS >=99 AND UPDATETIME < DATEADD(DAY, -3, GETDATE())";
-                db.Default.Database.ExecuteSqlRaw(copySql);
+                db.Default.Ado.UseStoredProcedure().ExecuteCommand(copySql);
                 var clearSql = "DELETE FROM WCS_TASK WHERE STATUS >=99 AND UPDATETIME < DATEADD(DAY, -3, GETDATE())";
-                db.Default.Database.ExecuteSqlRaw(clearSql);
+                db.Default.Ado.UseStoredProcedure().ExecuteCommand(clearSql);
             });
         }
     }
-}
+}

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

@@ -1,4 +1,4 @@
-using DBHelper;
+using DBHelper_SqlSugar;
 using System;
 using System.ComponentModel;
 using WCS.Core;
@@ -19,7 +19,7 @@ namespace WCS.Service.Handlers
             if ((DateTime.Now - last).TotalMilliseconds < 10000)
                 return;
             last = DateTime.Now;
-            DB.Do(Uploader.Upload);
+            Db.Do(Uploader.Upload);
         }
     }
 }

+ 4 - 4
Projects/永冠OPP/WCS.Service/Handlers/WorkHandler.cs

@@ -1,11 +1,11 @@
-using System;
+using Logs;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Reflection;
 using System.Threading.Tasks;
 using WCS.Core;
 using WCS.Entity;
-using WCS.Service.Helpers;
 
 namespace WCS.Service.Handlers
 {
@@ -113,7 +113,7 @@ namespace WCS.Service.Handlers
                 }
                 if (ex.RECORDDB)
                 {
-                    LogHelper.AddWCS_EXCEPTION(ex.Message, code, WCS_EXCEPTIONTYPE.无.ToString());
+                    Helpers.LogHelper.AddWCS_EXCEPTION(ex.Message, code, WCS_EXCEPTIONTYPE.无.ToString());
                 }
                 if (ex.REPORTWCS)
                 {
@@ -146,4 +146,4 @@ namespace WCS.Service.Handlers
             }
         }
     }
-}
+}

+ 9 - 11
Projects/永冠OPP/WCS.Service/Helpers/LogHelper.cs

@@ -1,8 +1,6 @@
-using DBHelper;
-using Microsoft.EntityFrameworkCore;
+using DBHelper_SqlSugar;
+using Logs;
 using System;
-using System.Linq;
-using WCS.Core;
 using WCS.Entity;
 
 namespace WCS.Service.Helpers
@@ -17,13 +15,13 @@ namespace WCS.Service.Helpers
         /// <param name="type">异常类型 关联WCS_EXCEPTIONTYPE枚举</param>
         public static void AddWCS_EXCEPTION(string msg, string device, string type)
         {
-            DB.Do(db =>
+            Db.Do(db =>
             {
-                var exp = db.Default.Set<WCS_EXCEPTION>()
-                    .Where(v => EF.Functions.DateDiffSecond(v.UPDATETIME, DateTime.Now) < 5)
+                var exp = db.Default.Queryable<WCS_EXCEPTION>()
+                    .Where("TIMESTAMPDIFF(SECOND, UPDATETIME, '@now') < 5", new { now = DateTime.Now })
                     .Where(v => v.MSG == msg)
                     .OrderByDescending(v => v.ID)
-                    .FirstOrDefault() ?? db.Default.Set<WCS_EXCEPTION>().Add(new WCS_EXCEPTION
+                    .First() ?? new WCS_EXCEPTION
                     {
                         MSG = msg,
                         DEVICE = device,
@@ -32,11 +30,11 @@ namespace WCS.Service.Helpers
                         TIMES = 0,
                         UPDATETIME = DateTime.Now,
                         UPDATEUSER = "WCS"
-                    }).Entity;
+                    };
 
                 exp.TIMES++;
                 exp.UPDATETIME = DateTime.Now;
-                db.Default.SaveChanges();
+                db.Default.Storageable(exp).ExecuteCommand();
             });
         }
 
@@ -53,4 +51,4 @@ namespace WCS.Service.Helpers
             return $"{msg}|{device}|{type}";
         }
     }
-}
+}

+ 4 - 6
Projects/永冠OPP/WCS.Service/Helpers/SystemConfigHelpers.cs

@@ -1,6 +1,4 @@
-using DBHelper;
-using Microsoft.EntityFrameworkCore;
-using System.Linq;
+using DBHelper_SqlSugar;
 using WCS.Entity.Protocol;
 
 namespace WCS.Service.Helpers
@@ -18,12 +16,12 @@ namespace WCS.Service.Helpers
         public static bool GetDeviceConfig(string DEVICECODE)
         {
             bool result = true;
-            DB.Do(db =>
+            Db.Do(db =>
             {
-                var systemConfig = db.Default.Set<WCS_SystemConfig>().AsNoTracking().SingleOrDefault(p => p.DEVICECODE == DEVICECODE);
+                var systemConfig = db.Default.Queryable<WCS_SystemConfig>().Single(p => p.DEVICECODE == DEVICECODE);
                 if (systemConfig != null) result = systemConfig.ENABLED;
             });
             return result;
         }
     }
-}
+}

+ 6 - 6
Projects/永冠OPP/WCS.Service/Uploader.cs

@@ -1,7 +1,6 @@
-using DBHelper;
+using DBHelper_SqlSugar;
+using Logs;
 using System;
-using System.Linq;
-using WCS.Core;
 using WCS.Entity;
 
 namespace WCS.Service
@@ -28,13 +27,13 @@ namespace WCS.Service
 
         private static object UpLoadLockObj = new object();
 
-        public static void Upload(DB db)
+        public static void Upload(Db db)
         {
             //lock (UpLoadLockObj)
             {
                 try
                 {
-                    var tasks = db.Default.Set<WCS_TASK>().Where(v => v.WMSTASK > 0).Where(v => v.STATUS != v.UPLOADED).ToArray();
+                    var tasks = db.Default.Queryable<WCS_TASK>().Where(v => v.WMSTASK > 0).Where(v => v.STATUS != v.UPLOADED).ToArray();
                     foreach (var task in tasks)
                     {
                         try
@@ -50,7 +49,8 @@ namespace WCS.Service
                             Console.WriteLine($"上传任务状态失败:WCS任务号{task.ID},{ex.Message}");
                         }
                     }
-                    db.Default.SaveChanges();
+
+                    db.Default.Updateable(tasks).ExecuteCommand();
                 }
                 catch { }
             }

+ 8 - 8
Projects/永冠OPP/WCS.Service/WCS.Service.csproj

@@ -13,28 +13,28 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="DBHelper-SqlSugar" Version="1.0.0" />
     <PackageReference Include="Logs" Version="1.0.0.1" />
-    <PackageReference Include="MessagePack" Version="2.3.85" />
+    <PackageReference Include="MessagePack" Version="2.4.35" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.3">
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.6">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
-    <PackageReference Include="Microsoft.EntityFrameworkCore.DynamicLinq" Version="6.2.18" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.4" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.3">
+    <PackageReference Include="Microsoft.EntityFrameworkCore.DynamicLinq" Version="6.2.19" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.6" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.6">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
     <PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="6.0.0" />
     <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
-    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.2" />
-    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.3.0" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.6" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.3.1" />
   </ItemGroup>
 
   <ItemGroup>
+    <ProjectReference Include="..\..\..\DBHelper-SqlSugar\DBHelper-SqlSugar.csproj" />
     <ProjectReference Include="..\..\..\WCS.Core\WCS.Core.csproj" />
     <ProjectReference Include="..\..\..\WCS.Entity\WCS.Entity.csproj" />
     <ProjectReference Include="..\WCS.Entity.Protocol\WCS.Entity.Protocol.csproj" />

+ 12 - 14
Projects/永冠OPP/WCS.Service/WebApi/APICaller.cs

@@ -1,4 +1,5 @@
-using Newtonsoft.Json;
+using Logs;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -7,7 +8,6 @@ using System.IO;
 using System.Net;
 using System.Text;
 using System.Threading.Tasks;
-using WCS.Core;
 
 namespace WCS.Service
 {
@@ -86,25 +86,23 @@ namespace WCS.Service
         {
             var sw = new Stopwatch();
             sw.Start();
-            Encoding encoding = Encoding.UTF8;
-            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址
+            var encoding = Encoding.UTF8;
+            var request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址
             request.Timeout = 60000;//连接超时
             request.ReadWriteTimeout = 3600000;//读写超时
             request.Accept = "text/html,application/xhtml+xml,*/*";
             request.ContentType = "application/json";
             request.Method = type.ToUpper().ToString();//get或者post
-            byte[] buffer = encoding.GetBytes(jsonstr);
+            var buffer = encoding.GetBytes(jsonstr);
             request.ContentLength = buffer.Length;
             request.GetRequestStream().Write(buffer, 0, buffer.Length);
-            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
-            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
-            {
-                var res = reader.ReadToEnd();
-                sw.Stop();
-                if (sw.ElapsedMilliseconds > 500)
-                    InfoLog.INFO_TIMING($"接口{url}调用耗时{sw.ElapsedMilliseconds}---------{JsonConvert.SerializeObject(res)}");
-                return res;
-            }
+            var response = (HttpWebResponse)request.GetResponse();
+            using var reader = new StreamReader(response.GetResponseStream()!, Encoding.UTF8);
+            var res = reader.ReadToEnd();
+            sw.Stop();
+            if (sw.ElapsedMilliseconds > 500)
+                InfoLog.INFO_TIMING($"接口{url}调用耗时{sw.ElapsedMilliseconds}---------{JsonConvert.SerializeObject(res)}");
+            return res;
         }
     }
 }

+ 23 - 34
Projects/永冠OPP/WCS.Service/WebApi/WCSApi.cs

@@ -1,14 +1,11 @@
-using DBHelper;
+using DBHelper_SqlSugar;
 using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Service.Entity;
-using WCS.Service.WebApi.ViewModels;
 
 namespace WCS.Service.WebApi
 {
@@ -22,14 +19,14 @@ namespace WCS.Service.WebApi
             var res = new WcsContractApiResponse();
             try
             {
-                DB.Do(db =>
+                Db.Do(db =>
                 {
                     foreach (var obj in list)
                     {
                         if (obj.TaskType == "3")//移库任务
                         {
                             var wmstaskid = int.Parse(obj.WMSTaskNo);
-                            if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
+                            if (db.Default.Queryable<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
                                 throw new Exception("任务号" + wmstaskid + "重复下发");
 
                             var scid = int.Parse(obj.SRMNo.Last().ToString());
@@ -48,12 +45,12 @@ namespace WCS.Service.WebApi
                                 WMSTASK = int.Parse(obj.WMSTaskNo),
                                 TaskGroupKey = obj.TaskGroupKey
                             };
-                            db.Default.Add(task);
+                            db.Default.Insertable(task).ExecuteCommand();
                         }
                         else if (obj.TaskType == "2")
                         {  //出库任务
                             var wmstaskid = int.Parse(obj.WMSTaskNo);
-                            if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
+                            if (db.Default.Queryable<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
                                 throw new Exception("任务号" + wmstaskid + "重复下发");
 
                             var tunnel = "TY" + obj.SRMNo.Last();
@@ -76,12 +73,12 @@ namespace WCS.Service.WebApi
                                 FLOOR = 1,
                             };
 
-                            db.Default.Add(task);
+                            db.Default.Insertable(task).ExecuteCommand();
                         }
                         else if (obj.TaskType == "1")
                         {//入库任务
                             var wmstaskid = int.Parse(obj.WMSTaskNo);
-                            if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
+                            if (db.Default.Queryable<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
                                 throw new Exception("任务号" + wmstaskid + "重复下发");
 
                             if (obj.StartLocation.Contains("_Back_"))
@@ -111,8 +108,7 @@ namespace WCS.Service.WebApi
                                 else if (ws == 3)
                                     agvtask.Station = "2143";
 
-                                db.Default.Set<WCS_AGVTask>().Add(agvtask);
-                                db.Default.SaveChanges();
+                                db.Default.Insertable(agvtask).ExecuteCommand();
                             }
                             else
                             {
@@ -127,11 +123,10 @@ namespace WCS.Service.WebApi
                                     UPDATEUSER = "WMS",
                                     WMSTASK = int.Parse(obj.WMSTaskNo)
                                 };
-                                db.Default.Add(task);
+                                db.Default.Insertable(task).ExecuteCommand();
                             }
                         }
                     }
-                    db.Default.SaveChanges();
                 });
                 res.ResType = true;
             }
@@ -148,7 +143,7 @@ namespace WCS.Service.WebApi
             var res = new WcsContractApiResponse();
             try
             {
-                DB.Do(db =>
+                Db.Do(db =>
                 {
                     if (obj.Type == 1)
                     {
@@ -177,8 +172,7 @@ namespace WCS.Service.WebApi
                         else if (ws == 3)
                             agvtask.Station = "2143";
 
-                        db.Default.Set<WCS_AGVTask>().Add(agvtask);
-                        db.Default.SaveChanges();
+                        db.Default.Insertable(agvtask).ExecuteCommand();
                     }
                     else
                         throw new Exception($"类型{obj.Type}不支持");
@@ -199,15 +193,15 @@ namespace WCS.Service.WebApi
             var res = new WcsContractApiResponse();
             try
             {
-                DB.Do(db =>
+                Db.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().Where(v => v.BARCODE == code && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.组盘).FirstOrDefault();
+                    var task = db.Default.Queryable<WCS_TASK>().First(v => v.BARCODE == code && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.组盘);
                     if (task == null)
                         throw new Exception("WCS任务不存在");
                     task.STATUS = WCS.Entity.TaskStatus.已取消;
                     task.UPDATETIME = DateTime.Now;
                     task.UPDATEUSER = "RF";
-                    db.Default.SaveChanges();
+                    db.Default.Updateable(task).ExecuteCommand();
                 });
                 res.ResType = true;
             }
@@ -224,9 +218,9 @@ namespace WCS.Service.WebApi
             var res = new WcsContractApiResponse();
             try
             {
-                DB.Do(db =>
+                Db.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().Where(v => v.WMSTASK == wmstaskId).FirstOrDefault();
+                    var task = db.Default.Queryable<WCS_TASK>().First(v => v.WMSTASK == wmstaskId);
                     if (task == null)
                         throw new Exception("WCS任务不存在");
                     if (task.STATUS != WCS.Entity.TaskStatus.新建)
@@ -234,14 +228,12 @@ namespace WCS.Service.WebApi
                     task.STATUS = WCS.Entity.TaskStatus.已取消;
                     task.UPDATETIME = DateTime.Now;
                     task.UPDATEUSER = "WMS";
-                    db.Default.SaveChanges();
-                    if (task.TYPE == TaskType.出库 && task.AgvTask > 0)
-                    {
-                        var agvtask = db.Default.Set<WCS_AGVTask>().Find(task.AgvTask);
-                        agvtask.Status = AGVTaskStatus.取消;
-                        agvtask.UpdateTime = DateTime.Now;
-                        db.Default.SaveChanges();
-                    }
+                    db.Default.Updateable(task).ExecuteCommand();
+                    if (task.TYPE != TaskType.出库 || task.AgvTask <= 0) return;
+                    var agvtask = db.Default.Queryable<WCS_AGVTask>().InSingle(task.AgvTask);
+                    agvtask.Status = AGVTaskStatus.取消;
+                    agvtask.UpdateTime = DateTime.Now;
+                    db.Default.Updateable(agvtask).ExecuteCommand();
                 });
                 res.ResType = true;
             }
@@ -284,7 +276,6 @@ namespace WCS.Service.WebApi
         //        result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Tasknum == model.TASKNUM));
         //    }
 
-
         //    if (model.PH_STATUS != null)
         //    {
         //        result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM));
@@ -427,8 +418,6 @@ namespace WCS.Service.WebApi
         //    return result;
         //}
 
-       
-
         #endregion 静态方法
     }
-}
+}

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

@@ -1,18 +1,18 @@
-using System;
+using Logs;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using WCS.Core;
 using WCS.Service.Entity;
 
 namespace WCS.Service
 {
     public class WMS
     {
-        private static string Url = "http://192.168.249.150:8026";
+        private const string Url = "http://192.168.249.150:8026";
 
         //private static string Url = "http://127.0.0.1:8026";
-        private static string wareHouseId = "opphouse";
+        private const string WareHouseId = "opphouse";
 
         /// <summary>
         /// 向WMS获取入库任务 一次单卷
@@ -28,17 +28,14 @@ namespace WCS.Service
             {
                 new(){
                      ContainerBarCode = barcode,
-                     WareHouseId = wareHouseId,
+                     WareHouseId = WareHouseId,
                      EquipmentNo = devCode,
                      Memo1 = getTunnel ? "1" : "" //1:分巷道  2:分货位
                 }
             });
-            if (!res.ResType)
-            {
-                TaskException(devCode, res.ResMessage);
-                throw new WarnException(res.ResMessage);
-            }
-            return res.TaskList;
+            if (res.ResType) return res.TaskList;
+            TaskException(devCode, res.ResMessage);
+            throw new WarnException(res.ResMessage);
         }
 
         /// <summary>
@@ -58,13 +55,13 @@ namespace WCS.Service
             {
                 new(){
                      ContainerBarCode = barcode1,
-                     WareHouseId = wareHouseId,
+                     WareHouseId = WareHouseId,
                      EquipmentNo = devCode1,
                      Memo1 = getTunnel1 ? "1" : "" //1:分巷道  2:分货位
                 },
                 new(){
                      ContainerBarCode = barcode2,
-                     WareHouseId = wareHouseId,
+                     WareHouseId = WareHouseId,
                      EquipmentNo = devCode2,
                      Memo1 = getTunnel2 ? "1" : "" //1:分巷道  2:分货位
                 },
@@ -156,7 +153,7 @@ namespace WCS.Service
             var res = APICaller.CallApi<I_WCS_GetOutTaskResponse>(Url + "/api/Task/I_WCS_GetOutTask", new I_WCS_GetOutTaskRequest
             {
                 OutType = 1,
-                WareHouseId = wareHouseId,
+                WareHouseId = WareHouseId,
                 OutEndPostion = position
             });
             if (!res.ResType)
@@ -202,12 +199,9 @@ namespace WCS.Service
             {
                 WMSTaskNum = WMSTaskId
             });
-            if (!res.ResType)
-            {
-                TaskException(dev, res.ResMessage);
-                throw new WarnException(res.ResMessage);
-            }
-            return res;
+            if (res.ResType) return res;
+            TaskException(dev, res.ResMessage);
+            throw new WarnException(res.ResMessage);
         }
 
         public static void TaskException(string device, string exMsg)
@@ -228,7 +222,7 @@ namespace WCS.Service
                     InfoLog.INFO_I_WCS_GetExcTask(device + ":" + exMsg);
                     if (!res.ResType) throw new WarnException(res.ResMessage);
                 }
-                catch (Exception ex)
+                catch (Exception)
                 {
                 }
             });
@@ -253,7 +247,7 @@ namespace WCS.Service
                 if (!res.ResType)
                     throw new WarnException(res.ResMessage);
             }
-            catch (Exception ex)
+            catch (Exception)
             {
                 Console.WriteLine("I_WCS_PutDevInfo" + "接口调用失败");
             }

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

@@ -1,8 +1,10 @@
 using DBHelper_SqlSugar;
 using Logs;
+using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
 using Newtonsoft.Json;
+using SqlSugar;
 using System;
 using System.IO;
 using System.Linq;
@@ -32,7 +34,7 @@ namespace WCS.Service
             #region 启用日志
 
             var logConfig = JsonConvert.DeserializeObject<LogConfig>(await File.ReadAllTextAsync("config.json", Encoding.Default, stoppingToken));
-            Logs.LogHelper.SetConfigInfo(logConfig);
+            Logs.LogHelper.SetConfigInfo(logConfig!);
 
             #endregion 启用日志
 
@@ -42,8 +44,21 @@ namespace WCS.Service
             Configs.ProtocolProxyBaseType = typeof(ProtocolProxy);
             Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
             Configs.StringEncoding = Encoding.UTF8;
-
+            Db.CreateContext(new ConnectionConfig()
+            {
+                ConnectionString = AppSettings.Config.GetConnectionString("WCSDB"),
+                DbType = DbType.MySql
+            }, "WCSDB");
             Db.SetDefaultDbContextType("WCSDB");
+            Db.Do(db =>
+            {
+                //TODO:DbMaintenance.CreateDatabase()并没起到作用,如果没有对应的数据库的话任然需要手动新建一个
+                db.Default.DbMaintenance.CreateDatabase();
+                db.Default.CodeFirst.InitTables(typeof(WCS_CMD));
+                db.Default.CodeFirst.InitTables(typeof(WCS_PLC));
+                db.Default.CodeFirst.InitTables(typeof(WCS_DATABLOCK));
+                //db.Default.CodeFirst.InitTables(typeof(WCS_DATABLOCK));
+            });
 
             //日志发布事件
             Configs.PublishEvent += () =>

+ 2 - 355
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -1,10 +1,5 @@
-using DBHelper;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using WCS.Core;
+using WCS.Core;
 using WCS.Entity;
-using WCS.Entity.Protocol.RGV;
 using WCS.Service.Extensions;
 using WCS.Service.Handlers;
 
@@ -18,66 +13,6 @@ namespace WCS.Service.Works.RGV
 
         protected override void Do(RGVDevice rgv)
         {
-            rgv.EX(rgv =>
-            {
-                //RGV是自动且空闲的
-                if (rgv.Data2.WorkMode != RGVMode.自动) throw new DoException($"{rgv.Data2.WorkMode}");
-                if (rgv.Data2.SystemStatus != RGVRunStatus.空闲) throw new DoException($"{rgv.Data2.SystemStatus}");
-
-                //RGV状态为 RGV到站&&任务完成 时程序认为RGV当前不在取货点
-                if (rgv.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.RGV到站) && rgv.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.任务完成))
-                {
-                    //下达一个目标为1030的移动任务
-                    rgv.Data.TaskID_1 = 1030;
-                    rgv.Data.DestPosition_1 = 1030;
-                    rgv.Data.TaskType_1 = RGVTaskType.移动;
-                    rgv.Data.Trigger_1++;
-                }
-
-                var obj = Device.Find(ConvGroup_1030).Create<StationDeviceGroup>();
-
-                obj.WhetherToExecute();
-
-                //筛选出有任务号和起始及目标地址的设备
-                var dev = obj.RGVGetTaskedDevice() ?? throw new WarnException("无可用任务");
-
-                DB.Do(db =>
-                {
-                    var taskids = dev.Select(v => v.Data2.Tasknum);
-                    var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
-                    if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
-                        throw new WarnException("任务组ID不一致");
-                    if (tasks.GroupBy(p => p.TaskGroupKey).Count() == 0)
-                        throw new WarnException("无任务组ID");
-                    var gw1 = obj.Items.ToArray()[0];
-                    var gw2 = obj.Items.ToArray()[1];
-                    if (gw1.Data2.Tasknum != 0 && gw2.Data2.Tasknum != 0)
-                    {
-                        if (gw1.Data2.Goodsend != gw2.Data2.Goodsend) throw new WarnException($"{obj.Entity.CODE}目标地址不一致");
-                    }
-                    rgv.Data.TaskID_1 = gw1.Data2.Tasknum;
-                    rgv.Data.TaskID_2 = gw2.Data2.Tasknum;
-                    if (gw1.Data2.Tasknum != 0)
-                    {
-                        rgv.Data.StartPosition_1 = gw1.Entity.CODE.ToShort();
-                        rgv.Data.DestPosition_1 = gw1.Data2.Goodsend;
-                    }
-                    else
-                    {
-                        rgv.Data.StartPosition_1 = gw1.Entity.CODE.ToShort();
-                        rgv.Data.DestPosition_1 = gw2.Data2.Goodsend;
-                    }
-                    rgv.Data.Trigger_1++;
-
-                    foreach (var task in tasks)
-                    {
-                        var msg = $"下达从{rgv.Data.StartPosition_1}移动至{rgv.Data.DestPosition_1}的RGV PLC指令。";
-                        msg += $"[{task.ID}][{rgv.Data.StartPosition_1}][{rgv.Data.DestPosition_1}[{rgv.Data.Trigger_1}]";
-
-                        task.CreateStatusLog(db, msg, this.GetType());
-                    }
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -91,168 +26,6 @@ namespace WCS.Service.Works.RGV
     {
         protected override void Do(RGVDevice obj)
         {
-            //11号站台是取货点,但不是待命点,如需取货,从九号站台调车
-            //2号站台是一个待命点,但是为了保证入库取货效率,所有后面会跟一个车
-            //如果3号站台的小车拦住了后一个小车的放货任务,检测一次最近的空车距离值,如果大于或等于618500并且小于被拦住小车的位置值再进行调车,用于避免无效空跑
-            obj.EX(obj =>
-            {
-                if (obj.Data2.Trigger_1 != obj.Data.Trigger_1) throw new WarnException($"等待执行任务{obj.Data2.TaskID_1}--{obj.Data2.TaskID_2}");
-                if (obj.Data2.WorkMode != RGVMode.自动) throw new DoException(obj.Data2.WorkMode.ToString());
-                if (obj.Data2.SystemStatus != RGVRunStatus.空闲) throw new DoException(obj.Data2.SystemStatus.ToString());
-                //RGV当前是否刚刚完成取货任务,等待放货
-                if (obj.IsPut())
-                {
-                    if (!obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV无光电,无法放货,请检查实际情况");
-                    //取小车上的任务
-                    DB.Do(db =>
-                    {
-                        List<int> taskids = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
-                        var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
-                        if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
-                            throw new WarnException("任务组ID不一致");
-                        if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
-                            throw new WarnException("无任务组ID");
-                        var destStation = Device.Find(tasks.FirstOrDefault().ADDRNEXT).Create<StationDeviceGroup>();
-                        obj.Put(destStation, obj.Data2.TaskID_1, obj.Data2.TaskID_2);
-                    });
-                    return;
-                }
-                //当前有rgv的取货站台
-                var pickStation = obj.CurrentStation();
-                //RGV是否在任何一个站台
-                if (pickStation != null)
-                {
-                    //是否是取货站台
-                    if (pickStation.Entity.Is(DF.涂布RGV取货设备组))
-                    {
-                        // 筛选出有任务号和起始及目标地址的设备
-                        var devs = pickStation.RGVGetTaskedDevice();
-                        //是否需要取货
-                        if (devs != null && devs.Count > 0)
-                        {
-                            //开始下达取货任务
-                            DB.Do(db =>
-                            {
-                                if (obj.Data2.TaskType_1 != RGVTaskType.移动) throw new WarnException($"RGV正在执行{obj.Data2.TaskType_1}");
-                                if (obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV有光电,无法取货,请检查实际情况");
-                                if (!obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.RGV到站)) throw new WarnException("RGV无到站状态,请检查RGV实际状态");
-
-                                var taskids = devs.Select(v => v.Data2.Tasknum);
-                                var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
-                                if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
-                                    throw new WarnException("任务组ID不一致");
-                                if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
-                                    throw new WarnException("无任务组ID");
-                                var gw1 = pickStation.Items.ToArray()[0];
-                                var gw2 = pickStation.Items.ToArray()[1];
-                                if (gw1.Data2.Tasknum != 0 && gw2.Data2.Tasknum != 0)
-                                {
-                                    if (gw1.Data2.Goodsend != gw2.Data2.Goodsend) throw new WarnException($"{obj.Entity.CODE}目标地址不一致");
-                                }
-                                obj.Data.TaskID_1 = gw1.Data2.Tasknum;
-                                obj.Data.TaskID_2 = gw2.Data2.Tasknum;
-                                obj.Data.TaskType_1 = RGVTaskType.取货;
-                                obj.Data.DestPosition_1 = pickStation.Entity.CODE.Replace("G", "").ToShort();
-
-                                obj.Data.Trigger_1++;
-
-                                foreach (var task in tasks)
-                                {
-                                    var msg = $"下达从{obj.Data.StartPosition_1}移动至{obj.Data.DestPosition_1}的RGV PLC指令。";
-                                    msg += $"[{task.ID}][{obj.Data.StartPosition_1}][{obj.Data.DestPosition_1}[{obj.Data.Trigger_1}]";
-
-                                    task.CreateStatusLog(db, msg, this.GetType());
-                                }
-                            });
-                            return;
-                        }
-                        else if (pickStation.Entity.CODE == "G9")
-                        {
-                            //九站台的小车需要额外检测一下11站台是否需要取货
-                            var station11 = Device.Find("G11").Create<StationDeviceGroup>();
-                            var station11Dev = station11.RGVGetTaskedDevice();
-                            if (station11Dev != null && station11Dev.Count > 0)
-                            {
-                                obj.Move(station11);
-                                return;
-                            }
-                        }
-
-                        //找到自己的后一个小车
-                        var afterRgv = obj.After();
-
-                        //自己是否阻挡了该小车
-                        if (afterRgv.Data2.WorkMode == RGVMode.自动 && afterRgv.Data2.SystemStatus != RGVRunStatus.空闲 && obj.StopedByMe(afterRgv))
-                        {
-                            if (pickStation.Entity.CODE == "G2")
-                            {
-                                //此站台因需要进行排队,因此是否需要赶车取决于是否拦住了两个小车的任务
-                                var afterRgv1 = afterRgv.After();
-                                //如果是空闲或者没有拦住他,就不执行赶车
-                                if (afterRgv1.Data2.WorkMode == RGVMode.自动 && (afterRgv1.Data2.SystemStatus == RGVRunStatus.空闲 || !afterRgv.StopedByMe(afterRgv1))) return;
-                            }
-                            else if (pickStation.Entity.CODE == "G3")
-                            {
-                                //为了减少空跑,需要被阻拦的小车后面的小车任务类型为移动并且位置值要大于618500小于被阻拦小车的位置值
-                                var afterRgv1 = afterRgv.After();
-                                if (afterRgv1.Data2.WorkMode == RGVMode.自动 && afterRgv.Data2.TaskType_1 != RGVTaskType.移动 && !(afterRgv1.Position < afterRgv.Position && afterRgv1.Position > 618500)) return;
-                            }
-                            //找到当前所在站台的下一个取货点
-                            var beforeStation = Device.Where(v => v.Is(DF.涂布RGV取货设备组) && v.CODE != pickStation.Entity.CODE)
-                                          .Select(v => v.Create<StationDeviceGroup>())
-                                          .OrderBy(v => pickStation.Distance(v))
-                                          .FirstOrDefault();
-
-                            //写入移动任务
-                            obj.Move(beforeStation);
-                            return;
-                        }
-                        else if (pickStation.Entity.CODE == "G11")
-                        {
-                            obj.Move(Device.Find("G2").Create<StationDeviceGroup>());
-                            return;
-                        }
-                        else
-                        {
-                            //找到自己前面的 有货 没有小车 没有正在过来的小车 距离自己最近的 的站台
-                            var station = Device.Where(v => v.Is(DF.涂布RGV取货设备组))
-                                                    .Select(v => v.Create<StationDeviceGroup>())
-                                                    .Where(v => v.Position > obj.Position) //前面的
-                                                    .Where(v => v.CurrentRGV() == null)
-                                                    .Where(v => !v.RgvList.Any(c => c.Data2.SystemStatus != RGVRunStatus.空闲 && c.Data2.DestPosition_1 == v.Entity.CODE.GetShortCode()))
-                                                    .Where(v =>
-                                                    {
-                                                        // 筛选出有任务号和起始及目标地址的设备
-                                                        var b = pickStation.RGVGetTaskedDevice();
-                                                        //是否需要取货
-                                                        if (b != null && b.Count > 0) return true;
-                                                        else return false;
-                                                    })
-                                                    .OrderBy(v => obj.Distance(v)).FirstOrDefault();//取当前小车最近
-                            if (obj.Data2.TaskType_1 == RGVTaskType.移动 && obj.Distance(station) > 100000)         
-                            {
-                                obj.Move(station);
-                                return;
-                            }
-                        }
-                    }
-
-                    //是否在一个放货站台
-                    if (pickStation.Entity.Is(DF.涂布RGV放货设备组))
-                    {
-                        pickStation = obj.BeforeStation();
-                        obj.Move(pickStation);
-                        return;
-                    }
-                }
-
-                //此时RGV即没有等待执行的放货任务,也不在任何一个取货点,因此需要调往最近的一个取货点
-                //找到距离这个RGV最近的一个取货点
-                //必须所有RGV都是空闲状态时才可以进行初始化
-                if (obj.RGVList.Any(v => v.Data2.SystemStatus != RGVRunStatus.空闲)) return;
-                pickStation = obj.BeforeStation();
-                obj.Move(pickStation);
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -266,132 +39,6 @@ namespace WCS.Service.Works.RGV
     {
         protected override void Do(RGVDevice obj)
         {
-            obj.EX(obj =>
-            {
-                if (obj.Data2.Trigger_1 != obj.Data.Trigger_1) throw new WarnException($"等待执行任务{obj.Data2.TaskID_1}--{obj.Data2.TaskID_2}");
-                if (obj.Data2.WorkMode != RGVMode.自动) throw new DoException(obj.Data2.WorkMode.ToString());
-                if (obj.Data2.SystemStatus != RGVRunStatus.空闲) throw new DoException(obj.Data2.SystemStatus.ToString());
-                //RGV当前是否刚刚完成取货任务,等待放货
-                if (obj.IsPut())
-                {
-                    if (!obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV无光电,无法放货,请检查实际情况");
-                    //取小车上的任务
-                    DB.Do(db =>
-                    {
-                        List<int> taskids = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
-                        var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
-                        if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
-                            throw new WarnException("任务组ID不一致");
-                        if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
-                            throw new WarnException("无任务组ID");
-                        var destStation = Device.Find(tasks.FirstOrDefault().ADDRNEXT).Create<StationDeviceGroup>();
-                        obj.Put(destStation, obj.Data2.TaskID_1, obj.Data2.TaskID_2);
-                    });
-
-                    return;
-                }
-
-                var pickStation = obj.CurrentStation();
-                //RGV是否在任何一个站台
-                if (pickStation != null)
-                {
-                    //是否是取货站台
-                    if (pickStation.Entity.Is(DF.BOPPRGV取货设备组))
-                    {
-                        // 筛选出有任务号和起始及目标地址的设备
-                        var devs = pickStation.RGVGetTaskedDevice();
-                        //是否需要取货
-                        if (devs != null && devs.Count() > 0)
-                        {
-                            //开始下达取货任务
-                            DB.Do(db =>
-                            {
-                                if (obj.Data2.TaskType_1 != RGVTaskType.移动) throw new WarnException($"RGV正在执行{obj.Data2.TaskType_1}");
-                                if (obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV有光电,无法取货,请检查实际情况");
-                                if (!obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.RGV到站)) throw new WarnException("RGV无到站状态,请检查RGV实际状态");
-
-                                var taskids = devs.Select(v => v.Data2.Tasknum);
-                                var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
-                                if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
-                                    throw new WarnException("任务组ID不一致");
-                                if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
-                                    throw new WarnException("无任务组ID");
-                                var gw1 = pickStation.Items.ToArray()[0];
-                                var gw2 = pickStation.Items.ToArray()[1];
-                                if (gw1.Data2.Tasknum != 0 && gw2.Data2.Tasknum != 0)
-                                {
-                                    if (gw1.Data2.Goodsend != gw2.Data2.Goodsend) throw new WarnException($"{obj.Entity.CODE}目标地址不一致");
-                                }
-                                obj.Pick(pickStation, gw1.Data2.Tasknum, gw2.Data2.Tasknum);
-
-                                foreach (var task in tasks)
-                                {
-                                    var msg = $"下达从{obj.Data.StartPosition_1}移动至{obj.Data.DestPosition_1}的RGV PLC指令。";
-                                    msg += $"[{task.ID}][{obj.Data.StartPosition_1}][{obj.Data.DestPosition_1}[{obj.Data.Trigger_1}]";
-
-                                    task.CreateStatusLog(db, msg, this.GetType());
-                                }
-                            });
-                            return;
-                        }
-
-                        ////找到自己的后一个小车
-                        //var afterRgv = obj.After();
-
-                        ////自己是否阻挡了该小车
-                        //if (afterRgv.Data2.WorkMode == RGVMode.自动 && afterRgv.Data2.SystemStatus != RGVRunStatus.空闲 && obj.StopedByMe(afterRgv))
-                        //{
-                        //    //找到当前所在站台的下一个取货点
-                        //    var beforeStation = Device.Where(v => v.Is(DF.BOPPRGV取货设备组) && v.CODE != pickStation.Entity.CODE)
-                        //                  .Select(v => v.Create<StationDeviceGroup>())
-                        //                  .OrderBy(v => pickStation.Distance(v))
-                        //                  .FirstOrDefault();
-
-                        //    //写入移动任务
-                        //    obj.Move(beforeStation);
-                        //    return;
-                        //}
-                        //else
-                        //{
-                        //    //取前一个取货点
-                        //    pickStation = obj.BeforeStation();
-                        //    //前一个取货点的小车
-                        //    var rgv = pickStation.CurrentRGV();
-                        //    //前一个取货点没有车 且没有非空闲目的地为前一个取货点的小车
-                        //    if (rgv == null && !obj.RGVList.Any(v => v.Data2.SystemStatus != RGVRunStatus.空闲 && v.Data2.DestPosition_1 == pickStation.Entity.CODE.Replace("G", "").ToShort()))
-                        //    {
-                        //        obj.Move(pickStation);
-                        //        return;
-                        //    }
-                        //}
-                        //计算当前RGV拦住小车的数量
-                        var max = obj.RGVList.Count(v => v.Data2.WorkMode == RGVMode.自动 && v.Data2.SystemStatus != RGVRunStatus.空闲 && obj.StopedByMe(v));
-                        if (pickStation.Entity.CODE == "G19" && max > 2)
-                        {
-                            obj.Move(Device.Find("G23").Create<StationDeviceGroup>());
-                        }
-                        //else if (pickStation.Entity.CODE == "G23" && max > 3)
-                        //{
-                        //    obj.Move(Device.Find("G19").Create<StationDeviceGroup>());
-                        //}
-                    }
-
-                    //是否在一个放货站台
-                    if (pickStation.Entity.Is(DF.BOPPRGV放货设备组))
-                    {
-                        pickStation = obj.BeforeStation();
-                        obj.Move(Device.Find("G23").Create<StationDeviceGroup>());
-                    }
-                    return;
-                }
-
-                //此时RGV即没有等待执行的放货任务,也不在任何一个取货点,因此需要调往最近的一个取货点
-                //找到距离这个RGV最近的一个取货点
-                //必须所有RGV都是空闲状态时才可以进行初始化
-                if (obj.RGVList.Any(v => v.Data2.SystemStatus != RGVRunStatus.空闲 || v.Data2.WorkMode != RGVMode.自动)) return;
-                pickStation = obj.BeforeStation();
-                obj.Move(Device.Find("G23").Create<StationDeviceGroup>());
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -399,4 +46,4 @@ namespace WCS.Service.Works.RGV
             return dev.Is(DF.BOPPRGV);
         }
     }
-}
+}

+ 1 - 372
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -1,16 +1,8 @@
-using DBHelper;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Linq;
 using WCS.Core;
 using WCS.Entity;
-using WCS.Entity.Protocol;
-using WCS.Entity.Protocol.SRM;
-using WCS.Service.Entity;
 using WCS.Service.Extensions;
 using WCS.Service.Handlers;
-using WCS.Service.Helpers;
 
 namespace WCS.Service.Works.SRM
 {
@@ -30,369 +22,6 @@ namespace WCS.Service.Works.SRM
 
         protected override void Do(SRMDevice obj)
         {
-            obj.EX(obj =>
-            {
-                var deviceCode = obj.Entity.CODE;
-                //先检查堆垛机是否报警
-                if (obj.Data3.SCAlarm != 0)
-                {
-                    if (obj.Entity.WakeupOn(5000)) WMS.DevInfo(obj.Entity.CODE, obj.Data3.SCAlarm.ToString());
-                    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)
-                {
-                    DB.Do(db =>
-                    {
-                        if (obj.Data2.VoucherNo_1 != obj.Data.VoucherNo_1)
-                        {
-                            if (db.Default.Set<WCS_TASK>().Find(obj.Data.TaskID_1).STATUS == TaskStatus.新建)
-                            {
-                                obj.Data.VoucherNo_1 = obj.Data2.VoucherNo_1;
-                            }
-                        }
-                        if (obj.Data2.VoucherNo_2 != obj.Data.VoucherNo_2)
-                        {
-                            if (db.Default.Set<WCS_TASK>().Find(obj.Data.TaskID_2).STATUS == TaskStatus.新建)
-                            {
-                                obj.Data.VoucherNo_2 = obj.Data2.VoucherNo_2;
-                            }
-                        }
-                    });
-                    throw new WarnException($"等待执行{obj.Data.TaskID_1}-{obj.Data.TaskID_2}");
-                }
-
-                //处理堆垛机已完成的任务
-                if (obj.Data2.FinishedTask_1 != 0 || obj.Data2.FinishedTask_2 != 0)
-                {
-                    InfoLog.INFO_SRMINFO($"开始完成任务:[{obj.Entity.CODE}]-{obj.Data2.FinishedTask_1}-{obj.Data2.FinishedTask_2}");
-                    obj.FinishedTaskHandle();
-                    InfoLog.INFO_SRMINFO($"完成任务处理结束:[{obj.Entity.CODE}]-{obj.Data2.FinishedTask_1}-{obj.Data2.FinishedTask_2}");
-                    return;
-                }
-
-                if (obj.Data2.SRMMode != SCMode.远程) return;
-                if (obj.Data2.SRMStatus != SCRunStatus.空闲) return;
-
-                var isTransfer = new List<WCS_TASK>(); //是否有移库任务
-                WCS_TASK enterPriority = new WCS_TASK(), outPriority = new WCS_TASK(); //出入库优先级任务
-                //再检查是否有等待执行的货物
-                DB.Do(db =>
-                {
-                    var task = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE).Where(v => v.STATUS == TaskStatus.堆垛机执行).FirstOrDefault();
-                    if (task != null) throw new WarnException($"[{deviceCode}]有正在执行的任务:[{task.ID}]");
-                    //属于当前堆垛机未执行的移库任务
-                    isTransfer = db.Default.Set<WCS_TASK>().AsNoTracking().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).ToList();
-                    //判断是否存在调整优先级任务,存在初始化isTransfer值 让本次执行优先任务
-                    if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.DEVICE == obj.Entity.CODE && v.TYPE != TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行 && v.Priority > 0))
-                        isTransfer = new List<WCS_TASK>();
-                    enterPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.入库 && v.STATUS < TaskStatus.堆垛机执行)
-                                                                 .OrderByDescending(v => v.Priority).FirstOrDefault();
-                    outPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.出库 && v.STATUS < TaskStatus.堆垛机执行)
-                                                                  .OrderByDescending(v => v.Priority).FirstOrDefault();
-                });
-
-                //最后一个是否是出库任务
-                var LastIsOut = obj.Entity.Get<bool>("LastIsOut");
-                obj.Entity.Set("LastIsOut", !LastIsOut);
-                if (isTransfer.Count > 0) //防止因为无当前堆垛机移库任务导致无法执行其他类型任务
-                {
-                    #region 移库
-
-                    DB.Do(db =>
-                    {
-                        //获取当前堆垛机未执行的任务的组ID
-                        var taskGroupKey = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME).FirstOrDefault().TaskGroupKey;
-                        //通过任务的组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)
-                        {
-                            var addrFrom = task.ADDRFROM.Split("-");
-                            var addrTo = task.ADDRTO.Split("-");
-
-                            var oldTaskSTATUS = task.STATUS;
-                            task.STARTTIME = DateTime.Now;
-                            task.UPDATETIME = DateTime.Now;
-                            task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
-                            task.DEVICE = obj.Entity.CODE;
-                            db.Default.SaveChanges();
-                            Uploader.Upload(db);
-                            task.CreateStatusLog(db, $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}]", this.GetType());
-
-                            if (addrFrom[2].ToShort().OddNumberOrEven())
-                            {
-                                obj.Data.TaskID_1 = task.ID;
-                                obj.Data.SLine_1 = addrFrom[0].ToShort();
-                                obj.Data.SCol_1 = addrFrom[1].ToShort();
-                                obj.Data.SLayer_1 = addrFrom[2].ToShort();
-                                obj.Data.ELine_1 = addrTo[0].ToShort();
-                                obj.Data.ECol_1 = addrTo[1].ToShort();
-                                obj.Data.ELayer_1 = addrTo[2].ToShort();
-                                obj.Data.VoucherNo_1++;
-                            }
-                            else
-                            {
-                                obj.Data.TaskID_2 = task.ID;
-                                obj.Data.SLine_2 = addrFrom[0].ToShort();
-                                obj.Data.SCol_2 = addrFrom[1].ToShort();
-                                obj.Data.SLayer_2 = addrFrom[2].ToShort();
-                                obj.Data.ELine_2 = addrTo[0].ToShort();
-                                obj.Data.ECol_2 = addrTo[1].ToShort();
-                                obj.Data.ELayer_2 = addrTo[2].ToShort();
-                                obj.Data.VoucherNo_2++;
-                            }
-                        }
-                    });
-
-                    #endregion 移库
-                }
-                else if (LastIsOut)
-                {
-                    #region 入库
-
-                    var floor = obj.Entity.Get<int>("LastInFloor");
-                    floor = floor % 2 + 1;
-                    obj.Entity.Set("LastInFloor", floor);
-                    if (enterPriority != null && outPriority != null && outPriority.Priority > enterPriority.Priority) return;
-
-                    var arrIn = obj.GetPickPoint()
-                                   .Where(v => Device.Where(d => d.IsConv()).Select(d => d.Device<IStation521>()).Where(d => d.Data.Goodsend == v.Entity.Code()).Any()) //有正在前往取货点的任务
-                                   .ToList();
-
-                    if (!arrIn.Any()) return; //当前堆垛机无入库任务
-
-                    //入库口设备信息 找一个有任务有光电且不在运行状态位的取货点 如果找不到代表任务还在输送途中
-                    var station = arrIn.OrderBy(v => v.Data2.Tasknum > 0 && v.Data2.Status.HasFlag(IstationStatus.光电状态) && !v.Data3.Status.HasFlag(StationStatus.运行状态位) ? 0 : 1)
-                                       .ThenBy(v => v.UpdateTime)
-                                       .FirstOrDefault() ?? throw new WarnException($"[{deviceCode}]等待入库任务输送到位");
-
-                    //根据上述筛选条件筛选出来的入库任务 找到对应的设备组
-                    var item = Device.Where(v => v.DEVICEGROUP.Any(p => p.MEMBER.CODE == station.Entity.CODE)).Single();
-                    //对数据进行排序,根据CAD图纸规划,取货点两个设备中设备号较大的一个一定对应到堆垛机的一工位货叉
-                    //因此按照降序进行排序,可以保证数组中第一个一定是放到堆垛机一工位的数据
-                    var devs = item.DEVICEGROUP.Select(v => v.MEMBER)
-                                               .Select(v => v.Create<StationDevice>())
-                                               .OrderByDescending(v => v.Entity.CODE)
-                                               .ToArray();
-                    var finishTaskList = new List<FinishTaskList<int>>(); //成功分配货位的任务
-                    //取巷道
-                    DB.Do(db =>
-                    {
-                        //检测有效任务数与实际任务是是否相等
-                        var validDev = devs.Where(v => v.Data2.Tasknum > 10000 && v.Data2.Status.HasFlag(IstationStatus.光电状态) && !v.Data3.Status.HasFlag(StationStatus.运行状态位));
-                        if (!validDev.Any()) throw new DoException("无有效入库任务");
-                        var tasknum = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == validDev.First().Data2.Tasknum);
-                        var taskList = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == tasknum.TaskGroupKey && v.TYPE == TaskType.入库);
-                        if (validDev.Count() != taskList) throw new WarnException($"任务数量不匹配,设备-{validDev.Count()},WCS-{taskList}");
-
-                        foreach (var dev in validDev)
-                        {
-                            var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.STATUS < TaskStatus.堆垛机执行 && v.ID == dev.Data2.Tasknum) ?? throw new WarnException($"设备有光电有任务且不在运行状态,但WCS找不到任务{dev.Data2.Tasknum}");
-                            var oldTask = task.STATUS;
-                            var tunnel = dev.Entity.ROUTES.First().NEXT.CODE;
-                            I_WCS_GetWareCellResponse loc;
-                            //判定当前设备对应的堆垛机工位
-                            if (dev.Entity.CODE == devs[0].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉1); //一工位
-                            else if (dev.Entity.CODE == devs[1].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉2); //2工位
-                            else throw new WarnException($"设备{dev.Entity.CODE}无法对应至堆垛机的任一一个工位");
-
-                            task.UPDATETIME = DateTime.Now;
-                            task.STATUS = TaskStatus.堆垛机执行;
-                            task.ADDRTO = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer);
-                            task.DEVICE = obj.Entity.CODE;
-                            task.TUNNEL = tunnel;
-                            task.CreateStatusLog(db, $"状态由{oldTask}变更至{task.STATUS}", this.GetType());
-                            finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
-                        }
-                        db.Default.SaveChanges();
-                    });
-                    DB.Do(db =>
-                    {
-                        foreach (var finish in finishTaskList)
-                        {
-                            var task = db.Default.Set<WCS_TASK>().Find(finish.FinishCode);
-                            var addTo = task.ADDRTO.Split("-");
-                            if (finish.Station.Entity.CODE == devs[0].Entity.CODE)  //一工位
-                            {
-                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]1工位-开始:[{obj.Data.TaskID_1}][{obj.Data.SLine_1}][{obj.Data.ELine_1}][{obj.Data.ECol_1}][{obj.Data.ELayer_1}][{obj.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
-                                obj.Data.TaskID_1 = task.ID;
-                                obj.Data.SLine_1 = finish.Station.Entity.CODE.ToShort();
-                                obj.Data.SCol_1 = 0;
-                                obj.Data.SLayer_1 = 0;
-                                obj.Data.ELine_1 = addTo[0].ToShort();
-                                obj.Data.ECol_1 = addTo[1].ToShort();
-                                obj.Data.ELayer_1 = addTo[2].ToShort();
-                                obj.Data.RES1_1 = finishTaskList.Count.ToShort();
-                                obj.Data.VoucherNo_1++;
-                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]1工位-结束:[{obj.Data.TaskID_1}][{obj.Data.SLine_1}][{obj.Data.ELine_1}][{obj.Data.ECol_1}][{obj.Data.ELayer_1}][{obj.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
-                            }
-                            else if (finish.Station.Entity.CODE == devs[1].Entity.CODE)
-                            {
-                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]2工位-开始:[{obj.Data.TaskID_2}][{obj.Data.SLine_2}][{obj.Data.ELine_2}][{obj.Data.ECol_2}][{obj.Data.ELayer_2}][{obj.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
-                                obj.Data.TaskID_2 = task.ID;
-                                obj.Data.SLine_2 = finish.Station.Entity.CODE.ToShort();
-                                obj.Data.SCol_2 = 0;
-                                obj.Data.SLayer_2 = 0;
-                                obj.Data.ELine_2 = addTo[0].ToShort();
-                                obj.Data.ECol_2 = addTo[1].ToShort();
-                                obj.Data.ELayer_2 = addTo[2].ToShort();
-                                obj.Data.RES1_2 = finishTaskList.Count.ToShort();
-                                obj.Data.VoucherNo_2++;
-                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]2工位-结束:[{obj.Data.TaskID_2}][{obj.Data.SLine_2}][{obj.Data.ELine_2}][{obj.Data.ECol_2}][{obj.Data.ELayer_2}][{obj.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
-                            }
-                        }
-                    });
-
-                    #endregion 入库
-                }
-                else
-                {
-                    #region 出库
-
-                    //obj.EXOutStock(obj =>
-                    //{
-                    obj.CheckOutTask();
-                    var floor = obj.Entity.Get<int>("LastOutFloor");
-                    floor = floor % 2 + 1;
-                    obj.Entity.Set("LastOutFloor", floor);
-                    if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
-
-                    //获取当前堆垛机所有的放货点
-                    var list = obj.GetDeliveryPoint();
-
-                    list = list.Where(v =>
-                    {
-                        //true:满足条件  false:不满足条件
-                        //返回结果为无货的设备  默认无货
-                        var res = true;
-                        //放货点是否有货
-                        if (v.Data.VoucherNo != v.Data2.VoucherNo) res = false;
-                        else if (v.Data3.Status.HasFlag(StationStatus.运行状态位)) res = false;
-                        else if (v.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
-                        else if (v.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
-                        else if (v.Data2.Tasknum > 10000) res = false;
-                        return res;
-                    }).ToList();
-
-                    //没有可用货位
-                    if (list.Count == 0) return;
-
-                    //月台所有设备当前有的任务号
-                    var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
-                    //堆垛机设备
-                    var srm = obj.Entity.CODE;
-                    DB.Do(db =>
-                    {
-                        //堆垛机当前是否有正在执行的任务
-                        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)
-                                                      .Where(v => v.TYPE == TaskType.出库)
-                                                      .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
-
-                        //同时对结果进行排序,分组
-                        var maxnum = ProtocolProxy.Ygwms150Redis.Get("SaleTaskGroupCount").ToInt();
-                        //所有 有优先级任务的出货口
-                        var priorityADDRTO = db.Default.Set<WCS_TASK>().Where(v => v.Priority > 0 && v.STATUS == TaskStatus.新建 && v.DEVICE != obj.Entity.CODE).ToList()
-                                                                        .GroupBy(v => v.ADDRTO).Select(v => new { v.Key, List = v.Select(p => p.DEVICE).Distinct().ToList() })
-                                                                        .Where(v => v.List.Where(p =>
-                                                                        {
-                                                                            var dev = Device.Find(p).Create<SRMDevice>();
-                                                                            return dev.Data2.SRMMode == SCMode.远程 && dev.Data2.SRMStatus == SCRunStatus.空闲;
-                                                                        }).Any())
-                                                                        .Select(v => v.Key)
-                                                                        .ToList();
-                        var cTaskList = db.Default.Set<WCS_TASK>().AsNoTracking()
-                                                                  .Where(d => d.TYPE == TaskType.出库)
-                                                                  .Where(d => d.STATUS > TaskStatus.新建)
-                                                                  .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID)).ToList();
-                        var outDepotList = waitTask.Where(v => cTaskList.Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR).GroupBy(d => d.TaskGroupKey).Count() < maxnum)
-                                                   .OrderByDescending(v => v.Priority)
-                                                   .ThenBy(v => v.ADDRTO == "G1340" ? 0 : 1)
-                                                   .ThenBy(v => v.FLOOR == floor ? 0 : 1)
-                                                   .ThenBy(v => cTaskList.Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR).GroupBy(d => d.TaskGroupKey).Count())
-                                                   .ThenBy(v => v.CREATETIME)
-                                                   .GroupBy(v => v.ADDRTO)
-                                                   .Where(v => !priorityADDRTO.Contains(v.Key))
-                                                   .FirstOrDefault()
-                                                   .Select(v => v).ToList();
-
-                        //获取两个个可执行任务,此时这两个任务的目标地址是一致的
-                        var tasks = outDepotList.GetOutTask();
-
-                        #region 校验两个产品是否为同规格
-
-                        if (tasks.Length == 2)
-                        {
-                            var length = tasks.OrderByDescending(v => v.Length).ToArray();
-                            //较大的长度减去较小的长度,差大于两百表示为不同规格产品
-                            if (length[0].Length - length[1].Length > 200)
-                            {
-                                tasks = tasks.Take(1).ToArray();
-                            }
-                        }
-
-                        #endregion 校验两个产品是否为同规格
-
-                        var finishTaskList = new List<FinishTaskList<SrmFork, Task>>();
-
-                        for (int i = 0; i < tasks.Length; i++)
-                        {
-                            var item = tasks[i];
-                            var task = db.Default.Set<WCS_TASK>().Find(item.ID);
-                            var oldTaskSTATUS = task.STATUS;
-                            task.STARTTIME = DateTime.Now;
-                            task.UPDATETIME = DateTime.Now;
-                            task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
-                            task.DEVICE = obj.Entity.CODE;
-                            task.TaskGroupKey = tasks.Length switch
-                            {
-                                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);
-                            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}]";
-                            else
-                                msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_2}-{obj.Data.SCol_2}-{obj.Data.SLayer_2}][{obj.Data.ELine_2}][{obj.Data.VoucherNo_2}]";
-                            task.CreateStatusLog(db, msg, this.GetType());
-                            item.SRMSTATION = task.SRMSTATION;
-                            finishTaskList.Add(new FinishTaskList<SrmFork, Task>(fork, item));
-                        }
-
-                        db.Default.SaveChanges();
-
-                        foreach (var finish in finishTaskList)
-                        {
-                            if (finish.FinishCode == SrmFork.货叉1) // 列数较小的放一工位
-                            {
-                                obj.WriteTask1(finish.Station, (short)tasks.Length);
-                            }
-                            else if (finish.FinishCode == SrmFork.货叉2) //列数较大的放二工位
-                            {
-                                obj.WriteTask2(finish.Station, (short)tasks.Length);
-                            }
-                        }
-                    });
-                    //});
-
-                    #endregion 出库
-                }
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)

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

@@ -1,16 +1,8 @@
-using DBHelper;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Collections.Generic;
 using WCS.Core;
 using WCS.Entity;
-using WCS.Entity.Protocol;
-using WCS.Entity.Protocol.SRM;
 using WCS.Service.Extensions;
 using WCS.Service.Handlers;
-using WCS.Service.Helpers;
-using TaskStatus = WCS.Entity.TaskStatus;
 
 namespace WCS.Service.Works.Station
 {
@@ -22,74 +14,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                obj.BcrStationIsForbid();
-                //设备组无论单卷还是双卷都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
-
-                //成功创建的任务
-                var finishTaskList = new List<FinishTaskList<int>>();
-
-                //创建对应的任务
-                DB.Do(db =>
-                {
-                    var devs = obj.GetBcrValid();
-                    devs.Valid();
-                    var infos = devs.GetWMSInTask();
-
-                    foreach (var item in devs)
-                    {
-                        var dev = item.Station;
-                        var next = dev.Entity.GetPath("SRM");
-                        var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode + "}"));
-                        if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
-                            throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
-
-                        var task = new WCS_TASK();
-                        task.BARCODE = info.ContainerCode;
-                        task.TYPE = TaskType.入库;
-                        task.STATUS = TaskStatus.执行中;
-                        task.ADDRFROM = dev.Entity.CODE;
-                        task.ADDRTO = info.EndPostion;
-                        task.STARTTIME = DateTime.Now;
-                        task.UPDATEUSER = "WCS";
-                        task.UPDATETIME = DateTime.Now;
-                        task.WMSTASK = int.Parse(info.WMSTaskNum);
-                        task.TaskGroupKey = info.TaskGroupKey;
-                        task.ADDRNEXT = next.CODE;
-                        task.HEIGHT = dev.Data2.GoodsSize;
-                        task.FLOOR = 2;
-
-                        db.Default.Set<WCS_TASK>().Add(task);
-                        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}]";
-                        task.CreateStatusLog(db, msg, this.GetType());
-                    }
-                    //两个任务一起创建
-                    db.Default.SaveChanges();
-                });
-
-                //检查对应的任务是否已创建成功
-                DB.Do(db =>
-                {
-                    foreach (var finishTask in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.FinishCode);
-                        if (task == null) continue;
-
-                        finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = task.ADDRFROM.ToShort();
-                        finishTask.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
-                        finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
-                        finishTask.Station.Data.CmdType = IstationCmdType.扫码入库;
-                        finishTask.Station.Data.VoucherNo++;
-                    }
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -106,104 +30,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                var code = obj.Entity.CODE;
-                //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
-
-                //成功分配巷道的任务的任务
-                var finishTaskList = new List<FinishTaskList<int>>();
-
-                //变更数据库信息
-                DB.Do(db =>
-                {
-                    var devs = obj.GetAddressValid();
-                    if (!devs.Any()) return; //无可执行任务
-                    var taskList = devs.ValidTaskCheck(db);
-
-                    var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
-                    if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
-                    var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
-
-                    var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
-
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
-                    foreach (var item in tunnels)
-                    {
-                        //当前巷道的取货点
-                        var allIn = Device.Where(v => v.Is(DF.SRMBOPP取货)) //一楼所有取货点
-                                          .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
-                                          .Select(v => v.CODE)
-                                          .ToList();
-                        //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
-                        var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE))).Select(v => v.CODE);
-                        //获得RGV的交货点
-                        var rgvDeliveryPoint = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && turntable.Contains(p.NEXT.CODE)))
-                                      .Select(v => v.Create<StationDevice>()) //取所有可以到达取货点设备的信息
-                                      .Where(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位)
-                                               && !v.Data2.Status.HasFlag(IstationStatus.光电状态)
-                                               && v.Data2.Tasknum < 10000
-                                               && v.Data3.Status.HasFlag(StationStatus.自动))//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
-                                      .Distinct()
-                                      .FirstOrDefault();//去一次重
-
-                        if (rgvDeliveryPoint == null) continue;
-                        var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == rgvDeliveryPoint.Entity)).MinBy(p => p.CODE);
-                        //RGV是否有正在前往这个地址的任务
-                        var rgvList = Device.Where(v => v.Is(DF.BOPPRGV)).Select(v => v.Create<RGVDevice>());
-                        if (rgvList.Any(v => (!v.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) || !v.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动))
-                                            && v.Data2.TaskType_1 == WCS.Entity.Protocol.RGV.RGVTaskType.放货
-                                            && v.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort())) continue;
-                        tunnelInfos.Add(new TunnelInfo
-                        {
-                            Tunnel = item,
-                            taskIN = taskInStation, //找到放货点设备所在组
-                            SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
-                        });
-                    }
-                    //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return (v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程) || v.SRM.Entity.CODE == "SRM1"; } catch { return false; } })
-                        .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成)).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
-                    if (tunnelInfo == null) throw new WarnException("无可用巷道");
-
-                    //开始变更任务信息
-                    foreach (var item in devs)
-                    {
-                        var dev = Device.Find(item.Station.Entity.CODE).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}");
-
-                        task.DEVICE = tunnelInfo.SRM.Entity.CODE;
-                        task.TUNNEL = tunnelInfo.Tunnel.CODE;
-                        task.ADDRNEXT = tunnelInfo.taskIN.CODE;
-                        task.TaskGroupKey = res.WMSTaskGroupKey;
-                        task.ADDRTO = task.DEVICE;
-                        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 FinishTaskList<int>(task.ID, item.Station));
-                    }
-                    db.Default.SaveChanges();
-                });
-
-                // 开始将任务信息写入到设备
-                DB.Do(db =>
-                {
-                    foreach (var finishTask in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
-                        if (task == null) continue;
-                        finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
-                        finishTask.Station.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
-                        finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
-                        finishTask.Station.Data.CmdType = IstationCmdType.分配目标地址;
-                        finishTask.Station.Data.VoucherNo++;
-                    }
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -220,94 +46,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                var code = obj.Entity.CODE;
-
-                //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
-                //成功分配巷道的任务的任务
-                var finishTaskList = new List<FinishTaskList<int>>();
-
-                //变更数据库信息
-                DB.Do(db =>
-                {
-                    var devs = obj.GetAddressValid();
-                    if (!devs.Any()) return; //无可执行任务
-                    var taskList = devs.ValidTaskCheck(db);
-
-                    var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
-                    if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
-                    var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
-
-                    var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
-
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
-                    foreach (var item in tunnels)
-                    {
-                        //当前巷道的取货点
-                        var allIn = Device.Where(v => v.Is(DF.SRMBOPP取货))
-                                          .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
-                                          .Select(v => v.CODE)
-                                          .ToList();
-                        //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
-                        var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE)))
-                                              .Where(v => obj.Items.Any(p => p.Entity == v))// 筛选出包含在当前设备组的设备
-                                              .Distinct()
-                                              .FirstOrDefault();//去一次重
-                        if (turntable == null) continue;
-                        var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => allIn.Contains(d.MEMBER.CODE))).OrderBy(p => p.CODE).FirstOrDefault();
-
-                        tunnelInfos.Add(new TunnelInfo
-                        {
-                            Tunnel = item,
-                            taskIN = dev, //找到放货点设备所在组
-                            SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
-                        });
-                    }
-                    //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } })
-                                                .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
-                    if (tunnelInfo == null) throw new WarnException("无可用巷道");
-
-                    //开始变更任务信息
-                    foreach (var item in devs)
-                    {
-                        var dev = Device.Find(item.Station.Entity.CODE).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}");
-
-                        task.DEVICE = tunnelInfo.SRM.Entity.CODE;
-                        task.TUNNEL = tunnelInfo.Tunnel.CODE;
-                        task.ADDRNEXT = dev.Entity.GetPath(task.DEVICE).CODE;
-                        task.TaskGroupKey = res.WMSTaskGroupKey;
-                        task.ADDRTO = task.DEVICE;
-                        var msg = $"下达从{obj.Entity.CODE}移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
-                        msg += $"[{dev.Data.Tasknum}][{obj.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
-                        task.CreateStatusLog(db, msg, this.GetType());
-                        finishTaskList.Add(new FinishTaskList<int>(task.ID, item.Station));
-                    }
-                    db.Default.SaveChanges();
-                });
-
-                // 开始将任务信息写入到设备
-                DB.Do(db =>
-                {
-                    foreach (var finishTask in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
-                        if (task == null) continue;
-
-                        finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
-                        finishTask.Station.Data.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++;
-                    }
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -317,4 +55,4 @@ namespace WCS.Service.Works.Station
 
         private List<string> devCodes = new List<string>() { "G1190", "G1199", "G1208", "G1217", "G1225" };
     }
-}
+}

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

@@ -23,79 +23,7 @@ namespace WCS.Service.Works.Station
 
         protected override void Do(StationDeviceGroup obj)
         {
-            var timer = new Stopwatch();
-            timer.Start();
-            obj.EX(obj =>
-                {
-                    obj.BcrStationIsForbid();
-                    //设备组无论单卷还是双卷都必须满足的条件
-                    if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                    if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
-
-                    //成功创建的任务
-                    var finishTaskList = new List<FinishTaskList<int>>();
-
-                    //创建对应的任务
-                    DB.Do(db =>
-                    {
-                        var devs = obj.GetBcrValid();
-                        devs.Valid();
-                        var infos = devs.GetWMSInTask();
-                        foreach (var item in devs)
-                        {
-                            var dev = item.Station;
-                            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}存在未完成任务,请检查是否为标签卡重复使用");
-
-                            var task = new WCS_TASK();
-                            task.BARCODE = info.ContainerCode;
-                            task.TYPE = TaskType.入库;
-                            task.STATUS = TaskStatus.执行中;
-                            task.ADDRFROM = dev.Entity.CODE;
-                            task.ADDRTO = info.EndPostion;
-                            task.STARTTIME = DateTime.Now;
-                            task.UPDATEUSER = "WCS";
-                            task.UPDATETIME = DateTime.Now;
-                            task.WMSTASK = int.Parse(info.WMSTaskNum);
-                            task.TaskGroupKey = info.TaskGroupKey;
-                            task.ADDRNEXT = next;
-                            task.HEIGHT = dev.Data2.GoodsSize;
-                            task.FLOOR = 1;
-
-                            db.Default.Set<WCS_TASK>().Add(task);
-                            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}]";
-                            task.CreateStatusLog(db, msg, this.GetType());
-                        }
-                        //两个任务一起创建
-                        db.Default.SaveChanges();
-                    });
-
-                    //检查对应的任务是否已创建成功
-                    DB.Do(db =>
-                    {
-                        //InfoLog.INFO_CREATETASKIN($"[{obj.Entity.CODE}]--生成任务{JsonConvert.SerializeObject(finishTaskList)}");
-                        foreach (var finishTask in finishTaskList)
-                        {
-                            var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.FinishCode);
-                            if (task == null) continue;
-
-                            finishTask.Station.Data.Tasknum = task.ID;
-                            finishTask.Station.Data.Goodsstart = task.ADDRFROM.ToShort();
-                            finishTask.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
-                            finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
-                            finishTask.Station.Data.CmdType = IstationCmdType.扫码入库;
-                            finishTask.Station.Data.VoucherNo++;
-                        }
-                    });
-
-                    timer.Stop();
-                    InfoLog.INFO_TIMING($"{obj.Entity.CODE}--扫码入库,耗时{timer.ElapsedMilliseconds}");
-                });
+           
         }
     }
 
@@ -109,103 +37,7 @@ namespace WCS.Service.Works.Station
 
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                var code = obj.Entity.CODE;
-                //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待任务执行,凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
-
-                //成功分配巷道的任务的任务
-                var finishTaskList = new List<FinishTaskList<int>>();
-
-                //变更数据库信息
-                DB.Do(db =>
-                {
-                    var devs = obj.Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Request == IstationRequest.请求分配目标地址)
-                                           .Where(v => v.Data2.Tasknum > 10000 && v.Data2.Goodsend != 0);
-                    if (!devs.Any()) return; //无可执行任务
-                    var taskIds = devs.Select(dev => dev.Data2.Tasknum).ToList();
-                    var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
-
-                    taskList.ValidTaskCheck(devs.Count(), db);
-
-                    var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
-                    if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
-                    var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
-
-                    var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
-
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
-                    foreach (var item in tunnels)
-                    {
-                        //当前巷道的取货点
-                        var allIn = Device.Where(v => v.Is(DF.SRM二级品取货)) //一楼所有取货点
-                                          .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
-                                          .Select(v => v.CODE)
-                                          .ToList();
-                        var putStation = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE))) //下一个目标地址包含取货点的设备
-                                      .Select(v => v.Create<StationDevice>()) //取所有可以到达取货点设备的信息
-                                      .Where(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位) && !v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Tasknum < 10000)//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
-                                      .Distinct()
-                                      .FirstOrDefault();//去一次重
-                        if (putStation == null) continue;
-                        var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == putStation.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
-                        //RGV是否有正在前往这个地址的任务
-                        var rgv8 = Device.Find("RGV8").Create<RGVDevice>();
-                        if ((!rgv8.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) || !rgv8.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动))
-                           && rgv8.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort()) continue;
-                        tunnelInfos.Add(new TunnelInfo
-                        {
-                            Tunnel = item,
-                            taskIN = taskInStation, //找到放货点设备所在组
-                            SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
-                        });
-                    }
-                    //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } })
-                                                .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成))
-                                                .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
-                    if (tunnelInfo == null) throw new WarnException("无可用巷道");
-
-                    //开始变更任务信息
-                    foreach (var item in devs)
-                    {
-                        var dev = Device.Find(item.Entity.CODE).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}");
-
-                        task.DEVICE = tunnelInfo.SRM.Entity.CODE;
-                        task.TUNNEL = tunnelInfo.Tunnel.CODE;
-                        task.ADDRNEXT = tunnelInfo.taskIN.CODE;
-                        task.TaskGroupKey = res.WMSTaskGroupKey;
-                        task.ADDRTO = task.DEVICE;
-                        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 FinishTaskList<int>(task.ID, item.Entity.Create<StationDevice>()));
-                    }
-
-                    db.Default.SaveChanges();
-                });
-
-                // 开始将任务信息写入到设备
-                DB.Do(db =>
-                {
-                    foreach (var finishTask in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
-                        if (task == null) continue;
-
-                        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++;
-                    }
-                });
-            });
+         
         }
     }
 
@@ -214,98 +46,7 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                var code = obj.Entity.CODE;
-
-                //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
-                //成功分配巷道的任务的任务
-                var finishTaskList = new List<FinishTaskList<int>>();
-
-                //变更数据库信息
-                DB.Do(db =>
-                {
-                    var devs = obj.Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Request == IstationRequest.请求分配目标地址)
-                                       .Where(v => v.Data2.Tasknum > 10000);
-                    if (!devs.Any()) return; //无可执行任务
-                    var taskIds = devs.Select(dev => dev.Data2.Tasknum).ToList();
-                    var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
-
-                    taskList.ValidTaskCheck(devs.Count(), db);
-
-                    var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
-                    if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
-                    var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
-
-                    var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
-
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
-                    foreach (var item in tunnels)
-                    {
-                        //当前巷道的取货点
-                        var allIn = Device.Where(v => v.Is(DF.SRM二级品取货)) //一楼所有取货点
-                                      .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
-                                      .Select(v => v.CODE)
-                                      .ToList();
-                        //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
-                        var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE)))
-                                          .Where(v => obj.Items.Any(p => p.Entity == v))// 筛选出包含在当前设备组的设备
-                                          .Distinct()
-                                          .FirstOrDefault();//去一次重
-                        if (turntable == null) continue;
-                        var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == turntable)).OrderBy(p => p.CODE).FirstOrDefault();
-
-                        tunnelInfos.Add(new TunnelInfo
-                        {
-                            Tunnel = item,
-                            taskIN = dev, //找到放货点设备所在组
-                            SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
-                        });
-                    }
-                    //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } })
-                                            .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
-                    if (tunnelInfo == null) throw new WarnException("无可用巷道");
-
-                    //开始变更任务信息
-                    foreach (var item in devs)
-                    {
-                        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}");
-
-                        task.DEVICE = tunnelInfo.SRM.Entity.CODE;
-                        task.TUNNEL = tunnelInfo.Tunnel.CODE;
-                        task.ADDRNEXT = tunnelInfo.taskIN.CODE;
-                        task.TaskGroupKey = res.WMSTaskGroupKey;
-                        task.ADDRTO = task.DEVICE;
-                        var msg = $"下达从{obj.Entity.CODE}移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
-                        msg += $"[{dev.Data.Tasknum}][{obj.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
-                        task.CreateStatusLog(db, msg, this.GetType());
-                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
-                    }
-                    db.Default.SaveChanges();
-                });
-
-                // 开始将任务信息写入到设备
-                DB.Do(db =>
-                {
-                    foreach (var finishTask in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
-                        if (task == null) continue;
-
-                        finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
-                        finishTask.Station.Data.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++;
-                    }
-                });
-            });
+            
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -321,57 +62,7 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                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 =>
-                {
-                    foreach (var dev in devs)
-                    {
-                        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;
-
-                        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));
-                    }
-                    db.Default.SaveChanges();
-                });
-
-                DB.Do(db =>
-                {
-                    foreach (var finish in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
-                        if (task == null) continue;
-                        finish.Station.Data.Tasknum = task.ID;
-                        finish.Station.Data.Goodsstart = finish.Station.Entity.CODE.ToShort();
-                        finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
-                        finish.Station.Data.CmdType = IstationCmdType.分配目标地址;
-                        finish.Station.Data.VoucherNo++;
-                    }
-                });
-            });
+            
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)

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

@@ -1,12 +1,7 @@
-using DBHelper;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
+using System.Collections.Generic;
 using WCS.Core;
 using WCS.Entity;
-using WCS.Entity.Protocol;
 using WCS.Service.Extensions;
-using WCS.Service.Helpers;
 
 namespace WCS.Service.Works.Station
 {
@@ -15,70 +10,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            var timer = new Stopwatch();
-            timer.Start();
-            obj.EX(obj =>
-            {
-                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 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>()));
-                    }
-                    if (!devs.Any()) return;
-                    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.Count() != devs.Count) throw new WarnException($"可执行任务数{devs.Count},实际任务数{tasks.Count()}");
-                        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();
-                });
-
-                DB.Do(db =>
-                {
-                    foreach (var finish in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
-                        if (task == null) continue;
-                        finish.Station.Data.Tasknum = task.ID;
-                        finish.Station.Data.Goodsstart = finish.Station.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++;
-                    }
-                    if (finishTaskList.Any())
-                    {
-                        timer.Stop();
-                        InfoLog.INFO_TIMING($"{obj.Entity.CODE}--分配目标地址,耗时{timer.ElapsedMilliseconds}");
-                    }
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -95,63 +26,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            var timer = new Stopwatch();
-            timer.Start();
-
-            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.Data2.Request != IstationRequest.月台出库口任务完成)
-                        {
-                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-月台出库口任务完成--3");
-                            continue;
-                        }
-                        if (dev.Data2.Tasknum < 10000)
-                        {
-                            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);
-                        if (task.STATUS == TaskStatus.新建) throw new WarnException($"{task.ID}任务状态错误");
-
-                        task.STATUS = TaskStatus.已完成;
-                        task.ENDTIME = System.DateTime.Now;
-                        task.UPDATEUSER = "WCS";
-                        task.CreateStatusLog(db, $"状态由[{TaskStatus.执行中}]变更为[{task.STATUS}]-{dev.FinishCode}", this.GetType());
-                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
-                    }
-                    db.Default.SaveChanges();
-                });
-                DB.Do(db =>
-                {
-                    foreach (var finish in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
-                        finish.Station.Data.CmdType = IstationCmdType.月台出库口任务完成;
-                        finish.Station.Data.VoucherNo++;
-                    }
-                    if (finishTaskList.Any())
-                    {
-                        timer.Stop();
-                        InfoLog.INFO_TIMING($"{obj.Entity.CODE}--处理请求到反馈完成信号耗时{timer.ElapsedMilliseconds}");
-                    }
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -167,48 +41,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                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($"等待任务执行--凭证号不一致");
-
-                DB.Do(db =>
-                {
-                    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.光电状态))
-                        {
-                            continue;
-                        };
-                        if (dev.Data2.Tasknum < 10000)
-                        {
-                            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>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
-                        if (devs.Count != tasks.Count()) throw new WarnException($"可执行任务数{devs.Count},实际任务数{tasks.Count()}");
-                        dev.Station.Data.Tasknum = task.ID;
-                        dev.Station.Data.Goodsstart = dev.Station.Entity.CODE.ToShort();
-                        dev.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
-                        dev.Station.Data.Goodsnum = devs.Count.ToShort();
-                        dev.Station.Data.CmdType = IstationCmdType.分配目标地址;
-                        dev.Station.Data.VoucherNo++;
-                    }
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)

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

@@ -22,150 +22,7 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                var station = obj.Entity.CODE;
-
-                #region 处理新增AGV任务
-
-                DB.Do(db =>
-                {
-                    //找到所有的AGV任务
-                    var agvTasks = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库)
-                    .Where(v => v.Status < AGVTaskStatus.完成).ToArray();
-
-                    foreach (var agvtask in agvTasks)
-                    {
-                        var position = agvtask.Position;
-                        if (!ProtocolProxy.AllDatas.ContainsKey(position))
-                            ProtocolProxy.AllDatas[position] = new ProdLineData();
-                        var pld = ProtocolProxy.AllDatas[position] as ProdLineData;
-                        pld.Frame = LogicHandler.Frame;
-                        pld.Code = position;
-                        pld.TaskList.Add(agvtask);
-
-                        if (agvtask.Status == AGVTaskStatus.新建)
-                        {
-                            if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
-                            {
-                                InfoLog.INFO_INFO($"{station}手动状态");
-                                continue;
-                            };
-                            var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成);
-                            //同时最多只能有10个任务被确认
-                            if (qty.Count() >= 10)
-                            {
-                                continue;
-                            };
-
-                            if (qty.Count(v => v.Station == obj.Entity.CODE) > qty.Count(v => v.Station != obj.Entity.CODE))
-                            {
-                                InfoLog.INFO_INFO($"{station}触发均分");
-                                continue;
-                            }
-
-                            agvtask.Station = obj.Entity.CODE;
-                            agvtask.Status = AGVTaskStatus.确认;
-                            agvtask.UpdateTime = DateTime.Now;
-                        }
-                        else if (agvtask.Status == AGVTaskStatus.确认 && agvtask.Status > agvtask.AGVStatus)
-                        {
-                            agvtask.Status = AGVTaskStatus.执行;
-                            agvtask.UpdateTime = DateTime.Now;
-                            db.Default.SaveChanges();
-                        }
-                        else if (agvtask.Status < agvtask.AGVStatus)
-                        {
-                            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.自动)))
-                                {
-                                    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.高位)))
-                                {
-                                    continue;
-                                }
-                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
-                                {
-                                    continue;
-                                }
-                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
-                                {
-                                    continue;
-                                }
-                                if (obj.Items.Any(v => v.Data2.Tasknum > 0))
-                                {
-                                    continue;
-                                }
-
-                                if (db.Default.Set<WCS_AGVTask>().Any(v => v.Station == agvtask.Station && v.Status >= AGVTaskStatus.请求_允许 && v.Status < AGVTaskStatus.完成扫码 && v.ID != agvtask.ID)) //只能允许一个
-                                {
-                                    continue;
-                                }
-
-                                agvtask.Status = agvtask.AGVStatus;
-                                agvtask.UpdateTime = DateTime.Now;
-                                db.Default.SaveChanges();
-                            }
-                            else if (agvtask.AGVStatus == AGVTaskStatus.取放完成)
-                            {
-                                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
-                                {
-                                    continue;
-                                }
-                                if (!obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
-                                {
-                                    continue;
-                                }
-
-                                agvtask.Status = agvtask.AGVStatus;
-                                agvtask.UpdateTime = DateTime.Now;
-                                db.Default.SaveChanges();
-                                foreach (var dev in obj.Items)
-                                {
-                                    if (dev.Data2.Status.HasFlag(IstationStatus.光电状态))
-                                    {
-                                        dev.Data.Goodsnum = (short)agvtask.Goodsnum;
-                                        dev.Data.Istation521Status = IstationStatus.AGV放货完成信号;
-                                    }
-                                }
-                            }
-                            else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.完成))
-                            {
-                                agvtask.Status = agvtask.AGVStatus;
-                                agvtask.UpdateTime = DateTime.Now;
-                                db.Default.SaveChanges();
-                                var devs = Device.Find(agvtask.Station).Create<StationDeviceGroup>();
-                                foreach (var dev in devs.Items)
-                                {
-                                    dev.Data.Goodscode = agvtask.ID;
-                                }
-                            }
-                            else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.取消))
-                            {
-                                agvtask.Status = agvtask.AGVStatus;
-                                agvtask.UpdateTime = DateTime.Now;
-                                db.Default.SaveChanges();
-                            }
-                        }
-                    }
-                    db.Default.SaveChanges();
-                });
-
-                #endregion 处理新增AGV任务
-            });
+          
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -182,94 +39,7 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            var timer = new Stopwatch();
-            timer.Start();
-            obj.EX(obj =>
-            {
-                obj.BcrStationIsForbid();
-                //设备组无论单卷还是双卷都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
-                if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.低位))) throw new DoException("不在低位");
-
-                //成功创建的任务
-                var finishTaskList = new List<FinishTaskList<int>>();
-
-                //创建对应的任务
-                DB.Do(db =>
-                {
-                    var devs = obj.GetBcrValid();
-                    devs.Valid();
-                    var infos = devs.GetWMSInTask();
-
-                    WCS_AGVTask agvTask = null;
-
-                    if (!obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.手动入库)))
-                    {
-                        agvTask = db.Default.Set<WCS_AGVTask>().FirstOrDefault(v => v.Status == AGVTaskStatus.完成 && v.Station == obj.Entity.CODE) ?? throw new WarnException("无完成AGV任务");
-
-                        if (agvTask.Status != AGVTaskStatus.完成扫码)
-                        {
-                            agvTask.Status = AGVTaskStatus.完成扫码;
-                            agvTask.UpdateTime = DateTime.Now;
-                        }
-                    }
-
-                    foreach (var item in devs)
-                    {
-                        var dev = item.Station;
-                        var next = dev.Entity.GetPath("SRM");
-                        var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode + "}"));
-                        if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
-                            throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
-
-                        var task = new WCS_TASK();
-                        task.BARCODE = info.ContainerCode;
-                        task.TYPE = TaskType.入库;
-                        task.STATUS = TaskStatus.执行中;
-                        task.ADDRFROM = dev.Entity.CODE;
-                        task.ADDRTO = info.EndPostion;
-                        task.STARTTIME = DateTime.Now;
-                        task.UPDATEUSER = "WCS";
-                        task.UPDATETIME = DateTime.Now;
-                        task.WMSTASK = int.Parse(info.WMSTaskNum);
-                        task.TaskGroupKey = info.TaskGroupKey;
-                        task.ADDRNEXT = next.CODE;
-                        task.HEIGHT = dev.Data2.GoodsSize;
-                        task.AgvTask = agvTask == null ? 0 : agvTask.ID;
-                        task.FLOOR = 2;
-
-                        db.Default.Set<WCS_TASK>().Add(task);
-                        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}]";
-                        task.CreateStatusLog(db, msg, this.GetType());
-                    }
-                    //两个任务一起创建
-                    db.Default.SaveChanges();
-                });
-
-                //检查对应的任务是否已创建成功
-                DB.Do(db =>
-                {
-                    foreach (var finishTask in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.FinishCode);
-                        if (task == null) continue;
-
-                        finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = task.ADDRFROM.ToShort();
-                        finishTask.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
-                        finishTask.Station.Data.Goodsnum = (short)finishTaskList.Count;
-                        finishTask.Station.Data.CmdType = IstationCmdType.扫码入库;
-                        finishTask.Station.Data.VoucherNo++;
-                    }
-                });
-
-                timer.Stop();
-                InfoLog.INFO_TIMING($"{obj.Entity.CODE}--扫码入库,耗时{timer.ElapsedMilliseconds}");
-            });
+          
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -286,124 +56,7 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                var key = $"WCS:Lock:CoatingAllocationTunnel";
-                try
-                {
-                    if (ProtocolProxy.Yg150Redis.Get(key) != null) throw new WarnException($"[CoatingAllocationTunnel]--触发并发管控");
-                    ProtocolProxy.Yg150Redis.Set(key, key);
-                    var code = obj.Entity.CODE;
-                    //两个设备都必须满足的条件
-                    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 devs = obj.Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Request == IstationRequest.请求分配目标地址)
-                                               .Where(v => v.Data2.Tasknum > 10000 && v.Data2.Goodsend != 0);
-                        if (!devs.Any()) return; //无可执行任务
-                        var taskIds = devs.Select(dev => dev.Data2.Tasknum).ToList();
-                        var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
-
-                        taskList.ValidTaskCheck(devs.Count(), db);
-
-                        var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
-                        if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
-                        var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
-
-                        var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
-
-                        List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
-                        foreach (var item in tunnels)
-                        {
-                            //当前巷道的取货点
-                            var allIn = Device.Where(v => v.Is(DF.SRM涂布取货)) //二楼所有取货点
-                                              .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
-                                              .Select(v => v.CODE)
-                                              .ToList();
-
-                            //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
-                            var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE))).Select(v => v.CODE);
-                            //获得RGV的交货点
-                            var rgvDeliveryPoint = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && turntable.Contains(p.NEXT.CODE)))
-                                          .Select(v => v.Create<StationDevice>()) //取所有可以到达取货点设备的信息
-                                          .Where(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位)
-                                                   && !v.Data2.Status.HasFlag(IstationStatus.光电状态)
-                                                   && v.Data2.Tasknum < 10000
-                                                   && v.Data3.Status.HasFlag(StationStatus.自动))//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
-                                          .Distinct()
-                                          .FirstOrDefault();//去一次重
-                            if (rgvDeliveryPoint == null) continue;
-                            var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == rgvDeliveryPoint.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
-                            //只能有一组任务的下一个地址是交货点
-                            if (db.Default.Set<WCS_TASK>().Any(v => v.ADDRNEXT == taskInStation.CODE)) continue;
-
-                            //RGV是否有正在前往这个地址的任务
-                            var rgvList = Device.Where(v => v.Is(DF.涂布RGV)).Select(v => v.Create<RGVDevice>());
-                            if (rgvList.Any(v => (!v.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) || !v.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动))
-                                                && v.Data2.TaskType_1 == WCS.Entity.Protocol.RGV.RGVTaskType.放货
-                                                && v.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort())) continue;
-
-                            tunnelInfos.Add(new TunnelInfo
-                            {
-                                Tunnel = item,
-                                taskIN = taskInStation, //找到放货点设备所在组
-                                SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
-                            });
-                        }
-                        //筛选出优先级最高的可用巷道
-                        var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程; } catch { return false; } })
-                                                    .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成))
-                                                    .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
-                        if (tunnelInfo == null) throw new WarnException("无可用巷道");
-
-                        //开始变更任务信息
-                        foreach (var item in devs)
-                        {
-                            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}");
-
-                            task.DEVICE = tunnelInfo.SRM.Entity.CODE;
-                            task.TUNNEL = tunnelInfo.Tunnel.CODE;
-                            task.ADDRNEXT = tunnelInfo.taskIN.CODE;
-                            task.TaskGroupKey = res.WMSTaskGroupKey;
-                            task.ADDRTO = task.DEVICE;
-                            var msg = $"下达从{obj.Entity.CODE}移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
-                            msg += $"[{dev.Data.Tasknum}][{obj.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
-                            task.CreateStatusLog(db, msg, this.GetType());
-                            finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
-                        }
-                        db.Default.SaveChanges();
-                    });
-
-                    // 开始将任务信息写入到设备
-                    DB.Do(db =>
-                    {
-                        foreach (var finishTask in finishTaskList)
-                        {
-                            var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
-                            if (task == null) continue;
-
-                            finishTask.Station.Data.Tasknum = task.ID;
-                            finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
-                            finishTask.Station.Data.Goodsend = task.ADDRNEXT.Replace("G", "").ToShort();
-                            finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
-                            finishTask.Station.Data.CmdType = IstationCmdType.分配目标地址;
-                            finishTask.Station.Data.VoucherNo++;
-                        }
-                    });
-                }
-                finally
-                {
-                    ProtocolProxy.Yg150Redis.Del(key);
-                }
-            });
+           
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -420,98 +73,7 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                var code = obj.Entity.CODE;
-
-                //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务--凭证号不一致");
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
-                //成功分配巷道的任务的任务
-                var finishTaskList = new List<FinishTaskList<int>>();
-
-                //变更数据库信息
-                DB.Do(db =>
-                {
-                    var devs = obj.Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Request == IstationRequest.请求分配目标地址)
-                                           .Where(v => v.Data2.Tasknum > 10000);
-                    if (!devs.Any()) return; //无可执行任务
-                    var taskIds = devs.Select(dev => dev.Data2.Tasknum).ToList();
-                    var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
-
-                    taskList.ValidTaskCheck(devs.Count(), db);
-
-                    var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
-                    if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
-                    var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
-
-                    var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
-
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
-                    foreach (var item in tunnels)
-                    {
-                        //当前巷道的取货点
-                        var allIn = Device.Where(v => v.Is(DF.SRM涂布取货)) //一楼所有取货点
-                                          .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
-                                          .Select(v => v.CODE)
-                                          .ToList();
-                        //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
-                        var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE)))
-                                              .Where(v => obj.Items.Any(p => p.Entity == v))// 筛选出包含在当前设备组的设备
-                                              .Distinct()
-                                              .FirstOrDefault();//去一次重
-                        if (turntable == null) continue;
-                        var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == turntable)).OrderBy(p => p.CODE).FirstOrDefault();
-
-                        tunnelInfos.Add(new TunnelInfo
-                        {
-                            Tunnel = item,
-                            taskIN = dev, //找到放货点设备所在组
-                            SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
-                        });
-                    }
-                    //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } })
-                                                .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
-                    if (tunnelInfo == null) throw new WarnException("无可用巷道");
-
-                    //开始变更任务信息
-                    foreach (var item in devs)
-                    {
-                        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}");
-
-                        task.DEVICE = tunnelInfo.SRM.Entity.CODE;
-                        task.TUNNEL = tunnelInfo.Tunnel.CODE;
-                        task.ADDRNEXT = dev.Entity.GetPath(task.DEVICE).CODE;
-                        task.TaskGroupKey = res.WMSTaskGroupKey;
-                        task.ADDRTO = task.DEVICE;
-                        var msg = $"下达从{obj.Entity.CODE}移动至{task.ADDRNEXT}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
-                        msg += $"[{dev.Data.Tasknum}][{obj.Entity.CODE}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
-                        task.CreateStatusLog(db, msg, this.GetType());
-                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
-                    }
-                    db.Default.SaveChanges();
-                });
-
-                // 开始将任务信息写入到设备
-                DB.Do(db =>
-                {
-                    foreach (var finishTask in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().Find(finishTask.FinishCode);
-                        if (task == null) continue;
-
-                        finishTask.Station.Data.Tasknum = task.ID;
-                        finishTask.Station.Data.Goodsstart = obj.Entity.CODE.Replace("G", "").ToShort();
-                        finishTask.Station.Data.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++;
-                    }
-                });
-            });
+            
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)

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

@@ -1,16 +1,8 @@
-using DBHelper;
-using Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Collections.Generic;
 using WCS.Core;
 using WCS.Entity;
-using WCS.Entity.Protocol;
-using WCS.Service.Entity;
 using WCS.Service.Extensions;
 using WCS.Service.Handlers;
-using WCS.Service.Helpers;
-using InfoLog = WCS.Core.InfoLog;
 
 namespace WCS.Service.Works.Station
 {
@@ -22,61 +14,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                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 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();
-                });
-
-                DB.Do(db =>
-                {
-                    foreach (var finish in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
-                        if (task == null) continue;
-                        finish.Station.Data.Tasknum = task.ID;
-                        finish.Station.Data.Goodsstart = finish.Station.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)
@@ -95,81 +32,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                var key = $"WCS:Lock:CoatingAllocationOutboundDeliveryPoint";
-                try
-                {
-                    if (ProtocolProxy.Yg150Redis.Get(key) != null) throw new WarnException($"[CoatingAllocationOutboundDeliveryPoint]--触发并发管控");
-                    ProtocolProxy.Yg150Redis.Set(key, key);
-                    if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException("等待执行任务,凭证号不一致");
-                    if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
-
-                    var finishTaskList = new List<FinishTaskList<int>>();
-
-                    DB.Do(db =>
-                    {
-                        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>()));
-                        }
-                        var G1 = Device.Find("G1").Create<StationDeviceGroup>();
-                        //只能有一组任务的下一个地址是交货点同时,放货点必须无货
-                        if (db.Default.Set<WCS_TASK>().Any(v => v.ADDRNEXT == "G1") ||
-                            G1.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位)
-                                            || v.Data2.Status.HasFlag(IstationStatus.光电状态)
-                                            || v.Data2.Tasknum > 10000
-                                            || !v.Data3.Status.HasFlag(StationStatus.自动))) return;
-                        foreach (var dev in devs)
-                        {
-                            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();
-                    });
-
-                    DB.Do(db =>
-                    {
-                        foreach (var finish in finishTaskList)
-                        {
-                            var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
-                            if (task == null) continue;
-                            finish.Station.Data.Tasknum = task.ID;
-                            finish.Station.Data.Goodsstart = finish.Station.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++;
-                        }
-                    });
-                }
-                finally
-                {
-                    ProtocolProxy.Yg150Redis.Del(key);
-                }
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -188,130 +50,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                //必须满足的条件
-                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 devs = new List<FinishTaskList<string>>();
-
-                    //获取需要执行的设备信息
-                    foreach (var dev in obj.Items)
-                    {
-                        if (!dev.Data3.Status.HasFlag(StationStatus.低位))
-                        {
-                            InfoLog.INFO_INFO($"{dev.Entity.CODE}--不在低位");
-                            continue;
-                        }
-                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
-                        {
-                            InfoLog.INFO_INFO($"{dev.Entity.CODE}--没有光电");
-                            continue;
-                        }
-                        if (dev.Data2.Request != IstationRequest.请求分配目标地址)
-                        {
-                            //InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", 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 task1 = taskList.FirstOrDefault();
-                    var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == task1.TaskGroupKey && v.TYPE == TaskType.出库);
-                    //开始检查任务数是否匹配
-                    if (devs.Count != taskCount) throw new WarnException($"可执行数{devs.Count},任务组任务数{taskCount},数量不匹配,{task1.ID}-{task1.TaskGroupKey}");
-
-                    var stationList = new List<FinishTaskList<WCS_TASK>>();
-
-                    //开始处理需要分配目标地址的设备
-                    foreach (var dev in devs)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum) ?? throw new WarnException($"WCS无[{dev.Station.Data2.Tasknum}]任务信息");
-                        var addNext = "";
-                        if (dev.Station.Entity.CODE == "1340")
-                        {
-                            var Station1343 = Device.Find("1343").Create<StationDevice>();
-                            addNext = "1343";
-                            if (!Station1343.Data3.Status.HasFlag(StationStatus.自动) || Station1343.Data2.Tasknum > 10000)
-                                addNext = "1340";
-                        }
-                        else if (dev.Station.Entity.CODE == "1341")
-                        {
-                            var Station1344 = Device.Find("1344").Create<StationDevice>();
-                            addNext = "1344";
-                            if (!Station1344.Data3.Status.HasFlag(StationStatus.自动) || Station1344.Data2.Tasknum > 10000)
-                                addNext = "1341";
-                        }
-
-                        task.ADDRNEXT = addNext;
-                        task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
-                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
-                        stationList.Add(new FinishTaskList<WCS_TASK>(task, dev.Station));
-                    }
-
-                    #region 校验两个地址是否一致
-
-                    if (stationList.Count == 2)
-                    {
-                        stationList = stationList.OrderBy(v => v.FinishCode.ADDRNEXT.ToShort()).ToList();
-                        var task3 = stationList[0];
-                        var task4 = stationList[1];
-                        if (task3.FinishCode.ADDRNEXT == "1343" && task4.FinishCode.ADDRNEXT == "1344")
-                        {
-                        }
-                        else if (task3.FinishCode.ADDRNEXT == "1340" && task4.FinishCode.ADDRNEXT == "1341")
-                        {
-                        }
-                        else
-                        {
-                            var devs1 = stationList.Select(v => v.Station);
-                            foreach (var dev in devs1)
-                            {
-                                if (!dev.Data3.Status.HasFlag(StationStatus.自动)) throw new WarnException($"{dev.Entity.CODE}--不是自动");
-                                if (dev.Data2.Tasknum > 10000) throw new WarnException($"{dev.Entity.CODE}--已有任务");
-                            }
-                        }
-                    }
-
-                    #endregion 校验两个地址是否一致
-
-                    db.Default.SaveChanges();
-                });
-
-                DB.Do(db =>
-                {
-                    foreach (var finish in finishTaskList)
-                    {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode) ?? throw new WarnException($"已完成DB任务变更,但写入PLC信息是找不到任务{finish.FinishCode}");
-
-                        finish.Station.Data.Tasknum = task.ID;
-                        finish.Station.Data.Goodsstart = finish.Station.Entity.CODE.ToShort();
-                        finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
-                        finish.Station.Data.GoodsSize = task.Length.ToShort();
-                        finish.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
-                        finish.Station.Data.CmdType = IstationCmdType.分配目标地址;
-                        finish.Station.Data.VoucherNo++;
-                        InfoLog.INFO_AGV($"出库分配AGV取货点[{finish.FinishCode}]-[{finish.Station.Data.Goodsend}]");
-                    }
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -328,60 +66,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-            {
-                //必须满足的条件
-                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 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>()));
-                    }
-
-                    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无该任务信息");
-                        task.ADDRNEXT = "G1340";
-                        dev.Station.Data.GoodsSize = task.Length.ToShort();
-                        dev.Station.Data.VoucherNo++;
-                    }
-                    db.Default.SaveChanges();
-                });
-            });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -398,168 +82,6 @@ namespace WCS.Service.Works.Station
     {
         protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(obj =>
-             {
-                 var station = obj.Entity.CODE;
-
-                 #region 处理新增叫料任务
-
-                 DB.Do(db =>
-                 {
-                     //找到所有的AGV任务
-                     var agvTasks = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料)
-                     .Where(v => v.Status < AGVTaskStatus.完成).ToArray();
-
-                     foreach (var agvtask in agvTasks)
-                     {
-                         var position = agvtask.Position;
-                         if (!ProtocolProxy.AllDatas.ContainsKey(position))
-                             ProtocolProxy.AllDatas[position] = new ProdLineData();
-                         var pld = ProtocolProxy.AllDatas[position] as ProdLineData;
-                         pld.Frame = LogicHandler.Frame;
-                         pld.Code = position;
-                         pld.TaskList.Add(agvtask);
-
-                         if (agvtask.Status == AGVTaskStatus.新建)
-                         {
-                             if (obj.Entity.CODE != "G1340") continue;
-                             var qty = db.Default.Set<WCS_AGVTask>()
-                                 .Where(v => v.TaskType == AGVTaskType.叫料 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成).Count(v => v.Position == agvtask.Position);
-
-                             if (qty >= 4)
-                             {
-                                 //InfoLog.INFO_WarnDb($"{agvtask.Position}正在执行的叫料任务数量已达{qty},暂停出库", obj.Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常);
-                                 continue;
-                             };
-
-                             //涂布叫料默认目标地址G1340,到达G1340后再决定是否要继续前进一步
-                             List<I_WCS_GetOutTaskResponseSingle> res;
-                             try
-                             {
-                                 res = WMS.GetOutTask(agvtask.Position.Replace("_OUT", ""), "G1340");
-                             }
-                             catch (WarnException ex)
-                             {
-                                 //InfoLog.INFO_WarnDb($"{ex.Message}", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
-                                 continue;
-                             };
-
-                             res.ForEach(outTask =>
-                             {
-                                 var srm = Device.Find(outTask.TunnelNum).ROUTES.Where(v => v.NEXT.IsSC()).Select(v => v.NEXT).FirstOrDefault();
-
-                                 var loc = string.Format("{0}-{1}-{2}", outTask.Row, outTask.Colomn, outTask.Layer);
-
-                                 var task = new WCS_TASK
-                                 {
-                                     TYPE = TaskType.出库,
-                                     STATUS = WCS.Entity.TaskStatus.新建,
-                                     ADDRFROM = loc,
-                                     ADDRTO = "G1340",
-                                     BARCODE = outTask.ContainerBarCode,
-                                     TUNNEL = outTask.TunnelNum,
-                                     WMSTASK = int.Parse(outTask.WMSTaskNum),
-                                     UPDATEUSER = "WCS",
-                                     SRMSTATION = "",
-                                     DEVICE = srm.CODE,
-                                     //ADDRCURRENT = loc,
-                                     AgvTask = agvtask.ID,
-                                     Length = outTask.Length,
-                                     FLOOR = 2
-                                 };
-                                 db.Default.Set<WCS_TASK>().Add(task);
-                                 agvtask.Status = AGVTaskStatus.确认;
-                                 agvtask.UpdateTime = DateTime.Now;
-                                 db.Default.SaveChanges();
-                             });
-                             return;
-                         }
-                         else if (agvtask.AGVStatus == AGVTaskStatus.完成)
-                         {
-                             agvtask.Status = agvtask.AGVStatus;
-                             agvtask.UpdateTime = DateTime.Now;
-                             db.Default.SaveChanges();
-                         }
-                         else if (agvtask.AGVStatus == AGVTaskStatus.取消)
-                         {
-                             agvtask.Status = agvtask.AGVStatus;
-                             agvtask.UpdateTime = DateTime.Now;
-                             db.Default.SaveChanges();
-                         }
-                     }
-                 });
-
-                 #endregion 处理新增叫料任务
-
-                 //空闲自动,停止运行
-                 if (obj.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("等待执行任务");
-                 if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) return;
-                 if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException("设备运行中");
-
-                 var taskIds = new List<int>();
-                 obj.Items.ToList().ForEach(dev => taskIds.Add(dev.Data2.Tasknum));
-                 DB.Do(db =>
-                 {
-                     var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID));
-                     if (!taskList.Any()) return;
-                     if (taskList == null) throw new WarnException($"WCS任务号{JsonConvert.SerializeObject(taskIds)}不存在");
-                     if (taskList.Any(v => v.TYPE != TaskType.出库)) throw new WarnException("有任务的类型不是出库");
-                     if (taskList.Any(v => v.AgvTask == 0)) throw new WarnException("人工出库任务,请手动搬走");
-
-                     var agvtask = db.Default.Set<WCS_AGVTask>().Find(taskList.FirstOrDefault().AgvTask);
-                     if (agvtask == null) throw new WarnException($"AGV任务号{taskList.FirstOrDefault().AgvTask}不存在");
-                     if (taskList.Count() != db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == taskList.FirstOrDefault().TaskGroupKey && v.TYPE == TaskType.出库)) throw new WarnException("可执行任务数与实际任务数不符");
-
-                     if (agvtask.Status == AGVTaskStatus.确认)
-                     {
-                         if (!obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.高位))) throw new WarnException("不在高位");
-                         var flag = db.Default.Set<WCS_AGVTask>()
-                             .Where(v => v.TaskType == AGVTaskType.叫料).Count(v => v.Status > AGVTaskStatus.确认 && v.Status < AGVTaskStatus.取放完成);
-                         if (flag >= 2) throw new Exception("有2未完成的AGV出库任务");
-
-                         taskList.ToList().ForEach(task =>
-                                 {
-                                     task.STATUS = WCS.Entity.TaskStatus.已完成;
-                                     task.UPDATETIME = DateTime.Now;
-                                     task.ENDTIME = DateTime.Now;
-                                 });
-
-                         agvtask.Station = obj.Entity.CODE;
-                         agvtask.Status = AGVTaskStatus.执行;
-                         agvtask.UpdateTime = DateTime.Now;
-                         db.Default.SaveChanges();
-                     }
-                     else if (agvtask.Status < agvtask.AGVStatus)
-                     {
-                         if (agvtask.AGVStatus == AGVTaskStatus.请求_允许)
-                         {
-                             if (!obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.高位))) throw new WarnException("不在高位");
-                             if (agvtask.Status < AGVTaskStatus.执行) throw new WarnException($"AGV状态错误-{agvtask.Status}");
-                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV取货完成信号))) throw new WarnException("任务清零信号未清除");
-                             if (!obj.Items.Any(v => v.Data2.Tasknum > 10000 && v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("没有设备有任务且有光电");
-
-                             agvtask.Status = agvtask.AGVStatus;
-                             agvtask.UpdateTime = DateTime.Now;
-                             db.Default.SaveChanges();
-                         }
-                         else if (agvtask.AGVStatus == AGVTaskStatus.取放完成)
-                         {
-                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV取货完成信号))) throw new WarnException("任务清零信号未清除");
-                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new WarnException("AGV取货完成后依然有光电信号");
-                             if (agvtask.Status < AGVTaskStatus.请求_允许) throw new WarnException("AGV任务状态有误");
-
-                             agvtask.Status = agvtask.AGVStatus;
-                             agvtask.UpdateTime = DateTime.Now;
-                             db.Default.SaveChanges();
-
-                             foreach (var dev in obj.Items)
-                             {
-                                 dev.Data.Istation521Status = IstationStatus.AGV取货完成信号;
-                             }
-                         }
-                     }
-                 });
-             });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -567,4 +89,4 @@ namespace WCS.Service.Works.Station
             return dev.CODE == "G1340" || dev.CODE == "G1343";
         }
     }
-}
+}

+ 1 - 1
Projects/永冠OPP/WCS.Service/appsettings.json

@@ -9,7 +9,7 @@
   "ConnectionStrings": {
     //"WCSDB": "Data Source=192.168.251.12;User ID=sa;Password=abc.123;Initial Catalog=WCS_MW;Integrated Security=False"
     //"WCSDB": "Data Source=192.168.249.120;User ID=sa;Password=password@123$%^;Initial Catalog=WCS_MW;Integrated Security=False;"
-    "WCSDB": "Data Source=192.168.249.151;User ID=sa;Password=Password@123;Initial Catalog=WCS_OPP;Integrated Security=False;"
+    "WCSDB": "server=localhost;Database=wcs;Uid=root;Pwd=123456;AllowLoadLocalInfile=true"
     //"WMSDB": "Data Source=192.168.249.151;User ID=sa;Password=Password@123;Initial Catalog=yongguanwms_opp;Integrated Security=False;"
   }
 }

+ 8 - 1
WCS Pedestal.sln

@@ -30,7 +30,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Logs", "Logs\Logs.csproj",
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PLC.Siemens", "PLC.Siemens\PLC.Siemens.csproj", "{8F6C4A79-98EA-4019-B72A-29290328185A}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DBHelper-SqlSugar", "DBHelper-SqlSugar\DBHelper-SqlSugar.csproj", "{A3E602C7-597C-469F-A065-BBA5901FFE2C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DBHelper-SqlSugar", "DBHelper-SqlSugar\DBHelper-SqlSugar.csproj", "{A3E602C7-597C-469F-A065-BBA5901FFE2C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlSugar", "..\..\..\..\开源\Src\Asp.NetCore2\SqlSugar\SqlSugar.csproj", "{9993C299-72BF-4F5A-AEAB-F1B41DF01FBC}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -74,6 +76,10 @@ Global
 		{A3E602C7-597C-469F-A065-BBA5901FFE2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A3E602C7-597C-469F-A065-BBA5901FFE2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{A3E602C7-597C-469F-A065-BBA5901FFE2C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9993C299-72BF-4F5A-AEAB-F1B41DF01FBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9993C299-72BF-4F5A-AEAB-F1B41DF01FBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9993C299-72BF-4F5A-AEAB-F1B41DF01FBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9993C299-72BF-4F5A-AEAB-F1B41DF01FBC}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -89,6 +95,7 @@ Global
 		{31B6E0FC-524C-4B52-9088-6EA4690E6B36} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
 		{8F6C4A79-98EA-4019-B72A-29290328185A} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
 		{A3E602C7-597C-469F-A065-BBA5901FFE2C} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
+		{9993C299-72BF-4F5A-AEAB-F1B41DF01FBC} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {75D30B04-ADD6-4FC6-8D7E-FAD45B731BB4}

+ 25 - 11
WCS.Entity/OBJ.cs

@@ -5,35 +5,49 @@ using System.ComponentModel.DataAnnotations.Schema;
 
 namespace WCS.Entity
 {
+    /// <summary>
+    /// 实体类通用基础类
+    /// </summary>
     [Serializable]
     public abstract class OBJ
     {
+        /// <summary>
+        /// ID
+        /// </summary>
         [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "ID")]
         [Column(Order = 0)]
-        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
-        [Display(Name = "主键", Order = 0)]
-        [Key]
         public virtual int ID { get; set; }
 
+        /// <summary>
+        /// 是否可用
+        /// </summary>
         [SugarColumn(ColumnDescription = "是否可用")]
-        [Display(Name = "可用")]
         public bool ENABLED { get; set; } = true;
 
-        [SugarColumn(ColumnDescription = "是否可用", Length = 50, IsNullable = true)]
-        [Display(Name = "更新者")]
-        [MaxLength(50)]
-        [Required]
+        /// <summary>
+        /// 更新用户
+        /// </summary>
+        [SugarColumn(ColumnDescription = "更新用户", Length = 50, IsNullable = true)]
         public string UPDATEUSER { get; set; }
 
+        /// <summary>
+        /// 更新时间
+        /// </summary>
         [SugarColumn(ColumnDescription = "更新时间")]
-        [Display(Name = "更新时间")]
         public DateTime UPDATETIME { get; set; } = DateTime.Now;
 
-        [SugarColumn(ColumnDescription = "更新时间")]
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "版本号")]
         [Timestamp]
-        [Display(Name = "版本")]
         public byte[] VER { get; set; }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
         public T Copy<T>() where T : OBJ
         {
             var instance = Activator.CreateInstance<T>();

+ 12 - 14
WCS.Entity/WCS_CMD.cs

@@ -1,28 +1,26 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Text;
-using SqlSugar;
+using SqlSugar;
 
 namespace WCS.Entity
 {
-    [SugarTable("WCS_CMD")]
+    [SugarTable("WCS_CMD", "WCS用户用写入PLC记录表")]
     public class WCS_CMD : OBJ
     {
-        [StringLength(20)]
+        [SugarColumn(Length = 20, ColumnDescription = "关联设备号")]
         public string DEVICE_CODE { get; set; }
 
-        [StringLength(256)]
-        public string PROTOCOL{ get; set; }
+        [Navigate(NavigateType.OneToOne, "DEVICE_CODE")]
+        public WCS_DEVICE DEVICE { get; set; }
 
-        [StringLength(32)]
-        public string PROPERTY { get; set; }  
+        [SugarColumn(Length = 256, ColumnDescription = "协议")]
+        public string PROTOCOL { get; set; }
 
-        [StringLength(512)]
+        [SugarColumn(Length = 32, ColumnDescription = "属性")]
+        public string PROPERTY { get; set; }
+
+        [SugarColumn(Length = 512, ColumnDescription = "值")]
         public string VALUE { get; set; }
 
+        [SugarColumn(ColumnDescription = "WCS版本号")]
         public int WCSVERSION { get; set; }
-
-
     }
 }

+ 19 - 20
WCS.Entity/WCS_DATABLOCK.cs

@@ -1,47 +1,46 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-using System.Text;
+using SqlSugar;
+using System;
 
 namespace WCS.Entity
 {
+    [SugarTable("WCS_DATABLOCK","PLC DB块配置表")]
     public class WCS_DATABLOCK : OBJ
     {
-        [NotMapped]
+        [SugarColumn(IsIgnore = true)]
         public override int ID { get; set; }
 
-        [Key]
-        [Display(Name = "编号")]
-        [MaxLength(20)]
+        [SugarColumn(IsPrimaryKey = true, Length = 20, ColumnDescription = "编号")]
         public string CODE { get; set; }
 
-        [Display(Name = "名称")]
-        [MaxLength(20)]
+        [SugarColumn(Length = 20, ColumnDescription = "名称")]
         public string NAME { get; set; }
 
-        [Display(Name = "PLC")]
+        public string PLCCODE { get; set; }
+
+        //[Navigate(typeof(WCS_PLC), nameof(PLCCODE), nameof(WCS_PLC.CODE))]
+        //public WCS_PLC PLC { get; set; }
+
+        [Navigate(NavigateType.OneToOne, nameof(PLCCODE))]
         public WCS_PLC PLC { get; set; }
 
         /// <summary>
         /// 西门子:DB520,其它:D0
         /// </summary>
-        [Display(Name = "编号")] 
+        [SugarColumn(ColumnDescription = "编号")]
         public int NO { get; set; }
 
-        [Display(Name = "总长度")]
+        [SugarColumn(ColumnDescription = "总长度")]
         public int LENGTH { get; set; }
 
-        [Display(Name = "结构体长度")]
+        [SugarColumn(ColumnDescription = "结构体长度")]
         public int DATALENGTH { get; set; }
 
-        [Display(Name = "协议类型")]
-        [StringLength(200)]
-        [Required]
-        public string PROTOCOL{ get; set; }
+        [SugarColumn(Length = 200, ColumnDescription = "协议类型")]
+        public string PROTOCOL { get; set; }
 
+        [SugarColumn]
         public bool NOUPDATE { get; set; }
-         
+
         public Type GetProtocolType()
         {
             return Type.GetType(PROTOCOL);

+ 21 - 41
WCS.Entity/WCS_DEVICE.cs

@@ -1,48 +1,42 @@
-using System;
+using SqlSugar;
+using System;
 using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 
 namespace WCS.Entity
 {
-    public enum DeviceType
-    {
-    }
-
+    /// <summary>
+    /// 设备列表
+    /// </summary>
+    [SugarTable("WCS_DEVICE", "设备列表")]
     public class WCS_DEVICE
     {
-        [Key]
-        [Required]
-        [Display(Name = "设备编号")]
-        [StringLength(50)]
+        [SugarColumn(IsPrimaryKey = true, ColumnDescription = "设备编号", Length = 50)]
         public string CODE { get; set; }
 
-        [Display(Name = "设备名称")]
-        [StringLength(50)]
-        [Required]
+        [SugarColumn(Length = 50, ColumnDescription = "设备名称")]
         public string NAME { get; set; }
 
-        //[Display(Name = "设备类型")]
-        //[StringLength(100)]
-        //[Required]
-        //public string TYPE { get; set; }
-
-        [Display(Name = "可用")]
+        [SugarColumn(Length = 50, ColumnDescription = "是否可用")]
         public bool ENABLED { get; set; } = true;
 
-        [MaxLength(50)]
-        [Required]
-        [Display(Name = "更新者")]
+        [SugarColumn(Length = 50, ColumnDescription = "更新者")]
         public string UPDATEUSER { get; set; }
 
-        [Display(Name = "更新时间")]
+        [SugarColumn(ColumnDescription = "更新时间")]
         public DateTime UPDATETIME { get; set; } = DateTime.Now;
 
-        [Timestamp]
-        [Display(Name = "版本")]
+        [SugarColumn(ColumnDescription = "版本")]
         public byte[] VER { get; set; }
 
-        public List<WCS_DEVICEPROTOCOL> PROTOCOLS { get; set; } = new List<WCS_DEVICEPROTOCOL>();
+        [SugarColumn(ColumnDescription = "读写协议")]
+        public int DEVICEPROTOCOLIDS { get; set; }
+
+        [Navigate(NavigateType.OneToMany, nameof(DEVICEPROTOCOLIDS))]
+        public List<WCS_DEVICEPROTOCOL> DEVICEPROTOCOLS { get; set; } = new List<WCS_DEVICEPROTOCOL>();
+
+        [SugarColumn()]
+        public int DEVICE { get; set; }
 
         [InverseProperty("DEVICE")]
         public List<WCS_ROUTE> ROUTES { get; set; } = new List<WCS_ROUTE>();
@@ -61,18 +55,4 @@ namespace WCS.Entity
             return CODE;
         }
     }
-
-    public class WCS_DEVICEPROTOCOL : OBJ
-    {
-        [Display(Name = "设备")]
-        [Required]
-        public WCS_DEVICE DEVICE { get; set; }
-
-        [Display(Name = "DB块")]
-        [Required]
-        public WCS_DATABLOCK DB { get; set; }
-
-        [Display(Name = "起始位置")]
-        public Int16 POSITION { get; set; }
-    }
-}
+}

+ 27 - 0
WCS.Entity/WCS_DEVICEPROTOCOL.cs

@@ -0,0 +1,27 @@
+using SqlSugar;
+using System;
+
+namespace WCS.Entity
+{
+    /// <summary>
+    /// DB块读写协议
+    /// </summary>
+    [SugarTable("WCS_DEVICEPROTOCOL", "DB块读写协议")]
+    public class WCS_DEVICEPROTOCOL : OBJ
+    {
+        [SugarColumn(ColumnDescription = "设备")]
+        public string DEVICECODE { get; set; }
+
+        [Navigate(NavigateType.OneToOne, nameof(DEVICECODE))]
+        public WCS_DEVICE DEVICE { get; set; }
+
+        [SugarColumn(ColumnDescription = "DB编号")]
+        public string DATABLOCKCODE { get; set; }
+
+        [Navigate(NavigateType.OneToOne, nameof(DATABLOCKCODE))]
+        public WCS_DATABLOCK DB { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始位置")]
+        public Int16 POSITION { get; set; }
+    }
+}

+ 18 - 28
WCS.Entity/WCS_PLC.cs

@@ -1,53 +1,43 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-using System.Text;
+using SqlSugar;
 
 namespace WCS.Entity
 {
+    [SugarTable("WCS_PLC")]
     public class WCS_PLC : OBJ
     {
-        [NotMapped]
-        public override int ID { get; set; } 
+        [SugarColumn(IsIgnore = true)]
+        public override int ID { get; set; }
 
-        [Key]
-        [Display(Name = "编号")]
-        [MaxLength(20)]
+        [SugarColumn(IsPrimaryKey = true, ColumnDescription = "编号", Length = 20)]
         public string CODE { get; set; }
 
-        [Display(Name = "名称")]
-        [MaxLength(20)]
+        [SugarColumn(ColumnDescription = "名称", Length = 20)]
         public string NAME { get; set; }
 
-        [Display(Name = "IP")]
-        [MaxLength(20)]
+        [SugarColumn(ColumnDescription = "IP", Length = 20)]
         public string IP { get; set; }
 
-        [Display(Name = "端口")]
+        [SugarColumn(ColumnDescription = "端口", Length = 20)]
         public int PORT { get; set; } = 102;
 
-        [Display(Name = "插槽号")]
+        [SugarColumn(ColumnDescription = "插槽号", Length = 20)]
         public int SLOT { get; set; }
 
-        [Display(Name = "机架号")]
+        [SugarColumn(ColumnDescription = "机架号", Length = 20)]
         public int RACK { get; set; }
 
-        [Display(Name = "厂商")]
+        [SugarColumn(ColumnDescription = "厂商", Length = 20)]
         public PLCType TYPE { get; set; }
 
-        [StringLength(10)]
-        [Display(Name = "型号")]
-        public string MODEL { get; set; } 
-
-
+        [SugarColumn(ColumnDescription = "型号", Length = 10)]
+        public string MODEL { get; set; }
     }
 
     public enum PLCType
-    { 
-        西门子=1,
-        三菱=2,
-        AB=3,
-        欧姆龙=4,
+    {
+        西门子 = 1,
+        三菱 = 2,
+        AB = 3,
+        欧姆龙 = 4,
     }
 }

+ 27 - 14
WCS.Entity/WCS_ROUTE.cs

@@ -1,22 +1,35 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using SqlSugar;
 
 namespace WCS.Entity
 {
-    public class WCS_ROUTE:OBJ
-    { 
-        [Required]
+    /// <summary>
+    /// 设备路由表
+    /// </summary>
+    [SugarTable("WCS_ROUTE", "设备路由表")]
+    public class WCS_ROUTE : OBJ
+    {
+        /// <summary>
+        /// 设备编号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "设备编号")]
+        public string DEVICECODE { get; set; }
+
+        /// <summary>
+        /// 所属设备信息
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(DEVICECODE))]
         public WCS_DEVICE DEVICE { get; set; }
 
-        [Required]
-        public WCS_DEVICE NEXT { get; set; }
+        /// <summary>
+        /// 下一个设备的编号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "下一个设备的编号")]
+        public string NEXTCODE { get; set; }
 
+        /// <summary>
+        /// 下一个设备的信息
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, "NEXTCODE")]
+        public WCS_DEVICE NEXT { get; set; }
     }
-
-   
 }