From b25f84acd529775efe1d43cbcad0142e19ba2182 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期一, 09 三月 2026 09:23:06 +0800
Subject: [PATCH] 添加多出库口轮询功能实现计划
---
Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-implementation.md | 675 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 675 insertions(+), 0 deletions(-)
diff --git a/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-implementation.md b/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-implementation.md
new file mode 100644
index 0000000..53822c6
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-implementation.md
@@ -0,0 +1,675 @@
+# 澶氬嚭搴撳彛杞鍔熻兘瀹炵幇璁″垝
+
+> **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: 娣诲姞杞鏈嶅姟绫绘敮鎸佸鍑哄簱鍙h礋杞藉潎琛�"
+```
+
+---
+
+## 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>
+/// 鏍规嵁宸烽亾纭畾鐩爣鍦板潃锛堟敮鎸佸鍑哄簱鍙h疆璇級
+/// </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: 纭閰嶇疆涓哄崟鍑哄簱鍙f牸寮�**
+
+妫�鏌� `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: 鎻愪氦骞跺彂娴嬭瘯浠g爜锛堝鏋滃垱寤轰簡鐙珛娴嬭瘯椤圭洰锛�**
+
+```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: 鏇存柊瀹炴柦鐘舵��**
+
+鍦ㄨ璁℃枃妗f湯灏剧殑"瀹炴柦娓呭崟"閮ㄥ垎锛屾洿鏂扮姸鎬侊細
+
+```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` 绫诲瀷
+**瑙e喅**:
+1. 纭 `WIDESEA_Core/Core/RoundRobinService.cs` 鏂囦欢瀛樺湪
+2. 妫�鏌ュ懡鍚嶇┖闂存槸鍚︽纭細`WIDESEA_Core.Core`
+3. 纭 `TaskService.cs` 涓湁姝g‘鐨� using 寮曠敤
+
+**闂**: `Dictionary<string, List<string>>` 缁戝畾澶辫触
+**瑙e喅**:
+1. 妫�鏌� `appsettings.json` 鏍煎紡鏄惁姝g‘
+2. 纭 JSON 鏁扮粍鏍煎紡锛歚"GW": ["10081", "10082"]`
+3. 妫�鏌ユ槸鍚︽湁閫楀彿鍒嗛殧绗﹂敊璇�
+
+### 杩愯鏃堕敊璇�
+
+**闂**: 杞涓嶇敓鏁堬紝鎬绘槸杩斿洖绗竴涓湴鍧�
+**瑙e喅**:
+1. 妫�鏌ラ厤缃腑鍦板潃鏁扮粍鏄惁鐪熺殑鏈夊涓厓绱�
+2. 纭 `RoundRobinService` 宸叉敞鍐屼负鍗曚緥
+3. 楠岃瘉 `GetNextAddress` 鏂规硶琚纭皟鐢�
+
+**闂**: 搴旂敤鍚姩澶辫触锛屾彁绀轰緷璧栨敞鍏ラ敊璇�
+**瑙e喅**:
+1. 纭 `RoundRobinService` 鍦� `Program.cs` 涓凡娉ㄥ唽
+2. 妫�鏌� `TaskService` 鏋勯�犲嚱鏁版槸鍚︽纭帴鏀惰鍙傛暟
+3. 楠岃瘉 Autofac 閰嶇疆
+
+### 娴嬭瘯闂
+
+**闂**: 娴嬭瘯鏁版嵁娌℃湁鍒涘缓浠诲姟
+**瑙e喅**:
+1. 纭搴撳瓨鐨� `OutboundDate` 宸茶繃鏈�
+2. 妫�鏌ュ簱瀛樼姸鎬佷负"鍏ュ簱瀹屾垚"
+3. 楠岃瘉鍚庡彴鏈嶅姟宸插惎鍔紙鏌ョ湅鏃ュ織锛�
+
+**闂**: 杞椤哄簭涓嶅
+**瑙e喅**:
+1. 妫�鏌� `GetNextAddress` 涓殑妯¤繍绠楅�昏緫
+2. 楠岃瘉 `AddOrUpdate` 鐨勬洿鏂板嚱鏁版槸鍚︽纭�
+3. 纭娌℃湁澶氫釜 `RoundRobinService` 瀹炰緥
+
+---
+
+## 鎬ц兘鎸囨爣
+
+棰勬湡鎬ц兘锛�
+- **鍗曟鍦板潃閫夋嫨**: < 1 寰锛堝唴瀛樻搷浣滐級
+- **骞跺彂 100 绾跨▼**: 鏃犻攣绔炰簤锛岀嚎鎬ф墿灞�
+- **鍐呭瓨寮�閿�**: 姣忎釜宸烽亾鍓嶇紑绾� 50 瀛楄妭
+
+---
+
+## 鍥炴粴鏂规
+
+濡傞渶鍥炴粴鍒板師鐗堟湰锛�
+
+1. **鎭㈠閰嶇疆**:
+```json
+"TargetAddresses": {
+ "GW": "10081",
+ "CW": "10080"
+}
+```
+
+2. **鎭㈠浠g爜**:
+```bash
+git revert <commit-hash-range>
+```
+
+3. **鎴栦娇鐢� git reset**锛堣皑鎱庝娇鐢級:
+```bash
+git reset --hard <before-implementation-commit>
+```
--
Gitblit v1.9.3