From 46ba61974b88fa75d1bcdad26709f2c3a945051e Mon Sep 17 00:00:00 2001
From: xxyy <cathay_xy@163.com>
Date: 星期五, 07 三月 2025 09:43:08 +0800
Subject: [PATCH] 新增 API 方法并实现请求节流机制

---
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json                     |    2 
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskController.cs        |   31 ++++++++-------
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/CheckingStockOutMiddleware.cs |   27 +++++++++++++
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/ThrottleFilter.cs             |   30 +++++++++++++++
 4 files changed, 75 insertions(+), 15 deletions(-)

diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskController.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskController.cs
index 69acae2..ca9f656 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskController.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskController.cs
@@ -1,5 +1,4 @@
 锘縰sing WIDESEA_DTO;
-using static WIDESEA_DTO.RequestTaskDto;
 
 namespace WIDESEA_WMSServer.Controllers;
 
@@ -29,21 +28,11 @@
     /// <param name="saveModel">浠诲姟鍙�</param>
     /// <returns>鎴愬姛鎴栧け璐�</returns>
     [HttpGet, Route("CompleteTaskAsync"), AllowAnonymous]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> CompleteTaskAsync(int taskNum)
     {
         return await _taskService.CompleteAsync(taskNum);
     }
-
-    /// <summary>
-    /// 浠诲姟瀹屾垚
-    /// </summary>
-    /// <param name="saveModel">浠诲姟鍙�</param>
-    /// <returns>鎴愬姛鎴栧け璐�</returns>
-    //[HttpGet, Route("CompleteTaskByStation"), AllowAnonymous]
-    //public async Task<WebResponseContent> CompleteTaskByStation(int taskNum)
-    //{
-    //    return await _taskService.CompleteTaskByStation(taskNum);
-    //}
 
     /// <summary>
     /// 妫�鏌ユ槸鍚﹂渶瑕佽繘琛岀Щ搴�
