林豪 左 3 years ago
parent
commit
ac52fd8ab2

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

@@ -1,6 +1,7 @@
 using DBHelper_SqlSugar;
 using Logs;
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
@@ -14,6 +15,129 @@ using TaskStatus = WCS.Entity.TaskStatus;
 
 namespace WCS.Service.Extensions
 {
+    public static class WCS_DEVICEExtension
+    {
+        private static ConcurrentDictionary<string, object> DeviceValues = new ConcurrentDictionary<string, object>();
+
+        public static void AddFlag(this WCS_DEVICE source, DF flag)
+        {
+            var df = source.Get<DF>("DeviceFlag");
+            df = df | flag;
+            source.Set("DeviceFlag", df);
+        }
+
+        public static bool Is(this WCS_DEVICE source, DF flag)
+        {
+            var df = source.Get<DF>("DeviceFlag");
+            return (df & flag) == flag;
+        }
+
+        public static void Set<T>(this WCS_DEVICE source, string key, T value)
+        {
+            DeviceValues[source.CODE + key] = value;
+        }
+
+        public static T Get<T>(this WCS_DEVICE source, string key)
+        {
+            if (!DeviceValues.ContainsKey(source.CODE + key))
+                return default(T);
+            return (T)DeviceValues[source.CODE + key];
+        }
+
+        public static short Code(this WCS_DEVICE source)
+        {
+            return short.Parse(source.CODE);
+        }
+
+        public static string Tunnel(this WCS_DEVICE source)
+        {
+            return source.Get<string>("Tunnel");
+        }
+
+        public static int TunnelNum(this WCS_DEVICE source)
+        {
+            return int.Parse(source.Tunnel().Last().ToString());
+        }
+
+        public static int Floor(this WCS_DEVICE source)
+        {
+            return source.Get<int>("Floor");
+        }
+
+        public static WCS_DEVICE SC(this WCS_DEVICE source)
+        {
+            return source.Get<WCS_DEVICE>("SC");
+        }
+
+        public static WCS_DEVICE RGV(this WCS_DEVICE source)
+        {
+            return source.Get<WCS_DEVICE>("RGV");
+        }
+
+        public static LocInfo LocInfo(this WCS_DEVICE source)
+        {
+            return source.Get<LocInfo>("LocInfo");
+        }
+
+        public static bool WakeupOn(this WCS_DEVICE source, int sec, string key)
+        {
+            var str = "WakeupOn" + key;
+            var last = source.Get<DateTime>(str);
+            if ((DateTime.Now - last).TotalMilliseconds > sec)
+            {
+                source.Set(str, DateTime.Now);
+                return true;
+            }
+            else
+            {
+                Ltc.Log("OnSleep");
+                return false;
+            }
+        }
+
+        public static bool WakeupOn(this WCS_DEVICE source, int sec)
+        {
+            return source.WakeupOn(sec, "");
+        }
+
+        public static void AddFlag(DF flag, params string[] devices)
+        {
+            var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
+            Parallel.ForEach(arr, v =>
+            {
+                v.AddFlag(flag);
+            });
+        }
+
+        public static void AddFlag(DF flag, Action<WCS_DEVICE> callbck, params string[] devices)
+        {
+            var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
+            Parallel.ForEach(arr, v =>
+            {
+                v.AddFlag(flag);
+                callbck?.Invoke(v);
+            });
+        }
+
+        public static void Set<T>(string key, T value, params string[] devices)
+        {
+            var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
+            Parallel.ForEach(arr, v =>
+            {
+                v.Set(key, value);
+            });
+        }
+
+        public static void Set<T>(string key, T value, Func<WCS_DEVICE, bool> func)
+        {
+            var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(func).ToArray();
+            Parallel.ForEach(arr, v =>
+            {
+                v.Set(key, value);
+            });
+        }
+    }
+
     /// <summary>
     /// 输送机设备组
     /// </summary>
@@ -1124,4 +1248,30 @@ namespace WCS.Service.Extensions
         public WCS_DEVICE taskIN;
         public Device<ISRM520, ISRM521, ISRM537> SRM;
     }
