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