@@ -51,6 +40,7 @@
     /// <param name="taskNum">浠诲姟鍙�</param>
     /// <returns>浠诲姟</returns>
     [HttpGet, Route("TransferCheckAsync"), AllowAnonymous]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> TransferCheckAsync(int taskNum)
     {
         return new WebResponseContent().OK(data: await _locationService.TransferCheckAsync(taskNum));
@@ -62,6 +52,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("RequestTaskAsync")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> RequestTaskAsync([FromBody] RequestTaskDto input)
     {
         return await Service.RequestTaskAsync(input);
@@ -73,6 +64,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("RequestInTask")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> RequestInTask([FromBody] RequestTaskDto input)
     {
         return await Service.RequestInTask(input);
@@ -84,6 +76,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("RequestLocationTaskAsync")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> UpdateExistingTask([FromBody] RequestTaskDto input)
     {
         return await Service.UpdateExistingTask(input);
@@ -95,17 +88,19 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("RequestTrayInTaskAsync")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> RequestTrayInTaskAsync([FromBody] RequestTaskDto input)
     {
         return await Service.RequestTrayInTaskAsync(input);
     }
 
     /// <summary>
-    /// 绌烘墭鐩�&婊$洏鍑哄簱璇锋眰
+    /// 绌烘墭鐩樻弧鐩樺嚭搴撹姹�
     /// </summary>
     /// <param name="request">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("RequestTrayOutTaskAsync")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> RequestTrayOutTaskAsync([FromBody] RequestOutTaskDto request)
     {
         return await Service.RequestTrayOutTaskAsync(request.Position, request.Tag, request.AreaCdoe, request.AreaCdoes, request.ProductionLine);
@@ -117,6 +112,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("UpdateTaskStatus")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> UpdateTaskStatus([FromBody] UpdateStatusDto input)
     {
         return await Service.UpdateTaskStatus(input.TaskNum, input.TaskState);
@@ -128,6 +124,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpGet, AllowAnonymous, Route("StockCheckingAsync")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public WebResponseContent StockCheckingAsync()
     {
         return Service.StockCheckingAsync();
@@ -140,6 +137,7 @@
     /// <param name="palletCode">鎵樼洏鍙�</param>
     /// <returns></returns>
     [HttpGet, AllowAnonymous, Route("CreateAndSendOutboundTask")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> CreateAndSendOutboundTask(string locationCode, string palletCode)
     {
         return await Service.CreateAndSendOutboundTask(locationCode, palletCode);
@@ -152,6 +150,7 @@
     /// <param name="palletCode">鎵樼洏鍙�</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("RequestInBoundTaskNG")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> RequestInBoundTaskNG([FromBody] RequestTaskDto input)
     {
         return await Service.CreateAndSendInboundTask(input.PalletCode, input.Position);
@@ -163,6 +162,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("GetFROutTrayToCW")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> GetFROutTrayToCW([FromBody] RequestTaskDto input)
     {
         return await Service.GetFROutTrayToCW(input);
@@ -174,11 +174,11 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("EmergencyTask")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public WebResponseContent EmergencyTask([FromBody] object input)
     {
         return Service.EmergencyTask(input);
     }
-
 
     /// <summary>
     /// CW3 鍑哄簱鑷冲寘瑁�
@@ -186,6 +186,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("RequestOutTaskToBZAsync")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> RequestOutTaskToBZAsync([FromBody] RequestTaskDto input)
     {
         return await Service.RequestOutTaskToBZAsync(input);
@@ -197,6 +198,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("SetEmptyOutbyInToOutAsync")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> SetEmptyOutbyInToOutAsync([FromBody] RequestTaskDto input)
     {
         return await Service.SetEmptyOutbyInToOutAsync(input);
@@ -208,6 +210,7 @@
     /// <param name="input">璇锋眰鏁版嵁</param>
     /// <returns></returns>
     [HttpPost, AllowAnonymous, Route("SetEmptyOutbyInToOutOneAsync")]
+    [TypeFilter(typeof(ThrottleFilter), Arguments = new object[] { 5 })] // 5绉掕妭娴�
     public async Task<WebResponseContent> SetEmptyOutbyInToOutOneAsync([FromBody] RequestTaskDto input)
     {
         return await Service.SetEmptyOutbyInToOutOneAsync(input);
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/CheckingStockOutMiddleware.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/CheckingStockOutMiddleware.cs
new file mode 100644
index 0000000..7f8fb9e
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/CheckingStockOutMiddleware.cs
@@ -0,0 +1,27 @@
+锘�
+using WIDESEA_Core.Middlewares;
+using WIDESEA_IStorageTaskServices;
+using WIDESEA_StorageOutTaskServices;
+
+namespace WIDESEA_WMSServer.Filter
+{
+    public static class StockOutMiddleware
+    {
+        public static Task InvokeAsync()
+        {
+            Task.Run(() =>
+            {
+                while (true)
+                {
+                    var _taskService = WIDESEA_Core.App.GetService<IDt_TaskService>();
+                    if (_taskService != null)
+                    {
+                        _taskService.StockCheckingAsync();
+                    }
+                    Thread.Sleep(10000);
+                }
+            });
+            return Task.CompletedTask;
+        }
+    }
+}
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/ThrottleFilter.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/ThrottleFilter.cs
new file mode 100644
index 0000000..a09fa3e
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/ThrottleFilter.cs
@@ -0,0 +1,30 @@
+锘縰sing Microsoft.AspNetCore.Mvc.Filters;
+using System.Collections.Concurrent;
+
+public class ThrottleFilter : IAsyncActionFilter
+{
+    private static readonly ConcurrentDictionary<string, DateTime> _lastExecutionTimes = new ConcurrentDictionary<string, DateTime>();
+    private readonly int _intervalInSeconds;
+
+    public ThrottleFilter(int intervalInSeconds)
+    {
+        _intervalInSeconds = intervalInSeconds;
+    }
+
+    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+    {
+        var actionName = context.ActionDescriptor.DisplayName;
+        if (_lastExecutionTimes.TryGetValue(actionName, out var lastExecutionTime))
+        {
+            var elapsedTime = DateTime.Now - lastExecutionTime;
+            if (elapsedTime.TotalSeconds < _intervalInSeconds)
+            {
+                context.Result = new Microsoft.AspNetCore.Mvc.StatusCodeResult(429);
+                return;
+            }
+        }
+
+        _lastExecutionTimes[actionName] = DateTime.Now;
+        await next();
+    }
+}
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
index db958e1..4475b74 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -27,7 +27,7 @@
 
   //缂撳瓨璁剧疆
   "CacheSettings": {
-    "UseRedis": true, //鍚敤redis
+    "UseRedis": false, //鍚敤redis
     "RedisSettings": {
       "Address": "127.0.0.1:6379", //鍦板潃
       "Password": "123456", //Redis鏈嶅姟瀵嗙爜

--
Gitblit v1.9.3