+
+    /// <summary>
+    /// 设备配置
+    /// </summary>
+    [Flags]
+    public enum DF
+    {
+        无 = 0,
+        SRM = 1 << 0,
+        SRM二级品取货 = 1 << 1,
+        SRM涂布取货 = 1 << 2,
+        SRM月台放货 = 1 << 3,
+        一楼RGV放货 = 1 << 4,
+        月台 = 1 << 5,
+        涂布RGV = 1 << 6,
+        BOPPRGV = 1 << 7,
+        涂布RGV取货设备组 = 1 << 8,
+        涂布RGV放货设备组 = 1 << 9,
+        涂布出库RGV取货站台 = 1 << 10,
+        涂布入库RGV取货站台 = 1 << 11,
+        SRM涂布放货 = 1 << 12,
+        涂布RGV取货站台 = 1 << 13,
+        BOPPRGV取货设备组 = 1 << 14,
+        BOPPRGV放货设备组 = 1 << 15,
+        SRMBOPP取货 = 1 << 16,
+    }
 }

+ 22 - 1
Projects/永冠OPP/WCS.Service/Extensions/TypeExtension.cs

@@ -3,6 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Reflection;
+using System.Security.Cryptography;
 
 namespace WCS.Service.Extensions
 {
@@ -96,7 +97,7 @@ namespace WCS.Service.Extensions
         }
 
         /// <summary>
-        ///
+        /// 获取字典
         /// </summary>
         /// <typeparam name="T1"></typeparam>
         /// <typeparam name="T2"></typeparam>
@@ -119,5 +120,25 @@ namespace WCS.Service.Extensions
 
             return d;
         }
+
+        /// <summary>
+        /// 获取MD5字符串
+        /// </summary>
+        /// <param name="myString"></param>
+        /// <returns></returns>
+        public static string GetMD5(this string myString)
+        {
+            MD5 md5 = MD5.Create();
+            byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);
+            byte[] targetData = md5.ComputeHash(fromData);
+            string byte2String = null;
+
+            for (int i = 0; i < targetData.Length; i++)
+            {
+                byte2String += targetData[i].ToString("x");
+            }
+
+            return byte2String;
+        }
     }
 }

+ 0 - 152
Projects/永冠OPP/WCS.Service/Handlers/Device.cs

@@ -1,99 +1,10 @@
 using System;
-using System.Collections.Concurrent;
 using System.Linq;
-using System.Threading.Tasks;
 using WCS.Core;
 using WCS.Entity;
 
 public static class Device
 {
-    #region WCS_DEVICE扩展数据
-
-    private static ConcurrentDictionary<string, object> DeviceValues = new ConcurrentDictionary<string, object>();
-
-    public static void AddFlag(this WCS_DEVICE source, DF flag)
-    {
-        var df = source.Get<DF>("DeviceFlag");
-        df = df | flag;
-        source.Set("DeviceFlag", df);
-    }
-
-    public static bool Is(this WCS_DEVICE source, DF flag)
-    {
-        var df = source.Get<DF>("DeviceFlag");
-        return (df & flag) == flag;
-    }
-
-    public static void Set<T>(this WCS_DEVICE source, string key, T value)
-    {
-        DeviceValues[source.CODE + key] = value;
-    }
-
-    public static T Get<T>(this WCS_DEVICE source, string key)
-    {
-        if (!DeviceValues.ContainsKey(source.CODE + key))
-            return default(T);
-        return (T)DeviceValues[source.CODE + key];
-    }
-
-    public static short Code(this WCS_DEVICE source)
-    {
-        return short.Parse(source.CODE);
-    }
-
-    public static string Tunnel(this WCS_DEVICE source)
-    {
-        return source.Get<string>("Tunnel");
-    }
-
-    public static int TunnelNum(this WCS_DEVICE source)
-    {
-        return int.Parse(source.Tunnel().Last().ToString());
-    }
-
-    public static int Floor(this WCS_DEVICE source)
-    {
-        return source.Get<int>("Floor");
-    }
-
-    public static WCS_DEVICE SC(this WCS_DEVICE source)
-    {
-        return source.Get<WCS_DEVICE>("SC");
-    }
-
-    public static WCS_DEVICE RGV(this WCS_DEVICE source)
-    {
-        return source.Get<WCS_DEVICE>("RGV");
-    }
-
-    public static LocInfo LocInfo(this WCS_DEVICE source)
-    {
-        return source.Get<LocInfo>("LocInfo");
-    }
-
-    public static bool WakeupOn(this WCS_DEVICE source, int sec, string key)
-    {
-        var str = "WakeupOn" + key;
-        var last = source.Get<DateTime>(str);
-        if ((DateTime.Now - last).TotalMilliseconds > sec)
-        {
-            source.Set(str, DateTime.Now);
-            return true;
-        }
-        else
-        {
-            Ltc.Log("OnSleep");
-            return false;
-        }
-    }
-
-    public static bool WakeupOn(this WCS_DEVICE source, int sec)
-    {
-        return source.WakeupOn(sec, "");
-    }
-
-    #endregion WCS_DEVICE扩展数据
-
     #region 静态方法
 
     public static WCS_DEVICE[] Where(Func<WCS_DEVICE, bool> func)
@@ -112,68 +23,5 @@ public static class Device
         return Where(v => codes.Contains(v.CODE)).ToArray();
     }
 
