| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å¤åºåºå£è½®è¯¢åè½å®ç°è®¡å |
| | | |
| | | > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. |
| | | |
| | | **ç®æ :** æ¹è¿èªå¨åºåºä»»å¡åè½ï¼æ¯æä¸ä¸ªå··éé
ç½®å¤ä¸ªåºåºå£ï¼éè¿è½®è¯¢ç®æ³å®ç°è´è½½åè¡¡ |
| | | |
| | | **æ¶æ:** 使ç¨ç¬ç«ç RoundRobinService 类管ç轮询计æ°å¨ï¼åºäº ConcurrentDictionary å®ç°çº¿ç¨å®å
¨çè½®è¯¢éæ©ï¼é
ç½®ä» Dictionary<string, string> æ¹ä¸º Dictionary<string, List<string>> |
| | | |
| | | **ææ¯æ :** .NET 6, ConcurrentDictionary, IOptions 模å¼, Autofac ä¾èµæ³¨å
¥ |
| | | |
| | | --- |
| | | |
| | | ## åç½®æ£æ¥ |
| | | |
| | | å¨å¼å§å®ç°åï¼è¯·ç¡®è®¤ï¼ |
| | | - 项ç®ä½äº: `d:\Git\ShanMeiXinNengYuan\Code\WMS\WIDESEA_WMSServer` |
| | | - å·²é
è¯»è®¾è®¡ææ¡£: `docs/plans/2026-03-09-multi-outbound-address-roundrobin-design.md` |
| | | - 已宿èªå¨åºåºä»»å¡çåºç¡å®ç° (Tasks 1-7 已宿) |
| | | |
| | | --- |
| | | |
| | | ## Task 1: å建 RoundRobinService 轮询æå¡ç±» |
| | | |
| | | **Files:** |
| | | - Create: `WIDESEA_Core/Core/RoundRobinService.cs` |
| | | |
| | | **Step 1: å建 RoundRobinService ç±»** |
| | | |
| | | å建æä»¶ `WIDESEA_Core/Core/RoundRobinService.cs`: |
| | | |
| | | ```csharp |
| | | using System.Collections.Concurrent; |
| | | |
| | | namespace WIDESEA_Core.Core |
| | | { |
| | | /// <summary> |
| | | /// 轮询æå¡ - 线ç¨å®å
¨çå°åè½®è¯¢éæ© |
| | | /// </summary> |
| | | public class RoundRobinService |
| | | { |
| | | /// <summary> |
| | | /// 轮询计æ°å¨ - key: å··éåç¼, value: å½åç´¢å¼ |
| | | /// </summary> |
| | | private readonly ConcurrentDictionary<string, int> _counters = new(); |
| | | |
| | | /// <summary> |
| | | /// è·åä¸ä¸ä¸ªå°åï¼è½®è¯¢ï¼ |
| | | /// </summary> |
| | | /// <param name="key">å··éåç¼æ è¯</param> |
| | | /// <param name="addresses">åéå°åå表</param> |
| | | /// <returns>éä¸çç®æ å°å</returns> |
| | | public string GetNextAddress(string key, List<string> addresses) |
| | | { |
| | | // 空åè¡¨æ£æ¥ |
| | | if (addresses == null || addresses.Count == 0) |
| | | return "10080"; |
| | | |
| | | // å个å°åï¼ç´æ¥è¿å |
| | | if (addresses.Count == 1) |
| | | return addresses[0]; |
| | | |
| | | // å¤ä¸ªå°åï¼ä½¿ç¨è½®è¯¢éæ© |
| | | // AddOrUpdate æ¯ååæä½ï¼çº¿ç¨å®å
¨ |
| | | int index = _counters.AddOrUpdate( |
| | | key, |
| | | 0, // 馿¬¡ä½¿ç¨ï¼ä» 0 å¼å§ |
| | | (k, oldValue) => (oldValue + 1) % addresses.Count // 轮询ï¼éå¢å忍¡ |
| | | ); |
| | | |
| | | return addresses[index]; |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **Step 2: æäº¤ RoundRobinService ç±»** |
| | | |
| | | ```bash |
| | | git add WIDESEA_Core/Core/RoundRobinService.cs |
| | | git commit -m "feat: æ·»å 轮询æå¡ç±»æ¯æå¤åºåºå£è´è½½åè¡¡" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 2: ä¿®æ¹ AutoOutboundTaskOptions é
置模åç±» |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_Core/Core/AutoOutboundTaskOptions.cs` |
| | | |
| | | **Step 1: ä¿®æ¹ TargetAddresses 屿§ç±»å** |
| | | |
| | | 读åæä»¶ `WIDESEA_Core/Core/AutoOutboundTaskOptions.cs`ï¼æ¾å° `TargetAddresses` 屿§ï¼ä¿®æ¹å¦ä¸ï¼ |
| | | |
| | | **å代ç ï¼** |
| | | ```csharp |
| | | public Dictionary<string, string> TargetAddresses { get; set; } |
| | | = new() |
| | | { |
| | | { "GW", "10081" }, |
| | | { "CW", "10080" } |
| | | }; |
| | | ``` |
| | | |
| | | **ä¿®æ¹ä¸ºï¼** |
| | | ```csharp |
| | | public Dictionary<string, List<string>> TargetAddresses { get; set; } |
| | | = new() |
| | | { |
| | | { "GW", new List<string> { "10081" } }, |
| | | { "CW", new List<string> { "10080" } } |
| | | }; |
| | | ``` |
| | | |
| | | **Step 2: æäº¤é
置模å类修æ¹** |
| | | |
| | | ```bash |
| | | git add WIDESEA_Core/Core/AutoOutboundTaskOptions.cs |
| | | git commit -m "refactor: TargetAddresses æ¯æå¤åºåºå£é
ç½®" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 3: æ´æ° appsettings.json é
ç½®ç¤ºä¾ |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_WMSServer/appsettings.json` |
| | | |
| | | **Step 1: æ´æ° TargetAddresses é
ç½®** |
| | | |
| | | å¨ `appsettings.json` ä¸ï¼å° `AutoOutboundTask.TargetAddresses` çå¼ä»å符串æ¹ä¸ºæ°ç»ï¼ |
| | | |
| | | **åé
ç½®ï¼** |
| | | ```json |
| | | { |
| | | "AutoOutboundTask": { |
| | | "Enable": true, |
| | | "CheckIntervalSeconds": 300, |
| | | "TargetAddresses": { |
| | | "GW": "10081", |
| | | "CW": "10080" |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **æ°é
ç½®ï¼** |
| | | ```json |
| | | { |
| | | "AutoOutboundTask": { |
| | | "Enable": true, |
| | | "CheckIntervalSeconds": 300, |
| | | "TargetAddresses": { |
| | | "GW": ["10081"], |
| | | "CW": ["10080"] |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **注æï¼** 妿éè¦é
ç½®å¤ä¸ªåºåºå£ï¼å¯ä»¥è¿æ ·é
ç½®ï¼ |
| | | ```json |
| | | "TargetAddresses": { |
| | | "GW": ["10081", "10082", "10083"], |
| | | "CW": ["10080"] |
| | | } |
| | | ``` |
| | | |
| | | **Step 2: æäº¤é
ç½®æ´æ°** |
| | | |
| | | ```bash |
| | | git add WIDESEA_WMSServer/appsettings.json |
| | | git commit -m "config: æ´æ° TargetAddresses 为æ°ç»æ ¼å¼" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 4: å¨ TaskService 䏿³¨å
¥ RoundRobinService |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_TaskInfoService/TaskService.cs` |
| | | |
| | | **Step 1: æ·»å ç§æåæ®µ** |
| | | |
| | | å¨ `TaskService` ç±»çç§æåæ®µåºåï¼å¤§çº¦ç¬¬ 20-30 è¡ï¼ï¼æ·»å ï¼ |
| | | |
| | | ```csharp |
| | | private readonly RoundRobinService _roundRobinService; |
| | | ``` |
| | | |
| | | **Step 2: ä¿®æ¹æé 彿°** |
| | | |
| | | 卿é 彿°åæ°ä¸æ·»å `RoundRobinService roundRobinService`ï¼å¹¶èµå¼ï¼ |
| | | |
| | | **æ¾å°æé 彿°ï¼** |
| | | ```csharp |
| | | public TaskService( |
| | | IRepository<Dt_Task> BaseDal, |
| | | IMapper mapper, |
| | | IStockInfoService stockInfoService, |
| | | ILocationInfoService locationInfoService, |
| | | HttpClientHelper httpClientHelper, |
| | | IConfiguration configuration) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _stockInfoService = stockInfoService; |
| | | _locationInfoService = locationInfoService; |
| | | _httpClientHelper = httpClientHelper; |
| | | _configuration = configuration; |
| | | } |
| | | ``` |
| | | |
| | | **ä¿®æ¹ä¸ºï¼** |
| | | ```csharp |
| | | public TaskService( |
| | | IRepository<Dt_Task> BaseDal, |
| | | IMapper mapper, |
| | | IStockInfoService stockInfoService, |
| | | ILocationInfoService locationInfoService, |
| | | HttpClientHelper httpClientHelper, |
| | | IConfiguration configuration, |
| | | RoundRobinService roundRobinService) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _stockInfoService = stockInfoService; |
| | | _locationInfoService = locationInfoService; |
| | | _httpClientHelper = httpClientHelper; |
| | | _configuration = configuration; |
| | | _roundRobinService = roundRobinService; |
| | | } |
| | | ``` |
| | | |
| | | **Step 3: æäº¤æé 彿°ä¿®æ¹** |
| | | |
| | | ```bash |
| | | git add WIDESEA_TaskInfoService/TaskService.cs |
| | | git commit -m "refactor: 注å
¥ RoundRobinService" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 5: ä¿®æ¹ DetermineTargetAddress æ¹æ³ |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_TaskInfoService/TaskService.cs` |
| | | |
| | | **Step 1: æ¾å°å¹¶ä¿®æ¹ DetermineTargetAddress æ¹æ³** |
| | | |
| | | æ¾å° `DetermineTargetAddress` æ¹æ³ï¼å¤§çº¦å¨ç¬¬ 385-397 è¡ï¼ï¼å°å
¶å®æ´æ¿æ¢ä¸ºï¼ |
| | | |
| | | ```csharp |
| | | /// <summary> |
| | | /// æ ¹æ®å··éç¡®å®ç®æ å°åï¼æ¯æå¤åºåºå£è½®è¯¢ï¼ |
| | | /// </summary> |
| | | private string DetermineTargetAddress(string roadway, Dictionary<string, List<string>> addressMap) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(roadway)) |
| | | return "10080"; |
| | | |
| | | // æ¥æ¾å¹é
çå··éåç¼ |
| | | string matchedPrefix = null; |
| | | foreach (var kvp in addressMap) |
| | | { |
| | | if (roadway.Contains(kvp.Key)) |
| | | { |
| | | matchedPrefix = kvp.Key; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (matchedPrefix == null) |
| | | return "10080"; |
| | | |
| | | var addresses = addressMap[matchedPrefix]; |
| | | if (addresses == null || addresses.Count == 0) |
| | | return "10080"; |
| | | |
| | | // å个å°åï¼ç´æ¥è¿å |
| | | if (addresses.Count == 1) |
| | | return addresses[0]; |
| | | |
| | | // å¤ä¸ªå°åï¼ä½¿ç¨è½®è¯¢æå¡ |
| | | return _roundRobinService.GetNextAddress(matchedPrefix, addresses); |
| | | } |
| | | ``` |
| | | |
| | | **Step 2: æäº¤æ¹æ³ä¿®æ¹** |
| | | |
| | | ```bash |
| | | git add WIDESEA_TaskInfoService/TaskService.cs |
| | | git commit -m "feat: æ¯æå¤åºåºå£è½®è¯¢éæ©" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 6: å¨ Program.cs 䏿³¨å RoundRobinService |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_WMSServer/Program.cs` |
| | | |
| | | **Step 1: æ·»å RoundRobinService 注å** |
| | | |
| | | å¨ `Program.cs` ä¸ï¼æ¾å°é
置注ååºåï¼å¤§çº¦ç¬¬ 43-45 è¡ï¼ï¼å¨ `AddAllOptionRegister()` ä¹åæ·»å ï¼ |
| | | |
| | | ```csharp |
| | | builder.Services.AddSingleton<RoundRobinService>(); |
| | | ``` |
| | | |
| | | **宿´ä¸ä¸æï¼** |
| | | ```csharp |
| | | builder.Services.AddAllOptionRegister(); |
| | | builder.Services.AddSingleton<RoundRobinService>(); // æ°å¢ |
| | | builder.Services.AddMemoryCacheSetup(); |
| | | ``` |
| | | |
| | | **Step 2: æäº¤æå¡æ³¨å** |
| | | |
| | | ```bash |
| | | git add WIDESEA_WMSServer/Program.cs |
| | | git commit -m "config: 注å RoundRobinService 为å便å¡" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 7: ç¼è¯éªè¯ |
| | | |
| | | **Step 1: ç¼è¯é¡¹ç®** |
| | | |
| | | ```bash |
| | | cd WIDESEA_WMSServer |
| | | dotnet build --configuration Release |
| | | ``` |
| | | |
| | | **颿è¾åº:** ç¼è¯æåï¼0 个é误 |
| | | |
| | | **Step 2: æ£æ¥ç¼è¯ç»æ** |
| | | |
| | | 确认è¾åºå
å«ï¼ |
| | | ``` |
| | | Build succeeded. |
| | | 0 Warning(s) |
| | | 0 Error(s) |
| | | ``` |
| | | |
| | | **Step 3: 妿éè¯¯ï¼æ ¹æ®é误信æ¯ä¿®å¤** |
| | | |
| | | 常è§é®é¢ï¼ |
| | | - ç¼ºå° `using System.Collections.Generic;` â æ·»å å½åç©ºé´ |
| | | - `RoundRobinService` æ¾ä¸å° â æ£æ¥å½å空é´å注å |
| | | |
| | | --- |
| | | |
| | | ## Task 8: æå¨æµè¯ - ååºåºå£ |
| | | |
| | | **Step 1: 确认é
置为ååºåºå£æ ¼å¼** |
| | | |
| | | æ£æ¥ `appsettings.json` ä¸çé
ç½®ï¼ |
| | | ```json |
| | | { |
| | | "AutoOutboundTask": { |
| | | "TargetAddresses": { |
| | | "GW": ["10081"], |
| | | "CW": ["10080"] |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **Step 2: å夿µè¯æ°æ®** |
| | | |
| | | 卿°æ®åºä¸æ§è¡ï¼ |
| | | ```sql |
| | | -- 设置æµè¯åºåçåºåºæ¥æä¸ºè¿å»æ¶é´ |
| | | UPDATE Dt_StockInfo |
| | | SET OutboundDate = DATEADD(MINUTE, -5, GETDATE()) |
| | | WHERE PalletCode = 'TEST001' AND StockStatus = 1; |
| | | ``` |
| | | |
| | | **Step 3: å¯å¨åºç¨** |
| | | |
| | | ```bash |
| | | cd WIDESEA_WMSServer |
| | | dotnet run |
| | | ``` |
| | | |
| | | **Step 4: è§å¯æ¥å¿è¾åº** |
| | | |
| | | 颿çå°ï¼ |
| | | ``` |
| | | info: èªå¨åºåºä»»å¡åå°æå¡å·²å¯å¨ |
| | | info: å°æåºåæ£æ¥å®æ: æåå建 1 个åºåºä»»å¡ |
| | | ``` |
| | | |
| | | **Step 5: éªè¯æ°æ®åº** |
| | | |
| | | ```sql |
| | | SELECT TaskNum, PalletCode, TargetAddress FROM Dt_Task |
| | | WHERE PalletCode = 'TEST001' AND Creater = 'system_auto' |
| | | ``` |
| | | |
| | | 颿 `TargetAddress` 为é
ç½®çå°åï¼å¦ "10081"ï¼ |
| | | |
| | | **Step 6: æ¸
çæµè¯æ°æ®** |
| | | |
| | | ```sql |
| | | DELETE FROM Dt_Task WHERE PalletCode = 'TEST001' |
| | | UPDATE Dt_StockInfo SET OutboundDate = NULL WHERE PalletCode = 'TEST001' |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 9: æå¨æµè¯ - å¤åºåºå£è½®è¯¢ |
| | | |
| | | **Step 1: ä¿®æ¹é
置为å¤åºåºå£** |
| | | |
| | | æ´æ° `appsettings.json`ï¼ |
| | | ```json |
| | | { |
| | | "AutoOutboundTask": { |
| | | "TargetAddresses": { |
| | | "GW": ["10081", "10082", "10083"], |
| | | "CW": ["10080"] |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **Step 2: åå¤å¤ä¸ªæµè¯åºå** |
| | | |
| | | ```sql |
| | | UPDATE Dt_StockInfo |
| | | SET OutboundDate = DATEADD(MINUTE, -5, GETDATE()) |
| | | WHERE PalletCode IN ('TEST001', 'TEST002', 'TEST003', 'TEST004', 'TEST005') |
| | | AND StockStatus = 1 |
| | | AND LocationCode LIKE '%GW%'; -- ç¡®ä¿ä½¿ç¨ GW å··é |
| | | ``` |
| | | |
| | | **Step 3: å¯å¨åºç¨å¹¶è§å¯æ¥å¿** |
| | | |
| | | ```bash |
| | | dotnet run |
| | | ``` |
| | | |
| | | **Step 4: éªè¯è½®è¯¢åé
** |
| | | |
| | | ```sql |
| | | SELECT TaskNum, PalletCode, TargetAddress |
| | | FROM Dt_Task |
| | | WHERE PalletCode IN ('TEST001', 'TEST002', 'TEST003', 'TEST004', 'TEST005') |
| | | AND Creater = 'system_auto' |
| | | ORDER BY CreateDate |
| | | ``` |
| | | |
| | | 颿 `TargetAddress` æè½®è¯¢é¡ºåºåé
ï¼10081, 10082, 10083, 10081, 10082... |
| | | |
| | | **Step 5: æ¸
çæµè¯æ°æ®** |
| | | |
| | | ```sql |
| | | DELETE FROM Dt_Task WHERE PalletCode IN ('TEST001', 'TEST002', 'TEST003', 'TEST004', 'TEST005') |
| | | UPDATE Dt_StockInfo |
| | | SET OutboundDate = NULL |
| | | WHERE PalletCode IN ('TEST001', 'TEST002', 'TEST003', 'TEST004', 'TEST005') |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 10: å¹¶åå®å
¨æµè¯ |
| | | |
| | | **Step 1: å建æµè¯èæ¬** |
| | | |
| | | å建ä¸ä¸ªç®åç PowerShell èæ¬ `test-concurrent.ps1`ï¼ |
| | | |
| | | ```powershell |
| | | # 模æå¹¶ååå»ºä»»å¡ |
| | | $tasks = 1..10 | ForEach-Object { |
| | | Start-ThreadJob -ScriptBlock { |
| | | # è°ç¨å建任å¡ç API æç´æ¥æä½æ°æ®åº |
| | | # è¿éç®å为模æ |
| | | Start-Sleep -Milliseconds (Get-Random -Minimum 10 -Maximum 100) |
| | | } |
| | | } |
| | | |
| | | Wait-Job -Job $tasks |
| | | Receive-Job -Job $tasks |
| | | ``` |
| | | |
| | | **Step 2: è§å¯è½®è¯¢è®¡æ°å¨** |
| | | |
| | | å¨åå°æå¡ä¸æ·»å ä¸´æ¶æ¥å¿ï¼æµè¯åå é¤ï¼ï¼ |
| | | |
| | | å¨ `RoundRobinService.GetNextAddress` 䏿·»å ï¼ |
| | | ```csharp |
| | | Console.WriteLine($"[RoundRobin] Key={key}, Index={index}, Address={addresses[index]}"); |
| | | ``` |
| | | |
| | | **Step 3: éªè¯çº¿ç¨å®å
¨** |
| | | |
| | | - å¤ä¸ªä»»å¡åæ¶å建 |
| | | - 计æ°å¨éå¢ä¸åºç°éå¤æè·³è· |
| | | - å°ååé
åå |
| | | |
| | | **Step 4: ç§»é¤è°è¯æ¥å¿** |
| | | |
| | | æµè¯å®æåï¼ç§»é¤æ·»å çæ¥å¿è¯å¥ã |
| | | |
| | | **Step 5: æäº¤å¹¶åæµè¯ä»£ç ï¼å¦æå建äºç¬ç«æµè¯é¡¹ç®ï¼** |
| | | |
| | | ```bash |
| | | git add -A |
| | | git commit -m "test: æ·»å å¹¶åå®å
¨æµè¯" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 11: æ´æ°è®¾è®¡ææ¡£ |
| | | |
| | | **Files:** |
| | | - Modify: `docs/plans/2026-03-09-multi-outbound-address-roundrobin-design.md` |
| | | |
| | | **Step 1: æ´æ°å®æ½ç¶æ** |
| | | |
| | | å¨è®¾è®¡ææ¡£æ«å°¾ç"宿½æ¸
å"é¨åï¼æ´æ°ç¶æï¼ |
| | | |
| | | ```markdown |
| | | ## 宿½æ¸
å |
| | | |
| | | - [x] ä¿®æ¹ `AutoOutboundTaskOptions.TargetAddresses` ç±»å |
| | | - [x] å建 `RoundRobinService` ç±» |
| | | - [x] ä¿®æ¹ `TaskService.DetermineTargetAddress` æ¹æ³ |
| | | - [x] å¨ `Program.cs` 注å `RoundRobinService` |
| | | - [x] æ´æ° `appsettings.json` é
ç½®ç¤ºä¾ |
| | | - [x] ç¼è¯éªè¯ |
| | | - [x] æå¨æµè¯ |
| | | - [x] å¹¶åå®å
¨æµè¯ |
| | | - [x] æ´æ°è®¾è®¡ææ¡£ |
| | | |
| | | **宿½æ¥æ**: 2026-03-09 |
| | | **宿½äºº**: Claude Code |
| | | **ç¶æ**: 已宿 |
| | | ``` |
| | | |
| | | **Step 2: æäº¤ææ¡£æ´æ°** |
| | | |
| | | ```bash |
| | | git add docs/plans/2026-03-09-multi-outbound-address-roundrobin-design.md |
| | | git commit -m "docs: æ´æ°è®¾è®¡ææ¡£å®æ½ç¶æ" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 12: æç»éªè¯ |
| | | |
| | | **Step 1: è¿è¡å®æ´ç¼è¯** |
| | | |
| | | ```bash |
| | | cd .. |
| | | dotnet build WIDESEA_WMSServer/WIDESEA_WMSServer.csproj --configuration Release |
| | | ``` |
| | | |
| | | **Step 2: ç¡®è®¤æææä»¶å·²æäº¤** |
| | | |
| | | ```bash |
| | | git status |
| | | ``` |
| | | |
| | | 颿è¾åºï¼`nothing to commit, working tree clean` |
| | | |
| | | **Step 3: æ¥çæäº¤åå²** |
| | | |
| | | ```bash |
| | | git log --oneline -10 |
| | | ``` |
| | | |
| | | **Step 4: éªè¯åè½å®æ´æ§** |
| | | |
| | | æ£æ¥æ¸
åï¼ |
| | | - [ ] `RoundRobinService` 类已å建并注å |
| | | - [ ] `AutoOutboundTaskOptions` ç±»åå·²ä¿®æ¹ |
| | | - [ ] `TaskService.DetermineTargetAddress` å·²æ´æ° |
| | | - [ ] `appsettings.json` é
ç½®æ ¼å¼å·²æ´æ° |
| | | - [ ] ç¼è¯æåï¼0 é误 |
| | | - [ ] ååºåºå£æµè¯éè¿ |
| | | - [ ] å¤åºåºå£è½®è¯¢æµè¯éè¿ |
| | | - [ ] å¹¶åå®å
¨éªè¯éè¿ |
| | | |
| | | --- |
| | | |
| | | ## å®ææ£æ¥æ¸
å |
| | | |
| | | - [ ] ææä»£ç æä»¶å·²å建/ä¿®æ¹ |
| | | - [ ] ææä»£ç å·²ç¼è¯éè¿ |
| | | - [ ] é
ç½®æä»¶å·²æ´æ° |
| | | - [ ] ååºåºå£æµè¯å·²å®æ |
| | | - [ ] å¤åºåºå£è½®è¯¢æµè¯å·²å®æ |
| | | - [ ] å¹¶åå®å
¨æµè¯å·²å®æ |
| | | - [ ] ææ¡£å·²æ´æ° |
| | | - [ ] æææ´æ¹å·²æäº¤å° git |
| | | |
| | | --- |
| | | |
| | | ## æ
éææ¥ |
| | | |
| | | ### ç¼è¯é误 |
| | | |
| | | **é®é¢**: æ¾ä¸å° `RoundRobinService` ç±»å |
| | | **è§£å³**: |
| | | 1. 确认 `WIDESEA_Core/Core/RoundRobinService.cs` æä»¶åå¨ |
| | | 2. æ£æ¥å½åç©ºé´æ¯å¦æ£ç¡®ï¼`WIDESEA_Core.Core` |
| | | 3. 确认 `TaskService.cs` 䏿æ£ç¡®ç using å¼ç¨ |
| | | |
| | | **é®é¢**: `Dictionary<string, List<string>>` ç»å®å¤±è´¥ |
| | | **è§£å³**: |
| | | 1. æ£æ¥ `appsettings.json` æ ¼å¼æ¯å¦æ£ç¡® |
| | | 2. 确认 JSON æ°ç»æ ¼å¼ï¼`"GW": ["10081", "10082"]` |
| | | 3. æ£æ¥æ¯å¦æéå·åé符é误 |
| | | |
| | | ### è¿è¡æ¶é误 |
| | | |
| | | **é®é¢**: 轮询ä¸çæï¼æ»æ¯è¿å第ä¸ä¸ªå°å |
| | | **è§£å³**: |
| | | 1. æ£æ¥é
ç½®ä¸å°åæ°ç»æ¯å¦ççæå¤ä¸ªå
ç´ |
| | | 2. 确认 `RoundRobinService` 已注å为åä¾ |
| | | 3. éªè¯ `GetNextAddress` æ¹æ³è¢«æ£ç¡®è°ç¨ |
| | | |
| | | **é®é¢**: åºç¨å¯å¨å¤±è´¥ï¼æç¤ºä¾èµæ³¨å
¥é误 |
| | | **è§£å³**: |
| | | 1. 确认 `RoundRobinService` å¨ `Program.cs` ä¸å·²æ³¨å |
| | | 2. æ£æ¥ `TaskService` æé 彿°æ¯å¦æ£ç¡®æ¥æ¶è¯¥åæ° |
| | | 3. éªè¯ Autofac é
ç½® |
| | | |
| | | ### æµè¯é®é¢ |
| | | |
| | | **é®é¢**: æµè¯æ°æ®æ²¡æåå»ºä»»å¡ |
| | | **è§£å³**: |
| | | 1. 确认åºåç `OutboundDate` å·²è¿æ |
| | | 2. æ£æ¥åºåç¶æä¸º"å
¥åºå®æ" |
| | | 3. éªè¯åå°æå¡å·²å¯å¨ï¼æ¥çæ¥å¿ï¼ |
| | | |
| | | **é®é¢**: 轮询顺åºä¸å¯¹ |
| | | **è§£å³**: |
| | | 1. æ£æ¥ `GetNextAddress` ä¸ç模è¿ç®é»è¾ |
| | | 2. éªè¯ `AddOrUpdate` çæ´æ°å½æ°æ¯å¦æ£ç¡® |
| | | 3. 确认没æå¤ä¸ª `RoundRobinService` å®ä¾ |
| | | |
| | | --- |
| | | |
| | | ## æ§è½ææ |
| | | |
| | | 颿æ§è½ï¼ |
| | | - **忬¡å°åéæ©**: < 1 å¾®ç§ï¼å
åæä½ï¼ |
| | | - **å¹¶å 100 线ç¨**: æ éç«äºï¼çº¿æ§æ©å± |
| | | - **å
åå¼é**: æ¯ä¸ªå··éåç¼çº¦ 50 åè |
| | | |
| | | --- |
| | | |
| | | ## åæ»æ¹æ¡ |
| | | |
| | | å¦éåæ»å°åçæ¬ï¼ |
| | | |
| | | 1. **æ¢å¤é
ç½®**: |
| | | ```json |
| | | "TargetAddresses": { |
| | | "GW": "10081", |
| | | "CW": "10080" |
| | | } |
| | | ``` |
| | | |
| | | 2. **æ¢å¤ä»£ç **: |
| | | ```bash |
| | | git revert <commit-hash-range> |
| | | ``` |
| | | |
| | | 3. **æä½¿ç¨ git reset**ï¼è°¨æ
使ç¨ï¼: |
| | | ```bash |
| | | git reset --hard <before-implementation-commit> |
| | | ``` |