From 6d578d016127db97d6f981ff18614ef52a2e0ede Mon Sep 17 00:00:00 2001
From: xxyy <cathay_xy@163.com>
Date: 星期三, 05 三月 2025 17:19:01 +0800
Subject: [PATCH] 添加缓存服务及相关功能支持

---
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs |  134 +++++++++++++++++++++++++++++++++-----------
 1 files changed, 99 insertions(+), 35 deletions(-)

diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
index cad83fa..7f139ed 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -1,7 +1,9 @@
 锘縰sing Autofac.Core;
 using Mapster;
 using Masuit.Tools;
+using SqlSugar;
 using System.Text.RegularExpressions;
+using WIDESEA_Cache;
 using WIDESEA_Core.Const;
 using WIDESEA_DTO.MOM;
 using WIDESEA_DTO.WMS;
@@ -9,7 +11,6 @@
 using WIDESEA_IStoragIntegrationServices;
 using WIDESEAWCS_BasicInfoRepository;
 using WIDESEAWCS_QuartzJob.Models;
-
 
 namespace WIDESEA_StorageTaskServices;
 
@@ -31,6 +32,7 @@
     private readonly IAgingInOrOutInputService _agingInOrOutInputService; //闈欑疆\闄堝寲
     private readonly IDt_StationManagerRepository _stationManagerRepository;
     private readonly ISys_ConfigService _configService;
+    private readonly ISimpleCacheService _simpleCacheService;
 
     public Dt_TaskService(IDt_TaskRepository BaseDal,
                                 IUnitOfWorkManage unitOfWorkManage,
@@ -48,7 +50,8 @@
                                 IAgingInOrOutInputService agingInOrOutInputService,
                                 IStockInfoDetailRepository stockInfoDetailRepository,
                                 IDt_StationManagerRepository stationManagerRepository,
-                                ISys_ConfigService configService) : base(BaseDal)
+                                ISys_ConfigService configService,
+                                ISimpleCacheService simpleCacheService) : base(BaseDal)
     {
         _unitOfWorkManage = unitOfWorkManage;
         _stockInfoRepository = stockInfoRepository;
@@ -65,6 +68,7 @@
         _stockInfoDetailRepository = stockInfoDetailRepository;
         _stationManagerRepository = stationManagerRepository;
         _configService = configService;
+        _simpleCacheService = simpleCacheService;
     }
 
     #region 澶栭儴鎺ュ彛鏂规硶
@@ -1001,7 +1005,6 @@
                     return content.Error(result.MOMMessage);
             }
 
-
             if (result.SerialNos.Count <= 0)
             {
                 var config = _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_InStacker, SysConfigConst.InboundIsEmpty);
@@ -1118,7 +1121,6 @@
                 return content.Error("褰撳墠鎵樼洏鏃犱骇绾�,鑱旂郴MOM娣诲姞浜х嚎");
             }
 
-
             var stationManagers = _stationManagerRepository.QueryData(x => x.stationType == 6 && x.stationChildCode == input.Position).FirstOrDefault();
             if (stationManagers == null)
             {
@@ -1206,7 +1208,6 @@
 
             //ConsoleHelper.WriteColorLine(JsonConvert.SerializeObject(stockInfo), ConsoleColor.DarkMagenta);
 
-
             // 鏂板閲嶅浠诲姟鏍¢獙
             var hasTask = BaseDal.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
             if (hasTask != null)
@@ -1258,26 +1259,101 @@
         }
 
         var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
-        List<string> materielCodes = null;
-        if (outBoundMateriel.Count != 0)
+        List<string>? materielCodes = outBoundMateriel.Count != 0
+            ? outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == area.AreaCode)
+                              .Select(x => x.MaterielCode)
+                              .ToList()
+            : null;
+
+        IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo);
+        List<DtStockInfo> stockInfoList = stockInfos.Values.ToList();
+        var result = new DtStockInfo();
+
+        if (stockInfoList.IsNullOrEmpty())
         {
-            materielCodes = outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == area.AreaCode).Select(x => x.MaterielCode).ToList();
+            stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
+                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock).IncludesAllFirstLayer().ToListAsync();
         }
 
-        var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
-            .Includes(x => x.LocationInfo) // 棰勫姞杞絃ocationInfo
-            .Includes(x => x.StockInfoDetails) // 棰勫姞杞絊tockInfoDetails
-            .Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 杩囨护鏉′欢
-            .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
-            .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢
-            .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
-            .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
-            .OrderBy(x => x.OutboundTime) // 鎺掑簭
-            .FirstAsync(); // 鑾峰彇绗竴涓厓绱�
+        result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull)
+                          .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
+                          .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable)
+                          .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
+                          .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
+                          .OrderBy(x => x.OutboundTime)
+                          .FirstOrDefault();
 