-    public static void Set<T>(string key, T value, params string[] devices)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
-        Parallel.ForEach(arr, v =>
-        {
-            v.Set(key, value);
-        });
-    }
-
-    public static void Set<T>(string key, T value, Func<WCS_DEVICE, bool> func)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(func).ToArray();
-        Parallel.ForEach(arr, v =>
-        {
-            v.Set(key, value);
-        });
-    }
-
-    public static void AddFlag(DF flag, params string[] devices)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
-        Parallel.ForEach(arr, v =>
-        {
-            v.AddFlag(flag);
-        });
-    }
-
-    public static void AddFlag(DF flag, Action<WCS_DEVICE> callbck, params string[] devices)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
-        Parallel.ForEach(arr, v =>
-        {
-            v.AddFlag(flag);
-            callbck?.Invoke(v);
-        });
-    }
-
     #endregion 静态方法
 }
-
-/// <summary>
-/// 设备配置
-/// </summary>
-[Flags]
-public enum DF
-{
-    无 = 0,
-    SRM = 1 << 0,
-    SRM二级品取货 = 1 << 1,
-    SRM涂布取货 = 1 << 2,
-    SRM月台放货 = 1 << 3,
-    一楼RGV放货 = 1 << 4,
-    月台 = 1 << 5,
-    涂布RGV = 1 << 6,
-    BOPPRGV = 1 << 7,
-    涂布RGV取货设备组 = 1 << 8,
-    涂布RGV放货设备组 = 1 << 9,
-    涂布出库RGV取货站台 = 1 << 10,
-    涂布入库RGV取货站台 = 1 << 11,
-    SRM涂布放货 = 1 << 12,
-    涂布RGV取货站台 = 1 << 13,
-    BOPPRGV取货设备组 = 1 << 14,
-    BOPPRGV放货设备组 = 1 << 15,
-    SRMBOPP取货 = 1 << 16,
-}

+ 2 - 1
Projects/永冠OPP/WCS.Service/Helpers/LogHelper.cs

@@ -1,5 +1,6 @@
 using DBHelper_SqlSugar;
 using Logs;
+using SqlSugar;
 using System;
 using WCS.Entity;
 
