From c99808261b1b1460d22a7f7db5955a65080c3b4b Mon Sep 17 00:00:00 2001
From: Admin <Admin@ADMIN>
Date: 星期一, 27 四月 2026 08:58:57 +0800
Subject: [PATCH] 优化货位查找

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA.Services/Common/GetEmptyLocationAction.cs |  254 ++++++++++++++++++++++++--------------------------
 1 files changed, 123 insertions(+), 131 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA.Services/Common/GetEmptyLocationAction.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA.Services/Common/GetEmptyLocationAction.cs"
index b0144a9..9221d6c 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA.Services/Common/GetEmptyLocationAction.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA.Services/Common/GetEmptyLocationAction.cs"
@@ -17,187 +17,179 @@
 {
     public partial class CommonFunction
     {
+        private readonly static object _locker = new object();
+
+        public static List<LocationCache> locationCaches = new List<LocationCache>();
+
+        public class LocationCache
+        {
+            public string LocationCode { get; set; }
+
+            public DateTime DateTime { get; set; }
+        }
+
         /// <summary>
         /// 缁欏叆搴撹姹傚垎閰嶈揣浣�
         /// </summary>
         /// <returns></returns>
         public static Dt_locationinfo GetEmptyLocationAction(int? Gznumber = 0)
         {
-            List<string> locationId = new List<string>();
-            //鍑哄簱浠诲姟
-            List<Dt_taskinfo> currentTask = Dt_taskinfoRepository.Instance.Find(r => r.task_type.Contains("Out"));
-            if (null != currentTask && currentTask.Count > 0)
-                locationId = currentTask.Select(r => r.task_fromlocationid).ToList();
-
-            //鍏ュ簱浠诲姟
-            Dt_locationinfo locationinfo = null;
-
-
-
-            List<int> listLayer = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
-
-            // 褰撲紶杩涙潵鐨勬槸1 澶勭悊鍏ュ簱鍖虹殑閫昏緫 褰撲紶杩涙潵鐨勬槸2澶勭悊鍑哄簱鍖虹殑閫昏緫
-            if (Gznumber == 1)
+            lock (_locker)
             {
-                List<Dt_taskinfo> inbound = Dt_taskinfoRepository.Instance.Find(x =>
-                x.task_beginstation == "20101"
-                );
-                foreach (var item in inbound)
+                List<LocationCache> removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();//鏌ヨ娣诲姞闈欐�佸彉閲忚秴杩�10鍒嗛挓鐨勮揣浣�
+                int count = removeItems.Count;
+                for (int i = 0; i < count; i++)
                 {
-                    string[] location = item.task_tolocationid.Split('-');
-                    //鑾峰彇褰撳墠鏈変换鍔$殑灞�
-                    int layer = int.Parse(location[0]);
-                    LogRecord.WriteLog((int)LogEnum.InBound, $"鍒嗛厤浠诲姟鏃讹紝鏈夊叆搴撲换鍔¢渶瑕佸垹闄ょ殑灞傦細{layer}锛屽綋鍓嶅眰璐т綅缂栧彿锛歿item.ToJson()},褰撳墠鐜版湁浠诲姟{inbound.ToJson()}");
-                    listLayer.Remove(layer);
+                    locationCaches.Remove(removeItems[i]);//绉婚櫎鏌ヨ娣诲姞闈欐�佸彉閲忚秴杩�5鍒嗛挓鐨勮揣浣�
                 }
 
-                List<Dt_taskinfo> outboundTask = Dt_taskinfoRepository.Instance.Find(r => ((r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString())
-       && (r.task_state == TaskState.TaskState_RGV_Received.ToString() || r.task_state == TaskState.TaskState_RGV_Finished.ToString()))
-   || r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString());
+                List<string> lockLocations = locationCaches.Select(x => x.LocationCode).ToList();
 
-                if (null != outboundTask && outboundTask.Count > 0)
+
+
+                List<string> locationId = new List<string>();
+                //鍑哄簱浠诲姟
+                List<Dt_taskinfo> currentTask = Dt_taskinfoRepository.Instance.Find(r => r.task_type.Contains("Out"));
+                if (null != currentTask && currentTask.Count > 0)
+                    locationId = currentTask.Select(r => r.task_fromlocationid).ToList();
+
+                //鍏ュ簱浠诲姟
+                Dt_locationinfo locationinfo = null;
+
+
+
+                List<int> listLayer = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
+
+                // 褰撲紶杩涙潵鐨勬槸1 澶勭悊鍏ュ簱鍖虹殑閫昏緫 褰撲紶杩涙潵鐨勬槸2澶勭悊鍑哄簱鍖虹殑閫昏緫
+                if (Gznumber == 1)
                 {
-                    List<string> fromStation = outboundTask.Where(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString()).Select(r => r.task_fromlocationid).ToList();
-                    fromStation.AddRange(outboundTask.Where(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString()).Select(r => r.task_tolocationid).ToList());
-
-                    foreach (var item in fromStation)
+                    List<Dt_taskinfo> inbound = Dt_taskinfoRepository.Instance.Find(x =>
+                    x.task_beginstation == "20101"
+                    );
+                    foreach (var item in inbound)
                     {
-                        string[] location = item.Split('-');
+                        string[] location = item.task_tolocationid.Split('-');
                         //鑾峰彇褰撳墠鏈変换鍔$殑灞�
                         int layer = int.Parse(location[0]);
-                        LogRecord.WriteLog((int)LogEnum.InBound, $"鍒嗛厤浠诲姟鏃讹紝鏈夊叆搴撲换鍔¢渶瑕佸垹闄ょ殑灞傦細{layer}锛屽綋鍓嶅眰璐т綅缂栧彿锛歿item.ToJson()},褰撳墠鐜版湁浠诲姟{outboundTask.ToJson()}");
+                        LogRecord.WriteLog((int)LogEnum.InBound, $"鍒嗛厤浠诲姟鏃讹紝鏈夊叆搴撲换鍔¢渶瑕佸垹闄ょ殑灞傦細{layer}锛屽綋鍓嶅眰璐т綅缂栧彿锛歿item.ToJson()},褰撳墠鐜版湁浠诲姟{inbound.ToJson()}");
                         listLayer.Remove(layer);
                     }
-                }
 
-            }
-            else if (Gznumber == 2)
-            {
-                List<Dt_taskinfo> outbound = Dt_taskinfoRepository.Instance.Find(x =>
-                x.task_beginstation == "90101"
-                );
-                foreach (var item in outbound)
-                {
-                    string[] location = item.task_tolocationid.Split('-');
-                    //鑾峰彇褰撳墠鏈変换鍔$殑灞�
-                    int layer = int.Parse(location[0]);
-                    LogRecord.WriteLog((int)LogEnum.InBound, $"鍒嗛厤浠诲姟鏃讹紝鏈夊叆搴撲换鍔¢渶瑕佸垹闄ょ殑灞傦細{layer}锛屽綋鍓嶅眰璐т綅缂栧彿锛歿item.ToJson()},褰撳墠鐜版湁浠诲姟{outbound.ToJson()}");
-                    listLayer.Remove(layer);
-                }
-            }
-            else
-            {
-                List<Dt_taskinfo> inboundTask = Dt_taskinfoRepository.Instance.Find(r => r.task_type.Contains("Inbound"));
-                if (null != inboundTask && inboundTask.Count > 0)
-                {
-                    foreach (var item in inboundTask)
+                    List<Dt_taskinfo> outboundTask = Dt_taskinfoRepository.Instance.Find(r => ((r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString())
+           && (r.task_state == TaskState.TaskState_RGV_Received.ToString() || r.task_state == TaskState.TaskState_RGV_Finished.ToString()))
+       || r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString());
+
+                    if (null != outboundTask && outboundTask.Count > 0)
                     {
-                        //濡傛灉鍙栬揣瀹屾垚锛屽彲浠ュ垎閰�
-                        if (string.IsNullOrEmpty(item.task_bak_2) || !"2".Equals(item.task_bak_2))
+                        List<string> fromStation = outboundTask.Where(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString()).Select(r => r.task_fromlocationid).ToList();
+                        fromStation.AddRange(outboundTask.Where(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString()).Select(r => r.task_tolocationid).ToList());
+
+                        foreach (var item in fromStation)
                         {
-                            string[] location = item.task_tolocationid.Split('-');
+                            string[] location = item.Split('-');
                             //鑾峰彇褰撳墠鏈変换鍔$殑灞�
                             int layer = int.Parse(location[0]);
-                            LogRecord.WriteLog((int)LogEnum.InBound, $"鍒嗛厤浠诲姟鏃讹紝鏈夊叆搴撲换鍔¢渶瑕佸垹闄ょ殑灞傦細{layer}锛屽綋鍓嶅眰璐т綅缂栧彿锛歿item.ToJson()},褰撳墠鐜版湁浠诲姟{inboundTask.ToJson()}");
+                            LogRecord.WriteLog((int)LogEnum.InBound, $"鍒嗛厤浠诲姟鏃讹紝鏈夊叆搴撲换鍔¢渶瑕佸垹闄ょ殑灞傦細{layer}锛屽綋鍓嶅眰璐т綅缂栧彿锛歿item.ToJson()},褰撳墠鐜版湁浠诲姟{outboundTask.ToJson()}");
                             listLayer.Remove(layer);
                         }
                     }
+
                 }
-                List<Dt_taskinfo> outboundTask = Dt_taskinfoRepository.Instance.Find(r => ((r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString())
-       && (r.task_state == TaskState.TaskState_RGV_Received.ToString() || r.task_state == TaskState.TaskState_RGV_Finished.ToString()))
-   || r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString());
-
-                if (null != outboundTask && outboundTask.Count > 0)
+                else if (Gznumber == 2)
                 {
-                    List<string> fromStation = outboundTask.Where(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString()).Select(r => r.task_fromlocationid).ToList();
-                    fromStation.AddRange(outboundTask.Where(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString()).Select(r => r.task_tolocationid).ToList());
-
-                    foreach (var item in fromStation)
+                    List<Dt_taskinfo> outbound = Dt_taskinfoRepository.Instance.Find(x => x.task_beginstation == "90101");
+                    foreach (var item in outbound)
                     {
-                        string[] location = item.Split('-');
+                        string[] location = item.task_tolocationid.Split('-');
                         //鑾峰彇褰撳墠鏈変换鍔$殑灞�
                         int layer = int.Parse(location[0]);
-                        LogRecord.WriteLog((int)LogEnum.InBound, $"鍒嗛厤浠诲姟鏃讹紝鏈夊叆搴撲换鍔¢渶瑕佸垹闄ょ殑灞傦細{layer}锛屽綋鍓嶅眰璐т綅缂栧彿锛歿item.ToJson()},褰撳墠鐜版湁浠诲姟{outboundTask.ToJson()}");
+                        LogRecord.WriteLog((int)LogEnum.InBound, $"鍒嗛厤浠诲姟鏃讹紝鏈夊叆搴撲换鍔¢渶瑕佸垹闄ょ殑灞傦細{layer}锛屽綋鍓嶅眰璐т綅缂栧彿锛歿item.ToJson()},褰撳墠鐜版湁浠诲姟{outbound.ToJson()}");
                         listLayer.Remove(layer);
                     }
                 }
-
-            }
-
-
-
-
-
-            List<int> rgvLayer = new List<int>();
-            WebResponseContent resultcontent = RGVAPIInvokeGetRgvInfo.GetRgvInfo();
-            if (resultcontent.Status)
-            {
-                RgvDeviceStatusModel rgvData = (RgvDeviceStatusModel)resultcontent.Data;
-                //0绂荤嚎 1姝e父 2鏁呴殰
-                for (int i = 0; i < rgvData.data.Count(); i++)
+                else
                 {
-                    Info _info = rgvData.data[i];
-                    if (_info.status == 1 && listLayer.Contains(_info.layer))
+                    throw new Exception("鑾峰彇搴撲綅绫诲瀷涓嶅尮閰�");
+                }
+
+                List<int> rgvLayer = new List<int>();
+                WebResponseContent resultcontent = RGVAPIInvokeGetRgvInfo.GetRgvInfo();
+                if (resultcontent.Status)
+                {
+                    RgvDeviceStatusModel rgvData = (RgvDeviceStatusModel)resultcontent.Data;
+                    //0绂荤嚎 1姝e父 2鏁呴殰
+                    for (int i = 0; i < rgvData.data.Count(); i++)
                     {
-                        rgvLayer.Add(_info.layer);
+                        Info _info = rgvData.data[i];
+                        if (_info.status == 1 && listLayer.Contains(_info.layer))
+                        {
+                            rgvLayer.Add(_info.layer);
+                        }
                     }
                 }
-            }
+
+
+                List<Dt_locationinfo> LocationList = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
+                && !x.location_islocked && !lockLocations.Contains(x.location_id));
 
 
 
-            if (locationId.Count > 0)
-            {
-                //浼樺厛鍒嗛厤绌挎杞︾殑灞�
-                if (rgvLayer.Count > 0)
+                if (locationId.Count > 0)
                 {
-                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString() 
-                    && !x.location_islocked && rgvLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)  
-                     .ThenBy(x => x.location_column).FirstOrDefault();
-                    if (null != locationinfo)
-                        return locationinfo;
+                    //浼樺厛鍒嗛厤绌挎杞︾殑灞�
+                    if (rgvLayer.Count > 0)
+                    {
+                        locationinfo = LocationList.Where(x => rgvLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
+                         .ThenBy(x => x.location_column).FirstOrDefault();
+                        if (null != locationinfo)
+                            return locationinfo;
+                        else
+                            locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
+                        .ThenBy(x => x.location_column).FirstOrDefault();
+                    }
                     else
-                        locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
-                    && !x.location_islocked && listLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer) 
-                    .ThenBy(x => x.location_column).FirstOrDefault();
-                }
-                else
-                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
-                     && !x.location_islocked && listLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer) 
-                     .ThenBy(x => x.location_column).FirstOrDefault();
-
-                if (null != locationinfo)
-                    return locationinfo;
-            }
-            else
-            {
-                if (rgvLayer.Count > 0)
-                {
-                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
-                 && !x.location_islocked && rgvLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
+                        locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
+                         .ThenBy(x => x.location_column).FirstOrDefault();
 
                     if (null != locationinfo)
+                    {
+                        locationCaches.Add(new LocationCache { DateTime = DateTime.Now, LocationCode = locationinfo.location_id });
                         return locationinfo;
-                    else
-                        locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
-                        && !x.location_islocked && listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
+                    }
                 }
                 else
-                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
-              && !x.location_islocked && listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
+                {
+                    if (rgvLayer.Count > 0)
+                    {
+                        locationinfo = LocationList.Where(x => rgvLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
 
-                if (null != locationinfo)
-                    return locationinfo;
-            }
+                        if (null != locationinfo)
+                            return locationinfo;
+                        else
+                            locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
+                    }
+                    else
+                        locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
 
-            if (locationinfo == null)
-            {
-                locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
-              && !x.location_islocked && listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
-                if (null != locationinfo)
-                    return locationinfo;
+                    if (null != locationinfo)
+                    {
+                        locationCaches.Add(new LocationCache { DateTime = DateTime.Now, LocationCode = locationinfo.location_id });
+                        return locationinfo;
+                    }
+                }
+
+                if (locationinfo == null)
+                {
+                    locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
+                    if (null != locationinfo)
+                    {
+                        locationCaches.Add(new LocationCache { DateTime = DateTime.Now, LocationCode = locationinfo.location_id });
+                        return locationinfo;
+                    }
+                        
+                }
+                throw new Exception("鏆傛棤璐т綅鍙垎閰�");
             }
-            throw new Exception("鏆傛棤璐т綅鍙垎閰�");
         }
     }
 }

--
Gitblit v1.9.3