-        //var firstOrDefault = result.FirstOrDefault(x => roadways.Contains(x.LocationInfo.RoadwayNo)); // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌
-        //var firstOrDefault = result[0]; // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌
-        //return firstOrDefault;
+        if (result != null)
+        {
+            stockInfoList = stockInfoList.Where(x => x != result).ToList();
+            if (stockInfos.IsNullOrEmpty())
+            {
+                foreach (var item in stockInfoList)
+                {
+                    _simpleCacheService.HashAdd(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, item.PalletCode, item);
+                }
+            }
+            else
+            {
+                _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode });
+            }
+        }
+
+        return result;
+
+        if (stockInfoList.IsNullOrEmpty())
+        {
+            stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>().IncludesAllFirstLayer().ToListAsync();
+
+            result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true)
+                .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
+                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢
+                .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
+                .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
+                .OrderBy(x => x.OutboundTime) // 鎺掑簭
+                .FirstOrDefault(); // 鑾峰彇绗竴涓厓绱�
+
+            if (result != null)
+            {
+                // 鎺掗櫎 result 涓殑鍏冪礌
+                stockInfoList = stockInfoList.Where(x => x != result).ToList();
+            }
+            foreach (var item in stockInfoList)
+            {
+                _simpleCacheService.HashAdd(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, item.PalletCode, item);
+            }
+        }
+        else
+        {
+            result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true)
+                .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
+                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢
+                .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
+                .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
+                .OrderBy(x => x.OutboundTime) // 鎺掑簭
+                .FirstOrDefault(); // 鑾峰彇绗竴涓厓绱�
+            if (result != null)
+            {
+                // 鎺掗櫎 result 涓殑鍏冪礌
+                stockInfoList = stockInfoList.Where(x => x != result).ToList();
+            }
+            string[] xfasd = new string[] { result.PalletCode };
+            _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode });
+        }
+
+        #region
+        //var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
+        //    .Includes(x => x.LocationInfo) // 棰勫姞杞絃ocationInfo
+        //    .Includes(x => x.StockInfoDetails) // 棰勫姞杞絊tockInfoDetails
+        //    .Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 杩囨护鏉′欢
+        //    .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
+        //    .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢
+        //    .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo))
+        //    .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
+        //    .OrderBy(x => x.OutboundTime) // 鎺掑簭
+        //    .FirstAsync(); // 鑾峰彇绗竴涓厓绱�
+        #endregion
+
         return result;
     }
 
@@ -1292,7 +1368,6 @@
             ConsoleHelper.WriteErrorLine($"鏌ヨ甯告俯瀹炵洏搴撳瓨淇℃伅鏃�,鏈壘鍒板尯鍩熶唬鐮佷负{JsonConvert.SerializeObject(areaCodes)}鐨勬暟鎹�");
             return null;
         }
-
 
         var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
         List<string> materielCodes = null;
@@ -1317,10 +1392,6 @@
             .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
             .OrderBy(x => x.OutboundTime) // 鎺掑簭
             .FirstAsync(); // 鑾峰彇绗竴涓厓绱�
-
-        //var firstOrDefault = result.FirstOrDefault(x => roadways.Contains(x.LocationInfo.RoadwayNo)); // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌
-        //var firstOrDefault = result[0]; // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌
-        //return firstOrDefault;
         return result;
     }
 
@@ -1336,7 +1407,6 @@
 
         ConsoleHelper.WriteColorLine(station.Roadway, ConsoleColor.Magenta);
         var stackers = station.Roadway.Split(',').ToList();
-
 
         var devices = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>()
             .Where(x => x.DeviceStatus == "1")
@@ -1684,7 +1754,7 @@
         //    content.Error(ex.Message);
         //}
         //return content;
-        #endregion
+        #endregion 闈欑疆寮傚父鍙e叆搴�
         WebResponseContent content = new WebResponseContent();
         try
         {
@@ -1826,7 +1896,6 @@
         return content;
     }
 
-
     private WMSTaskDTO CreateWMSTaskDTO(object source)
     {
         if (source is Dt_Task taskOld)
@@ -1870,8 +1939,6 @@
     #endregion 闈欑疆寮傚父鍙e叆搴�
 
     #endregion 澶栭儴鎺ュ彛鏂规硶
-
-
 
     #region 鍐呴儴璋冪敤鏂规硶
 
@@ -2152,7 +2219,6 @@
                 }
             }
 
-
             // 娣诲姞鍘嗗彶浠诲姟
             var isTaskHtyAdd = await _task_HtyRepository.AddDataAsync(taskHty) > 0;
 
@@ -2185,7 +2251,6 @@
     }
 
     #region 浠诲姟璇锋眰鏂规硶
-
 
     private static readonly SemaphoreSlim _semaphoreUpdate = new SemaphoreSlim(1, 1);
     // 鏇存柊浠诲姟璐т綅
@@ -2273,7 +2338,6 @@
         }
         catch (Exception)
         {
-
             throw;
         }
         finally { _semaphoreUpdate.Release(); }
@@ -2387,8 +2451,8 @@
         return content;
     }
 
-
     private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
+
     /// <summary>
     /// 鏌ユ壘璐т綅
     /// </summary>

--
Gitblit v1.9.3