@@ -18,7 +19,7 @@ namespace WCS.Service.Helpers
             Db.Do(db =>
             {
                 var exp = db.Default.Queryable<WCS_EXCEPTION>()
-                    .Where("TIMESTAMPDIFF(SECOND, UPDATETIME, '@now') < 5", new { now = DateTime.Now })
+                    .Where(v => SqlFunc.DateDiff(DateType.Second, v.UPDATETIME, DateTime.Now) < 5)
                     .Where(v => v.MSG == msg)
                     .OrderByDescending(v => v.ID)
                     .First() ?? new WCS_EXCEPTION

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

@@ -69,7 +69,6 @@ namespace WCS.Service
                 last.ISLAST = false;
             }
 
-            var a = db.Default.Storageable(Protocol.DEVICE).ExecuteCommand();
             newobj.DEVICECOD = Protocol.DEVICE.CODE;
             newobj.ISLAST = true;
             newobj.UPDATETIME = DateTime.Now;

+ 44 - 46
Projects/永冠OPP/WCS.Service/WebApi/APICaller.cs

@@ -2,12 +2,10 @@
 using Newtonsoft.Json;
 using System;
 using System.Collections.Concurrent;
-using System.Collections.Generic;
 using System.Diagnostics;
 using System.IO;
 using System.Net;
 using System.Text;
-using System.Threading.Tasks;
 using static System.Net.WebRequest;
 
 namespace WCS.Service
@@ -33,54 +31,54 @@ namespace WCS.Service
         public static T CallApi<T>(string url, object parameter, string type = "Post")
         {
             var content = JsonConvert.SerializeObject(parameter);
-            var key = url + content;
-            if (Results.ContainsKey(key))
+            //var key = url + content;
+            // if (Results.ContainsKey(key))
+            //{
+            //    var res = Results[key];
+            //    if (res == null)
+            //        throw new WarnException("接口调用中");
+            //    try
+            //    {
+            //        if (!res.Succsess)
+            //            throw new WarnException(res.Exception);
+            //        return (T)res.Data;
+            //    }
+            //    finally
+            //    {
+            //        Results.Remove(key, out res);
+            //    }
+            //}
+            //else
+            //{
+            //    Results[key] = null;
+            //    var task = Task.Run(() =>
+            //     {
+            var res = new Result();
+            try
             {
-                var res = Results[key];
-                if (res == null)
-                    throw new WarnException("接口调用中");
-                try
-                {
-                    if (!res.Succsess)
-                        throw new WarnException(res.Exception);
-                    return (T)res.Data;
-                }
-                finally
-                {
-                    Results.Remove(key, out res);
-                }
+                var result = HttpApi(url, content, type);
+                res.Data = JsonConvert.DeserializeObject<T>(result);
+                //res.Succsess = true;
             }
-            else
+            catch (Exception ex)
             {
-                Results[key] = null;
-                var task = Task.Run(() =>
-                 {
-                     var res = new Result();
-                     try
-                     {
-                         var result = HttpApi(url, content, type);
-                         res.Data = JsonConvert.DeserializeObject<T>(result);
-                         res.Succsess = true;
-                     }
-                     catch (Exception ex)
-                     {
-                         res.Exception = ex.Message;
-                     }
-                     finally
-                     {
-                         Results[key] = res;
-                     }
-                 });
-                task.Wait(50);
-                if (task.IsCompleted)
-                {
-                    return CallApi<T>(url, parameter, type);
-                }
-                else
-                {
-                    throw new WarnException("接口调用中");
-                }
+                res.Exception = ex.Message;
             }
+            return (T)res.Data;
+            //finally
+            //{
+            //    Results[key] = res;
+            //}
+            // });
+            //task.Wait(50);
+            //if (task.IsCompleted)
+            //{
+            //    return CallApi<T>(url, parameter, type);
+            //}
+            //else
+            //{
+            //    throw new WarnException("接口调用中");
+            //}
         }
 
         private static string HttpApi(string url, string jsonstr, string type)

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

@@ -1,9 +1,10 @@
 using Logs;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 using WCS.Service.Entity;
+using WCS.Service.Extensions;
 
 namespace WCS.Service
 {
@@ -24,7 +25,7 @@ namespace WCS.Service
         /// <exception cref="Exception"></exception>
         public static List<I_WCS_GetInTaskResponseItem> I_WCS_GetInTask(string barcode, string devCode, bool getTunnel = false)
         {
-            var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_GetInTask", new List<I_WCS_GetInTaskRequest>()
+            var data = JsonConvert.SerializeObject(new List<I_WCS_GetInTaskRequest>()
             {
                 new(){
                      ContainerBarCode = barcode,
@@ -33,6 +34,12 @@ namespace WCS.Service
                      Memo1 = getTunnel ? "1" : "" //1:分巷道  2:分货位
                 }
             });
+            var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+            {
+                Name = "I_WCS_GetInTask",
+                Parameters = data,
+                ParametersMD5 = data.GetMD5()
+            });
             if (res.ResType) return res.TaskList;
             TaskException(devCode, res.ResMessage);
             throw new WarnException(res.ResMessage);
@@ -51,7 +58,7 @@ namespace WCS.Service
         /// <returns></returns>
         public static List<I_WCS_GetInTaskResponseItem> I_WCS_GetInTask(string barcode1, string devCode1, string barcode2, string devCode2, bool getTunnel1 = false, bool getTunnel2 = false)
         {
-            var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_GetInTask", new List<I_WCS_GetInTaskRequest>()
+            var data = JsonConvert.SerializeObject(new List<I_WCS_GetInTaskRequest>()
             {
                 new(){
                      ContainerBarCode = barcode1,
@@ -66,6 +73,12 @@ namespace WCS.Service
                      Memo1 = getTunnel2 ? "1" : "" //1:分巷道  2:分货位
                 },
             });
+            var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+            {
+                Name = "I_WCS_GetInTask",
+                Parameters = data,
+                ParametersMD5 = data.GetMD5()
+            });
             if (res.ResType) return res.TaskList;
             TaskException($"G{devCode1}", res.ResMessage);
             throw new WarnException(res.ResMessage);
@@ -82,13 +95,19 @@ namespace WCS.Service
         /// <returns></returns>
         public static I_WCS_GetWareCellResponse GetLocalIn(int wmstaskid, string tunnel, string device, WareCellForkNum ForkNum)
         {
-            var res = APICaller.CallApi<I_WCS_GetWareCellResponse>(Url + "/api/Task/I_WCS_GetWareCell", new I_WCS_GetWareCellRequest
+            var data = JsonConvert.SerializeObject(new I_WCS_GetWareCellRequest
             {
                 PickUpEquipmentNo = device,
                 TunnelNum = tunnel.Last().ToString(),
                 WMSTaskNum = wmstaskid.ToString(),
                 ForkNum = ForkNum
             });
+            var res = APICaller.CallApi<I_WCS_GetWareCellResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+            {
+                Name = "I_WCS_GetWareCell",
+                Parameters = data,
+                ParametersMD5 = data.GetMD5()
+            });
             if (res.ResType) return res;
             TaskException(device, res.ResMessage);
             throw new WarnException(res.ResMessage);
@@ -96,7 +115,7 @@ namespace WCS.Service
 
         public static void UpdateTask(string POSIDNEXT, int wmstaskid, int status, int size = -1)
         {
-            var res = APICaller.CallApi<List<I_WCS_PutTaskStepResponse>>(Url + "/api/Task/I_WCS_PutTaskStep", new List<I_WCS_TASKRequest>
+            var data = JsonConvert.SerializeObject(new List<I_WCS_TASKRequest>
             {
                 new()
                 {
@@ -106,6 +125,12 @@ namespace WCS.Service
                     Size=size
                 }
             });
+            var res = APICaller.CallApi<List<I_WCS_PutTaskStepResponse>>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+            {
+                Name = "I_WCS_PutTaskStep",
+                Parameters = data,
+                ParametersMD5 = data.GetMD5()
+            });
             if (res == null || res.Count == 0)
             {
                 throw new WarnException("I_WCS_PutTaskStep调用失败");
@@ -116,10 +141,16 @@ namespace WCS.Service
 
         public static GetProductInfoResponse GetProductInfo(string barcode, string dev)
         {
-            var res = APICaller.CallApi<GetProductInfoResponse>(Url + "/api/Task/GetProductInfo", new GetProductInfoRequest
+            var data = JsonConvert.SerializeObject(new GetProductInfoRequest
             {
                 BarCode = barcode
             });
+            var res = APICaller.CallApi<GetProductInfoResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+            {
+                Name = "GetProductInfo",
+                Parameters = data,
+                ParametersMD5 = data.GetMD5()
+            });
             try
             {
                 if (!res.ResType)
@@ -150,12 +181,18 @@ namespace WCS.Service
         /// <exception cref="Exception"></exception>
         public static List<I_WCS_GetOutTaskResponseSingle> GetOutTask(string position, string devCode)
         {
-            var res = APICaller.CallApi<I_WCS_GetOutTaskResponse>(Url + "/api/Task/I_WCS_GetOutTask", new I_WCS_GetOutTaskRequest
+            var data = JsonConvert.SerializeObject(new I_WCS_GetOutTaskRequest
             {
                 OutType = 1,
                 WareHouseId = WareHouseId,
                 OutEndPostion = position
             });
+            var res = APICaller.CallApi<I_WCS_GetOutTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+            {
+                Name = "I_WCS_GetOutTask",
+                Parameters = data,
+                ParametersMD5 = data.GetMD5()
+            });
             if (!res.ResType)
             {
                 TaskException(position, res.ResMessage);
@@ -195,10 +232,16 @@ namespace WCS.Service
         /// <exception cref="Exception"></exception>
         public static I_WCS_GetTunnelListResponse GetTunnelList(List<string> WMSTaskId, string dev)
         {
-            var res = APICaller.CallApi<I_WCS_GetTunnelListResponse>(Url + "/api/Task/I_WCS_GetTunnelList", new I_WCS_GetTunnelListRequest
+            var data = JsonConvert.SerializeObject(new I_WCS_GetTunnelListRequest
             {
                 WMSTaskNum = WMSTaskId
             });
+            var res = APICaller.CallApi<I_WCS_GetTunnelListResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+            {
+                Name = "I_WCS_GetTunnelList",
+                Parameters = data,
+                ParametersMD5 = data.GetMD5()
+            });
             if (res.ResType) return res;
             TaskException(dev, res.ResMessage);
             throw new WarnException(res.ResMessage);
@@ -208,17 +251,23 @@ namespace WCS.Service
         {
             if (exMsg == "接口调用中")
                 return;
-            Task.Run(() =>
+            System.Threading.Tasks.Task.Run(() =>
             {
                 try
                 {
-                    Console.WriteLine(device + ":" + exMsg);
-                    var res = APICaller.CallApi2<I_WCS_GetExcTaskResponse>(Url + "/api/Task/I_WCS_GetExcTask", new I_WCS_GetExcTaskRequest
+                    var data = JsonConvert.SerializeObject(new I_WCS_GetExcTaskRequest
                     {
                         ExcCode = exMsg,
                         EquipmentNo = device,
                         ExcMessage = exMsg,
                     });
+                    Console.WriteLine(device + ":" + exMsg);
+                    var res = APICaller.CallApi2<I_WCS_GetExcTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+                    {
+                        Name = "I_WCS_GetExcTask",
+                        Parameters = data,
+                        ParametersMD5 = data.GetMD5()
+                    });
                     InfoLog.INFO_I_WCS_GetExcTask(device + ":" + exMsg);
                     if (!res.ResType) throw new WarnException(res.ResMessage);
                 }
@@ -244,13 +293,19 @@ namespace WCS.Service
             return;
             try
             {
-                var res = APICaller.CallApi<I_WCS_PutDevInfoResponse>(Url + "/api/Task/I_WCS_PutDevInfo", DevInfoList);
+                var data = JsonConvert.SerializeObject(DevInfoList);
+                var res = APICaller.CallApi<I_WCS_PutDevInfoResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
+                {
+                    Name = "I_WCS_GetExcTask",
+                    Parameters = data,
+                    ParametersMD5 = data.GetMD5()
+                });
                 if (!res.ResType)
                     throw new WarnException(res.ResMessage);
             }
-            catch (Exception)
+            catch (Exception ex)
             {
-                Console.WriteLine("I_WCS_PutDevInfo" + "接口调用失败");
+                InfoLog.INFO_WARN($"I_WCS_PutDevInfo接口调用失败:{ex.Message}");
             }
             finally
             {
@@ -270,4 +325,25 @@ namespace WCS.Service
             catch { }
         }
     }
+
+    /// <summary>
+    /// 调用接口传入参数
+    /// </summary>
+    public class InterfaceParameters
+    {
+        /// <summary>
+        /// 业务名 例:I_WCS_GetInTask
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 传入参数为Json
+        /// </summary>
+        public string Parameters { get; set; }
+
+        /// <summary>
+        /// 传入参数的唯一值
+        /// </summary>
+        public string ParametersMD5 { get; set; }
+    }
 }

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

@@ -10,6 +10,7 @@ namespace WCS.Service.Works.SRM
     {
         protected override void Do(Device<ISRM520, ISRM521, ISRM537> obj)
         {
+            obj.Data.ECol_1 = (short)22l;
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)

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

@@ -1,9 +1,7 @@
 using DBHelper_SqlSugar;
 using Logs;
-using System;
 using System.Collections.Generic;
 using System.Diagnostics;
-using System.Linq;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
@@ -13,7 +11,7 @@ using WCS.Service.Helpers;
 
 namespace WCS.Service.Works.Station
 {
-    [WorkTitle(typeof(ProductHandler), "扫码入库")]
+    //[WorkTitle(typeof(ProductHandler), "扫码入库")]
     internal class 扫码入库 : Work<StationDeviceGroup>
     {
         protected override void Do(StationDeviceGroup obj)
@@ -22,54 +20,50 @@ namespace WCS.Service.Works.Station
             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();
+                    var devs = obj.Items;
+                    //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.Queryable<WCS_TASK>().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
-                            throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
-
-                        var task = new WCS_TASK
-                        {
-                            BARCODE = info.ContainerCode,
-                            TYPE = TaskType.入库,
-                            STATUS = TaskStatus.执行中,
-                            ADDRFROM = dev.Entity.CODE,
-                            ADDRTO = info.EndPostion,
-                            STARTTIME = DateTime.Now,
-                            UPDATEUSER = "WCS",
-                            UPDATETIME = DateTime.Now,
-                            WMSTASK = int.Parse(info.WMSTaskNum),
-                            TaskGroupKey = info.TaskGroupKey,
-                            ADDRNEXT = next,
-                            HEIGHT = dev.Data2.GoodsSize,
-                            FLOOR = 1
-                        };
-
-                        db.Default.Updateable(task).AddQueue();
-                        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());
+                        //var dev = item.Station;
+                        //var next = dev.Entity.GetPath("SRM").CODE;
+                        //var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode + "}"));
+                        //if (db.Default.Queryable<WCS_TASK>().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
+                        //    throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
+
+                        //var task = new WCS_TASK
+                        //{
+                        //    BARCODE = info.ContainerCode,
+                        //    TYPE = TaskType.入库,
+                        //    STATUS = TaskStatus.执行中,
+                        //    ADDRFROM = dev.Entity.CODE,
+                        //    ADDRTO = info.EndPostion,
+                        //    STARTTIME = DateTime.Now,
+                        //    UPDATEUSER = "WCS",
+                        //    UPDATETIME = DateTime.Now,
+                        //    WMSTASK = int.Parse(info.WMSTaskNum),
+                        //    TaskGroupKey = info.TaskGroupKey,
+                        //    ADDRNEXT = next,
+                        //    HEIGHT = dev.Data2.GoodsSize,
+                        //    FLOOR = 1
+                        //};
+
+                        //db.Default.Updateable(task).AddQueue();
+                        finishTaskList.Add(new FinishTaskList<int>(0, item.Entity.Create<StationDevice>()));
+
+                        //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.SaveQueues();
+                    //db.Default.SaveQueues();
                 });
 
                 //检查对应的任务是否已创建成功
@@ -77,21 +71,111 @@ namespace WCS.Service.Works.Station
                 {
                     foreach (var finishTask in finishTaskList)
                     {
-                        var task = db.Default.Queryable<WCS_TASK>().First(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++;
+                        //var task = db.Default.Queryable<WCS_TASK>().First(v => v.WMSTASK == finishTask.FinishCode);
+                        //if (task == null) continue;
+
+                        //finishTask.Station.Data2.Status = finishTask.Station.Data2.Status | IstationStatus.光电状态;
+                        //finishTask.Station.Data.Goodsstart = 2222;
+                        //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}");
             });
+
+            //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.Queryable<WCS_TASK>().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
+            //                throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
+
+            //            var task = new WCS_TASK
+            //            {
+            //                BARCODE = info.ContainerCode,
+            //                TYPE = TaskType.入库,
+            //                STATUS = TaskStatus.执行中,
+            //                ADDRFROM = dev.Entity.CODE,
+            //                ADDRTO = info.EndPostion,
+            //                STARTTIME = DateTime.Now,
+            //                UPDATEUSER = "WCS",
+            //                UPDATETIME = DateTime.Now,
+            //                WMSTASK = int.Parse(info.WMSTaskNum),
+            //                TaskGroupKey = info.TaskGroupKey,
+            //                ADDRNEXT = next,
+            //                HEIGHT = dev.Data2.GoodsSize,
+            //                FLOOR = 1
+            //            };
+
+            //            db.Default.Updateable(task).AddQueue();
+            //            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.SaveQueues();
+            //    });
+
+            //    //检查对应的任务是否已创建成功
+            //    Db.Do(db =>
+            //    {
+            //        foreach (var finishTask in finishTaskList)
+            //        {
+            //            var task = db.Default.Queryable<WCS_TASK>().First(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}");
+            //});
+        }
+
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return dev.CODE == "G1028";
+        }
+    }
+
+    [WorkTitle(typeof(ProductHandler), "扫码入库")]
+    internal class 扫码入库1 : Work<StationDeviceGroup>
+    {
+        protected override void Do(StationDeviceGroup obj)
+        {
+            var a = Device.Find("1028").Create<StationDevice>();
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)

+ 24 - 2
Virtual_PLC/PlcData.cs

@@ -1,6 +1,7 @@
 using FreeRedis;
 using Newtonsoft.Json;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace Virtual_PLC
 {
@@ -69,7 +70,11 @@ namespace Virtual_PLC
             {
                 //判断值是否相等,值相等代表已经有过数据生成了,并且没有任何变化
                 var RedisPlcData = Redis.Get(key);
-                if (JsonConvert.SerializeObject(pLCDatas) == RedisPlcData) return;
+                if (JsonConvert.SerializeObject(pLCDatas) == RedisPlcData)
+                {
+                    PLCDatas = pLCDatas;
+                    return;
+                }
             }
 
             pLCDatas.ForEach(v =>
@@ -120,7 +125,24 @@ namespace Virtual_PLC
         public static void Write(PLCData pLCData, int startLength, byte[] value)
         {
             var data = PLCDatas.Find(v => v.IP == pLCData.IP && v.DB == pLCData.DB);
-            var start = startLength < data.DataLength ? 0 : (data.DataLength - startLength) + startLength;
+            int start = 0;
+            if (data.DataLength == data.Length) //数据长度与总长度相等时计算
+            {
+                start = startLength < data.DataLength ? 0 : (data.DataLength - startLength) + startLength;
+            }
+            else //不等
+            {
+                int addstart = 0;
+                var mun = data.Length / data.DataLength;
+                var a = new List<int>();
+                for (int i = 0; i < mun; i++)
+                {
+                    a.Add(addstart);
+                    addstart = addstart + data.DataLength;
+                }
+                start = a.Where(v => v <= startLength).OrderByDescending(v => v).FirstOrDefault();
+                startLength = startLength - start;
+            }
             var bytes = System.Text.Encoding.Default.GetBytes(Redis.Get($"{pLCData.IP}:{pLCData.DB}:{start}")); //获取原有数据
             value.CopyTo(bytes, startLength); //将变更的数据,更新到redis字节组中
             Redis.Set($"{pLCData.IP}:{pLCData.DB}:{start}", bytes);

+ 6 - 1
WCS.Core/DataTrans/ProtocolProxyBase.cs

@@ -5,6 +5,7 @@ using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Reflection;
 using System.Runtime.InteropServices;
+using System.Threading.Tasks;
 using WCS.Entity;
 
 namespace WCS.Core.DataTrans
@@ -118,7 +119,11 @@ namespace WCS.Core.DataTrans
 
         private void InvokeUpdate(string user, Db db)
         {
-            SaveChangs(user, db);
+            //TODO:怀疑会有问题,需要再看一下
+            Task.Run(() =>
+            {
+                SaveChangs(user, db);
+            });
         }
 
         private WCS_PROTOCOLDATA _last = null;

+ 27 - 0
WCS.Core/Device.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Linq;
+using WCS.Core;
+using WCS.Entity;
+
+public static class Device
+{
+    #region 静态方法
+
+    public static WCS_DEVICE[] Where(Func<WCS_DEVICE, bool> func)
+    {
+        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(func).ToArray();
+        return arr;
+    }
+
+    public static WCS_DEVICE Find(string code)
+    {
+        return Where(v => v.CODE == code).Single();
+    }
+
+    public static WCS_DEVICE[] Find(params string[] codes)
+    {
+        return Where(v => codes.Contains(v.CODE)).ToArray();
+    }
+
+    #endregion 静态方法
+}

+ 2 - 1
WCS.Core/EntityEx.cs

@@ -73,7 +73,8 @@ namespace WCS.Core
 
         public Group(WCS_DEVICE entity) : base(entity)
         {
-            Items = entity.DEVICEGROUP.Select(v => Activator.CreateInstance(typeof(T), v.MEMBER)).OfType<T>().OrderBy(p => p.Entity.CODE).ToList();
+            var a = entity.DEVICEGROUP.Select(v => Activator.CreateInstance(typeof(T), v.MEMBER)).OfType<T>();
+            Items = entity.DEVICEGROUP.Select(v => v.MEMBER.Create<T>()).OrderBy(p => p.Entity.CODE).ToList();
         }
     }
 

+ 0 - 1
WCS.Core/LogicHandler.cs

@@ -117,7 +117,6 @@ namespace WCS.Core
         /// </summary>
         private static void Loop()
         {
-            //TODO:可能存在异常,使用时需验证一次
             var arr = AllObjects.OfType<WCS_DEVICE>().Where(v => v.ENABLED).SelectMany(v => v.DEVICEPROTOCOLS)
                 .Where(v => v.ENABLED && v.DB.ENABLED && v.DB.PLC.ENABLED)
                 .GroupBy(v => v.DB).Select(v => v.Key)