From fd18eaba5e1c086a588509371f91310e7aafff9c Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期三, 08 四月 2026 22:06:59 +0800
Subject: [PATCH] refactor: 升级多个项目目标框架至.NET 8.0
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj | 2
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/config/applicationhost.config | 1910 ++++++++++++++++++++++++-----------------------
Code/WCS/WIDESEAWCS_Server/CLAUDE.md | 299 ++-----
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj | 2
/dev/null | 142 ---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj | 6
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_RedisService/WIDESEAWCS_RedisService.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj | 2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj | 2
24 files changed, 1,085 insertions(+), 1,312 deletions(-)
diff --git a/.omc/project-memory.json b/.omc/project-memory.json
deleted file mode 100644
index 199e998..0000000
--- a/.omc/project-memory.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "version": "1.0.0",
- "lastScanned": 1775442733141,
- "projectRoot": "D:\\Git\\ShanMeiXinNengYuan",
- "techStack": {
- "languages": [],
- "frameworks": [],
- "packageManager": null,
- "runtime": null
- },
- "build": {
- "buildCommand": null,
- "testCommand": null,
- "lintCommand": null,
- "devCommand": null,
- "scripts": {}
- },
- "conventions": {
- "namingStyle": null,
- "importStyle": null,
- "testPattern": null,
- "fileOrganization": null
- },
- "structure": {
- "isMonorepo": false,
- "workspaces": [],
- "mainDirectories": [],
- "gitBranches": {
- "defaultBranch": "master",
- "branchingStrategy": null
- }
- },
- "customNotes": [],
- "directoryMap": {
- "Code": {
- "path": "Code",
- "purpose": null,
- "fileCount": 0,
- "lastAccessed": 1775442733121,
- "keyFiles": []
- },
- "椤圭洰璧勬枡": {
- "path": "椤圭洰璧勬枡",
- "purpose": null,
- "fileCount": 0,
- "lastAccessed": 1775442733121,
- "keyFiles": []
- }
- },
- "hotPaths": [],
- "userDirectives": []
-}
\ No newline at end of file
diff --git a/.omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json b/.omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json
deleted file mode 100644
index 3611296..0000000
--- a/.omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "session_id": "e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f",
- "ended_at": "2026-03-24T03:25:50.783Z",
- "reason": "other",
- "agents_spawned": 0,
- "agents_completed": 0,
- "modes_used": []
-}
\ No newline at end of file
diff --git a/Code/WCS/.omc/state/agent-replay-607da09d-2c9a-4405-bfb9-46c9b0d2c05f.jsonl b/Code/WCS/.omc/state/agent-replay-607da09d-2c9a-4405-bfb9-46c9b0d2c05f.jsonl
deleted file mode 100644
index 5079599..0000000
--- a/Code/WCS/.omc/state/agent-replay-607da09d-2c9a-4405-bfb9-46c9b0d2c05f.jsonl
+++ /dev/null
@@ -1 +0,0 @@
-{"t":0,"agent":"a7f1459","agent_type":"unknown","event":"agent_stop","success":true}
diff --git a/Code/WCS/.omc/state/idle-notif-cooldown.json b/Code/WCS/.omc/state/idle-notif-cooldown.json
deleted file mode 100644
index 88cae56..0000000
--- a/Code/WCS/.omc/state/idle-notif-cooldown.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "lastSentAt": "2026-03-24T02:37:21.000Z"
-}
\ No newline at end of file
diff --git a/Code/WCS/.omc/state/subagent-tracking.json b/Code/WCS/.omc/state/subagent-tracking.json
deleted file mode 100644
index e379105..0000000
--- a/Code/WCS/.omc/state/subagent-tracking.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "agents": [],
- "total_spawned": 0,
- "total_completed": 0,
- "total_failed": 0,
- "last_updated": "2026-03-24T02:38:41.486Z"
-}
\ No newline at end of file
diff --git a/Code/WCS/AGENTS.md b/Code/WCS/AGENTS.md
deleted file mode 100644
index 8ecf800..0000000
--- a/Code/WCS/AGENTS.md
+++ /dev/null
@@ -1,62 +0,0 @@
-锘�# Repository Guidelines
-
-## 椤圭洰缁撴瀯涓庢ā鍧楃粍缁�
-鏈粨搴撳寘鍚袱涓牳蹇冨簲鐢細
-- `WIDESEAWCS_Client/`锛歏ue 3 + Vite 鍓嶇锛屼富瑕佺洰褰曞寘鎷� `src/views`銆乣src/components`銆乣src/api`銆乣src/router`銆乣src/store`銆�
-- `WIDESEAWCS_Server/`锛欰SP.NET Core 鍚庣瑙e喅鏂规锛坄WIDESEAWCS_Server.sln`锛夛紝鎸夊垎灞傜粍缁囦负 `WIDESEAWCS_*Service`銆乣WIDESEAWCS_*Repository`銆乣WIDESEAWCS_Core`銆乣WIDESEAWCS_Domain`锛岃皟搴︿笌璁惧鐩稿叧浠g爜鍦� `WIDESEAWCS_Tasks` 涓� `WIDESEAWCS_QuartzJob`銆�
-
-娴嬭瘯涓昏浣嶄簬 `WIDESEAWCS_Server/WIDESEAWCS_Tests`锛坸Unit锛夛紝鍙﹀杩樻湁棰嗗煙涓庨泦鎴愭祴璇曢」鐩��
-
-## 鏋勫缓銆佹祴璇曚笌鏈湴寮�鍙戝懡浠�
-- 鍓嶇锛堝湪 `WIDESEAWCS_Client/` 鎵ц锛夛細
- - `npm install`锛氬畨瑁呬緷璧栥��
- - `npm run serve`锛氬惎鍔ㄦ湰鍦板紑鍙戞湇鍔★紙Vite锛夈��
- - `npm run build`锛氭瀯寤虹敓浜ц祫婧愩��
- - `npm run lint`锛氭墽琛� ESLint 妫�鏌ャ��
-- 鍚庣锛堝湪 `WIDESEAWCS_Server/` 鎵ц锛夛細
- - `dotnet restore WIDESEAWCS_Server.sln`锛氳繕鍘� NuGet 渚濊禆銆�
- - `dotnet build WIDESEAWCS_Server.sln`锛氱紪璇戝叏閮ㄥ悗绔」鐩��
- - `dotnet run --project WIDESEAWCS_Server`锛氭湰鍦板惎鍔� API銆�
- - `dotnet test WIDESEAWCS_Tests/WIDESEAWCS_Tests.csproj`锛氳繍琛屽崟鍏冩祴璇曘��
-
-## 寮�鍙戞祦绋嬪己鍒惰鑼�
-- 鎵�鏈変换鍔″繀椤诲湪 `Code/WCS/.worktrees/<task-name>` 鐙珛 worktree 涓紑鍙戯紝涓嶇洿鎺ュ湪涓诲伐浣滃尯鏀瑰姩銆�
-- 鍒嗘敮鍛藉悕缁熶竴锛歚feat/<妯″潡>-<涓婚>`銆乣fix/<妯″潡>-<闂>`銆乣refactor/<妯″潡>-<涓婚>`銆乣docs/<涓婚>`銆�
-- 姣忔鎻愪氦鍓嶈嚦灏戞墽琛屼笌鏀瑰姩鐩稿叧鐨勬渶灏忛獙璇侊紙鍓嶇鏀瑰姩璺� `npm run lint`锛涘悗绔敼鍔ㄨ窇 `dotnet test` 鎴栨渶灏忓彲杩愯楠岃瘉锛夈��
-- 绂佹涓�娆℃彁浜ゆ贩鍏ユ棤鍏抽噸鏋勩�佹牸寮忓寲鍣0鎴栧ぇ闈㈢Н鏂囦欢绉诲姩銆�
-
-## 浠g爜椋庢牸涓庡懡鍚嶈鑼�
-- C#锛�4 绌烘牸缂╄繘锛涚被鍨�/鏂规硶/灞炴�т娇鐢� `PascalCase`锛涘眬閮ㄥ彉閲忓拰鍙傛暟浣跨敤 `camelCase`锛涙帴鍙d娇鐢� `I` 鍓嶇紑銆�
-- Vue/JS锛氶伒寰幇鏈� ESLint 閰嶇疆涓庨」鐩棦鏈夋ā寮忥紱鏂囦欢鍚嶅簲涓庡姛鑳戒竴鑷达紙濡� `TaskController.cs`銆佸姛鑳界洰褰曚笅 `index.vue`锛夈��
-- 榛樿瑕佹眰锛氬鏂板鎴栦慨鏀圭殑浠g爜娣诲姞璇︾粏涓枃娉ㄩ噴锛岃嚦灏戝寘鍚柟娉曠洰鐨勩�佸弬鏁板惈涔夈�佽繑鍥炲�笺�佸叧閿�昏緫姝ラ鍜屽紓甯稿鐞嗚鏄庛��
-- 娉ㄩ噴瑕佹眰鍙銆佸彲缁存姢锛岀姝⑩�滈噸澶嶄唬鐮佸瓧闈㈡剰鎬濃�濈殑鏃犳晥娉ㄩ噴銆�
-
-## 鏁版嵁涓�鑷存�т笌浜嬪姟瑙勮寖
-- 鍚屼竴涓氬姟鎿嶄綔娑夊強澶氫釜鏁版嵁瀵硅薄锛堝琛ㄣ�佸浠撳偍銆佽法鏈嶅姟鍐欏叆锛夊悓鏃舵敼鍔ㄦ椂锛屽繀椤讳娇鐢ㄦ暟鎹簱浜嬪姟锛圱ransaction锛変繚璇佸師瀛愭�с��
-- 浜嬪姟鑼冨洿鍙鐩栧繀瑕佸啓鎿嶄綔锛岀姝㈠皢闀胯�楁椂 IO/缃戠粶璋冪敤鏀惧叆浜嬪姟鍐咃紝閬垮厤闀夸簨鍔¢攣琛ㄣ��
-- 鍙戠敓寮傚父鏃跺繀椤诲洖婊氫簨鍔★紝骞惰褰曚簨鍔′笂涓嬫枃锛堜笟鍔″崟鍙枫�佸叧閿富閿�佽皟鐢ㄩ摼鏍囪瘑锛夈��
-- 鑻ユ秹鍙婂垎甯冨紡鎴栬法杈圭晫鍐欏叆锛岄渶鍦� PR 涓槑纭竴鑷存�х瓥鐣ワ紙琛ュ伩銆侀噸璇曘�佸箓绛夐敭锛夈��
-
-## 鎺ュ彛銆佹棩蹇椾笌寮傚父瑙勮寖
-- API 杩斿洖缁撴瀯淇濇寔缁熶竴锛屽瓧娈靛懡鍚嶄笌鐜版湁鍚庣搴忓垪鍖栫瓥鐣ヤ竴鑷达紝閬垮厤闅忔剰鍙樻洿鍝嶅簲瀛楁銆�
-- Service 灞傛姏鍑虹殑涓氬姟寮傚父闇�鍖呭惈鍙畾浣嶄笂涓嬫枃锛堜换鍔″彿銆佽澶囧彿銆佸叧閿弬鏁帮級銆�
-- 鏃ュ織绾у埆瑙勮寖锛氳皟璇曠粏鑺傜敤 `Debug`锛屼笟鍔″叧閿矾寰勭敤 `Information`锛屽彲鎭㈠寮傚父鐢� `Warning`锛屼笉鍙仮澶嶉敊璇敤 `Error`銆�
-- 涓ョ鍚炲紓甯革紱鎹曡幏鍚庡繀椤昏褰曚笂涓嬫枃骞跺喅瀹氶噸鎶涙垨杞崲涓轰笟鍔¢敊璇��
-- 娑夊強澶栭儴绯荤粺璋冪敤銆両O銆佺綉缁滈�氫俊銆佽澶囬�氫俊銆佹暟鎹簱璁块棶鐨勫叧閿矾寰勫繀椤讳娇鐢� `try-catch`锛沗catch` 涓嚦灏戣褰曢敊璇俊鎭笌鍏抽敭鍙傛暟锛屽苟淇濈暀鍘熷鍫嗘爤锛坄throw;`锛夛紝绂佹浠� `throw ex;`銆�
-
-## 娴嬭瘯瑙勮寖
-- 涓昏娴嬭瘯妗嗘灦涓� xUnit锛岄」鐩凡寮曞叆 `Moq`銆乣FluentAssertions`銆乣coverlet.collector`銆�
-- 娴嬭瘯鍛藉悕寤鸿锛歚MethodName_ShouldExpectedBehavior`銆�
-- 娑夊強琛屼负鍙樺寲鐨勬敼鍔紝蹇呴』鍚屾鏂板鎴栨洿鏂版祴璇曞悗鍐嶅悎骞躲��
-
-## 鎻愪氦涓� Pull Request 瑙勮寖
-- 鎻愪氦鍘嗗彶浠ヨ仛鐒﹀瀷鍓嶇紑涓轰富锛歚feat:`銆乣fix:`銆乣refactor:`銆乣docs:`銆乣chore:`锛堜腑鏂囨憳瑕侊級銆�
-- 姣忔潯鎻愪氦淇℃伅蹇呴』鍖呭惈璇︾粏鎻愪氦鍐呭锛氳嚦灏戣鏄庢敼浜嗕粈涔堛�佷负浠�涔堟敼銆佸奖鍝嶄簡鍝簺妯″潡/鏂囦欢锛涚姝粎鍐欌�滀慨鏀逛唬鐮佲�濃�滀紭鍖栤�濊繖绫绘ā绯婃弿杩般��
-- PR 蹇呴』璇存槑锛氭敼鍔ㄥ唴瀹广�佹敼鍔ㄥ師鍥犮�佸奖鍝嶈矾寰勩�侀獙璇佹柟寮忎笌缁撴灉銆佹綔鍦ㄩ闄╀笌鍥炴粴鏂规銆�
-- 浠呭湪鍓嶇鐣岄潰鍙樻洿鏃堕檮鎴浘锛涙帴鍙e彉鏇撮渶闄勮姹�/鍝嶅簲绀轰緥銆�
-
-## 瀹夊叏涓庨厤缃鑼�
-- 绂佹鎻愪氦瀵嗛挜銆佷护鐗屻�佽繛鎺ヤ覆鏄庢枃锛涙晱鎰熼厤缃繀椤绘斁鍏ョ幆澧冨彉閲忔垨鏈湴鍙楁帶閰嶇疆銆�
-- `appsettings*.json` 鐨勭幆澧冨樊寮傞」闇�鏂囨。鍖栵紝閬垮厤鎶婂紑鍙戞満閰嶇疆甯﹀叆娴嬭瘯/鐢熶骇銆�
-- 娑夊強鏉冮檺銆侀壌鏉冦�佷腑闂翠欢椤哄簭鐨勬敼鍔紝蹇呴』鍦� PR 涓崟鐙爣娉ㄣ��
-
diff --git a/Code/WCS/CLAUDE.md b/Code/WCS/CLAUDE.md
deleted file mode 100644
index 19fe0e5..0000000
--- a/Code/WCS/CLAUDE.md
+++ /dev/null
@@ -1,183 +0,0 @@
-# CLAUDE.md
-
-鏈枃浠朵负 Claude Code (claude.ai/code) 鍦ㄦ浠g爜搴撲腑宸ヤ綔鏃舵彁渚涙寚瀵笺��
-
-## 椤圭洰姒傝堪
-
-杩欐槸涓�涓� **WCS锛堜粨搴撴帶鍒剁郴缁燂級** - 閯編鏂拌兘婧愪粨搴撴帶鍒剁郴缁燂紝鍖呭惈锛�
-
-- **WIDESEAWCS_Client** - Vue 3 鍓嶇搴旂敤锛圗lement Plus UI锛�
-- **WIDESEAWCS_Server** - ASP.NET Core 6.0 鍚庣 API 鏈嶅姟鍣�
-
-绯荤粺绠$悊鑷姩鍖栦粨搴撲綔涓氾紝鍖呮嫭鍫嗗灈鏈恒�佽緭閫佺嚎銆佺┛姊溅鍜屾満姊版墜鐨勭墿鏂欐惉杩愪换鍔★紙缁勭洏銆佹崲鐩樸�佹媶鐩橈級銆�
-
----
-
-## 甯哥敤鍛戒护
-
-### 鍓嶇 (WIDESEAWCS_Client)
-
-```bash
-# 瀹夎渚濊禆锛堝湪 Client 鐩綍涓級
-cd WIDESEAWCS_Client
-npm install
-
-# 寮�鍙戞湇鍔″櫒
-npm run serve
-
-# 鐢熶骇鏋勫缓
-npm run build
-
-# 浠g爜妫�鏌�
-npm run lint
-```
-
-**Node.js 18+ 娉ㄦ剰浜嬮」**锛氬鏋� `npm run serve` 鍥� OpenSSL 閿欒澶辫触锛宍package.json` 鑴氭湰宸插寘鍚� `SET NODE_OPTIONS=--openssl-legacy-provider` 瑙e喅鏂规銆�
-
-### 鍚庣 (WIDESEAWCS_Server)
-
-```bash
-# 鏋勫缓鏁翠釜瑙e喅鏂规
-cd WIDESEAWCS_Server
-dotnet build WIDESEAWCS_Server.sln
-
-# 杩愯鏈嶅姟鍣�
-dotnet run --project WIDESEAWCS_Server
-
-# 杩愯娴嬭瘯
-dotnet test WIDESEAWCS_Tests
-```
-
-**鏈嶅姟鍣ㄧ鍙�**锛欰PI 杩愯鍦� `http://*:9292`锛堝彲鍦� `appsettings.json` 涓厤缃級
-
----
-
-## 鏋舵瀯
-
-### 鍓嶇鏋舵瀯 (Vue 3)
-
-**鎶�鏈爤**锛�
-- Vue 3 + Vite
-- Element Plus UI 妗嗘灦
-- Vue Router锛坔ash 妯″紡锛�
-- Vuex 鐘舵�佺鐞�
-- Axios HTTP 璇锋眰
-- SignalR 瀹炴椂閫氫俊锛堝彲閫夛級
-
-**鍏抽敭鐩綍**锛�
-- `src/views/` - 椤甸潰缁勪欢锛圚ome銆丩ogin銆乻ystem銆乥asicinfo銆乼askinfo銆乧harts锛�
-- `src/components/basic/` - 鍙鐢ㄧ粍浠讹紝鍖呮嫭 `ViewGrid`锛堟暟鎹〃鏍肩粍浠讹級
-- `src/api/` - HTTP 瀹㈡埛绔紙`http.js`锛夛紝甯︿护鐗岀鐞嗗拰鎷︽埅鍣�
-- `src/router/` - 璺敱瀹氫箟锛屽甫韬唤楠岃瘉瀹堝崼
-- `src/store/` - Vuex 瀛樺偍锛岀敤浜庣敤鎴蜂俊鎭拰鏉冮檺
-- `src/uitils/` - 宸ュ叿鍑芥暟
-
-**HTTP 瀹㈡埛绔�** (`src/api/http.js`)锛�
-- 鍩虹 URL 榛樿鍊硷細寮�鍙戠幆澧冿紙`http://127.0.0.1:9292/`锛夈�佺敓浜х幆澧冿紙`http://115.159.85.185:9292/`锛�
-- 鑷姩鍖呭惈 `Authorization: Bearer {token}` 璇锋眰澶�
-- 鏀跺埌 `wideseawcs_exp` 鍝嶅簲澶存椂鑷姩鍒锋柊浠ょ墝
-- 401 鑷姩閲嶅畾鍚戝埌鐧诲綍椤�
-- 瀵煎嚭鏂规硶锛歚post()`銆乣get()`銆乣download()`銆乣ajax()`
-
-**鍏ㄥ眬灞炴��**锛堝湪 `main.js` 涓寕杞斤級锛�
-- `this.$http` - HTTP 瀹㈡埛绔�
-- `this.base` - 閫氱敤宸ュ叿
-- `this.permission` - 鏉冮檺妫�鏌�
-- `this.$global` - 鍏ㄥ眬閰嶇疆锛圫ignalR 鍚敤鏍囧織銆佽〃鏍兼爣绛炬樉绀猴級
-
-### 鍚庣鏋舵瀯 (ASP.NET Core)
-
-**鎶�鏈爤**锛�
-- ASP.NET Core 6.0 Web API
-- Autofac DI锛屼娇鐢� `IDependency` 鏍囪鎺ュ彛瀹炵幇鑷姩娉ㄥ唽
-- Quartz.NET 瀹氭椂浠诲姟锛堣澶囬�氫俊寰幆锛�
-- SqlSugar ORM 鏁版嵁搴撹闂�
-- Redis锛堥�氳繃 `WIDESEAWCS_RedisService` 瀹炵幇 L1+L2 娣峰悎缂撳瓨锛�
-- TCP Socket 鏈嶅姟鍣紙绔彛 2000锛夌敤浜庡疄鏃惰澶囬�氫俊
-- HslCommunication 搴撶敤浜� PLC/纭欢閫氫俊
-
-**椤圭洰缁撴瀯**锛�
-```
-WIDESEAWCS_Server/ # 涓� API 鏈嶅姟鍣�
-WIDESEAWCS_Core/ # 鏍稿績鍩虹璁炬柦锛氬熀绫汇�丏I銆佹墿灞曘�佷腑闂翠欢
-WIDESEAWCS_Model/ # 鏁版嵁妯″瀷鍜� DTO
-WIDESEAWCS_Communicator/ # 纭欢閫氫俊椹卞姩锛堣タ闂ㄥ瓙銆佹濮嗛緳銆丮odbus 绛夛級
-WIDESEAWCS_QuartzJob/ # 浠诲姟璋冨害鍩虹璁炬柦鍜岃澶囨娊璞�
-WIDESEAWCS_Tasks/ # Quartz 浠诲姟瀹炵幇锛堣澶囬�氫俊寰幆锛�
-WIDESEAWCS_RedisService/ # Redis 鏈嶅姟锛氱紦瀛樸�侀攣銆佽鏁板櫒銆佸彂甯冭闃�
-WIDESEAWCS_*Repository/ # 鏁版嵁璁块棶灞傚疄鐜�
-WIDESEAWCS_*Service/ # 涓氬姟鏈嶅姟灞�
-WIDESEAWCS_Tests/ # 鍗曞厓娴嬭瘯
-```
-
-**渚濊禆娉ㄥ叆妯″紡**锛�
-- 瀹炵幇 `IDependency` 鏍囪鎺ュ彛鐨勬湇鍔$敱 Autofac **鑷姩娉ㄥ唽**
-- 浣嶄簬 `AutofacModuleRegister` 涓壂鎻忔墍鏈夌▼搴忛泦
-- 娣诲姞鍓嶄娇鐢� `services.Remove()` 瑕嗙洊鐜版湁娉ㄥ唽
-
-**缂撳瓨灞�** (`ICacheService`)锛�
-- L1锛堝唴瀛橈級+ L2锛圧edis锛夋贩鍚堢紦瀛�
-- 瀹炵幇锛歚MemoryCacheService`銆乣RedisCacheService`銆乣HybridCacheService`
-- 甯哥敤鏂规硶锛歚Add`銆乣Get<T>`銆乣Remove`銆乣RemoveByPrefix`銆乣GetOrAdd<T>`
-
-**璁惧閫氫俊**锛�
-- 浠诲姟缁ф壙 `JobBase` 骞跺疄鐜� `IJob`
-- 璁惧绫诲瀷锛歚IStackerCrane`锛堝爢鍨涙満锛夈�乣IConveyorLine`锛堣緭閫佺嚎锛夈�乣IShuttleCar`锛堢┛姊溅锛夈�乣IRobot`锛堟満姊版墜锛�
-- 閫氫俊鍣細`SiemensS7Communicator`銆乣OmronEtherNetCommunicator`銆乣ModbusTcpCommunicator`銆乣SerialPortCommunicator`
-- TCP Socket 鏈嶅姟鍣紙绔彛 2000锛夌敱 `SocketServerHostedService` 绠$悊
-
----
-
-## 鍏抽敭闆嗘垚鐐�
-
-### 绯荤粺闆嗘垚 URL (BaseAPI 甯搁噺)
-- WMS锛歚http://localhost:9291/api/`
-- WCS锛堟湰鏈嶅姟鍣級锛歚http://localhost:9292/api/`
-- MES锛歚http://localhost:9293/api/`
-- ERP锛歚http://localhost:9294/api/`
-
-### 鏈烘鎵嬮�氫俊绯荤粺
-鏈烘鎵嬫帶鍒剁殑妯″潡鍖栨灦鏋勶細
-- `RobotClientManager` - TCP 瀹㈡埛绔繛鎺ョ鐞�
-- `RobotStateManager` - 绾跨▼瀹夊叏鐨勬満姊版墜鐘舵�佺紦瀛�
-- `RobotMessageHandler` - TCP 娑堟伅瑙f瀽
-- `RobotTaskProcessor` - 浠诲姟鎵ц鍜岀姸鎬佽浆鎹�
-- 浠诲姟绫诲瀷锛歚GroupPallet (500)` 缁勭洏銆乣ChangePallet (510)` 鎹㈢洏銆乣SplitPallet (520)` 鎷嗙洏
-
-### 閰嶇疆 (appsettings.json)
-鍏抽敭璁剧疆锛�
-- `"urls": "http://*:9292"` - 鏈嶅姟鍣ㄧ鍙�
-- `"QuartzJobAutoStart": true` - 鑷姩鍚姩瀹氭椂浠诲姟
-- `"SocketServer:Enabled": true` - 鍚敤 TCP 鏈嶅姟鍣�
-- `"RedisConfig:Enabled": true` - 鍚敤 Redis 缂撳瓨
-- `"DBType": "SqlServer"` - 鏁版嵁搴撶被鍨�
-
----
-
-## 寮�鍙戞寚鍗�
-
-### 娣诲姞鏂板姛鑳�
-
-**鍚庣**锛�
-1. 鍦� `WIDESEAWCS_IService/` 涓垱寤烘湇鍔℃帴鍙�
-2. 鍦� `WIDESEAWCS_Service/` 涓垱寤烘湇鍔″疄鐜帮紝瀹炵幇 `IDependency`
-3. 鍦� `WIDESEAWCS_Tasks/` 涓垱寤轰换鍔★紝缁ф壙 `JobBase` 鍜� `IJob`
-4. 鍦� `WIDESEAWCS_QuartzJob/Device/` 涓坊鍔犺澶囩被鍨�
-
-**鍓嶇**锛�
-1. 鍦� `src/views/` 涓坊鍔犺鍥�
-2. 鍦� `src/router/index.js` 涓坊鍔犺矾鐢�
-3. 浣跨敤 `$http.post()` 鍜� `$http.get()` 杩涜 API 璋冪敤
-4. 浣跨敤 `ViewGrid` 缁勪欢鏄剧ず鏁版嵁琛ㄦ牸
-
-### 浠g爜椋庢牸
-- **C#**锛氱被鍨�/鏂规硶/灞炴�т娇鐢� PascalCase锛屽眬閮ㄥ彉閲�/鍙傛暟浣跨敤 camelCase銆�4 绌烘牸缂╄繘锛屽ぇ鎷彿鎹㈣銆�
-- **JavaScript/Vue**锛氶伒寰幇鏈夋ā寮忥紝鏂扮粍浠朵娇鐢� Vue 3 Composition API
-- **娉ㄩ噴**锛氫负鏂板/淇敼鐨勪唬鐮佹坊鍔犺缁嗙殑涓枃娉ㄩ噴锛堟柟娉曠洰鐨勩�佸弬鏁般�佽繑鍥炲�笺�侀�愯璇存槑銆佸紓甯稿鐞嗭級
-
-### 閲嶈璇存槑
-- 鍚庣浣跨敤 **CamelCase** JSON 搴忓垪鍖�
-- 鎵�鏈夋湇鍔¢�氳繃 Autofac 榛樿浣跨敤 **scoped** 鐢熷懡鍛ㄦ湡
-- Redis 杩炴帴鍦ㄩ娆¤闂椂寤惰繜鍒濆鍖�
-- 鍦ㄤ换鍔′腑浣跨敤 `ConsoleHelper.WriteSuccessLine()` / `WriteErrorLine()` 杩涜鎺у埗鍙拌緭鍑�
-- TCP Socket 鏈嶅姟鍣ㄧ嫭绔嬩簬 HTTP API 杩愯
diff --git a/Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json b/Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json
deleted file mode 100644
index 524ee2c..0000000
--- a/Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "version": "1.0.0",
- "lastScanned": 1774322743799,
- "projectRoot": "d:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Client",
- "techStack": {
- "languages": [
- {
- "name": "JavaScript/TypeScript",
- "version": null,
- "confidence": "high",
- "markers": [
- "package.json"
- ]
- }
- ],
- "frameworks": [
- {
- "name": "vue",
- "version": "3.2.37",
- "category": "frontend"
- },
- {
- "name": "vite",
- "version": "5.0.0",
- "category": "build"
- }
- ],
- "packageManager": "pnpm",
- "runtime": null
- },
- "build": {
- "buildCommand": "pnpm build",
- "testCommand": null,
- "lintCommand": "pnpm lint",
- "devCommand": null,
- "scripts": {
- "serve": "vite",
- "build": "vite build",
- "preview": "vite preview",
- "lint": "eslint --ext .js,.vue src"
- }
- },
- "conventions": {
- "namingStyle": null,
- "importStyle": null,
- "testPattern": null,
- "fileOrganization": "type-based"
- },
- "structure": {
- "isMonorepo": false,
- "workspaces": [],
- "mainDirectories": [
- "public",
- "src",
- "tests"
- ],
- "gitBranches": {
- "defaultBranch": "master",
- "branchingStrategy": null
- }
- },
- "customNotes": [],
- "directoryMap": {
- "config": {
- "path": "config",
- "purpose": "Configuration files",
- "fileCount": 1,
- "lastAccessed": 1774322743642,
- "keyFiles": [
- "buttons.js"
- ]
- },
- "dist": {
- "path": "dist",
- "purpose": "Distribution/build output",
- "fileCount": 3,
- "lastAccessed": 1774322743642,
- "keyFiles": [
- "index.html",
- "wcslogo.png",
- "wms_d.png"
- ]
- },
- "public": {
- "path": "public",
- "purpose": "Public files",
- "fileCount": 3,
- "lastAccessed": 1774322743680,
- "keyFiles": [
- "index.html",
- "wcslogo.png",
- "wms_d.png"
- ]
- },
- "src": {
- "path": "src",
- "purpose": "Source code",
- "fileCount": 2,
- "lastAccessed": 1774322743680,
- "keyFiles": [
- "App.vue",
- "main.js"
- ]
- },
- "tests": {
- "path": "tests",
- "purpose": "Test files",
- "fileCount": 0,
- "lastAccessed": 1774322743682,
- "keyFiles": []
- },
- "dist\\assets": {
- "path": "dist\\assets",
- "purpose": "Static assets",
- "fileCount": 80,
- "lastAccessed": 1774322743684,
- "keyFiles": [
- "401-D9QhAVFF.js",
- "404-DCIcd6re.js",
- "Audit-C52MvHzW.css"
- ]
- },
- "dist\\static": {
- "path": "dist\\static",
- "purpose": "Static files",
- "fileCount": 1,
- "lastAccessed": 1774322743684,
- "keyFiles": [
- "login_bg.png"
- ]
- },
- "public\\static": {
- "path": "public\\static",
- "purpose": "Static files",
- "fileCount": 1,
- "lastAccessed": 1774322743685,
- "keyFiles": [
- "login_bg.png"
- ]
- },
- "src\\api": {
- "path": "src\\api",
- "purpose": "API routes",
- "fileCount": 3,
- "lastAccessed": 1774322743686,
- "keyFiles": [
- "http.js",
- "permission.js",
- "useTest.js"
- ]
- },
- "src\\assets": {
- "path": "src\\assets",
- "purpose": "Static assets",
- "fileCount": 1,
- "lastAccessed": 1774322743687,
- "keyFiles": [
- "logo.png"
- ]
- },
- "src\\components": {
- "path": "src\\components",
- "purpose": "UI components",
- "fileCount": 0,
- "lastAccessed": 1774322743688,
- "keyFiles": []
- },
- "src\\views": {
- "path": "src\\views",
- "purpose": "View templates",
- "fileCount": 3,
- "lastAccessed": 1774322743689,
- "keyFiles": [
- "Home.vue",
- "Index.vue",
- "Login.vue"
- ]
- }
- },
- "hotPaths": [
- {
- "path": "src\\views\\Index.vue",
- "accessCount": 2,
- "lastAccessed": 1774325401660,
- "type": "directory"
- },
- {
- "path": "src\\views\\fix_encoding.js",
- "accessCount": 1,
- "lastAccessed": 1774325444193,
- "type": "file"
- },
- {
- "path": "src\\views\\fix.js",
- "accessCount": 1,
- "lastAccessed": 1774325462466,
- "type": "file"
- },
- {
- "path": "src\\views\\replacements.json",
- "accessCount": 1,
- "lastAccessed": 1774325476630,
- "type": "file"
- }
- ],
- "userDirectives": []
-}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatCurrentSession.json b/Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatCurrentSession.json
deleted file mode 100644
index b78166e..0000000
--- a/Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatCurrentSession.json
+++ /dev/null
@@ -1 +0,0 @@
-{"_v":"v1","data":{"sessionId":"01996f24c43d7332993d43e3fe0ad04b","sessionName":"","messages":[{"role":"user","content":"","isTips":null,"cost":0,"parser":{"nodes":[],"parserState":{"line":0,"column":0,"offset":0,"metadata":false,"buffer":"","closing":false,"currentParent":null,"moveCursor":false,"tagBuffer":"","isCollectingTag":false},"content":"","columns":[]},"source":null,"error":null,"id":null,"localReferences":[{"uri":{"scheme":"file","authority":"","path":"file:///E:/4.閲嶆瀯/WIDESEAWCS/InfrastructureWCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/LocalLogger.cs","query":"","fragment":""},"range":[{"character":0,"line":0},{"character":0,"line":648}],"isRequestStage":true}],"references":null,"followup":null,"topic":"workspace","score":null,"command":"explain","changeToOptimize":null,"button":null,"knowledge":null,"knowledgeReferences":null,"knowledgeStatus":null,"variables":[],"selectedRange":null,"actions":null,"selectedRanges":[],"createdAt":1758506333319},{"role":"assistant","content":"<think>\n鎴戜滑姝e湪鏌ョ湅涓�涓狢#鐨勬棩蹇楄褰曠被LocalLogger銆傝繖涓被鐢ㄤ簬灏嗘棩蹇楀啓鍏ユ枃浠讹紝鍚屾椂鍙�夊湴杈撳嚭鍒版帶鍒跺彴锛屽苟鏀寔鏃ュ織鏂囦欢鐨勬粴鍔ㄥ拰娓呯悊銆俓n 棣栧厛锛屾垜浠敞鎰忓埌杩欎釜绫绘湁鍑犱釜绉佹湁瀛楁锛歕n _logFilePath锛氭棩蹇楁枃浠剁殑瀛樺偍璺緞銆俓n _minLogLevel锛氭渶浣庣殑鏃ュ織绾у埆锛屼綆浜庢绾у埆鐨勬棩蹇椾笉浼氳璁板綍銆俓n _maxFileSize锛氬崟涓棩蹇楁枃浠剁殑鏈�澶уぇ灏忥紙浠ュ瓧鑺備负鍗曚綅锛夈�俓n _maxRetainFiles锛氭渶澶氫繚鐣欑殑鏃ュ織鏂囦欢鏁伴噺銆俓n _enableConsoleOutput锛氭槸鍚﹀惎鐢ㄦ帶鍒跺彴杈撳嚭銆俓n _lock锛氫竴涓敤浜庡悓姝ョ殑瀵硅薄锛岀‘淇濆绾跨▼瀹夊叏銆俓n loggerQueueData锛氫竴涓苟鍙戦槦鍒楋紝浣嗕唬鐮佷腑骞舵病鏈変娇鐢ㄥ埌锛屽彲鑳芥槸棰勭暀鐨勩�俓n\n 鏋勯�犲嚱鏁帮細\n 鍒濆鍖栨棩蹇楄矾寰勪负搴旂敤绋嬪簭鍩虹洰褰曚笅鐨刓"Log\"鏂囦欢澶广�俓n 浠庨厤缃枃浠讹紙閫氳繃AppSettings绫伙級璇诲彇鏃ュ織绾у埆锛屽鏋滄病鏈夐厤缃垯榛樿涓篋EBUG绾у埆銆俓n 璇诲彇鏃ュ織鏂囦欢澶у皬锛堜互MB涓哄崟浣嶏紝榛樿5MB锛夛紝骞惰浆鎹负瀛楄妭銆俓n 璇诲彇鏈�澶т繚鐣欐棩蹇楁枃浠舵暟锛堥粯璁�200涓級銆俓n 璇诲彇鏄惁鍚敤鎺у埗鍙拌緭鍑猴紙閫氳繃AppSettings.ObjToBool杞崲锛夈�俓n 纭繚鏃ュ織鐩綍瀛樺湪锛屼笉瀛樺湪鍒欏垱寤恒�俓n 璋冪敤CreateWebSocket鏂规硶锛堜絾浠g爜鐗囨涓湭缁欏嚭璇ユ柟娉曪紝鎵�浠ュ彲鑳芥槸鐢ㄤ簬杩滅▼鏃ュ織浼犺緭锛燂級銆俓n\n Log鏂规硶锛堢鏈夛級锛歕n 棣栧厛妫�鏌ユ棩蹇楃骇鍒槸鍚︿綆浜庢渶灏忕骇鍒紝濡傛灉鏄垯鐩存帴杩斿洖銆俓n 鐒跺悗鍒涘缓涓�涓狶ogMessageItem瀵硅薄锛堣繖涓璞″皝瑁呬簡鏃ュ織鐨勬椂闂淬�佺骇鍒�佸叧閿瓧銆佹秷鎭拰寮傚父锛夛紝骞惰皟鐢ㄥ叾ToString鏂规硶鐢熸垚鏃ュ織鏉$洰銆俓n 浣跨敤lock纭繚绾跨▼瀹夊叏锛屽洜涓烘枃浠舵搷浣滃拰娓呯悊鎿嶄綔闇�瑕佷簰鏂ャ�俓n 鍦ㄩ攣鍐咃細\n 璋冪敤GetLastAccessFileName鑾峰彇褰撳墠搴旇鍐欏叆鐨勬棩蹇楁枃浠跺悕锛堝彲鑳芥槸鏈�鏂扮殑鏈弧鐨勬枃浠讹紝鎴栬�呮柊寤轰竴涓級銆俓n 璋冪敤CleanOldLogs娓呯悊鏃ф棩蹇楋紙淇濈暀鏈�鏂扮殑_maxRetainFiles涓枃浠讹級銆俓n 灏嗘棩蹇楁潯鐩拷鍔犲埌鏂囦欢涓紙浣跨敤File.AppendAllText锛夈�俓n 濡傛灉鍚敤浜嗘帶鍒跺彴杈撳嚭锛屽垯璋冪敤ConsoleOutput鏂规硶銆俓n\n ConsoleOutput鏂规硶锛歕n 鏍规嵁鏃ュ織绾у埆璁剧疆鎺у埗鍙板墠鏅壊锛岀劧鍚庤緭鍑烘棩蹇楁潯鐩�俓n\n GetLastAccessFileName鏂规硶锛歕n 鑾峰彇鏃ュ織鐩綍涓嬫墍鏈�.log鏂囦欢锛屾寜鍒涘缓鏃堕棿鍊掑簭鎺掑垪锛堟渶鏂扮殑鍦ㄥ墠锛夈�俓n 濡傛灉鏈�鏂扮殑鏂囦欢澶у皬灏忎簬_maxFileSize锛屽垯杩斿洖璇ユ枃浠跺悕銆俓n 鍚﹀垯锛岃繑鍥炰竴涓柊鐨勬枃浠跺悕锛堜互褰撳墠鏃堕棿鍛藉悕锛屾牸寮忎负yyyyMMddHHmmss.log锛夈�俓n\n CleanOldLogs鏂规硶锛歕n 鍚屾牱鑾峰彇鎵�鏈夋棩蹇楁枃浠讹紝鎸夊垱寤烘椂闂村�掑簭鎺掑垪銆俓n 浠庣_maxRetainFiles涓枃浠跺紑濮嬶紙绱㈠紩浠�0寮�濮嬶紝鎵�浠ヤ繚鐣欏墠_maxRetainFiles涓級锛屽垹闄ゅ悗闈㈢殑鎵�鏈夋枃浠躲�俓n\n AnalysisLogSource鏂规硶锛歕n 杩欐槸涓�涓紓姝ヨ凯浠e櫒鏂规硶锛岀敤浜庤В鏋愭棩蹇楁簮锛堜竴涓瓧绗︿覆锛夊苟鍒嗘壒杩斿洖鏃ュ織鏉$洰銆俓n 浣跨敤姝e垯琛ㄨ揪寮忓尮閰嶆棩蹇楁潯鐩紙姣忎釜鏃ュ織鏉$洰浠\u0002寮�濮嬶紝\\u0003缁撴潫锛夈�俓n 姝e垯琛ㄨ揪寮忔ā寮忚В閲婏細\n 鍒嗙粍1锛氭椂闂达紙鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍2锛氭棩蹇楃骇鍒紙鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍3锛氬叧閿瓧锛堝彲閫夛紝鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍4锛氭秷鎭紙鍦ㄥ叧閿瓧涔嬪悗锛岀洿鍒伴亣鍒版崲琛屾垨鑰呭紓甯搁儴鍒嗭級\n 鍒嗙粍5锛氬紓甯镐俊鎭紙鍦╗寮傚父]鏍囩涔嬪悗锛岀洿鍒癨\u0003锛塡n 灏嗘瘡涓尮閰嶉」瑙f瀽涓篖ogMessageItem瀵硅薄锛屽苟鏀堕泦鍒板垪琛ㄤ腑銆俓n 褰撴敹闆嗗埌batchSize锛堥粯璁�100锛夋潯鏃讹紝灏辫繑鍥炰竴鎵癸紝鐒跺悗娓呯┖鍒楄〃缁х画鏀堕泦銆俓n\n 娉ㄦ剰锛氬湪鎻愪緵鐨勪唬鐮佺墖娈典腑锛孉nalysisLogSource鏂规硶鍙粰鍑轰簡閮ㄥ垎瀹炵幇锛堝埌yield return涔嬪墠锛夈�傚湪yield return涔嬪悗锛屽簲璇ヨ繕鏈変唬鐮佸鐞嗗墿浣欑殑鏃ュ織鏉$洰锛堝嵆鏈�鍚庝竴鎵逛笉瓒砨atchSize鐨勬潯鐩級銆備絾鏄唬鐮佺墖娈靛湪yield return涔嬪悗灏辩粨鏉熶簡锛屾墍浠ュ彲鑳藉悗闈㈣繕鏈変唬鐮佹病鏈夋樉绀哄嚭鏉ャ�俓n\n 鍙﹀锛屼唬鐮佷腑鏈変竴涓湭鏄剧ず鐨勬柟娉旵reateWebSocket锛屽彲鑳芥槸鐢ㄤ簬寤虹珛WebSocket杩炴帴浠ヤ究灏嗘棩蹇楀疄鏃跺彂閫佸埌杩滅▼瀹㈡埛绔紵浣嗗洜涓烘病鏈夊叿浣撳疄鐜帮紝鎵�浠ユ棤娉曠‘瀹氥�俓n\n 娼滃湪闂锛歕n 1. 鍦↙og鏂规硶涓紝姣忔鍐欏叆鏃ュ織閮戒細璋冪敤CleanOldLogs锛岃繖浼氬鑷存瘡娆″啓鏃ュ織閮借鎵弿鏃ュ織鐩綍骞跺垹闄ゆ棫鏂囦欢銆傚鏋滄棩蹇楁枃浠跺緢澶氾紝杩欏彲鑳戒細褰卞搷鎬ц兘銆傚彲浠ヨ�冭檻浼樺寲锛屾瘮濡傛瘡澶╂竻鐞嗕竴娆★紝鎴栬�呭崟鐙嚎绋嬫竻鐞嗐�俓n 2. 鍦℅etLastAccessFileName鏂规硶涓紝濡傛灉鏃ュ織鐩綍涓嬫病鏈夋枃浠讹紝鍒欑洿鎺ヨ繑鍥炴柊鏂囦欢鍚嶃�備絾鏄紝濡傛灉鍚屾椂鏈夊涓嚎绋嬭皟鐢↙og鏂规硶锛屽彲鑳戒細鍚屾椂鍒涘缓澶氫釜鏂版枃浠讹紙鍥犱负閿佸彧淇濇姢浜哃og鏂规硶鍐呴儴锛岃�孏etLastAccessFileName鏂规硶鍦ㄩ攣鍐呰皟鐢紝鎵�浠ュ疄闄呬笂涓嶄細鍚屾椂鍒涘缓澶氫釜鏂囦欢锛屽洜涓洪攣淇濊瘉浜嗕簰鏂ワ級銆備絾鏄紝濡傛灉澶氫釜杩涚▼鍚屾椂浣跨敤鍚屼竴涓棩蹇楃洰褰曪紝鍒欏彲鑳戒細鍑虹幇闂銆俓n 3. 鍦–leanOldLogs鏂规硶涓紝鍒犻櫎鏂囦欢鏃朵娇鐢ㄤ簡try-catch蹇界暐寮傚父锛岃繖鍙兘浼氬鑷存煇浜涙枃浠舵棤娉曞垹闄わ紙姣斿琚叾浠栬繘绋嬪崰鐢級鑰屾棤娉曟竻鐞嗭紝浣嗕笉浼氬奖鍝嶄富娴佺▼銆俓n 4. 鍦ˋnalysisLogSource鏂规硶涓紝姝e垯琛ㄨ揪寮忓彲鑳芥棤娉曞尮閰嶆墍鏈夋儏鍐碉紝鐗瑰埆鏄綋娑堟伅涓寘鍚柟鎷彿鏃讹紝鍙兘浼氬鑷磋В鏋愰敊璇�傚彟澶栵紝寮傚父閮ㄥ垎浣跨敤浜哰\\s\\S]*?鏉ュ尮閰嶄换鎰忓瓧绗︼紙鍖呮嫭鎹㈣锛夛紝浣嗚娉ㄦ剰濡傛灉鏃ュ織鏉$洰涓嚭鐜颁簡\\u0003锛屽彲鑳戒細瀵艰嚧鎻愬墠缁撴潫鍖归厤銆俓n\n 鏀硅繘寤鸿锛歕n 1. 瀵逛簬棰戠箒鐨勬棩蹇楀啓鍏ワ紝鍙互鑰冭檻浣跨敤寮傛鍐欏叆鎴栬�呬娇鐢ㄤ竴涓悗鍙扮嚎绋嬫潵鍐欏叆锛岄伩鍏嶉樆濉炶皟鐢ㄧ嚎绋嬨�俓n 2. 灏咰leanOldLogs鐨勮皟鐢ㄩ鐜囬檷浣庯紝姣斿鍦ㄦ瘡娆″垱寤烘柊鏂囦欢鐨勬椂鍊欐墠娓呯悊锛屾垨鑰呮瘡灏忔椂娓呯悊涓�娆°�俓n 3. 鑰冭檻浣跨敤鎴愮啛鐨勬棩蹇楀簱濡侼Log鎴朣erilog锛屽畠浠凡缁忚В鍐充簡杩欎簺闂銆俓n\n 鐢变簬浠g爜鐗囨涓嶅畬鏁达紝浠ヤ笂鍒嗘瀽鍩轰簬宸叉彁渚涚殑閮ㄥ垎銆俓n</think>\n杩欐浠g爜瀹炵幇浜嗕竴涓湰鍦版棩蹇楄褰曞櫒 `LocalLogger`锛岀敤浜庣鐞嗘棩蹇楃殑鍐欏叆銆佹粴鍔ㄥ拰娓呯悊銆備互涓嬫槸鏍稿績鍔熻兘鐨勮В鏋愶細\n\n### 1. **鍒濆鍖栭厤缃�**\n- **鏃ュ織璺緞**锛氭棩蹇楀瓨鍌ㄥ湪搴旂敤鍩虹洰褰曠殑 `Log` 鏂囦欢澶癸紙閫氳繃 `AppDomain.CurrentDomain.BaseDirectory` 鑾峰彇锛夈�俓n- **鏃ュ織绾у埆**锛氫粠閰嶇疆鏂囦欢璇诲彇 `LogLevel`锛堥粯璁� `DEBUG`锛夛紝浣庝簬姝ょ骇鍒殑鏃ュ織灏嗚蹇界暐銆俓n- **鏂囦欢澶у皬闄愬埗**锛氬崟涓棩蹇楁枃浠舵渶澶т负 `maxFileSize` MB锛堥粯璁� 5MB锛夛紝瓒呴檺鍚庡垱寤烘柊鏂囦欢銆俓n- **鏂囦欢淇濈暀绛栫暐**锛氭渶澶氫繚鐣� `maxRetainFiles` 涓枃浠讹紙榛樿 200 涓級锛屾棫鏂囦欢鑷姩鍒犻櫎銆俓n- **鎺у埗鍙拌緭鍑�**锛氭牴鎹厤缃喅瀹氭槸鍚﹀皢鏃ュ織鍚屾杈撳嚭鍒版帶鍒跺彴锛堝甫棰滆壊鏍囪锛夈�俓n\n### 2. **鏃ュ織鍐欏叆娴佺▼**\n- **鏃ュ織鏍煎紡鍖�**锛氶�氳繃 `LogMessageItem` 灏佽鏃ュ織淇℃伅锛堟椂闂淬�佺骇鍒�佸叧閿瘝銆佹秷鎭�佸紓甯革級锛屽苟杞崲涓哄瓧绗︿覆銆俓n- **绾跨▼瀹夊叏**锛氫娇鐢� `lock (_lock)` 纭繚鏂囦欢鎿嶄綔鍜屾竻鐞嗙殑鍘熷瓙鎬с�俓n- **鏂囦欢閫夋嫨**锛歕n - 璋冪敤 `GetLastAccessFileName()` 鑾峰彇鏈�鏂版棩蹇楁枃浠躲�俓n - 鑻ュ綋鍓嶆枃浠舵湭瓒呭ぇ灏忛檺鍒讹紝鍒欑户缁啓鍏ワ紱鍚﹀垯鎸夋椂闂存埑鐢熸垚鏂版枃浠跺悕锛堝 `20240101120000.log`锛夈�俓n- **娓呯悊鏃ф枃浠�**锛氭瘡娆″啓鍏ュ墠璋冪敤 `CleanOldLogs()`锛屽垹闄よ秴鍑轰繚鐣欐暟閲忕殑鏈�鏃ф枃浠躲�俓n\n### 3. **鎺у埗鍙拌緭鍑�**\n- 鏍规嵁鏃ュ織绾у埆璁剧疆涓嶅悓棰滆壊锛歕n - `DEBUG` 鈫� 鐧借壊\n - `INFO` 鈫� 钃濊壊\n - `WARN` 鈫� 榛勮壊\n - `ERROR` 鈫� 绾㈣壊\n - `FATAL` 鈫� 娣辩孩鑹瞈n\n### 4. **鏃ュ織瑙f瀽鍔熻兘**\n- **姝e垯鍖归厤**锛歚AnalysisLogSource()` 鏂规硶閫氳繃姝e垯琛ㄨ揪寮忚В鏋愭棩蹇楁枃鏈細\n ```regex\n \\u0002\\[([^\\]]+)\\] \\[([^\\]]+)\\](?: \\[([^\\]]+)\\])?(?: ([^\\u0003]*?))?(?:\\n\\[寮傚父\\]([\\s\\S]*?))?\\u0003\n ```\n 鍖归厤瀛楁鍖呮嫭锛氭椂闂存埑銆佹棩蹇楃骇鍒�佸叧閿瘝銆佹秷鎭�佸紓甯镐俊鎭�俓n- **鍒嗘壒杩斿洖**锛氳В鏋愬悗鐨勬棩蹇楁潯鐩寜 `batchSize`锛堥粯璁� 100 鏉★級鍒嗘壒杩斿洖锛岄伩鍏嶅唴瀛樻孩鍑恒�俓n\n### 娼滃湪闂涓庝紭鍖栧缓璁甛n1. **鎬ц兘鐡堕**锛歕n - 姣忔鍐欐棩蹇楅兘鎵弿鐩綍鍜屾竻鐞嗘枃浠讹紝楂橀鏃ュ織鍦烘櫙涓嬪彲鑳藉奖鍝嶆�ц兘銆傚缓璁敼涓哄畾鏃舵竻鐞嗭紙濡傛瘡灏忔椂涓�娆★級銆俓n - 鏂囦欢鍐欏叆浣跨敤 `File.AppendAllText`锛岄绻佸皬鏂囦欢鍐欏叆鏁堢巼杈冧綆銆傚彲鏀圭敤 `FileStream` 鎴栫紦鍐插啓鍏ャ�俓n\n2. **姝e垯琛ㄨ揪寮忛闄�**锛歕n - 鏃ュ織瑙f瀽鐨勬鍒欒緝澶嶆潅锛岃嫢鏃ュ織鏍煎紡鍙樺寲鍙兘鍖归厤澶辫触銆傚缓璁鍔犳牸寮忔牎楠屾垨鏀圭敤缁撴瀯鍖栨棩蹇楋紙濡� JSON锛夈�俓n\n3. **鏈疄鐜板姛鑳�**锛歕n - `CreateWebSocket()` 鏂规硶鏈湪浠g爜涓疄鐜帮紝闇�纭鏄惁璁″垝鏀寔 WebSocket 鏃ュ織鎺ㄩ�併�俓n\n4. **閿欒澶勭悊**锛歕n - 鏂囦欢鍒犻櫎鏃跺拷鐣ュ紓甯革紙`catch {}`锛夛紝鍙兘瀵艰嚧娓呯悊澶辫触鍗翠笉鎶ヨ銆傚缓璁嚦灏戣褰曞垹闄ゅ紓甯搞�俓n\n### 鍏稿瀷浣跨敤鍦烘櫙\n```csharp\nvar logger = new LocalLogger();\nlogger.Log(LogLevel.INFO, \"绯荤粺鍚姩瀹屾垚\", \"Startup\");\n// 杈撳嚭绀轰緥锛歔2024-01-01 12:00:00] [INFO] [Startup] 绯荤粺鍚姩瀹屾垚\n```undefined","isTips":null,"cost":49028,"parser":{"nodes":[{"type":"reasoning","content":"<think>\n鎴戜滑姝e湪鏌ョ湅涓�涓狢#鐨勬棩蹇楄褰曠被LocalLogger銆傝繖涓被鐢ㄤ簬灏嗘棩蹇楀啓鍏ユ枃浠讹紝鍚屾椂鍙�夊湴杈撳嚭鍒版帶鍒跺彴锛屽苟鏀寔鏃ュ織鏂囦欢鐨勬粴鍔ㄥ拰娓呯悊銆俓n 棣栧厛锛屾垜浠敞鎰忓埌杩欎釜绫绘湁鍑犱釜绉佹湁瀛楁锛歕n _logFilePath锛氭棩蹇楁枃浠剁殑瀛樺偍璺緞銆俓n _minLogLevel锛氭渶浣庣殑鏃ュ織绾у埆锛屼綆浜庢绾у埆鐨勬棩蹇椾笉浼氳璁板綍銆俓n _maxFileSize锛氬崟涓棩蹇楁枃浠剁殑鏈�澶уぇ灏忥紙浠ュ瓧鑺備负鍗曚綅锛夈�俓n _maxRetainFiles锛氭渶澶氫繚鐣欑殑鏃ュ織鏂囦欢鏁伴噺銆俓n _enableConsoleOutput锛氭槸鍚﹀惎鐢ㄦ帶鍒跺彴杈撳嚭銆俓n _lock锛氫竴涓敤浜庡悓姝ョ殑瀵硅薄锛岀‘淇濆绾跨▼瀹夊叏銆俓n loggerQueueData锛氫竴涓苟鍙戦槦鍒楋紝浣嗕唬鐮佷腑骞舵病鏈変娇鐢ㄥ埌锛屽彲鑳芥槸棰勭暀鐨勩�俓n\n 鏋勯�犲嚱鏁帮細\n 鍒濆鍖栨棩蹇楄矾寰勪负搴旂敤绋嬪簭鍩虹洰褰曚笅鐨刓"Log\"鏂囦欢澶广�俓n 浠庨厤缃枃浠讹紙閫氳繃AppSettings绫伙級璇诲彇鏃ュ織绾у埆锛屽鏋滄病鏈夐厤缃垯榛樿涓篋EBUG绾у埆銆俓n 璇诲彇鏃ュ織鏂囦欢澶у皬锛堜互MB涓哄崟浣嶏紝榛樿5MB锛夛紝骞惰浆鎹负瀛楄妭銆俓n 璇诲彇鏈�澶т繚鐣欐棩蹇楁枃浠舵暟锛堥粯璁�200涓級銆俓n 璇诲彇鏄惁鍚敤鎺у埗鍙拌緭鍑猴紙閫氳繃AppSettings.ObjToBool杞崲锛夈�俓n 纭繚鏃ュ織鐩綍瀛樺湪锛屼笉瀛樺湪鍒欏垱寤恒�俓n 璋冪敤CreateWebSocket鏂规硶锛堜絾浠g爜鐗囨涓湭缁欏嚭璇ユ柟娉曪紝鎵�浠ュ彲鑳芥槸鐢ㄤ簬杩滅▼鏃ュ織浼犺緭锛燂級銆俓n\n Log鏂规硶锛堢鏈夛級锛歕n 棣栧厛妫�鏌ユ棩蹇楃骇鍒槸鍚︿綆浜庢渶灏忕骇鍒紝濡傛灉鏄垯鐩存帴杩斿洖銆俓n 鐒跺悗鍒涘缓涓�涓狶ogMessageItem瀵硅薄锛堣繖涓璞″皝瑁呬簡鏃ュ織鐨勬椂闂淬�佺骇鍒�佸叧閿瓧銆佹秷鎭拰寮傚父锛夛紝骞惰皟鐢ㄥ叾ToString鏂规硶鐢熸垚鏃ュ織鏉$洰銆俓n 浣跨敤lock纭繚绾跨▼瀹夊叏锛屽洜涓烘枃浠舵搷浣滃拰娓呯悊鎿嶄綔闇�瑕佷簰鏂ャ�俓n 鍦ㄩ攣鍐咃細\n 璋冪敤GetLastAccessFileName鑾峰彇褰撳墠搴旇鍐欏叆鐨勬棩蹇楁枃浠跺悕锛堝彲鑳芥槸鏈�鏂扮殑鏈弧鐨勬枃浠讹紝鎴栬�呮柊寤轰竴涓級銆俓n 璋冪敤CleanOldLogs娓呯悊鏃ф棩蹇楋紙淇濈暀鏈�鏂扮殑_maxRetainFiles涓枃浠讹級銆俓n 灏嗘棩蹇楁潯鐩拷鍔犲埌鏂囦欢涓紙浣跨敤File.AppendAllText锛夈�俓n 濡傛灉鍚敤浜嗘帶鍒跺彴杈撳嚭锛屽垯璋冪敤ConsoleOutput鏂规硶銆俓n\n ConsoleOutput鏂规硶锛歕n 鏍规嵁鏃ュ織绾у埆璁剧疆鎺у埗鍙板墠鏅壊锛岀劧鍚庤緭鍑烘棩蹇楁潯鐩�俓n\n GetLastAccessFileName鏂规硶锛歕n 鑾峰彇鏃ュ織鐩綍涓嬫墍鏈�.log鏂囦欢锛屾寜鍒涘缓鏃堕棿鍊掑簭鎺掑垪锛堟渶鏂扮殑鍦ㄥ墠锛夈�俓n 濡傛灉鏈�鏂扮殑鏂囦欢澶у皬灏忎簬_maxFileSize锛屽垯杩斿洖璇ユ枃浠跺悕銆俓n 鍚﹀垯锛岃繑鍥炰竴涓柊鐨勬枃浠跺悕锛堜互褰撳墠鏃堕棿鍛藉悕锛屾牸寮忎负yyyyMMddHHmmss.log锛夈�俓n\n CleanOldLogs鏂规硶锛歕n 鍚屾牱鑾峰彇鎵�鏈夋棩蹇楁枃浠讹紝鎸夊垱寤烘椂闂村�掑簭鎺掑垪銆俓n 浠庣_maxRetainFiles涓枃浠跺紑濮嬶紙绱㈠紩浠�0寮�濮嬶紝鎵�浠ヤ繚鐣欏墠_maxRetainFiles涓級锛屽垹闄ゅ悗闈㈢殑鎵�鏈夋枃浠躲�俓n\n AnalysisLogSource鏂规硶锛歕n 杩欐槸涓�涓紓姝ヨ凯浠e櫒鏂规硶锛岀敤浜庤В鏋愭棩蹇楁簮锛堜竴涓瓧绗︿覆锛夊苟鍒嗘壒杩斿洖鏃ュ織鏉$洰銆俓n 浣跨敤姝e垯琛ㄨ揪寮忓尮閰嶆棩蹇楁潯鐩紙姣忎釜鏃ュ織鏉$洰浠\u0002寮�濮嬶紝\\u0003缁撴潫锛夈�俓n 姝e垯琛ㄨ揪寮忔ā寮忚В閲婏細\n 鍒嗙粍1锛氭椂闂达紙鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍2锛氭棩蹇楃骇鍒紙鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍3锛氬叧閿瓧锛堝彲閫夛紝鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍4锛氭秷鎭紙鍦ㄥ叧閿瓧涔嬪悗锛岀洿鍒伴亣鍒版崲琛屾垨鑰呭紓甯搁儴鍒嗭級\n 鍒嗙粍5锛氬紓甯镐俊鎭紙鍦╗寮傚父]鏍囩涔嬪悗锛岀洿鍒癨\u0003锛塡n 灏嗘瘡涓尮閰嶉」瑙f瀽涓篖ogMessageItem瀵硅薄锛屽苟鏀堕泦鍒板垪琛ㄤ腑銆俓n 褰撴敹闆嗗埌batchSize锛堥粯璁�100锛夋潯鏃讹紝灏辫繑鍥炰竴鎵癸紝鐒跺悗娓呯┖鍒楄〃缁х画鏀堕泦銆俓n\n 娉ㄦ剰锛氬湪鎻愪緵鐨勪唬鐮佺墖娈典腑锛孉nalysisLogSource鏂规硶鍙粰鍑轰簡閮ㄥ垎瀹炵幇锛堝埌yield return涔嬪墠锛夈�傚湪yield return涔嬪悗锛屽簲璇ヨ繕鏈変唬鐮佸鐞嗗墿浣欑殑鏃ュ織鏉$洰锛堝嵆鏈�鍚庝竴鎵逛笉瓒砨atchSize鐨勬潯鐩級銆備絾鏄唬鐮佺墖娈靛湪yield return涔嬪悗灏辩粨鏉熶簡锛屾墍浠ュ彲鑳藉悗闈㈣繕鏈変唬鐮佹病鏈夋樉绀哄嚭鏉ャ�俓n\n 鍙﹀锛屼唬鐮佷腑鏈変竴涓湭鏄剧ず鐨勬柟娉旵reateWebSocket锛屽彲鑳芥槸鐢ㄤ簬寤虹珛WebSocket杩炴帴浠ヤ究灏嗘棩蹇楀疄鏃跺彂閫佸埌杩滅▼瀹㈡埛绔紵浣嗗洜涓烘病鏈夊叿浣撳疄鐜帮紝鎵�浠ユ棤娉曠‘瀹氥�俓n\n 娼滃湪闂锛歕n 1. 鍦↙og鏂规硶涓紝姣忔鍐欏叆鏃ュ織閮戒細璋冪敤CleanOldLogs锛岃繖浼氬鑷存瘡娆″啓鏃ュ織閮借鎵弿鏃ュ織鐩綍骞跺垹闄ゆ棫鏂囦欢銆傚鏋滄棩蹇楁枃浠跺緢澶氾紝杩欏彲鑳戒細褰卞搷鎬ц兘銆傚彲浠ヨ�冭檻浼樺寲锛屾瘮濡傛瘡澶╂竻鐞嗕竴娆★紝鎴栬�呭崟鐙嚎绋嬫竻鐞嗐�俓n 2. 鍦℅etLastAccessFileName鏂规硶涓紝濡傛灉鏃ュ織鐩綍涓嬫病鏈夋枃浠讹紝鍒欑洿鎺ヨ繑鍥炴柊鏂囦欢鍚嶃�備絾鏄紝濡傛灉鍚屾椂鏈夊涓嚎绋嬭皟鐢↙og鏂规硶锛屽彲鑳戒細鍚屾椂鍒涘缓澶氫釜鏂版枃浠讹紙鍥犱负閿佸彧淇濇姢浜哃og鏂规硶鍐呴儴锛岃�孏etLastAccessFileName鏂规硶鍦ㄩ攣鍐呰皟鐢紝鎵�浠ュ疄闄呬笂涓嶄細鍚屾椂鍒涘缓澶氫釜鏂囦欢锛屽洜涓洪攣淇濊瘉浜嗕簰鏂ワ級銆備絾鏄紝濡傛灉澶氫釜杩涚▼鍚屾椂浣跨敤鍚屼竴涓棩蹇楃洰褰曪紝鍒欏彲鑳戒細鍑虹幇闂銆俓n 3. 鍦–leanOldLogs鏂规硶涓紝鍒犻櫎鏂囦欢鏃朵娇鐢ㄤ簡try-catch蹇界暐寮傚父锛岃繖鍙兘浼氬鑷存煇浜涙枃浠舵棤娉曞垹闄わ紙姣斿琚叾浠栬繘绋嬪崰鐢級鑰屾棤娉曟竻鐞嗭紝浣嗕笉浼氬奖鍝嶄富娴佺▼銆俓n 4. 鍦ˋnalysisLogSource鏂规硶涓紝姝e垯琛ㄨ揪寮忓彲鑳芥棤娉曞尮閰嶆墍鏈夋儏鍐碉紝鐗瑰埆鏄綋娑堟伅涓寘鍚柟鎷彿鏃讹紝鍙兘浼氬鑷磋В鏋愰敊璇�傚彟澶栵紝寮傚父閮ㄥ垎浣跨敤浜哰\\s\\S]*?鏉ュ尮閰嶄换鎰忓瓧绗︼紙鍖呮嫭鎹㈣锛夛紝浣嗚娉ㄦ剰濡傛灉鏃ュ織鏉$洰涓嚭鐜颁簡\\u0003锛屽彲鑳戒細瀵艰嚧鎻愬墠缁撴潫鍖归厤銆俓n\n 鏀硅繘寤鸿锛歕n 1. 瀵逛簬棰戠箒鐨勬棩蹇楀啓鍏ワ紝鍙互鑰冭檻浣跨敤寮傛鍐欏叆鎴栬�呬娇鐢ㄤ竴涓悗鍙扮嚎绋嬫潵鍐欏叆锛岄伩鍏嶉樆濉炶皟鐢ㄧ嚎绋嬨�俓n 2. 灏咰leanOldLogs鐨勮皟鐢ㄩ鐜囬檷浣庯紝姣斿鍦ㄦ瘡娆″垱寤烘柊鏂囦欢鐨勬椂鍊欐墠娓呯悊锛屾垨鑰呮瘡灏忔椂娓呯悊涓�娆°�俓n 3. 鑰冭檻浣跨敤鎴愮啛鐨勬棩蹇楀簱濡侼Log鎴朣erilog锛屽畠浠凡缁忚В鍐充簡杩欎簺闂銆俓n\n 鐢变簬浠g爜鐗囨涓嶅畬鏁达紝浠ヤ笂鍒嗘瀽鍩轰簬宸叉彁渚涚殑閮ㄥ垎銆俓n</think>","contentId":2014385504,"children":[],"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"杩欐浠g爜瀹炵幇浜嗕竴涓湰鍦版棩蹇楄褰曞櫒 `LocalLogger`锛岀敤浜庣鐞嗘棩蹇楃殑鍐欏叆銆佹粴鍔ㄥ拰娓呯悊銆備互涓嬫槸鏍稿績鍔熻兘鐨勮В鏋愶細","children":[],"contentId":-1207430004,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 1. **鍒濆鍖栭厤缃�**","children":[],"contentId":-1084626202,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"list-item","content":"**鏃ュ織璺緞**锛氭棩蹇楀瓨鍌ㄥ湪搴旂敤鍩虹洰褰曠殑 `Log` 鏂囦欢澶癸紙閫氳繃 `AppDomain.CurrentDomain.BaseDirectory` 鑾峰彇锛夈��","children":[],"contentId":-1696386507,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"list-item","content":"**鏃ュ織绾у埆**锛氫粠閰嶇疆鏂囦欢璇诲彇 `LogLevel`锛堥粯璁� `DEBUG`锛夛紝浣庝簬姝ょ骇鍒殑鏃ュ織灏嗚蹇界暐銆�","children":[],"contentId":-492889106,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"list-item","content":" **鏂囦欢澶у皬闄愬埗**锛氬崟涓棩蹇楁枃浠舵渶澶т负 `maxFileSize` MB锛堥粯璁� 5MB锛夛紝瓒呴檺鍚庡垱寤烘柊鏂囦欢銆�","children":[],"contentId":-1350407878,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"list-item","content":" **鏂囦欢淇濈暀绛栫暐**锛氭渶澶氫繚鐣� `maxRetainFiles` 涓枃浠讹紙榛樿 200 涓級锛屾棫鏂囦欢鑷姩鍒犻櫎銆�","children":[],"contentId":-2054636824,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"list-item","content":" **鎺у埗鍙拌緭鍑�**锛氭牴鎹厤缃喅瀹氭槸鍚﹀皢鏃ュ織鍚屾杈撳嚭鍒版帶鍒跺彴锛堝甫棰滆壊鏍囪锛夈��","children":[],"contentId":1291657913,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 2. **鏃ュ織鍐欏叆娴佺▼**","children":[],"contentId":-1012509908,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"list-item","content":" **鏃ュ織鏍煎紡鍖�**锛氶�氳繃 `LogMessageItem` 灏佽鏃ュ織淇℃伅锛堟椂闂淬�佺骇鍒�佸叧閿瘝銆佹秷鎭�佸紓甯革級锛屽苟杞崲涓哄瓧绗︿覆銆�","children":[],"contentId":968094303,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"list-item","content":" **绾跨▼瀹夊叏**锛氫娇鐢� `lock (_lock)` 纭繚鏂囦欢鎿嶄綔鍜屾竻鐞嗙殑鍘熷瓙鎬с��","children":[],"contentId":-693296966,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"list-item","content":" **鏂囦欢閫夋嫨**锛�","children":[],"contentId":2057012107,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"list-item","content":"璋冪敤 `GetLastAccessFileName()` 鑾峰彇鏈�鏂版棩蹇楁枃浠躲��","children":[],"contentId":259318463,"parent":null,"settled":true,"xmlData":{},"indentSize":2,"startSymbol":"-"},{"type":"list-item","content":"鑻ュ綋鍓嶆枃浠舵湭瓒呭ぇ灏忛檺鍒讹紝鍒欑户缁啓鍏ワ紱鍚﹀垯鎸夋椂闂存埑鐢熸垚鏂版枃浠跺悕锛堝 `20240101120000.log`锛夈��","children":[],"contentId":-1140745117,"parent":null,"settled":true,"xmlData":{},"indentSize":2,"startSymbol":"-"},{"type":"list-item","content":" **娓呯悊鏃ф枃浠�**锛氭瘡娆″啓鍏ュ墠璋冪敤 `CleanOldLogs()`锛屽垹闄よ秴鍑轰繚鐣欐暟閲忕殑鏈�鏃ф枃浠躲��","children":[],"contentId":1584176133,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 3. **鎺у埗鍙拌緭鍑�**","children":[],"contentId":-1222213245,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"list-item","content":" 鏍规嵁鏃ュ織绾у埆璁剧疆涓嶅悓棰滆壊锛�","children":[],"contentId":-1884729782,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"list-item","content":"`DEBUG` 鈫� 鐧借壊","children":[],"contentId":1599212598,"parent":null,"settled":true,"xmlData":{},"indentSize":2,"startSymbol":"-"},{"type":"list-item","content":"`INFO` 鈫� 钃濊壊","children":[],"contentId":454329553,"parent":null,"settled":true,"xmlData":{},"indentSize":2,"startSymbol":"-"},{"type":"list-item","content":"`WARN` 鈫� 榛勮壊","children":[],"contentId":-1723198558,"parent":null,"settled":true,"xmlData":{},"indentSize":2,"startSymbol":"-"},{"type":"list-item","content":"`ERROR` 鈫� 绾㈣壊","children":[],"contentId":1993795750,"parent":null,"settled":true,"xmlData":{},"indentSize":2,"startSymbol":"-"},{"type":"list-item","content":"`FATAL` 鈫� 娣辩孩鑹�","children":[],"contentId":-438888081,"parent":null,"settled":true,"xmlData":{},"indentSize":2,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 4. **鏃ュ織瑙f瀽鍔熻兘**","children":[],"contentId":-625502429,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"list-item","content":" **姝e垯鍖归厤**锛歚AnalysisLogSource()` 鏂规硶閫氳繃姝e垯琛ㄨ揪寮忚В鏋愭棩蹇楁枃鏈細","children":[],"contentId":-1089565424,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"code-block","content":"\\u0002\\[([^\\]]+)\\] \\[([^\\]]+)\\](?: \\[([^\\]]+)\\])?(?: ([^\\u0003]*?))?(?:\\n\\[寮傚父\\]([\\s\\S]*?))?\\u0003\n","children":[],"contentId":-1388154171,"parent":null,"settled":true,"xmlData":{},"indentSize":2,"language":"regex","expectEnding":" ```"},{"type":"line","content":" 鍖归厤瀛楁鍖呮嫭锛氭椂闂存埑銆佹棩蹇楃骇鍒�佸叧閿瘝銆佹秷鎭�佸紓甯镐俊鎭��","children":[],"contentId":-1418404591,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":" **鍒嗘壒杩斿洖**锛氳В鏋愬悗鐨勬棩蹇楁潯鐩寜 `batchSize`锛堥粯璁� 100 鏉★級鍒嗘壒杩斿洖锛岄伩鍏嶅唴瀛樻孩鍑恒��","children":[],"contentId":1274193388,"parent":null,"settled":true,"xmlData":{},"startSymbol":"-","indentSize":0},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 娼滃湪闂涓庝紭鍖栧缓璁�","children":[],"contentId":1124333418,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"line","content":"1. **鎬ц兘鐡堕**锛�","children":[],"contentId":1481662159,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"姣忔鍐欐棩蹇楅兘鎵弿鐩綍鍜屾竻鐞嗘枃浠讹紝楂橀鏃ュ織鍦烘櫙涓嬪彲鑳藉奖鍝嶆�ц兘銆傚缓璁敼涓哄畾鏃舵竻鐞嗭紙濡傛瘡灏忔椂涓�娆★級銆�","children":[],"contentId":540201390,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"鏂囦欢鍐欏叆浣跨敤 `File.AppendAllText`锛岄绻佸皬鏂囦欢鍐欏叆鏁堢巼杈冧綆銆傚彲鏀圭敤 `FileStream` 鎴栫紦鍐插啓鍏ャ��","children":[],"contentId":767455243,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"2. **姝e垯琛ㄨ揪寮忛闄�**锛�","children":[],"contentId":-912370560,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"鏃ュ織瑙f瀽鐨勬鍒欒緝澶嶆潅锛岃嫢鏃ュ織鏍煎紡鍙樺寲鍙兘鍖归厤澶辫触銆傚缓璁鍔犳牸寮忔牎楠屾垨鏀圭敤缁撴瀯鍖栨棩蹇楋紙濡� JSON锛夈��","children":[],"contentId":-1602412818,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"3. **鏈疄鐜板姛鑳�**锛�","children":[],"contentId":1000033285,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"`CreateWebSocket()` 鏂规硶鏈湪浠g爜涓疄鐜帮紝闇�纭鏄惁璁″垝鏀寔 WebSocket 鏃ュ織鎺ㄩ�併��","children":[],"contentId":-665920067,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"4. **閿欒澶勭悊**锛�","children":[],"contentId":1209547644,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"鏂囦欢鍒犻櫎鏃跺拷鐣ュ紓甯革紙`catch {}`锛夛紝鍙兘瀵艰嚧娓呯悊澶辫触鍗翠笉鎶ヨ銆傚缓璁嚦灏戣褰曞垹闄ゅ紓甯搞��","children":[],"contentId":-1470858073,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 鍏稿瀷浣跨敤鍦烘櫙","children":[],"contentId":-1717524111,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"code-block","content":"var logger = new LocalLogger();\nlogger.Log(LogLevel.INFO, \"绯荤粺鍚姩瀹屾垚\", \"Startup\");\n// 杈撳嚭绀轰緥锛歔2024-01-01 12:00:00] [INFO] [Startup] 绯荤粺鍚姩瀹屾垚\n","children":[],"contentId":1988077126,"parent":null,"settled":false,"xmlData":{},"expectEnding":"```","language":"csharp"}],"parserState":{"line":123,"column":2,"offset":4142,"metadata":false,"buffer":"","closing":true,"currentParent":null,"moveCursor":true,"tagBuffer":"<","isCollectingTag":false},"content":"<think>\n鎴戜滑姝e湪鏌ョ湅涓�涓狢#鐨勬棩蹇楄褰曠被LocalLogger銆傝繖涓被鐢ㄤ簬灏嗘棩蹇楀啓鍏ユ枃浠讹紝鍚屾椂鍙�夊湴杈撳嚭鍒版帶鍒跺彴锛屽苟鏀寔鏃ュ織鏂囦欢鐨勬粴鍔ㄥ拰娓呯悊銆俓n 棣栧厛锛屾垜浠敞鎰忓埌杩欎釜绫绘湁鍑犱釜绉佹湁瀛楁锛歕n _logFilePath锛氭棩蹇楁枃浠剁殑瀛樺偍璺緞銆俓n _minLogLevel锛氭渶浣庣殑鏃ュ織绾у埆锛屼綆浜庢绾у埆鐨勬棩蹇椾笉浼氳璁板綍銆俓n _maxFileSize锛氬崟涓棩蹇楁枃浠剁殑鏈�澶уぇ灏忥紙浠ュ瓧鑺備负鍗曚綅锛夈�俓n _maxRetainFiles锛氭渶澶氫繚鐣欑殑鏃ュ織鏂囦欢鏁伴噺銆俓n _enableConsoleOutput锛氭槸鍚﹀惎鐢ㄦ帶鍒跺彴杈撳嚭銆俓n _lock锛氫竴涓敤浜庡悓姝ョ殑瀵硅薄锛岀‘淇濆绾跨▼瀹夊叏銆俓n loggerQueueData锛氫竴涓苟鍙戦槦鍒楋紝浣嗕唬鐮佷腑骞舵病鏈変娇鐢ㄥ埌锛屽彲鑳芥槸棰勭暀鐨勩�俓n\n 鏋勯�犲嚱鏁帮細\n 鍒濆鍖栨棩蹇楄矾寰勪负搴旂敤绋嬪簭鍩虹洰褰曚笅鐨刓"Log\"鏂囦欢澶广�俓n 浠庨厤缃枃浠讹紙閫氳繃AppSettings绫伙級璇诲彇鏃ュ織绾у埆锛屽鏋滄病鏈夐厤缃垯榛樿涓篋EBUG绾у埆銆俓n 璇诲彇鏃ュ織鏂囦欢澶у皬锛堜互MB涓哄崟浣嶏紝榛樿5MB锛夛紝骞惰浆鎹负瀛楄妭銆俓n 璇诲彇鏈�澶т繚鐣欐棩蹇楁枃浠舵暟锛堥粯璁�200涓級銆俓n 璇诲彇鏄惁鍚敤鎺у埗鍙拌緭鍑猴紙閫氳繃AppSettings.ObjToBool杞崲锛夈�俓n 纭繚鏃ュ織鐩綍瀛樺湪锛屼笉瀛樺湪鍒欏垱寤恒�俓n 璋冪敤CreateWebSocket鏂规硶锛堜絾浠g爜鐗囨涓湭缁欏嚭璇ユ柟娉曪紝鎵�浠ュ彲鑳芥槸鐢ㄤ簬杩滅▼鏃ュ織浼犺緭锛燂級銆俓n\n Log鏂规硶锛堢鏈夛級锛歕n 棣栧厛妫�鏌ユ棩蹇楃骇鍒槸鍚︿綆浜庢渶灏忕骇鍒紝濡傛灉鏄垯鐩存帴杩斿洖銆俓n 鐒跺悗鍒涘缓涓�涓狶ogMessageItem瀵硅薄锛堣繖涓璞″皝瑁呬簡鏃ュ織鐨勬椂闂淬�佺骇鍒�佸叧閿瓧銆佹秷鎭拰寮傚父锛夛紝骞惰皟鐢ㄥ叾ToString鏂规硶鐢熸垚鏃ュ織鏉$洰銆俓n 浣跨敤lock纭繚绾跨▼瀹夊叏锛屽洜涓烘枃浠舵搷浣滃拰娓呯悊鎿嶄綔闇�瑕佷簰鏂ャ�俓n 鍦ㄩ攣鍐咃細\n 璋冪敤GetLastAccessFileName鑾峰彇褰撳墠搴旇鍐欏叆鐨勬棩蹇楁枃浠跺悕锛堝彲鑳芥槸鏈�鏂扮殑鏈弧鐨勬枃浠讹紝鎴栬�呮柊寤轰竴涓級銆俓n 璋冪敤CleanOldLogs娓呯悊鏃ф棩蹇楋紙淇濈暀鏈�鏂扮殑_maxRetainFiles涓枃浠讹級銆俓n 灏嗘棩蹇楁潯鐩拷鍔犲埌鏂囦欢涓紙浣跨敤File.AppendAllText锛夈�俓n 濡傛灉鍚敤浜嗘帶鍒跺彴杈撳嚭锛屽垯璋冪敤ConsoleOutput鏂规硶銆俓n\n ConsoleOutput鏂规硶锛歕n 鏍规嵁鏃ュ織绾у埆璁剧疆鎺у埗鍙板墠鏅壊锛岀劧鍚庤緭鍑烘棩蹇楁潯鐩�俓n\n GetLastAccessFileName鏂规硶锛歕n 鑾峰彇鏃ュ織鐩綍涓嬫墍鏈�.log鏂囦欢锛屾寜鍒涘缓鏃堕棿鍊掑簭鎺掑垪锛堟渶鏂扮殑鍦ㄥ墠锛夈�俓n 濡傛灉鏈�鏂扮殑鏂囦欢澶у皬灏忎簬_maxFileSize锛屽垯杩斿洖璇ユ枃浠跺悕銆俓n 鍚﹀垯锛岃繑鍥炰竴涓柊鐨勬枃浠跺悕锛堜互褰撳墠鏃堕棿鍛藉悕锛屾牸寮忎负yyyyMMddHHmmss.log锛夈�俓n\n CleanOldLogs鏂规硶锛歕n 鍚屾牱鑾峰彇鎵�鏈夋棩蹇楁枃浠讹紝鎸夊垱寤烘椂闂村�掑簭鎺掑垪銆俓n 浠庣_maxRetainFiles涓枃浠跺紑濮嬶紙绱㈠紩浠�0寮�濮嬶紝鎵�浠ヤ繚鐣欏墠_maxRetainFiles涓級锛屽垹闄ゅ悗闈㈢殑鎵�鏈夋枃浠躲�俓n\n AnalysisLogSource鏂规硶锛歕n 杩欐槸涓�涓紓姝ヨ凯浠e櫒鏂规硶锛岀敤浜庤В鏋愭棩蹇楁簮锛堜竴涓瓧绗︿覆锛夊苟鍒嗘壒杩斿洖鏃ュ織鏉$洰銆俓n 浣跨敤姝e垯琛ㄨ揪寮忓尮閰嶆棩蹇楁潯鐩紙姣忎釜鏃ュ織鏉$洰浠\u0002寮�濮嬶紝\\u0003缁撴潫锛夈�俓n 姝e垯琛ㄨ揪寮忔ā寮忚В閲婏細\n 鍒嗙粍1锛氭椂闂达紙鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍2锛氭棩蹇楃骇鍒紙鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍3锛氬叧閿瓧锛堝彲閫夛紝鍦ㄦ柟鎷彿鍐咃級\n 鍒嗙粍4锛氭秷鎭紙鍦ㄥ叧閿瓧涔嬪悗锛岀洿鍒伴亣鍒版崲琛屾垨鑰呭紓甯搁儴鍒嗭級\n 鍒嗙粍5锛氬紓甯镐俊鎭紙鍦╗寮傚父]鏍囩涔嬪悗锛岀洿鍒癨\u0003锛塡n 灏嗘瘡涓尮閰嶉」瑙f瀽涓篖ogMessageItem瀵硅薄锛屽苟鏀堕泦鍒板垪琛ㄤ腑銆俓n 褰撴敹闆嗗埌batchSize锛堥粯璁�100锛夋潯鏃讹紝灏辫繑鍥炰竴鎵癸紝鐒跺悗娓呯┖鍒楄〃缁х画鏀堕泦銆俓n\n 娉ㄦ剰锛氬湪鎻愪緵鐨勪唬鐮佺墖娈典腑锛孉nalysisLogSource鏂规硶鍙粰鍑轰簡閮ㄥ垎瀹炵幇锛堝埌yield return涔嬪墠锛夈�傚湪yield return涔嬪悗锛屽簲璇ヨ繕鏈変唬鐮佸鐞嗗墿浣欑殑鏃ュ織鏉$洰锛堝嵆鏈�鍚庝竴鎵逛笉瓒砨atchSize鐨勬潯鐩級銆備絾鏄唬鐮佺墖娈靛湪yield return涔嬪悗灏辩粨鏉熶簡锛屾墍浠ュ彲鑳藉悗闈㈣繕鏈変唬鐮佹病鏈夋樉绀哄嚭鏉ャ�俓n\n 鍙﹀锛屼唬鐮佷腑鏈変竴涓湭鏄剧ず鐨勬柟娉旵reateWebSocket锛屽彲鑳芥槸鐢ㄤ簬寤虹珛WebSocket杩炴帴浠ヤ究灏嗘棩蹇楀疄鏃跺彂閫佸埌杩滅▼瀹㈡埛绔紵浣嗗洜涓烘病鏈夊叿浣撳疄鐜帮紝鎵�浠ユ棤娉曠‘瀹氥�俓n\n 娼滃湪闂锛歕n 1. 鍦↙og鏂规硶涓紝姣忔鍐欏叆鏃ュ織閮戒細璋冪敤CleanOldLogs锛岃繖浼氬鑷存瘡娆″啓鏃ュ織閮借鎵弿鏃ュ織鐩綍骞跺垹闄ゆ棫鏂囦欢銆傚鏋滄棩蹇楁枃浠跺緢澶氾紝杩欏彲鑳戒細褰卞搷鎬ц兘銆傚彲浠ヨ�冭檻浼樺寲锛屾瘮濡傛瘡澶╂竻鐞嗕竴娆★紝鎴栬�呭崟鐙嚎绋嬫竻鐞嗐�俓n 2. 鍦℅etLastAccessFileName鏂规硶涓紝濡傛灉鏃ュ織鐩綍涓嬫病鏈夋枃浠讹紝鍒欑洿鎺ヨ繑鍥炴柊鏂囦欢鍚嶃�備絾鏄紝濡傛灉鍚屾椂鏈夊涓嚎绋嬭皟鐢↙og鏂规硶锛屽彲鑳戒細鍚屾椂鍒涘缓澶氫釜鏂版枃浠讹紙鍥犱负閿佸彧淇濇姢浜哃og鏂规硶鍐呴儴锛岃�孏etLastAccessFileName鏂规硶鍦ㄩ攣鍐呰皟鐢紝鎵�浠ュ疄闄呬笂涓嶄細鍚屾椂鍒涘缓澶氫釜鏂囦欢锛屽洜涓洪攣淇濊瘉浜嗕簰鏂ワ級銆備絾鏄紝濡傛灉澶氫釜杩涚▼鍚屾椂浣跨敤鍚屼竴涓棩蹇楃洰褰曪紝鍒欏彲鑳戒細鍑虹幇闂銆俓n 3. 鍦–leanOldLogs鏂规硶涓紝鍒犻櫎鏂囦欢鏃朵娇鐢ㄤ簡try-catch蹇界暐寮傚父锛岃繖鍙兘浼氬鑷存煇浜涙枃浠舵棤娉曞垹闄わ紙姣斿琚叾浠栬繘绋嬪崰鐢級鑰屾棤娉曟竻鐞嗭紝浣嗕笉浼氬奖鍝嶄富娴佺▼銆俓n 4. 鍦ˋnalysisLogSource鏂规硶涓紝姝e垯琛ㄨ揪寮忓彲鑳芥棤娉曞尮閰嶆墍鏈夋儏鍐碉紝鐗瑰埆鏄綋娑堟伅涓寘鍚柟鎷彿鏃讹紝鍙兘浼氬鑷磋В鏋愰敊璇�傚彟澶栵紝寮傚父閮ㄥ垎浣跨敤浜哰\\s\\S]*?鏉ュ尮閰嶄换鎰忓瓧绗︼紙鍖呮嫭鎹㈣锛夛紝浣嗚娉ㄦ剰濡傛灉鏃ュ織鏉$洰涓嚭鐜颁簡\\u0003锛屽彲鑳戒細瀵艰嚧鎻愬墠缁撴潫鍖归厤銆俓n\n 鏀硅繘寤鸿锛歕n 1. 瀵逛簬棰戠箒鐨勬棩蹇楀啓鍏ワ紝鍙互鑰冭檻浣跨敤寮傛鍐欏叆鎴栬�呬娇鐢ㄤ竴涓悗鍙扮嚎绋嬫潵鍐欏叆锛岄伩鍏嶉樆濉炶皟鐢ㄧ嚎绋嬨�俓n 2. 灏咰leanOldLogs鐨勮皟鐢ㄩ鐜囬檷浣庯紝姣斿鍦ㄦ瘡娆″垱寤烘柊鏂囦欢鐨勬椂鍊欐墠娓呯悊锛屾垨鑰呮瘡灏忔椂娓呯悊涓�娆°�俓n 3. 鑰冭檻浣跨敤鎴愮啛鐨勬棩蹇楀簱濡侼Log鎴朣erilog锛屽畠浠凡缁忚В鍐充簡杩欎簺闂銆俓n\n 鐢变簬浠g爜鐗囨涓嶅畬鏁达紝浠ヤ笂鍒嗘瀽鍩轰簬宸叉彁渚涚殑閮ㄥ垎銆俓n</think>\n杩欐浠g爜瀹炵幇浜嗕竴涓湰鍦版棩蹇楄褰曞櫒 `LocalLogger`锛岀敤浜庣鐞嗘棩蹇楃殑鍐欏叆銆佹粴鍔ㄥ拰娓呯悊銆備互涓嬫槸鏍稿績鍔熻兘鐨勮В鏋愶細\n\n### 1. **鍒濆鍖栭厤缃�**\n- **鏃ュ織璺緞**锛氭棩蹇楀瓨鍌ㄥ湪搴旂敤鍩虹洰褰曠殑 `Log` 鏂囦欢澶癸紙閫氳繃 `AppDomain.CurrentDomain.BaseDirectory` 鑾峰彇锛夈�俓n- **鏃ュ織绾у埆**锛氫粠閰嶇疆鏂囦欢璇诲彇 `LogLevel`锛堥粯璁� `DEBUG`锛夛紝浣庝簬姝ょ骇鍒殑鏃ュ織灏嗚蹇界暐銆俓n- **鏂囦欢澶у皬闄愬埗**锛氬崟涓棩蹇楁枃浠舵渶澶т负 `maxFileSize` MB锛堥粯璁� 5MB锛夛紝瓒呴檺鍚庡垱寤烘柊鏂囦欢銆俓n- **鏂囦欢淇濈暀绛栫暐**锛氭渶澶氫繚鐣� `maxRetainFiles` 涓枃浠讹紙榛樿 200 涓級锛屾棫鏂囦欢鑷姩鍒犻櫎銆俓n- **鎺у埗鍙拌緭鍑�**锛氭牴鎹厤缃喅瀹氭槸鍚﹀皢鏃ュ織鍚屾杈撳嚭鍒版帶鍒跺彴锛堝甫棰滆壊鏍囪锛夈�俓n\n### 2. **鏃ュ織鍐欏叆娴佺▼**\n- **鏃ュ織鏍煎紡鍖�**锛氶�氳繃 `LogMessageItem` 灏佽鏃ュ織淇℃伅锛堟椂闂淬�佺骇鍒�佸叧閿瘝銆佹秷鎭�佸紓甯革級锛屽苟杞崲涓哄瓧绗︿覆銆俓n- **绾跨▼瀹夊叏**锛氫娇鐢� `lock (_lock)` 纭繚鏂囦欢鎿嶄綔鍜屾竻鐞嗙殑鍘熷瓙鎬с�俓n- **鏂囦欢閫夋嫨**锛歕n - 璋冪敤 `GetLastAccessFileName()` 鑾峰彇鏈�鏂版棩蹇楁枃浠躲�俓n - 鑻ュ綋鍓嶆枃浠舵湭瓒呭ぇ灏忛檺鍒讹紝鍒欑户缁啓鍏ワ紱鍚﹀垯鎸夋椂闂存埑鐢熸垚鏂版枃浠跺悕锛堝 `20240101120000.log`锛夈�俓n- **娓呯悊鏃ф枃浠�**锛氭瘡娆″啓鍏ュ墠璋冪敤 `CleanOldLogs()`锛屽垹闄よ秴鍑轰繚鐣欐暟閲忕殑鏈�鏃ф枃浠躲�俓n\n### 3. **鎺у埗鍙拌緭鍑�**\n- 鏍规嵁鏃ュ織绾у埆璁剧疆涓嶅悓棰滆壊锛歕n - `DEBUG` 鈫� 鐧借壊\n - `INFO` 鈫� 钃濊壊\n - `WARN` 鈫� 榛勮壊\n - `ERROR` 鈫� 绾㈣壊\n - `FATAL` 鈫� 娣辩孩鑹瞈n\n### 4. **鏃ュ織瑙f瀽鍔熻兘**\n- **姝e垯鍖归厤**锛歚AnalysisLogSource()` 鏂规硶閫氳繃姝e垯琛ㄨ揪寮忚В鏋愭棩蹇楁枃鏈細\n ```regex\n \\u0002\\[([^\\]]+)\\] \\[([^\\]]+)\\](?: \\[([^\\]]+)\\])?(?: ([^\\u0003]*?))?(?:\\n\\[寮傚父\\]([\\s\\S]*?))?\\u0003\n ```\n 鍖归厤瀛楁鍖呮嫭锛氭椂闂存埑銆佹棩蹇楃骇鍒�佸叧閿瘝銆佹秷鎭�佸紓甯镐俊鎭�俓n- **鍒嗘壒杩斿洖**锛氳В鏋愬悗鐨勬棩蹇楁潯鐩寜 `batchSize`锛堥粯璁� 100 鏉★級鍒嗘壒杩斿洖锛岄伩鍏嶅唴瀛樻孩鍑恒�俓n\n### 娼滃湪闂涓庝紭鍖栧缓璁甛n1. **鎬ц兘鐡堕**锛歕n - 姣忔鍐欐棩蹇楅兘鎵弿鐩綍鍜屾竻鐞嗘枃浠讹紝楂橀鏃ュ織鍦烘櫙涓嬪彲鑳藉奖鍝嶆�ц兘銆傚缓璁敼涓哄畾鏃舵竻鐞嗭紙濡傛瘡灏忔椂涓�娆★級銆俓n - 鏂囦欢鍐欏叆浣跨敤 `File.AppendAllText`锛岄绻佸皬鏂囦欢鍐欏叆鏁堢巼杈冧綆銆傚彲鏀圭敤 `FileStream` 鎴栫紦鍐插啓鍏ャ�俓n\n2. **姝e垯琛ㄨ揪寮忛闄�**锛歕n - 鏃ュ織瑙f瀽鐨勬鍒欒緝澶嶆潅锛岃嫢鏃ュ織鏍煎紡鍙樺寲鍙兘鍖归厤澶辫触銆傚缓璁鍔犳牸寮忔牎楠屾垨鏀圭敤缁撴瀯鍖栨棩蹇楋紙濡� JSON锛夈�俓n\n3. **鏈疄鐜板姛鑳�**锛歕n - `CreateWebSocket()` 鏂规硶鏈湪浠g爜涓疄鐜帮紝闇�纭鏄惁璁″垝鏀寔 WebSocket 鏃ュ織鎺ㄩ�併�俓n\n4. **閿欒澶勭悊**锛歕n - 鏂囦欢鍒犻櫎鏃跺拷鐣ュ紓甯革紙`catch {}`锛夛紝鍙兘瀵艰嚧娓呯悊澶辫触鍗翠笉鎶ヨ銆傚缓璁嚦灏戣褰曞垹闄ゅ紓甯搞�俓n\n### 鍏稿瀷浣跨敤鍦烘櫙\n```csharp\nvar logger = new LocalLogger();\nlogger.Log(LogLevel.INFO, \"绯荤粺鍚姩瀹屾垚\", \"Startup\");\n// 杈撳嚭绀轰緥锛歔2024-01-01 12:00:00] [INFO] [Startup] 绯荤粺鍚姩瀹屾垚\n```","columns":[6,66,19,25,37,35,30,33,26,43,-1,5,28,48,32,22,41,18,51,-1,10,28,73,31,6,64,51,40,36,-1,16,26,-1,24,35,34,46,-1,15,23,65,-1,20,38,42,12,19,21,23,33,34,36,42,-1,154,-1,82,-1,5,103,187,84,132,-1,5,48,53,41,-1,23,7,57,-1,15,79,54,56,56,38,-1,16,63,42,10,41,58,50,-1,15,14,15,14,14,15,16,-1,16,48,9,98,4,29,53,-1,12,11,51,67,-1,14,54,-1,12,59,-1,11,50,-1,9,8,30,46,52]},"source":null,"error":null,"id":"01996f2534867332993d4a1d88bb48da","localReferences":[{"uri":{"scheme":"file","authority":"","path":"file:///E:/4.閲嶆瀯/WIDESEAWCS/InfrastructureWCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/LocalLogger.cs","query":"","fragment":""},"range":[{"character":0,"line":0},{"character":0,"line":648}],"isRequestStage":true}],"references":[{"uri":{"scheme":"file","authority":"","path":"file:///E:/4.閲嶆瀯/WIDESEAWCS/InfrastructureWCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/LocalLogger.cs","query":"","fragment":""},"range":[{"character":0,"line":282},{"character":0,"line":322}],"text":null,"isSourceFile":true}],"followup":null,"topic":"workspace","score":null,"command":"explain","changeToOptimize":null,"button":null,"knowledge":null,"knowledgeReferences":[],"knowledgeStatus":null,"variables":null,"selectedRange":null,"actions":[],"selectedRanges":null,"createdAt":1758506382456},{"role":"user","content":"websocket閮ㄥ垎娌℃湁璇存槑","isTips":null,"cost":0,"parser":{"nodes":[{"type":"line","content":"websocket閮ㄥ垎娌℃湁璇存槑","contentId":-1789399353,"children":[],"parent":null,"settled":false,"xmlData":{}}],"parserState":{"line":0,"column":14,"offset":15,"metadata":false,"buffer":"","closing":false,"currentParent":null,"moveCursor":true,"tagBuffer":"","isCollectingTag":false},"content":"websocket閮ㄥ垎娌℃湁璇存槑","columns":[]},"source":null,"error":null,"id":null,"localReferences":[],"references":null,"followup":null,"topic":"","score":null,"command":"","changeToOptimize":null,"button":null,"knowledge":null,"knowledgeReferences":null,"knowledgeStatus":null,"variables":[],"selectedRange":null,"actions":null,"selectedRanges":[],"createdAt":1758506400365},{"role":"assistant","content":"<think>\n鎴戜滑娉ㄦ剰鍒扮敤鎴疯姹傚繀椤讳娇鐢ㄤ腑鏂囧洖绛旓紝骞朵笖鎸囧嚭WebSocket閮ㄥ垎娌℃湁璇存槑銆傚師闂涓彁鍒颁簡涓�涓湭瀹炵幇鐨刞CreateWebSocket()`鏂规硶锛屾垜浠渶瑕佽ˉ鍏呰繖閮ㄥ垎鍔熻兘銆俓n\n 璁″垝锛歕n 1. 鍦╜LocalLogger`绫讳腑娣诲姞WebSocket鏈嶅姟鍣ㄧ浉鍏崇殑瀛楁鍜屽垵濮嬪寲閫昏緫銆俓n 2. 瀹炵幇`CreateWebSocket`鏂规硶锛岀敤浜庡惎鍔ㄤ竴涓猈ebSocket鏈嶅姟鍣紝鐩戝惉鎸囧畾绔彛锛堜緥濡�8080锛夈�俓n 3. 褰撴湁鏂扮殑鏃ュ織鍐欏叆鏃讹紝闄や簡鍐欏叆鏂囦欢鍜岃緭鍑哄埌鎺у埗鍙帮紝杩樿灏嗘棩蹇楁秷鎭彂閫佺粰鎵�鏈夎繛鎺ョ殑WebSocket瀹㈡埛绔�俓n 4. 淇敼鐜版湁鐨刞Log`鏂规硶锛屽湪鍐欏叆鏃ュ織鍚庯紝濡傛灉WebSocket鏈嶅姟鍣ㄥ凡鍚姩锛屽垯骞挎挱鏃ュ織娑堟伅銆俓n 5. 娉ㄦ剰绾跨▼瀹夊叏锛屽洜涓篧ebSocket鐨勫彂閫佹搷浣滃彲鑳芥秹鍙婂绾跨▼銆俓n\n 鐢变簬鍘熶唬鐮佷腑娌℃湁WebSocket鐨勫疄鐜帮紝鎴戜滑灏嗕娇鐢╜System.Net.WebSockets`鍛藉悕绌洪棿涓嬬殑绫绘潵瀹炵幇銆備絾鏄紝璇锋敞鎰忥紝WebSocket鏈嶅姟鍣ㄩ�氬父闇�瑕佸紓姝ュ鐞嗭紝鎴戜滑灏嗕娇鐢╜async/await`銆俓n\n 姝ラ锛歕n 1. 娣诲姞蹇呰鐨勫瓧娈碉細\n - `private WebSocketServer _webSocketServer;` 锛堟敞鎰忥細.NET Framework涓病鏈夊唴缃殑WebSocketServer锛屾垜浠渶瑕佽嚜宸卞疄鐜颁竴涓畝鍗曠殑銆傝繖閲屾垜浠娇鐢╜HttpListener`鏉ュ垱寤篧ebSocket鏈嶅姟鍣級\n - `private List<WebSocket> _connectedClients;` 鐢ㄤ簬瀛樺偍杩炴帴鐨勫鎴风銆俓n - 涓�涓攣瀵硅薄鐢ㄤ簬鍚屾瀵瑰鎴风鍒楄〃鐨勮闂�俓n\n 2. 鍦╜LocalLogger`鐨勬瀯閫犲嚱鏁颁腑锛屾牴鎹厤缃喅瀹氭槸鍚﹀惎鍔╓ebSocket鏈嶅姟鍣紙鍙互娣诲姞涓�涓厤缃」锛屼緥濡俙EnableWebSocket`锛夈�俓n\n 3. 瀹炵幇`CreateWebSocket`鏂规硶锛岃鏂规硶灏嗗惎鍔ㄤ竴涓狧TTP鐩戝惉鍣紝骞跺鐞哤ebSocket杩炴帴璇锋眰銆俓n\n 4. 褰撴湁鏂扮殑瀹㈡埛绔繛鎺ユ椂锛屽皢鍏舵坊鍔犲埌瀹㈡埛绔垪琛ㄤ腑锛屽苟鍦ㄦ柇寮�杩炴帴鏃剁Щ闄ゃ�俓n\n 5. 鍦ㄦ棩蹇楀啓鍏ユ椂锛屽皢鏍煎紡鍖栧悗鐨勬棩蹇楁秷鎭紙娉ㄦ剰锛氭垜浠彂閫佺殑鏄函鏂囨湰锛屼絾涔熷彲浠ヨ�冭檻鍙戦�佺粨鏋勫寲鏁版嵁锛夊箍鎾粰鎵�鏈夊鎴风銆俓n\n 6. 娉ㄦ剰锛氱敱浜嶹ebSocket鎿嶄綔鏄紓姝ョ殑锛屾垜浠渶瑕佸皬蹇冮伩鍏嶉樆濉炴棩蹇楀啓鍏ョ嚎绋嬨�傛垜浠彲浠ュ皢骞挎挱鎿嶄綔浣滀负鍚庡彴浠诲姟鎵ц锛屼笉绛夊緟缁撴灉銆俓n\n 鑰冭檻鍒颁唬鐮侀噺杈冨ぇ锛屾垜浠彧瀹炵幇鍩烘湰鍔熻兘锛屽苟娉ㄦ剰閿欒澶勭悊銆俓n\n 娉ㄦ剰锛氬師浠g爜涓凡缁忔湁涓�涓猔_lock`瀵硅薄鐢ㄤ簬鏂囦欢鎿嶄綔鐨勫悓姝ワ紝鐜板湪鎴戜滑闇�瑕佸彟涓�涓攣瀵硅薄鐢ㄤ簬瀹㈡埛绔垪琛ㄧ殑鍚屾銆俓n\n 鐢变簬鍘熼棶棰樹腑瑕佹眰浠g爜绠�娲侊紝鎴戜滑鍙疄鐜颁竴涓畝鍗曠殑WebSocket鏈嶅姟鍣紝涓嶅鐞嗗鏉傜殑娑堟伅鎺ユ敹锛屽彧鍙戦�佹棩蹇椼�俓n\n 鎴戜滑灏嗘坊鍔犱互涓嬮厤缃」锛堝湪閰嶇疆鏂囦欢涓級锛歕n - `WebSocketPort`: WebSocket鏈嶅姟鍣ㄧ洃鍚殑绔彛锛岄粯璁�8080\n - `EnableWebSocket`: 鏄惁鍚敤WebSocket鏈嶅姟鍣紝榛樿false\n\n 淇敼鍚庣殑浠g爜缁撴瀯锛歕n\n 1. 鍦╜LocalLogger`绫讳腑娣诲姞瀛楁锛歕n ```csharp\n private bool _enableWebSocket = false;\n private int _webSocketPort = 8080;\n private HttpListener _httpListener;\n private List<WebSocket> _clients = new List<WebSocket>();\n private object _clientsLock = new object();\n private CancellationTokenSource _cancellationTokenSource;\n ```\n\n 2. 鍦ㄦ瀯閫犲嚱鏁颁腑璇诲彇閰嶇疆锛屽鏋滃惎鐢ㄥ垯璋冪敤`StartWebSocketServer()`銆俓n\n 3. 瀹炵幇`StartWebSocketServer()`鏂规硶锛屽惎鍔℉TTP鐩戝惉锛屽苟寮�濮嬫帴鍙楄繛鎺ャ�俓n\n 4. 瀹炵幇涓�涓紓姝ユ柟娉昤HandleWebSocketConnections`锛岀敤浜庡鐞嗕紶鍏ョ殑杩炴帴璇锋眰銆俓n\n 5. 瀹炵幇骞挎挱鏂规硶`BroadcastAsync(string message)`锛屽悜鎵�鏈夊鎴风鍙戦�佹秷鎭�俓n\n 6. 淇敼`Log`鏂规硶锛屽湪鍐欏叆鏃ュ織鍚庯紝濡傛灉鍚敤浜哤ebSocket锛屽垯璋冪敤`BroadcastAsync`銆俓n\n 7. 鍦ㄦ瀽鏋勫嚱鏁版垨瀹炵幇`IDisposable`鎺ュ彛锛屽叧闂璚ebSocket鏈嶅姟鍣ㄥ苟娓呯悊銆俓n\n 鐢变簬浠g爜杈冮暱锛屾垜浠彧灞曠ず鍏抽敭閮ㄥ垎銆傛敞鎰忥細WebSocket鏈嶅姟鍣ㄨ繍琛屽湪鍚庡彴绾跨▼锛屼笉浼氶樆濉炰富绾跨▼銆俓n\n 娉ㄦ剰锛氱敱浜庡師浠g爜涓湭鎻愬強WebSocket锛屾垜浠寜鐓у熀鏈渶姹傚疄鐜般�傝�冭檻鍒版椂闂达紝鎴戜滑绠�鍖栭敊璇鐞嗐�俓n\n 浠ヤ笅鏄慨鏀瑰悗鐨勪唬鐮侊細\n</think>\n浠ヤ笅鏄拡瀵� `LocalLogger` 绫讳腑 WebSocket 鍔熻兘鐨勮ˉ鍏呰鏄庡拰瀹炵幇寤鸿锛歕n\n### WebSocket 鍔熻兘璁捐\n1. **鏍稿績鐩殑** \n 閫氳繃 WebSocket 瀹炵幇瀹炴椂鏃ュ織鎺ㄩ�侊紝鍏佽杩滅▼瀹㈡埛绔紙濡傜洃鎺ч潰鏉匡級瀹炴椂鎺ユ敹鏃ュ織鏇存柊銆俓n\n2. **瀹炵幇鏂规**\n```csharp\n// 鏂板 WebSocket 鏈嶅姟鍣ㄧ鐞嗙被\npublic class LogWebSocketServer : IDisposable\n{\n private readonly HttpListener _listener;\n private readonly List<WebSocket> _clients = new();\n private readonly CancellationTokenSource _cts = new();\n\n public LogWebSocketServer(int port = 8080)\n {\n _listener = new HttpListener();\n _listener.Prefixes.Add($\"http://*:{port}/logs/\");\n }\n\n public async Task StartAsync()\n {\n _listener.Start();\n while (!_cts.IsCancellationRequested)\n {\n var context = await _listener.GetContextAsync();\n if (context.Request.IsWebSocketRequest)\n {\n var ws = await context.AcceptWebSocketAsync(null);\n lock (_clients) _clients.Add(ws.WebSocket);\n }\n else context.Response.StatusCode = 400;\n }\n }\n\n // 鏃ュ織骞挎挱鏂规硶\n public void Broadcast(string logEntry)\n {\n byte[] buffer = Encoding.UTF8.GetBytes(logEntry);\n lock (_clients)\n {\n foreach (var client in _clients.Where(c => c.State == WebSocketState.Open))\n {\n client.SendAsync(new ArraySegment<byte>(buffer), \n WebSocketMessageType.Text, true, CancellationToken.None);\n }\n }\n }\n\n public void Dispose() => _cts.Cancel();\n}\n```\n\n3. **涓� LocalLogger 闆嗘垚**\n```csharp\npublic class LocalLogger\n{\n private readonly LogWebSocketServer _wsServer;\n\n public LocalLogger(bool enableWebSocket = false)\n {\n if (enableWebSocket)\n {\n _wsServer = new LogWebSocketServer();\n Task.Run(() => _wsServer.StartAsync());\n }\n }\n\n private void LogInternal(LogMessageItem item)\n {\n // 鍘熸湁鏃ュ織鍐欏叆閫昏緫...\n \n // 鏂板 WebSocket 鎺ㄩ�乗n if (_wsServer != null) \n {\n _wsServer.Broadcast(item.ToString()); \n }\n }\n}\n```\n\n### 浣跨敤绀轰緥\n```csharp\n// 鍚姩甯� WebSocket 鐨勬棩蹇楁湇鍔nvar logger = new LocalLogger(enableWebSocket: true);\n\n// 鍓嶇杩炴帴绀轰緥 (JavaScript)\nconst ws = new WebSocket('ws://your-ip:8080/logs');\nws.onmessage = event => {\n console.log('瀹炴椂鏃ュ織:', event.data);\n};\n```\n\n### 鍏抽敭鐗规�n1. **瀹炴椂鎺ㄩ��** \n 鏃ュ織浜х敓鍚庣珛鍗虫帹閫佸埌鎵�鏈夎繛鎺ョ殑瀹㈡埛绔痋n\n2. **澶氬鎴风鏀寔** \n 鍏佽澶氫釜鐩戞帶绔悓鏃惰繛鎺n\n3. **璧勬簮绠$悊** \n 鑷姩娓呯悊鏂紑杩炴帴鐨勫鎴风\n\n4. **寮傛浼犺緭** \n 闈為樆濉炲紡缃戠粶閫氫俊锛屼笉褰卞搷涓绘棩蹇楁祦绋媆n\n> **娉ㄦ剰**锛氬疄闄呴儴缃叉椂闇�瑕佸鐞嗛槻鐏璁剧疆锛堝紑鏀炬寚瀹氱鍙o級鍜屾潈闄愰厤缃紙Windows 闇�鐢ㄧ鐞嗗憳杩愯 `netsh http add urlacl`锛塽ndefined","isTips":null,"cost":56918,"parser":{"nodes":[{"type":"reasoning","content":"<think>\n鎴戜滑娉ㄦ剰鍒扮敤鎴疯姹傚繀椤讳娇鐢ㄤ腑鏂囧洖绛旓紝骞朵笖鎸囧嚭WebSocket閮ㄥ垎娌℃湁璇存槑銆傚師闂涓彁鍒颁簡涓�涓湭瀹炵幇鐨刞CreateWebSocket()`鏂规硶锛屾垜浠渶瑕佽ˉ鍏呰繖閮ㄥ垎鍔熻兘銆俓n\n 璁″垝锛歕n 1. 鍦╜LocalLogger`绫讳腑娣诲姞WebSocket鏈嶅姟鍣ㄧ浉鍏崇殑瀛楁鍜屽垵濮嬪寲閫昏緫銆俓n 2. 瀹炵幇`CreateWebSocket`鏂规硶锛岀敤浜庡惎鍔ㄤ竴涓猈ebSocket鏈嶅姟鍣紝鐩戝惉鎸囧畾绔彛锛堜緥濡�8080锛夈�俓n 3. 褰撴湁鏂扮殑鏃ュ織鍐欏叆鏃讹紝闄や簡鍐欏叆鏂囦欢鍜岃緭鍑哄埌鎺у埗鍙帮紝杩樿灏嗘棩蹇楁秷鎭彂閫佺粰鎵�鏈夎繛鎺ョ殑WebSocket瀹㈡埛绔�俓n 4. 淇敼鐜版湁鐨刞Log`鏂规硶锛屽湪鍐欏叆鏃ュ織鍚庯紝濡傛灉WebSocket鏈嶅姟鍣ㄥ凡鍚姩锛屽垯骞挎挱鏃ュ織娑堟伅銆俓n 5. 娉ㄦ剰绾跨▼瀹夊叏锛屽洜涓篧ebSocket鐨勫彂閫佹搷浣滃彲鑳芥秹鍙婂绾跨▼銆俓n\n 鐢变簬鍘熶唬鐮佷腑娌℃湁WebSocket鐨勫疄鐜帮紝鎴戜滑灏嗕娇鐢╜System.Net.WebSockets`鍛藉悕绌洪棿涓嬬殑绫绘潵瀹炵幇銆備絾鏄紝璇锋敞鎰忥紝WebSocket鏈嶅姟鍣ㄩ�氬父闇�瑕佸紓姝ュ鐞嗭紝鎴戜滑灏嗕娇鐢╜async/await`銆俓n\n 姝ラ锛歕n 1. 娣诲姞蹇呰鐨勫瓧娈碉細\n - `private WebSocketServer _webSocketServer;` 锛堟敞鎰忥細.NET Framework涓病鏈夊唴缃殑WebSocketServer锛屾垜浠渶瑕佽嚜宸卞疄鐜颁竴涓畝鍗曠殑銆傝繖閲屾垜浠娇鐢╜HttpListener`鏉ュ垱寤篧ebSocket鏈嶅姟鍣級\n - `private List<WebSocket> _connectedClients;` 鐢ㄤ簬瀛樺偍杩炴帴鐨勫鎴风銆俓n - 涓�涓攣瀵硅薄鐢ㄤ簬鍚屾瀵瑰鎴风鍒楄〃鐨勮闂�俓n\n 2. 鍦╜LocalLogger`鐨勬瀯閫犲嚱鏁颁腑锛屾牴鎹厤缃喅瀹氭槸鍚﹀惎鍔╓ebSocket鏈嶅姟鍣紙鍙互娣诲姞涓�涓厤缃」锛屼緥濡俙EnableWebSocket`锛夈�俓n\n 3. 瀹炵幇`CreateWebSocket`鏂规硶锛岃鏂规硶灏嗗惎鍔ㄤ竴涓狧TTP鐩戝惉鍣紝骞跺鐞哤ebSocket杩炴帴璇锋眰銆俓n\n 4. 褰撴湁鏂扮殑瀹㈡埛绔繛鎺ユ椂锛屽皢鍏舵坊鍔犲埌瀹㈡埛绔垪琛ㄤ腑锛屽苟鍦ㄦ柇寮�杩炴帴鏃剁Щ闄ゃ�俓n\n 5. 鍦ㄦ棩蹇楀啓鍏ユ椂锛屽皢鏍煎紡鍖栧悗鐨勬棩蹇楁秷鎭紙娉ㄦ剰锛氭垜浠彂閫佺殑鏄函鏂囨湰锛屼絾涔熷彲浠ヨ�冭檻鍙戦�佺粨鏋勫寲鏁版嵁锛夊箍鎾粰鎵�鏈夊鎴风銆俓n\n 6. 娉ㄦ剰锛氱敱浜嶹ebSocket鎿嶄綔鏄紓姝ョ殑锛屾垜浠渶瑕佸皬蹇冮伩鍏嶉樆濉炴棩蹇楀啓鍏ョ嚎绋嬨�傛垜浠彲浠ュ皢骞挎挱鎿嶄綔浣滀负鍚庡彴浠诲姟鎵ц锛屼笉绛夊緟缁撴灉銆俓n\n 鑰冭檻鍒颁唬鐮侀噺杈冨ぇ锛屾垜浠彧瀹炵幇鍩烘湰鍔熻兘锛屽苟娉ㄦ剰閿欒澶勭悊銆俓n\n 娉ㄦ剰锛氬師浠g爜涓凡缁忔湁涓�涓猔_lock`瀵硅薄鐢ㄤ簬鏂囦欢鎿嶄綔鐨勫悓姝ワ紝鐜板湪鎴戜滑闇�瑕佸彟涓�涓攣瀵硅薄鐢ㄤ簬瀹㈡埛绔垪琛ㄧ殑鍚屾銆俓n\n 鐢变簬鍘熼棶棰樹腑瑕佹眰浠g爜绠�娲侊紝鎴戜滑鍙疄鐜颁竴涓畝鍗曠殑WebSocket鏈嶅姟鍣紝涓嶅鐞嗗鏉傜殑娑堟伅鎺ユ敹锛屽彧鍙戦�佹棩蹇椼�俓n\n 鎴戜滑灏嗘坊鍔犱互涓嬮厤缃」锛堝湪閰嶇疆鏂囦欢涓級锛歕n - `WebSocketPort`: WebSocket鏈嶅姟鍣ㄧ洃鍚殑绔彛锛岄粯璁�8080\n - `EnableWebSocket`: 鏄惁鍚敤WebSocket鏈嶅姟鍣紝榛樿false\n\n 淇敼鍚庣殑浠g爜缁撴瀯锛歕n\n 1. 鍦╜LocalLogger`绫讳腑娣诲姞瀛楁锛歕n ```csharp\n private bool _enableWebSocket = false;\n private int _webSocketPort = 8080;\n private HttpListener _httpListener;\n private List<WebSocket> _clients = new List<WebSocket>();\n private object _clientsLock = new object();\n private CancellationTokenSource _cancellationTokenSource;\n ```\n\n 2. 鍦ㄦ瀯閫犲嚱鏁颁腑璇诲彇閰嶇疆锛屽鏋滃惎鐢ㄥ垯璋冪敤`StartWebSocketServer()`銆俓n\n 3. 瀹炵幇`StartWebSocketServer()`鏂规硶锛屽惎鍔℉TTP鐩戝惉锛屽苟寮�濮嬫帴鍙楄繛鎺ャ�俓n\n 4. 瀹炵幇涓�涓紓姝ユ柟娉昤HandleWebSocketConnections`锛岀敤浜庡鐞嗕紶鍏ョ殑杩炴帴璇锋眰銆俓n\n 5. 瀹炵幇骞挎挱鏂规硶`BroadcastAsync(string message)`锛屽悜鎵�鏈夊鎴风鍙戦�佹秷鎭�俓n\n 6. 淇敼`Log`鏂规硶锛屽湪鍐欏叆鏃ュ織鍚庯紝濡傛灉鍚敤浜哤ebSocket锛屽垯璋冪敤`BroadcastAsync`銆俓n\n 7. 鍦ㄦ瀽鏋勫嚱鏁版垨瀹炵幇`IDisposable`鎺ュ彛锛屽叧闂璚ebSocket鏈嶅姟鍣ㄥ苟娓呯悊銆俓n\n 鐢变簬浠g爜杈冮暱锛屾垜浠彧灞曠ず鍏抽敭閮ㄥ垎銆傛敞鎰忥細WebSocket鏈嶅姟鍣ㄨ繍琛屽湪鍚庡彴绾跨▼锛屼笉浼氶樆濉炰富绾跨▼銆俓n\n 娉ㄦ剰锛氱敱浜庡師浠g爜涓湭鎻愬強WebSocket锛屾垜浠寜鐓у熀鏈渶姹傚疄鐜般�傝�冭檻鍒版椂闂达紝鎴戜滑绠�鍖栭敊璇鐞嗐�俓n\n 浠ヤ笅鏄慨鏀瑰悗鐨勪唬鐮侊細\n</think>","contentId":-378270283,"children":[],"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"浠ヤ笅鏄拡瀵� `LocalLogger` 绫讳腑 WebSocket 鍔熻兘鐨勮ˉ鍏呰鏄庡拰瀹炵幇寤鸿锛�","children":[],"contentId":-1005472094,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" WebSocket 鍔熻兘璁捐","children":[],"contentId":-887015622,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"line","content":"1. **鏍稿績鐩殑** ","children":[],"contentId":1943910660,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":" 閫氳繃 WebSocket 瀹炵幇瀹炴椂鏃ュ織鎺ㄩ�侊紝鍏佽杩滅▼瀹㈡埛绔紙濡傜洃鎺ч潰鏉匡級瀹炴椂鎺ユ敹鏃ュ織鏇存柊銆�","children":[],"contentId":-902896680,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"2. **瀹炵幇鏂规**","children":[],"contentId":532976805,"parent":null,"settled":true,"xmlData":{}},{"type":"code-block","content":"// 鏂板 WebSocket 鏈嶅姟鍣ㄧ鐞嗙被\npublic class LogWebSocketServer : IDisposable\n{\n private readonly HttpListener _listener;\n private readonly List<WebSocket> _clients = new();\n private readonly CancellationTokenSource _cts = new();\n\n public LogWebSocketServer(int port = 8080)\n {\n _listener = new HttpListener();\n _listener.Prefixes.Add($\"http://*:{port}/logs/\");\n }\n\n public async Task StartAsync()\n {\n _listener.Start();\n while (!_cts.IsCancellationRequested)\n {\n var context = await _listener.GetContextAsync();\n if (context.Request.IsWebSocketRequest)\n {\n var ws = await context.AcceptWebSocketAsync(null);\n lock (_clients) _clients.Add(ws.WebSocket);\n }\n else context.Response.StatusCode = 400;\n }\n }\n\n // 鏃ュ織骞挎挱鏂规硶\n public void Broadcast(string logEntry)\n {\n byte[] buffer = Encoding.UTF8.GetBytes(logEntry);\n lock (_clients)\n {\n foreach (var client in _clients.Where(c => c.State == WebSocketState.Open))\n {\n client.SendAsync(new ArraySegment<byte>(buffer), \n WebSocketMessageType.Text, true, CancellationToken.None);\n }\n }\n }\n\n public void Dispose() => _cts.Cancel();\n}\n","children":[],"contentId":732439768,"parent":null,"settled":true,"xmlData":{},"expectEnding":"```","language":"csharp"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"3. **涓� LocalLogger 闆嗘垚**","children":[],"contentId":-294972218,"parent":null,"settled":true,"xmlData":{}},{"type":"code-block","content":"public class LocalLogger\n{\n private readonly LogWebSocketServer _wsServer;\n\n public LocalLogger(bool enableWebSocket = false)\n {\n if (enableWebSocket)\n {\n _wsServer = new LogWebSocketServer();\n Task.Run(() => _wsServer.StartAsync());\n }\n }\n\n private void LogInternal(LogMessageItem item)\n {\n // 鍘熸湁鏃ュ織鍐欏叆閫昏緫...\n \n // 鏂板 WebSocket 鎺ㄩ�乗n if (_wsServer != null) \n {\n _wsServer.Broadcast(item.ToString()); \n }\n }\n}\n","children":[],"contentId":-1111551195,"parent":null,"settled":true,"xmlData":{},"expectEnding":"```","language":"csharp"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 浣跨敤绀轰緥","children":[],"contentId":665634042,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"code-block","content":"// 鍚姩甯� WebSocket 鐨勬棩蹇楁湇鍔nvar logger = new LocalLogger(enableWebSocket: true);\n\n// 鍓嶇杩炴帴绀轰緥 (JavaScript)\nconst ws = new WebSocket('ws://your-ip:8080/logs');\nws.onmessage = event => {\n console.log('瀹炴椂鏃ュ織:', event.data);\n};\n","children":[],"contentId":-463063703,"parent":null,"settled":true,"xmlData":{},"expectEnding":"```","language":"csharp"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":"鍏抽敭鐗规��","children":[],"contentId":658805801,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"line","content":"1. **瀹炴椂鎺ㄩ��** ","children":[],"contentId":-617241260,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":" 鏃ュ織浜х敓鍚庣珛鍗虫帹閫佸埌鎵�鏈夎繛鎺ョ殑瀹㈡埛绔�","children":[],"contentId":-349252495,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"2. **澶氬鎴风鏀寔** ","children":[],"contentId":-554917898,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":" 鍏佽澶氫釜鐩戞帶绔悓鏃惰繛鎺�","children":[],"contentId":1785852803,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"3. **璧勬簮绠$悊** ","children":[],"contentId":-1874822090,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":" 鑷姩娓呯悊鏂紑杩炴帴鐨勫鎴风","children":[],"contentId":1218924719,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"4. **寮傛浼犺緭** ","children":[],"contentId":1042889020,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":" 闈為樆濉炲紡缃戠粶閫氫俊锛屼笉褰卞搷涓绘棩蹇楁祦绋�","children":[],"contentId":405478714,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"> **娉ㄦ剰**锛氬疄闄呴儴缃叉椂闇�瑕佸鐞嗛槻鐏璁剧疆锛堝紑鏀炬寚瀹氱鍙o級鍜屾潈闄愰厤缃紙Windows 闇�鐢ㄧ鐞嗗憳杩愯 `netsh http add urlacl`锛�","children":[],"contentId":-512769914,"parent":null,"settled":false,"xmlData":{}}],"parserState":{"line":175,"column":76,"offset":4590,"metadata":false,"buffer":"","closing":false,"currentParent":null,"moveCursor":true,"tagBuffer":"<","isCollectingTag":false},"content":"<think>\n鎴戜滑娉ㄦ剰鍒扮敤鎴疯姹傚繀椤讳娇鐢ㄤ腑鏂囧洖绛旓紝骞朵笖鎸囧嚭WebSocket閮ㄥ垎娌℃湁璇存槑銆傚師闂涓彁鍒颁簡涓�涓湭瀹炵幇鐨刞CreateWebSocket()`鏂规硶锛屾垜浠渶瑕佽ˉ鍏呰繖閮ㄥ垎鍔熻兘銆俓n\n 璁″垝锛歕n 1. 鍦╜LocalLogger`绫讳腑娣诲姞WebSocket鏈嶅姟鍣ㄧ浉鍏崇殑瀛楁鍜屽垵濮嬪寲閫昏緫銆俓n 2. 瀹炵幇`CreateWebSocket`鏂规硶锛岀敤浜庡惎鍔ㄤ竴涓猈ebSocket鏈嶅姟鍣紝鐩戝惉鎸囧畾绔彛锛堜緥濡�8080锛夈�俓n 3. 褰撴湁鏂扮殑鏃ュ織鍐欏叆鏃讹紝闄や簡鍐欏叆鏂囦欢鍜岃緭鍑哄埌鎺у埗鍙帮紝杩樿灏嗘棩蹇楁秷鎭彂閫佺粰鎵�鏈夎繛鎺ョ殑WebSocket瀹㈡埛绔�俓n 4. 淇敼鐜版湁鐨刞Log`鏂规硶锛屽湪鍐欏叆鏃ュ織鍚庯紝濡傛灉WebSocket鏈嶅姟鍣ㄥ凡鍚姩锛屽垯骞挎挱鏃ュ織娑堟伅銆俓n 5. 娉ㄦ剰绾跨▼瀹夊叏锛屽洜涓篧ebSocket鐨勫彂閫佹搷浣滃彲鑳芥秹鍙婂绾跨▼銆俓n\n 鐢变簬鍘熶唬鐮佷腑娌℃湁WebSocket鐨勫疄鐜帮紝鎴戜滑灏嗕娇鐢╜System.Net.WebSockets`鍛藉悕绌洪棿涓嬬殑绫绘潵瀹炵幇銆備絾鏄紝璇锋敞鎰忥紝WebSocket鏈嶅姟鍣ㄩ�氬父闇�瑕佸紓姝ュ鐞嗭紝鎴戜滑灏嗕娇鐢╜async/await`銆俓n\n 姝ラ锛歕n 1. 娣诲姞蹇呰鐨勫瓧娈碉細\n - `private WebSocketServer _webSocketServer;` 锛堟敞鎰忥細.NET Framework涓病鏈夊唴缃殑WebSocketServer锛屾垜浠渶瑕佽嚜宸卞疄鐜颁竴涓畝鍗曠殑銆傝繖閲屾垜浠娇鐢╜HttpListener`鏉ュ垱寤篧ebSocket鏈嶅姟鍣級\n - `private List<WebSocket> _connectedClients;` 鐢ㄤ簬瀛樺偍杩炴帴鐨勫鎴风銆俓n - 涓�涓攣瀵硅薄鐢ㄤ簬鍚屾瀵瑰鎴风鍒楄〃鐨勮闂�俓n\n 2. 鍦╜LocalLogger`鐨勬瀯閫犲嚱鏁颁腑锛屾牴鎹厤缃喅瀹氭槸鍚﹀惎鍔╓ebSocket鏈嶅姟鍣紙鍙互娣诲姞涓�涓厤缃」锛屼緥濡俙EnableWebSocket`锛夈�俓n\n 3. 瀹炵幇`CreateWebSocket`鏂规硶锛岃鏂规硶灏嗗惎鍔ㄤ竴涓狧TTP鐩戝惉鍣紝骞跺鐞哤ebSocket杩炴帴璇锋眰銆俓n\n 4. 褰撴湁鏂扮殑瀹㈡埛绔繛鎺ユ椂锛屽皢鍏舵坊鍔犲埌瀹㈡埛绔垪琛ㄤ腑锛屽苟鍦ㄦ柇寮�杩炴帴鏃剁Щ闄ゃ�俓n\n 5. 鍦ㄦ棩蹇楀啓鍏ユ椂锛屽皢鏍煎紡鍖栧悗鐨勬棩蹇楁秷鎭紙娉ㄦ剰锛氭垜浠彂閫佺殑鏄函鏂囨湰锛屼絾涔熷彲浠ヨ�冭檻鍙戦�佺粨鏋勫寲鏁版嵁锛夊箍鎾粰鎵�鏈夊鎴风銆俓n\n 6. 娉ㄦ剰锛氱敱浜嶹ebSocket鎿嶄綔鏄紓姝ョ殑锛屾垜浠渶瑕佸皬蹇冮伩鍏嶉樆濉炴棩蹇楀啓鍏ョ嚎绋嬨�傛垜浠彲浠ュ皢骞挎挱鎿嶄綔浣滀负鍚庡彴浠诲姟鎵ц锛屼笉绛夊緟缁撴灉銆俓n\n 鑰冭檻鍒颁唬鐮侀噺杈冨ぇ锛屾垜浠彧瀹炵幇鍩烘湰鍔熻兘锛屽苟娉ㄦ剰閿欒澶勭悊銆俓n\n 娉ㄦ剰锛氬師浠g爜涓凡缁忔湁涓�涓猔_lock`瀵硅薄鐢ㄤ簬鏂囦欢鎿嶄綔鐨勫悓姝ワ紝鐜板湪鎴戜滑闇�瑕佸彟涓�涓攣瀵硅薄鐢ㄤ簬瀹㈡埛绔垪琛ㄧ殑鍚屾銆俓n\n 鐢变簬鍘熼棶棰樹腑瑕佹眰浠g爜绠�娲侊紝鎴戜滑鍙疄鐜颁竴涓畝鍗曠殑WebSocket鏈嶅姟鍣紝涓嶅鐞嗗鏉傜殑娑堟伅鎺ユ敹锛屽彧鍙戦�佹棩蹇椼�俓n\n 鎴戜滑灏嗘坊鍔犱互涓嬮厤缃」锛堝湪閰嶇疆鏂囦欢涓級锛歕n - `WebSocketPort`: WebSocket鏈嶅姟鍣ㄧ洃鍚殑绔彛锛岄粯璁�8080\n - `EnableWebSocket`: 鏄惁鍚敤WebSocket鏈嶅姟鍣紝榛樿false\n\n 淇敼鍚庣殑浠g爜缁撴瀯锛歕n\n 1. 鍦╜LocalLogger`绫讳腑娣诲姞瀛楁锛歕n ```csharp\n private bool _enableWebSocket = false;\n private int _webSocketPort = 8080;\n private HttpListener _httpListener;\n private List<WebSocket> _clients = new List<WebSocket>();\n private object _clientsLock = new object();\n private CancellationTokenSource _cancellationTokenSource;\n ```\n\n 2. 鍦ㄦ瀯閫犲嚱鏁颁腑璇诲彇閰嶇疆锛屽鏋滃惎鐢ㄥ垯璋冪敤`StartWebSocketServer()`銆俓n\n 3. 瀹炵幇`StartWebSocketServer()`鏂规硶锛屽惎鍔℉TTP鐩戝惉锛屽苟寮�濮嬫帴鍙楄繛鎺ャ�俓n\n 4. 瀹炵幇涓�涓紓姝ユ柟娉昤HandleWebSocketConnections`锛岀敤浜庡鐞嗕紶鍏ョ殑杩炴帴璇锋眰銆俓n\n 5. 瀹炵幇骞挎挱鏂规硶`BroadcastAsync(string message)`锛屽悜鎵�鏈夊鎴风鍙戦�佹秷鎭�俓n\n 6. 淇敼`Log`鏂规硶锛屽湪鍐欏叆鏃ュ織鍚庯紝濡傛灉鍚敤浜哤ebSocket锛屽垯璋冪敤`BroadcastAsync`銆俓n\n 7. 鍦ㄦ瀽鏋勫嚱鏁版垨瀹炵幇`IDisposable`鎺ュ彛锛屽叧闂璚ebSocket鏈嶅姟鍣ㄥ苟娓呯悊銆俓n\n 鐢变簬浠g爜杈冮暱锛屾垜浠彧灞曠ず鍏抽敭閮ㄥ垎銆傛敞鎰忥細WebSocket鏈嶅姟鍣ㄨ繍琛屽湪鍚庡彴绾跨▼锛屼笉浼氶樆濉炰富绾跨▼銆俓n\n 娉ㄦ剰锛氱敱浜庡師浠g爜涓湭鎻愬強WebSocket锛屾垜浠寜鐓у熀鏈渶姹傚疄鐜般�傝�冭檻鍒版椂闂达紝鎴戜滑绠�鍖栭敊璇鐞嗐�俓n\n 浠ヤ笅鏄慨鏀瑰悗鐨勪唬鐮侊細\n</think>\n浠ヤ笅鏄拡瀵� `LocalLogger` 绫讳腑 WebSocket 鍔熻兘鐨勮ˉ鍏呰鏄庡拰瀹炵幇寤鸿锛歕n\n### WebSocket 鍔熻兘璁捐\n1. **鏍稿績鐩殑** \n 閫氳繃 WebSocket 瀹炵幇瀹炴椂鏃ュ織鎺ㄩ�侊紝鍏佽杩滅▼瀹㈡埛绔紙濡傜洃鎺ч潰鏉匡級瀹炴椂鎺ユ敹鏃ュ織鏇存柊銆俓n\n2. **瀹炵幇鏂规**\n```csharp\n// 鏂板 WebSocket 鏈嶅姟鍣ㄧ鐞嗙被\npublic class LogWebSocketServer : IDisposable\n{\n private readonly HttpListener _listener;\n private readonly List<WebSocket> _clients = new();\n private readonly CancellationTokenSource _cts = new();\n\n public LogWebSocketServer(int port = 8080)\n {\n _listener = new HttpListener();\n _listener.Prefixes.Add($\"http://*:{port}/logs/\");\n }\n\n public async Task StartAsync()\n {\n _listener.Start();\n while (!_cts.IsCancellationRequested)\n {\n var context = await _listener.GetContextAsync();\n if (context.Request.IsWebSocketRequest)\n {\n var ws = await context.AcceptWebSocketAsync(null);\n lock (_clients) _clients.Add(ws.WebSocket);\n }\n else context.Response.StatusCode = 400;\n }\n }\n\n // 鏃ュ織骞挎挱鏂规硶\n public void Broadcast(string logEntry)\n {\n byte[] buffer = Encoding.UTF8.GetBytes(logEntry);\n lock (_clients)\n {\n foreach (var client in _clients.Where(c => c.State == WebSocketState.Open))\n {\n client.SendAsync(new ArraySegment<byte>(buffer), \n WebSocketMessageType.Text, true, CancellationToken.None);\n }\n }\n }\n\n public void Dispose() => _cts.Cancel();\n}\n```\n\n3. **涓� LocalLogger 闆嗘垚**\n```csharp\npublic class LocalLogger\n{\n private readonly LogWebSocketServer _wsServer;\n\n public LocalLogger(bool enableWebSocket = false)\n {\n if (enableWebSocket)\n {\n _wsServer = new LogWebSocketServer();\n Task.Run(() => _wsServer.StartAsync());\n }\n }\n\n private void LogInternal(LogMessageItem item)\n {\n // 鍘熸湁鏃ュ織鍐欏叆閫昏緫...\n \n // 鏂板 WebSocket 鎺ㄩ�乗n if (_wsServer != null) \n {\n _wsServer.Broadcast(item.ToString()); \n }\n }\n}\n```\n\n### 浣跨敤绀轰緥\n```csharp\n// 鍚姩甯� WebSocket 鐨勬棩蹇楁湇鍔nvar logger = new LocalLogger(enableWebSocket: true);\n\n// 鍓嶇杩炴帴绀轰緥 (JavaScript)\nconst ws = new WebSocket('ws://your-ip:8080/logs');\nws.onmessage = event => {\n console.log('瀹炴椂鏃ュ織:', event.data);\n};\n```\n\n### 鍏抽敭鐗规�n1. **瀹炴椂鎺ㄩ��** \n 鏃ュ織浜х敓鍚庣珛鍗虫帹閫佸埌鎵�鏈夎繛鎺ョ殑瀹㈡埛绔痋n\n2. **澶氬鎴风鏀寔** \n 鍏佽澶氫釜鐩戞帶绔悓鏃惰繛鎺n\n3. **璧勬簮绠$悊** \n 鑷姩娓呯悊鏂紑杩炴帴鐨勫鎴风\n\n4. **寮傛浼犺緭** \n 闈為樆濉炲紡缃戠粶閫氫俊锛屼笉褰卞搷涓绘棩蹇楁祦绋媆n\n> **娉ㄦ剰**锛氬疄闄呴儴缃叉椂闇�瑕佸鐞嗛槻鐏璁剧疆锛堝紑鏀炬寚瀹氱鍙o級鍜屾潈闄愰厤缃紙Windows 闇�鐢ㄧ鐞嗗憳杩愯 `netsh http add urlacl`锛�","columns":[6,84,-1,3,45,59,55,49,34,-1,107,-1,3,11,139,61,24,-1,78,-1,58,-1,36,-1,57,-1,65,-1,27,-1,54,-1,53,-1,19,45,47,-1,9,-1,24,12,41,37,38,60,46,60,6,-1,46,-1,49,-1,52,-1,53,-1,55,-1,45,-1,48,-1,48,-1,10,7,45,-1,17,12,47,-1,10,8,21,44,0,43,53,57,-1,45,4,38,56,4,-1,33,4,25,44,8,59,50,12,65,58,12,50,8,4,-1,12,41,4,56,22,8,86,12,64,76,12,8,4,-1,42,0,0,-1,22,8,23,0,49,-1,51,4,27,8,48,50,8,4,-1,48,4,21,7,25,30,8,49,8,4,0,0,-1,7,8,21,51,-1,21,50,24,36,1,1,-1,7,12,20,-1,14,13,-1,12,14,-1,12,19,-1]},"source":null,"error":null,"id":"01996f263a6d7332993d54849440330d","localReferences":null,"references":[{"uri":{"scheme":"file","authority":"","path":"file:///E:/4.閲嶆瀯/WIDESEAWCS/InfrastructureWCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/LocalLogger.cs","query":"","fragment":""},"range":[{"character":0,"line":276},{"character":0,"line":316}],"text":null,"isSourceFile":true}],"followup":null,"topic":"","score":null,"command":"","changeToOptimize":null,"button":null,"knowledge":null,"knowledgeReferences":[],"knowledgeStatus":null,"variables":null,"selectedRange":null,"actions":[],"selectedRanges":null,"createdAt":1758506457295},{"role":"user","content":"LogWebSocketServer 娣诲姞鍙戦�佺粰鎸囧畾瀹㈡埛绔紝鎺ユ敹瀹㈡埛绔俊鎭瓑鍔熻兘锛屽畬鍠勪竴鐐�","isTips":null,"cost":0,"parser":{"nodes":[{"type":"line","content":"LogWebSocketServer 娣诲姞鍙戦�佺粰鎸囧畾瀹㈡埛绔紝鎺ユ敹瀹㈡埛绔俊鎭瓑鍔熻兘锛屽畬鍠勪竴鐐�","contentId":-778404162,"children":[],"parent":null,"settled":false,"xmlData":{}}],"parserState":{"line":0,"column":44,"offset":45,"metadata":false,"buffer":"","closing":false,"currentParent":null,"moveCursor":true,"tagBuffer":"","isCollectingTag":false},"content":"LogWebSocketServer 娣诲姞鍙戦�佺粰鎸囧畾瀹㈡埛绔紝鎺ユ敹瀹㈡埛绔俊鎭瓑鍔熻兘锛屽畬鍠勪竴鐐�","columns":[]},"source":null,"error":null,"id":null,"localReferences":[],"references":null,"followup":null,"topic":"","score":null,"command":"","changeToOptimize":null,"button":null,"knowledge":null,"knowledgeReferences":null,"knowledgeStatus":null,"variables":[],"selectedRange":null,"actions":null,"selectedRanges":[],"createdAt":1758506563831},{"role":"assistant","content":"<think>\n鎴戜滑灏嗗湪LogWebSocketServer涓坊鍔犱互涓嬪姛鑳斤細\n 1. 鏀寔鍚戞寚瀹氬鎴风鍙戦�佹秷鎭紙閫氳繃鏌愪釜鏍囪瘑锛屼緥濡傚鎴风ID锛塡n 2. 鎺ユ敹瀹㈡埛绔彂鏉ョ殑娑堟伅锛屽苟澶勭悊锛堜緥濡傦紝瀹㈡埛绔彲浠ュ彂閫佸懡浠ゆ潵杩囨护鏃ュ織绾у埆锛塡n 3. 涓烘瘡涓鎴风鍒嗛厤鍞竴ID锛屽苟璁板綍瀹㈡埛绔殑鐩稿叧淇℃伅锛堝杩炴帴鏃堕棿銆佹渶鍚庢椿鍔ㄦ椂闂寸瓑锛塡n 4. 蹇冭烦鏈哄埗锛氭娴嬪鎴风鏄惁瀛樻椿锛屾柇寮�涓嶆椿璺冪殑杩炴帴\n\n 鐢变簬鍘熶唬鐮佷腑浣跨敤浜咹ttpListener鍜學ebSocket锛屾垜浠皢鎵╁睍杩欎釜绫汇�俓n\n 娉ㄦ剰锛氫负浜嗙畝鍖栵紝鎴戜滑浣跨敤涓�涓瓧鍏告潵瀛樺偍瀹㈡埛绔紙浠ebSocket涓洪敭锛屼絾涓轰簡瀹夊叏鍜岀鐞嗭紝鎴戜滑浣跨敤涓�涓寘瑁呯被ClientInfo锛塡n\n 姝ラ锛歕n 1. 瀹氫箟ClientInfo绫伙紝鍖呭惈WebSocket銆佸敮涓�ID銆佽繛鎺ユ椂闂淬�佹渶鍚庢椿鍔ㄦ椂闂寸瓑銆俓n 2. 淇敼_clients涓哄瓧鍏革紝閿负鍞竴ID锛屽�间负ClientInfo瀵硅薄銆俓n 3. 鍦ˋcceptWebSocketAsync鏃跺垱寤篊lientInfo骞跺姞鍏ュ瓧鍏搞�俓n 4. 娣诲姞涓�涓柟娉昐endToClient(string clientId, string message)鐢ㄤ簬鍚戞寚瀹氬鎴风鍙戦�佹秷鎭�俓n 5. 淇敼Broadcast鏂规硶锛屽彲浠ラ�夋嫨骞挎挱缁欐墍鏈夊鎴风鎴栨帓闄ゆ煇浜涘鎴风銆俓n 6. 鎺ユ敹瀹㈡埛绔秷鎭細姣忎釜瀹㈡埛绔繛鎺ュ悗鍚姩涓�涓帴鏀跺惊鐜紝澶勭悊娑堟伅锛堜緥濡傦紝璁剧疆杩囨护鏉′欢锛夈�俓n 7. 蹇冭烦妫�娴嬶細瀹氭椂妫�鏌ュ鎴风鐨勬渶鍚庢椿鍔ㄦ椂闂达紝鏂紑瓒呰繃涓�瀹氭椂闂存湭娲诲姩鐨勮繛鎺ャ�俓n\n 鐢变簬浠g爜杈冮暱锛屾垜浠�愭瀹炵幇銆俓n\n 娉ㄦ剰锛氭浠g爜绀轰緥灏嗗敖閲忎繚鎸佺畝娲侊紝浣嗗疄闄呯敓浜х幆澧冮渶瑕佹洿瀹屽杽鐨勯敊璇鐞嗐�俓n</think>\n浠ヤ笅鏄畬鍠勫悗鐨� `LogWebSocketServer` 瀹炵幇锛屾坊鍔犱簡瀹㈡埛绔鐞嗐�佸畾鍚戞秷鎭彂閫佸拰娑堟伅鎺ユ敹澶勭悊鍔熻兘锛歕n\n```csharp\npublic class LogWebSocketServer : IDisposable\n{\n private readonly HttpListener _listener;\n private readonly ConcurrentDictionary<string, WebSocketClient> _clients = new();\n private readonly CancellationTokenSource _cts = new();\n private readonly int _port;\n \n // 蹇冭烦妫�娴嬮棿闅旓紙绉掞級\n private const int HEARTBEAT_INTERVAL = 30;\n\n public event Action<string> OnLogMessage; // 鏈嶅姟鍣ㄦ棩蹇椾簨浠禱n\n public LogWebSocketServer(int port = 8080)\n {\n _port = port;\n _listener = new HttpListener();\n _listener.Prefixes.Add($\"http://*:{port}/logs/\");\n }\n\n public async Task StartAsync()\n {\n Log(\"WebSocket 鏈嶅姟鍣ㄥ惎鍔ㄤ腑...\");\n _listener.Start();\n Log($\"鐩戝惉绔彛: {_port}\");\n \n // 鍚姩蹇冭烦妫�娴媆n _ = Task.Run(HeartbeatCheck);\n\n while (!_cts.IsCancellationRequested)\n {\n try\n {\n var context = await _listener.GetContextAsync();\n if (context.Request.IsWebSocketRequest)\n {\n ProcessWebSocketRequest(context);\n }\n else\n {\n context.Response.StatusCode = 400;\n context.Response.Close();\n }\n }\n catch (Exception ex)\n {\n Log($\"鏈嶅姟鍣ㄩ敊璇�: {ex.Message}\");\n }\n }\n }\n\n private async void ProcessWebSocketRequest(HttpListenerContext context)\n {\n try\n {\n var webSocketContext = await context.AcceptWebSocketAsync(null);\n var clientId = Guid.NewGuid().ToString();\n var client = new WebSocketClient(webSocketContext.WebSocket, clientId);\n \n _clients.TryAdd(clientId, client);\n Log($\"瀹㈡埛绔繛鎺�: {clientId} ({_clients.Count} 鍦ㄧ嚎)\");\n \n // 鍙戦�佹杩庢秷鎭痋n await SendToClient(clientId, $\"CONNECTED|{clientId}|{DateTime.Now:yyyy-MM-dd HH:mm:ss}\");\n \n // 鍚姩娑堟伅鎺ユ敹寰幆\n _ = Task.Run(() => ReceiveMessages(client));\n }\n catch (Exception ex)\n {\n Log($\"杩炴帴澶辫触: {ex.Message}\");\n context.Response.StatusCode = 500;\n context.Response.Close();\n }\n }\n\n private async Task ReceiveMessages(WebSocketClient client)\n {\n var buffer = new byte[4096];\n try\n {\n while (client.WebSocket.State == WebSocketState.Open)\n {\n var result = await client.WebSocket.ReceiveAsync(\n new ArraySegment<byte>(buffer), \n _cts.Token);\n \n if (result.MessageType == WebSocketMessageType.Close)\n {\n await CloseClient(client.Id, \"瀹㈡埛绔叧闂繛鎺");\n break;\n }\n \n // 澶勭悊鎺ユ敹鍒扮殑娑堟伅\n var message = Encoding.UTF8.GetString(buffer, 0, result.Count);\n client.LastActivity = DateTime.Now;\n HandleClientMessage(client.Id, message);\n }\n }\n catch (Exception ex)\n {\n Log($\"鎺ユ敹閿欒 [{client.Id}]: {ex.Message}\");\n await CloseClient(client.Id, \"杩炴帴寮傚父\");\n }\n }\n\n private void HandleClientMessage(string clientId, string message)\n {\n Log($\"鏀跺埌娑堟伅 [{clientId}]: {message}\");\n \n // 绀轰緥鍛戒护澶勭悊\n if (message.StartsWith(\"CMD:\"))\n {\n var cmd = message.Substring(4);\n switch (cmd.ToUpper())\n {\n case \"GET_CLIENTS\":\n var clients = string.Join(\",\", _clients.Keys);\n SendToClient(clientId, $\"CLIENTS|{clients}\");\n break;\n \n case \"PING\":\n SendToClient(clientId, \"PONG\");\n break;\n }\n }\n }\n\n // 鍙戦�佹秷鎭埌鎸囧畾瀹㈡埛绔痋n public async Task SendToClient(string clientId, string message)\n {\n if (_clients.TryGetValue(clientId, out var client))\n {\n try\n {\n var buffer = Encoding.UTF8.GetBytes(message);\n await client.WebSocket.SendAsync(\n new ArraySegment<byte>(buffer),\n WebSocketMessageType.Text,\n true,\n _cts.Token);\n \n client.LastActivity = DateTime.Now;\n }\n catch (Exception ex)\n {\n Log($\"鍙戦�佸け璐� [{clientId}]: {ex.Message}\");\n await CloseClient(clientId, \"鍙戦�佸け璐");\n }\n }\n }\n\n // 骞挎挱娑堟伅鍒版墍鏈夊鎴风\n public async Task Broadcast(string message)\n {\n var tasks = new List<Task>();\n foreach (var clientId in _clients.Keys.ToList())\n {\n tasks.Add(SendToClient(clientId, message));\n }\n await Task.WhenAll(tasks);\n }\n\n // 鍏抽棴瀹㈡埛绔繛鎺n private async Task CloseClient(string clientId, string reason)\n {\n if (_clients.TryRemove(clientId, out var client))\n {\n try\n {\n Log($\"鍏抽棴杩炴帴 [{clientId}]: {reason}\");\n await client.WebSocket.CloseAsync(\n WebSocketCloseStatus.NormalClosure,\n reason,\n _cts.Token);\n }\n catch\n {\n // 蹇界暐鍏抽棴寮傚父\n }\n }\n }\n\n // 蹇冭烦妫�娴媆n private async Task HeartbeatCheck()\n {\n while (!_cts.IsCancellationRequested)\n {\n await Task.Delay(HEARTBEAT_INTERVAL * 1000);\n \n foreach (var client in _clients.Values.ToList())\n {\n var inactiveTime = DateTime.Now - client.LastActivity;\n if (inactiveTime.TotalSeconds > HEARTBEAT_INTERVAL * 3)\n {\n await CloseClient(client.Id, $\"蹇冭烦瓒呮椂 ({inactiveTime.TotalSeconds}s)\");\n }\n }\n }\n }\n\n private void Log(string message) => OnLogMessage?.Invoke(message);\n\n public void Dispose()\n {\n _cts.Cancel();\n _listener.Stop();\n _listener.Close();\n \n // 鍏抽棴鎵�鏈夊鎴风\n foreach (var clientId in _clients.Keys.ToList())\n {\n CloseClient(clientId, \"鏈嶅姟鍣ㄥ叧闂璡").Wait();\n }\n }\n}\n\n// 瀹㈡埛绔俊鎭被\npublic class WebSocketClient\n{\n public WebSocket WebSocket { get; }\n public string Id { get; }\n public DateTime ConnectTime { get; }\n public DateTime LastActivity { get; set; }\n\n public WebSocketClient(WebSocket webSocket, string id)\n {\n WebSocket = webSocket;\n Id = id;\n ConnectTime = DateTime.Now;\n LastActivity = DateTime.Now;\n }\n}\n```\n\n### 涓昏澧炲己鍔熻兘锛歕n\n1. **瀹㈡埛绔鐞�**\n - 浣跨敤 `ConcurrentDictionary` 瀛樺偍瀹㈡埛绔俊鎭痋n - 姣忎釜瀹㈡埛绔垎閰嶅敮涓�ID锛圙UID锛塡n - 璁板綍杩炴帴鏃堕棿鍜屾渶鍚庢椿鍔ㄦ椂闂碶n\n2. **娑堟伅瀹氬悜鍙戦��**\n ```csharp\n // 鍙戦�佺粰鎸囧畾瀹㈡埛绔痋n await server.SendToClient(\"client-id\", \"鐗瑰畾娑堟伅\");\n \n // 骞挎挱缁欐墍鏈夊鎴风\n await server.Broadcast(\"鍏ㄥ眬閫氱煡\");\n ```\n\n3. **娑堟伅鎺ユ敹澶勭悊**\n - 鐙珛鎺ユ敹寰幆澶勭悊姣忎釜瀹㈡埛绔殑娑堟伅\n - 绀轰緥鍛戒护澶勭悊锛歕n ```text\n CMD:GET_CLIENTS 鈫� 鑾峰彇鎵�鏈夊鎴风ID\n CMD:PING 鈫� 杩斿洖PONG鍝嶅簲\n ```\n\n4. **蹇冭烦妫�娴嬫満鍒�**\n - 瀹氭椂妫�鏌ュ鎴风娲诲姩鐘舵�乗n - 鑷姩鏂紑瓒呰繃90绉掓湭娲诲姩鐨勫鎴风\n\n5. **杩炴帴鐢熷懡鍛ㄦ湡绠$悊**\n - 娆㈣繋娑堟伅锛歚CONNECTED|{clientId}|{time}`\n - 鍏抽棴閫氱煡锛氬寘鍚叧闂師鍥燶n - 鏈嶅姟鍣ㄥ叧闂椂鑷姩鏂紑鎵�鏈夊鎴风\n\n6. **閿欒澶勭悊**\n - 鎹曡幏鎵�鏈夌綉缁滃紓甯竆n - 璁板綍璇︾粏鐨勯敊璇棩蹇梊n - 鑷姩娓呯悊鏃犳晥杩炴帴\n\n### 闆嗘垚鍒版棩蹇楃郴缁焅n\n```csharp\npublic class LocalLogger\n{\n private readonly LogWebSocketServer _wsServer;\n\n public LocalLogger(bool enableWebSocket = false)\n {\n if (enableWebSocket)\n {\n _wsServer = new LogWebSocketServer();\n _wsServer.OnLogMessage += msg => Console.WriteLine($\"[WS] {msg}\");\n Task.Run(() => _wsServer.StartAsync());\n }\n }\n\n private void LogInternal(LogMessageItem item)\n {\n // 鍘熸湁鏃ュ織鍐欏叆閫昏緫...\n \n // WebSocket 鎺ㄩ�乗n if (_wsServer != null) \n {\n // 骞挎挱鏃ュ織缁欐墍鏈夊鎴风\n _wsServer.Broadcast($\"LOG|{item.ToString()}\").Wait();\n \n // 鎴栧畾鍚戝彂閫佺粰鐗瑰畾瀹㈡埛绔痋n // _wsServer.SendToClient(\"monitor-client\", item.ToString()).Wait();\n }\n }\n}\n```\n\n### 瀹㈡埛绔娇鐢ㄧず渚嬶紙JavaScript锛塡n\n```javascript\nconst ws = new WebSocket('ws://your-server-ip:8080/logs');\n\nws.onopen = () => console.log('宸茶繛鎺ユ棩蹇楁湇鍔″櫒');\nws.onmessage = e => {\n const [type, ...data] = e.data.split('|');\n \n switch(type) {\n case 'CONNECTED':\n console.log(`宸茶繛鎺ワ紝瀹㈡埛绔疘D: ${data[0]}锛屾椂闂�: ${data[1]}`);\n break;\n \n case 'LOG':\n undefined","isTips":null,"cost":72823,"parser":{"nodes":[{"type":"reasoning","content":"<think>\n鎴戜滑灏嗗湪LogWebSocketServer涓坊鍔犱互涓嬪姛鑳斤細\n 1. 鏀寔鍚戞寚瀹氬鎴风鍙戦�佹秷鎭紙閫氳繃鏌愪釜鏍囪瘑锛屼緥濡傚鎴风ID锛塡n 2. 鎺ユ敹瀹㈡埛绔彂鏉ョ殑娑堟伅锛屽苟澶勭悊锛堜緥濡傦紝瀹㈡埛绔彲浠ュ彂閫佸懡浠ゆ潵杩囨护鏃ュ織绾у埆锛塡n 3. 涓烘瘡涓鎴风鍒嗛厤鍞竴ID锛屽苟璁板綍瀹㈡埛绔殑鐩稿叧淇℃伅锛堝杩炴帴鏃堕棿銆佹渶鍚庢椿鍔ㄦ椂闂寸瓑锛塡n 4. 蹇冭烦鏈哄埗锛氭娴嬪鎴风鏄惁瀛樻椿锛屾柇寮�涓嶆椿璺冪殑杩炴帴\n\n 鐢变簬鍘熶唬鐮佷腑浣跨敤浜咹ttpListener鍜學ebSocket锛屾垜浠皢鎵╁睍杩欎釜绫汇�俓n\n 娉ㄦ剰锛氫负浜嗙畝鍖栵紝鎴戜滑浣跨敤涓�涓瓧鍏告潵瀛樺偍瀹㈡埛绔紙浠ebSocket涓洪敭锛屼絾涓轰簡瀹夊叏鍜岀鐞嗭紝鎴戜滑浣跨敤涓�涓寘瑁呯被ClientInfo锛塡n\n 姝ラ锛歕n 1. 瀹氫箟ClientInfo绫伙紝鍖呭惈WebSocket銆佸敮涓�ID銆佽繛鎺ユ椂闂淬�佹渶鍚庢椿鍔ㄦ椂闂寸瓑銆俓n 2. 淇敼_clients涓哄瓧鍏革紝閿负鍞竴ID锛屽�间负ClientInfo瀵硅薄銆俓n 3. 鍦ˋcceptWebSocketAsync鏃跺垱寤篊lientInfo骞跺姞鍏ュ瓧鍏搞�俓n 4. 娣诲姞涓�涓柟娉昐endToClient(string clientId, string message)鐢ㄤ簬鍚戞寚瀹氬鎴风鍙戦�佹秷鎭�俓n 5. 淇敼Broadcast鏂规硶锛屽彲浠ラ�夋嫨骞挎挱缁欐墍鏈夊鎴风鎴栨帓闄ゆ煇浜涘鎴风銆俓n 6. 鎺ユ敹瀹㈡埛绔秷鎭細姣忎釜瀹㈡埛绔繛鎺ュ悗鍚姩涓�涓帴鏀跺惊鐜紝澶勭悊娑堟伅锛堜緥濡傦紝璁剧疆杩囨护鏉′欢锛夈�俓n 7. 蹇冭烦妫�娴嬶細瀹氭椂妫�鏌ュ鎴风鐨勬渶鍚庢椿鍔ㄦ椂闂达紝鏂紑瓒呰繃涓�瀹氭椂闂存湭娲诲姩鐨勮繛鎺ャ�俓n\n 鐢变簬浠g爜杈冮暱锛屾垜浠�愭瀹炵幇銆俓n\n 娉ㄦ剰锛氭浠g爜绀轰緥灏嗗敖閲忎繚鎸佺畝娲侊紝浣嗗疄闄呯敓浜х幆澧冮渶瑕佹洿瀹屽杽鐨勯敊璇鐞嗐�俓n</think>","contentId":-673263023,"children":[],"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"浠ヤ笅鏄畬鍠勫悗鐨� `LogWebSocketServer` 瀹炵幇锛屾坊鍔犱簡瀹㈡埛绔鐞嗐�佸畾鍚戞秷鎭彂閫佸拰娑堟伅鎺ユ敹澶勭悊鍔熻兘锛�","children":[],"contentId":583850058,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"code-block","content":"public class LogWebSocketServer : IDisposable\n{\n private readonly HttpListener _listener;\n private readonly ConcurrentDictionary<string, WebSocketClient> _clients = new();\n private readonly CancellationTokenSource _cts = new();\n private readonly int _port;\n \n // 蹇冭烦妫�娴嬮棿闅旓紙绉掞級\n private const int HEARTBEAT_INTERVAL = 30;\n\n public event Action<string> OnLogMessage; // 鏈嶅姟鍣ㄦ棩蹇椾簨浠禱n\n public LogWebSocketServer(int port = 8080)\n {\n _port = port;\n _listener = new HttpListener();\n _listener.Prefixes.Add($\"http://*:{port}/logs/\");\n }\n\n public async Task StartAsync()\n {\n Log(\"WebSocket 鏈嶅姟鍣ㄥ惎鍔ㄤ腑...\");\n _listener.Start();\n Log($\"鐩戝惉绔彛: {_port}\");\n \n // 鍚姩蹇冭烦妫�娴媆n _ = Task.Run(HeartbeatCheck);\n\n while (!_cts.IsCancellationRequested)\n {\n try\n {\n var context = await _listener.GetContextAsync();\n if (context.Request.IsWebSocketRequest)\n {\n ProcessWebSocketRequest(context);\n }\n else\n {\n context.Response.StatusCode = 400;\n context.Response.Close();\n }\n }\n catch (Exception ex)\n {\n Log($\"鏈嶅姟鍣ㄩ敊璇�: {ex.Message}\");\n }\n }\n }\n\n private async void ProcessWebSocketRequest(HttpListenerContext context)\n {\n try\n {\n var webSocketContext = await context.AcceptWebSocketAsync(null);\n var clientId = Guid.NewGuid().ToString();\n var client = new WebSocketClient(webSocketContext.WebSocket, clientId);\n \n _clients.TryAdd(clientId, client);\n Log($\"瀹㈡埛绔繛鎺�: {clientId} ({_clients.Count} 鍦ㄧ嚎)\");\n \n // 鍙戦�佹杩庢秷鎭痋n await SendToClient(clientId, $\"CONNECTED|{clientId}|{DateTime.Now:yyyy-MM-dd HH:mm:ss}\");\n \n // 鍚姩娑堟伅鎺ユ敹寰幆\n _ = Task.Run(() => ReceiveMessages(client));\n }\n catch (Exception ex)\n {\n Log($\"杩炴帴澶辫触: {ex.Message}\");\n context.Response.StatusCode = 500;\n context.Response.Close();\n }\n }\n\n private async Task ReceiveMessages(WebSocketClient client)\n {\n var buffer = new byte[4096];\n try\n {\n while (client.WebSocket.State == WebSocketState.Open)\n {\n var result = await client.WebSocket.ReceiveAsync(\n new ArraySegment<byte>(buffer), \n _cts.Token);\n \n if (result.MessageType == WebSocketMessageType.Close)\n {\n await CloseClient(client.Id, \"瀹㈡埛绔叧闂繛鎺");\n break;\n }\n \n // 澶勭悊鎺ユ敹鍒扮殑娑堟伅\n var message = Encoding.UTF8.GetString(buffer, 0, result.Count);\n client.LastActivity = DateTime.Now;\n HandleClientMessage(client.Id, message);\n }\n }\n catch (Exception ex)\n {\n Log($\"鎺ユ敹閿欒 [{client.Id}]: {ex.Message}\");\n await CloseClient(client.Id, \"杩炴帴寮傚父\");\n }\n }\n\n private void HandleClientMessage(string clientId, string message)\n {\n Log($\"鏀跺埌娑堟伅 [{clientId}]: {message}\");\n \n // 绀轰緥鍛戒护澶勭悊\n if (message.StartsWith(\"CMD:\"))\n {\n var cmd = message.Substring(4);\n switch (cmd.ToUpper())\n {\n case \"GET_CLIENTS\":\n var clients = string.Join(\",\", _clients.Keys);\n SendToClient(clientId, $\"CLIENTS|{clients}\");\n break;\n \n case \"PING\":\n SendToClient(clientId, \"PONG\");\n break;\n }\n }\n }\n\n // 鍙戦�佹秷鎭埌鎸囧畾瀹㈡埛绔痋n public async Task SendToClient(string clientId, string message)\n {\n if (_clients.TryGetValue(clientId, out var client))\n {\n try\n {\n var buffer = Encoding.UTF8.GetBytes(message);\n await client.WebSocket.SendAsync(\n new ArraySegment<byte>(buffer),\n WebSocketMessageType.Text,\n true,\n _cts.Token);\n \n client.LastActivity = DateTime.Now;\n }\n catch (Exception ex)\n {\n Log($\"鍙戦�佸け璐� [{clientId}]: {ex.Message}\");\n await CloseClient(clientId, \"鍙戦�佸け璐");\n }\n }\n }\n\n // 骞挎挱娑堟伅鍒版墍鏈夊鎴风\n public async Task Broadcast(string message)\n {\n var tasks = new List<Task>();\n foreach (var clientId in _clients.Keys.ToList())\n {\n tasks.Add(SendToClient(clientId, message));\n }\n await Task.WhenAll(tasks);\n }\n\n // 鍏抽棴瀹㈡埛绔繛鎺n private async Task CloseClient(string clientId, string reason)\n {\n if (_clients.TryRemove(clientId, out var client))\n {\n try\n {\n Log($\"鍏抽棴杩炴帴 [{clientId}]: {reason}\");\n await client.WebSocket.CloseAsync(\n WebSocketCloseStatus.NormalClosure,\n reason,\n _cts.Token);\n }\n catch\n {\n // 蹇界暐鍏抽棴寮傚父\n }\n }\n }\n\n // 蹇冭烦妫�娴媆n private async Task HeartbeatCheck()\n {\n while (!_cts.IsCancellationRequested)\n {\n await Task.Delay(HEARTBEAT_INTERVAL * 1000);\n \n foreach (var client in _clients.Values.ToList())\n {\n var inactiveTime = DateTime.Now - client.LastActivity;\n if (inactiveTime.TotalSeconds > HEARTBEAT_INTERVAL * 3)\n {\n await CloseClient(client.Id, $\"蹇冭烦瓒呮椂 ({inactiveTime.TotalSeconds}s)\");\n }\n }\n }\n }\n\n private void Log(string message) => OnLogMessage?.Invoke(message);\n\n public void Dispose()\n {\n _cts.Cancel();\n _listener.Stop();\n _listener.Close();\n \n // 鍏抽棴鎵�鏈夊鎴风\n foreach (var clientId in _clients.Keys.ToList())\n {\n CloseClient(clientId, \"鏈嶅姟鍣ㄥ叧闂璡").Wait();\n }\n }\n}\n\n// 瀹㈡埛绔俊鎭被\npublic class WebSocketClient\n{\n public WebSocket WebSocket { get; }\n public string Id { get; }\n public DateTime ConnectTime { get; }\n public DateTime LastActivity { get; set; }\n\n public WebSocketClient(WebSocket webSocket, string id)\n {\n WebSocket = webSocket;\n Id = id;\n ConnectTime = DateTime.Now;\n LastActivity = DateTime.Now;\n }\n}\n","children":[],"contentId":1444455253,"parent":null,"settled":true,"xmlData":{},"expectEnding":"```","language":"csharp"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 涓昏澧炲己鍔熻兘锛�","children":[],"contentId":78155194,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"1. **瀹㈡埛绔鐞�**","children":[],"contentId":155012796,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"浣跨敤 `ConcurrentDictionary` 瀛樺偍瀹㈡埛绔俊鎭�","children":[],"contentId":-82750270,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"姣忎釜瀹㈡埛绔垎閰嶅敮涓�ID锛圙UID锛�","children":[],"contentId":1920076682,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"璁板綍杩炴帴鏃堕棿鍜屾渶鍚庢椿鍔ㄦ椂闂�","children":[],"contentId":-328543493,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"2. **娑堟伅瀹氬悜鍙戦��**","children":[],"contentId":1775113234,"parent":null,"settled":true,"xmlData":{}},{"type":"code-block","content":"// 鍙戦�佺粰鎸囧畾瀹㈡埛绔痋nawait server.SendToClient(\"client-id\", \"鐗瑰畾娑堟伅\");\n\n// 骞挎挱缁欐墍鏈夊鎴风\nawait server.Broadcast(\"鍏ㄥ眬閫氱煡\");\n","children":[],"contentId":-324503113,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"language":"csharp","expectEnding":" ```"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"3. **娑堟伅鎺ユ敹澶勭悊**","children":[],"contentId":90724543,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"鐙珛鎺ユ敹寰幆澶勭悊姣忎釜瀹㈡埛绔殑娑堟伅","children":[],"contentId":1697372355,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"绀轰緥鍛戒护澶勭悊锛�","children":[],"contentId":1443327360,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"code-block","content":"CMD:GET_CLIENTS 鈫� 鑾峰彇鎵�鏈夊鎴风ID\nCMD:PING 鈫� 杩斿洖PONG鍝嶅簲\n","children":[],"contentId":-1699317361,"parent":null,"settled":true,"xmlData":{},"indentSize":5,"language":"text","expectEnding":" ```"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"4. **蹇冭烦妫�娴嬫満鍒�**","children":[],"contentId":-2119812931,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"瀹氭椂妫�鏌ュ鎴风娲诲姩鐘舵��","children":[],"contentId":-66529679,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"鑷姩鏂紑瓒呰繃90绉掓湭娲诲姩鐨勫鎴风","children":[],"contentId":1454190085,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"5. **杩炴帴鐢熷懡鍛ㄦ湡绠$悊**","children":[],"contentId":1668990312,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"娆㈣繋娑堟伅锛歚CONNECTED|{clientId}|{time}`","children":[],"contentId":441846327,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"鍏抽棴閫氱煡锛氬寘鍚叧闂師鍥�","children":[],"contentId":1951412950,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"鏈嶅姟鍣ㄥ叧闂椂鑷姩鏂紑鎵�鏈夊鎴风","children":[],"contentId":-952970920,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"line","content":"6. **閿欒澶勭悊**","children":[],"contentId":-645393184,"parent":null,"settled":true,"xmlData":{}},{"type":"list-item","content":"鎹曡幏鎵�鏈夌綉缁滃紓甯�","children":[],"contentId":-1025274836,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"璁板綍璇︾粏鐨勯敊璇棩蹇�","children":[],"contentId":-835053913,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"list-item","content":"鑷姩娓呯悊鏃犳晥杩炴帴","children":[],"contentId":838203022,"parent":null,"settled":true,"xmlData":{},"indentSize":3,"startSymbol":"-"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 闆嗘垚鍒版棩蹇楃郴缁�","children":[],"contentId":-652303460,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"code-block","content":"public class LocalLogger\n{\n private readonly LogWebSocketServer _wsServer;\n\n public LocalLogger(bool enableWebSocket = false)\n {\n if (enableWebSocket)\n {\n _wsServer = new LogWebSocketServer();\n _wsServer.OnLogMessage += msg => Console.WriteLine($\"[WS] {msg}\");\n Task.Run(() => _wsServer.StartAsync());\n }\n }\n\n private void LogInternal(LogMessageItem item)\n {\n // 鍘熸湁鏃ュ織鍐欏叆閫昏緫...\n \n // WebSocket 鎺ㄩ�乗n if (_wsServer != null) \n {\n // 骞挎挱鏃ュ織缁欐墍鏈夊鎴风\n _wsServer.Broadcast($\"LOG|{item.ToString()}\").Wait();\n \n // 鎴栧畾鍚戝彂閫佺粰鐗瑰畾瀹㈡埛绔痋n // _wsServer.SendToClient(\"monitor-client\", item.ToString()).Wait();\n }\n }\n}\n","children":[],"contentId":269401335,"parent":null,"settled":true,"xmlData":{},"expectEnding":"```","language":"csharp"},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"heading","content":" 瀹㈡埛绔娇鐢ㄧず渚嬶紙JavaScript锛�","children":[],"contentId":-2087243928,"parent":null,"settled":true,"xmlData":{},"level":3},{"type":"line","content":"","children":[],"contentId":0,"parent":null,"settled":true,"xmlData":{}},{"type":"code-block","content":"const ws = new WebSocket('ws://your-server-ip:8080/logs');\n\nws.onopen = () => console.log('宸茶繛鎺ユ棩蹇楁湇鍔″櫒');\nws.onmessage = e => {\n const [type, ...data] = e.data.split('|');\n \n switch(type) {\n case 'CONNECTED':\n console.log(`宸茶繛鎺ワ紝瀹㈡埛绔疘D: ${data[0]}锛屾椂闂�: ${data[1]}`);\n break;\n \n case 'LOG':\n ","children":[],"contentId":1904818216,"parent":null,"settled":false,"xmlData":{},"expectEnding":"```","language":"javascript"}],"parserState":{"line":348,"column":4,"offset":9214,"metadata":false,"buffer":"","closing":false,"currentParent":null,"moveCursor":true,"tagBuffer":"<","isCollectingTag":false},"content":"<think>\n鎴戜滑灏嗗湪LogWebSocketServer涓坊鍔犱互涓嬪姛鑳斤細\n 1. 鏀寔鍚戞寚瀹氬鎴风鍙戦�佹秷鎭紙閫氳繃鏌愪釜鏍囪瘑锛屼緥濡傚鎴风ID锛塡n 2. 鎺ユ敹瀹㈡埛绔彂鏉ョ殑娑堟伅锛屽苟澶勭悊锛堜緥濡傦紝瀹㈡埛绔彲浠ュ彂閫佸懡浠ゆ潵杩囨护鏃ュ織绾у埆锛塡n 3. 涓烘瘡涓鎴风鍒嗛厤鍞竴ID锛屽苟璁板綍瀹㈡埛绔殑鐩稿叧淇℃伅锛堝杩炴帴鏃堕棿銆佹渶鍚庢椿鍔ㄦ椂闂寸瓑锛塡n 4. 蹇冭烦鏈哄埗锛氭娴嬪鎴风鏄惁瀛樻椿锛屾柇寮�涓嶆椿璺冪殑杩炴帴\n\n 鐢变簬鍘熶唬鐮佷腑浣跨敤浜咹ttpListener鍜學ebSocket锛屾垜浠皢鎵╁睍杩欎釜绫汇�俓n\n 娉ㄦ剰锛氫负浜嗙畝鍖栵紝鎴戜滑浣跨敤涓�涓瓧鍏告潵瀛樺偍瀹㈡埛绔紙浠ebSocket涓洪敭锛屼絾涓轰簡瀹夊叏鍜岀鐞嗭紝鎴戜滑浣跨敤涓�涓寘瑁呯被ClientInfo锛塡n\n 姝ラ锛歕n 1. 瀹氫箟ClientInfo绫伙紝鍖呭惈WebSocket銆佸敮涓�ID銆佽繛鎺ユ椂闂淬�佹渶鍚庢椿鍔ㄦ椂闂寸瓑銆俓n 2. 淇敼_clients涓哄瓧鍏革紝閿负鍞竴ID锛屽�间负ClientInfo瀵硅薄銆俓n 3. 鍦ˋcceptWebSocketAsync鏃跺垱寤篊lientInfo骞跺姞鍏ュ瓧鍏搞�俓n 4. 娣诲姞涓�涓柟娉昐endToClient(string clientId, string message)鐢ㄤ簬鍚戞寚瀹氬鎴风鍙戦�佹秷鎭�俓n 5. 淇敼Broadcast鏂规硶锛屽彲浠ラ�夋嫨骞挎挱缁欐墍鏈夊鎴风鎴栨帓闄ゆ煇浜涘鎴风銆俓n 6. 鎺ユ敹瀹㈡埛绔秷鎭細姣忎釜瀹㈡埛绔繛鎺ュ悗鍚姩涓�涓帴鏀跺惊鐜紝澶勭悊娑堟伅锛堜緥濡傦紝璁剧疆杩囨护鏉′欢锛夈�俓n 7. 蹇冭烦妫�娴嬶細瀹氭椂妫�鏌ュ鎴风鐨勬渶鍚庢椿鍔ㄦ椂闂达紝鏂紑瓒呰繃涓�瀹氭椂闂存湭娲诲姩鐨勮繛鎺ャ�俓n\n 鐢变簬浠g爜杈冮暱锛屾垜浠�愭瀹炵幇銆俓n\n 娉ㄦ剰锛氭浠g爜绀轰緥灏嗗敖閲忎繚鎸佺畝娲侊紝浣嗗疄闄呯敓浜х幆澧冮渶瑕佹洿瀹屽杽鐨勯敊璇鐞嗐�俓n</think>\n浠ヤ笅鏄畬鍠勫悗鐨� `LogWebSocketServer` 瀹炵幇锛屾坊鍔犱簡瀹㈡埛绔鐞嗐�佸畾鍚戞秷鎭彂閫佸拰娑堟伅鎺ユ敹澶勭悊鍔熻兘锛歕n\n```csharp\npublic class LogWebSocketServer : IDisposable\n{\n private readonly HttpListener _listener;\n private readonly ConcurrentDictionary<string, WebSocketClient> _clients = new();\n private readonly CancellationTokenSource _cts = new();\n private readonly int _port;\n \n // 蹇冭烦妫�娴嬮棿闅旓紙绉掞級\n private const int HEARTBEAT_INTERVAL = 30;\n\n public event Action<string> OnLogMessage; // 鏈嶅姟鍣ㄦ棩蹇椾簨浠禱n\n public LogWebSocketServer(int port = 8080)\n {\n _port = port;\n _listener = new HttpListener();\n _listener.Prefixes.Add($\"http://*:{port}/logs/\");\n }\n\n public async Task StartAsync()\n {\n Log(\"WebSocket 鏈嶅姟鍣ㄥ惎鍔ㄤ腑...\");\n _listener.Start();\n Log($\"鐩戝惉绔彛: {_port}\");\n \n // 鍚姩蹇冭烦妫�娴媆n _ = Task.Run(HeartbeatCheck);\n\n while (!_cts.IsCancellationRequested)\n {\n try\n {\n var context = await _listener.GetContextAsync();\n if (context.Request.IsWebSocketRequest)\n {\n ProcessWebSocketRequest(context);\n }\n else\n {\n context.Response.StatusCode = 400;\n context.Response.Close();\n }\n }\n catch (Exception ex)\n {\n Log($\"鏈嶅姟鍣ㄩ敊璇�: {ex.Message}\");\n }\n }\n }\n\n private async void ProcessWebSocketRequest(HttpListenerContext context)\n {\n try\n {\n var webSocketContext = await context.AcceptWebSocketAsync(null);\n var clientId = Guid.NewGuid().ToString();\n var client = new WebSocketClient(webSocketContext.WebSocket, clientId);\n \n _clients.TryAdd(clientId, client);\n Log($\"瀹㈡埛绔繛鎺�: {clientId} ({_clients.Count} 鍦ㄧ嚎)\");\n \n // 鍙戦�佹杩庢秷鎭痋n await SendToClient(clientId, $\"CONNECTED|{clientId}|{DateTime.Now:yyyy-MM-dd HH:mm:ss}\");\n \n // 鍚姩娑堟伅鎺ユ敹寰幆\n _ = Task.Run(() => ReceiveMessages(client));\n }\n catch (Exception ex)\n {\n Log($\"杩炴帴澶辫触: {ex.Message}\");\n context.Response.StatusCode = 500;\n context.Response.Close();\n }\n }\n\n private async Task ReceiveMessages(WebSocketClient client)\n {\n var buffer = new byte[4096];\n try\n {\n while (client.WebSocket.State == WebSocketState.Open)\n {\n var result = await client.WebSocket.ReceiveAsync(\n new ArraySegment<byte>(buffer), \n _cts.Token);\n \n if (result.MessageType == WebSocketMessageType.Close)\n {\n await CloseClient(client.Id, \"瀹㈡埛绔叧闂繛鎺");\n break;\n }\n \n // 澶勭悊鎺ユ敹鍒扮殑娑堟伅\n var message = Encoding.UTF8.GetString(buffer, 0, result.Count);\n client.LastActivity = DateTime.Now;\n HandleClientMessage(client.Id, message);\n }\n }\n catch (Exception ex)\n {\n Log($\"鎺ユ敹閿欒 [{client.Id}]: {ex.Message}\");\n await CloseClient(client.Id, \"杩炴帴寮傚父\");\n }\n }\n\n private void HandleClientMessage(string clientId, string message)\n {\n Log($\"鏀跺埌娑堟伅 [{clientId}]: {message}\");\n \n // 绀轰緥鍛戒护澶勭悊\n if (message.StartsWith(\"CMD:\"))\n {\n var cmd = message.Substring(4);\n switch (cmd.ToUpper())\n {\n case \"GET_CLIENTS\":\n var clients = string.Join(\",\", _clients.Keys);\n SendToClient(clientId, $\"CLIENTS|{clients}\");\n break;\n \n case \"PING\":\n SendToClient(clientId, \"PONG\");\n break;\n }\n }\n }\n\n // 鍙戦�佹秷鎭埌鎸囧畾瀹㈡埛绔痋n public async Task SendToClient(string clientId, string message)\n {\n if (_clients.TryGetValue(clientId, out var client))\n {\n try\n {\n var buffer = Encoding.UTF8.GetBytes(message);\n await client.WebSocket.SendAsync(\n new ArraySegment<byte>(buffer),\n WebSocketMessageType.Text,\n true,\n _cts.Token);\n \n client.LastActivity = DateTime.Now;\n }\n catch (Exception ex)\n {\n Log($\"鍙戦�佸け璐� [{clientId}]: {ex.Message}\");\n await CloseClient(clientId, \"鍙戦�佸け璐");\n }\n }\n }\n\n // 骞挎挱娑堟伅鍒版墍鏈夊鎴风\n public async Task Broadcast(string message)\n {\n var tasks = new List<Task>();\n foreach (var clientId in _clients.Keys.ToList())\n {\n tasks.Add(SendToClient(clientId, message));\n }\n await Task.WhenAll(tasks);\n }\n\n // 鍏抽棴瀹㈡埛绔繛鎺n private async Task CloseClient(string clientId, string reason)\n {\n if (_clients.TryRemove(clientId, out var client))\n {\n try\n {\n Log($\"鍏抽棴杩炴帴 [{clientId}]: {reason}\");\n await client.WebSocket.CloseAsync(\n WebSocketCloseStatus.NormalClosure,\n reason,\n _cts.Token);\n }\n catch\n {\n // 蹇界暐鍏抽棴寮傚父\n }\n }\n }\n\n // 蹇冭烦妫�娴媆n private async Task HeartbeatCheck()\n {\n while (!_cts.IsCancellationRequested)\n {\n await Task.Delay(HEARTBEAT_INTERVAL * 1000);\n \n foreach (var client in _clients.Values.ToList())\n {\n var inactiveTime = DateTime.Now - client.LastActivity;\n if (inactiveTime.TotalSeconds > HEARTBEAT_INTERVAL * 3)\n {\n await CloseClient(client.Id, $\"蹇冭烦瓒呮椂 ({inactiveTime.TotalSeconds}s)\");\n }\n }\n }\n }\n\n private void Log(string message) => OnLogMessage?.Invoke(message);\n\n public void Dispose()\n {\n _cts.Cancel();\n _listener.Stop();\n _listener.Close();\n \n // 鍏抽棴鎵�鏈夊鎴风\n foreach (var clientId in _clients.Keys.ToList())\n {\n CloseClient(clientId, \"鏈嶅姟鍣ㄥ叧闂璡").Wait();\n }\n }\n}\n\n// 瀹㈡埛绔俊鎭被\npublic class WebSocketClient\n{\n public WebSocket WebSocket { get; }\n public string Id { get; }\n public DateTime ConnectTime { get; }\n public DateTime LastActivity { get; set; }\n\n public WebSocketClient(WebSocket webSocket, string id)\n {\n WebSocket = webSocket;\n Id = id;\n ConnectTime = DateTime.Now;\n LastActivity = DateTime.Now;\n }\n}\n```\n\n### 涓昏澧炲己鍔熻兘锛歕n\n1. **瀹㈡埛绔鐞�**\n - 浣跨敤 `ConcurrentDictionary` 瀛樺偍瀹㈡埛绔俊鎭痋n - 姣忎釜瀹㈡埛绔垎閰嶅敮涓�ID锛圙UID锛塡n - 璁板綍杩炴帴鏃堕棿鍜屾渶鍚庢椿鍔ㄦ椂闂碶n\n2. **娑堟伅瀹氬悜鍙戦��**\n ```csharp\n // 鍙戦�佺粰鎸囧畾瀹㈡埛绔痋n await server.SendToClient(\"client-id\", \"鐗瑰畾娑堟伅\");\n \n // 骞挎挱缁欐墍鏈夊鎴风\n await server.Broadcast(\"鍏ㄥ眬閫氱煡\");\n ```\n\n3. **娑堟伅鎺ユ敹澶勭悊**\n - 鐙珛鎺ユ敹寰幆澶勭悊姣忎釜瀹㈡埛绔殑娑堟伅\n - 绀轰緥鍛戒护澶勭悊锛歕n ```text\n CMD:GET_CLIENTS 鈫� 鑾峰彇鎵�鏈夊鎴风ID\n CMD:PING 鈫� 杩斿洖PONG鍝嶅簲\n ```\n\n4. **蹇冭烦妫�娴嬫満鍒�**\n - 瀹氭椂妫�鏌ュ鎴风娲诲姩鐘舵�乗n - 鑷姩鏂紑瓒呰繃90绉掓湭娲诲姩鐨勫鎴风\n\n5. **杩炴帴鐢熷懡鍛ㄦ湡绠$悊**\n - 娆㈣繋娑堟伅锛歚CONNECTED|{clientId}|{time}`\n - 鍏抽棴閫氱煡锛氬寘鍚叧闂師鍥燶n - 鏈嶅姟鍣ㄥ叧闂椂鑷姩鏂紑鎵�鏈夊鎴风\n\n6. **閿欒澶勭悊**\n - 鎹曡幏鎵�鏈夌綉缁滃紓甯竆n - 璁板綍璇︾粏鐨勯敊璇棩蹇梊n - 鑷姩娓呯悊鏃犳晥杩炴帴\n\n### 闆嗘垚鍒版棩蹇楃郴缁焅n\n```csharp\npublic class LocalLogger\n{\n private readonly LogWebSocketServer _wsServer;\n\n public LocalLogger(bool enableWebSocket = false)\n {\n if (enableWebSocket)\n {\n _wsServer = new LogWebSocketServer();\n _wsServer.OnLogMessage += msg => Console.WriteLine($\"[WS] {msg}\");\n Task.Run(() => _wsServer.StartAsync());\n }\n }\n\n private void LogInternal(LogMessageItem item)\n {\n // 鍘熸湁鏃ュ織鍐欏叆閫昏緫...\n \n // WebSocket 鎺ㄩ�乗n if (_wsServer != null) \n {\n // 骞挎挱鏃ュ織缁欐墍鏈夊鎴风\n _wsServer.Broadcast($\"LOG|{item.ToString()}\").Wait();\n \n // 鎴栧畾鍚戝彂閫佺粰鐗瑰畾瀹㈡埛绔痋n // _wsServer.SendToClient(\"monitor-client\", item.ToString()).Wait();\n }\n }\n}\n```\n\n### 瀹㈡埛绔娇鐢ㄧず渚嬶紙JavaScript锛塡n\n```javascript\nconst ws = new WebSocket('ws://your-server-ip:8080/logs');\n\nws.onopen = () => console.log('宸茶繛鎺ユ棩蹇楁湇鍔″櫒');\nws.onmessage = e => {\n const [type, ...data] = e.data.split('|');\n \n switch(type) {\n case 'CONNECTED':\n console.log(`宸茶繛鎺ワ紝瀹㈡埛绔疘D: ${data[0]}锛屾椂闂�: ${data[1]}`);\n break;\n \n case 'LOG':\n ","columns":[6,29,31,38,42,26,-1,41,-1,65,-1,3,47,39,43,67,38,44,38,-1,14,-1,34,7,56,-1,8,44,0,43,83,57,30,3,15,45,-1,55,-1,45,4,20,38,56,4,-1,33,4,34,25,29,7,16,36,-1,44,8,14,12,63,54,16,52,16,19,16,53,44,16,12,31,12,43,12,8,4,-1,74,4,10,8,75,52,82,11,45,59,11,20,100,11,22,55,8,27,8,38,45,36,8,4,-1,61,4,35,10,8,64,12,64,51,31,15,68,16,59,25,16,15,26,78,50,55,12,8,27,8,52,48,8,4,-1,68,4,44,7,16,38,8,42,33,12,34,65,64,25,19,27,50,25,12,8,4,-1,16,66,4,58,8,14,12,60,48,50,45,24,31,15,50,12,31,12,55,51,12,8,4,-1,16,46,4,36,55,8,54,8,33,4,-1,13,65,4,56,8,14,12,51,49,54,26,31,12,16,12,24,12,8,4,-1,10,38,4,44,8,55,11,59,12,69,70,16,88,16,12,8,4,-1,69,-1,24,4,21,24,25,7,17,55,8,49,8,4,0,-1,8,27,0,38,28,39,45,-1,57,4,29,15,34,35,4,0,0,-1,10,-1,11,37,21,17,-1,12,11,13,49,2,13,33,5,-1,12,20,11,11,34,33,7,-1,12,15,20,-1,14,38,15,19,-1,10,12,13,12,-1,10,-1,8,23,0,49,-1,51,4,27,8,48,77,50,8,4,-1,48,4,21,7,22,30,8,24,64,11,25,79,8,4,0,0,-1,22,-1,12,57,-1,41,20,43,1,15,20,57,11,5,14]},"source":null,"error":null,"id":"01996f28b8f77332993d5f0fc5b18885","localReferences":null,"references":[{"uri":{"scheme":"file","authority":"","path":"file:///E:/4.閲嶆瀯/WIDESEAWCS/InfrastructureWCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/LogWebSocketServer.cs","query":"","fragment":""},"range":[{"character":0,"line":11},{"character":0,"line":51}],"text":null,"isSourceFile":true}],"followup":null,"topic":"","score":null,"command":"","changeToOptimize":null,"button":null,"knowledge":null,"knowledgeReferences":[],"knowledgeStatus":null,"variables":null,"selectedRange":null,"actions":[],"selectedRanges":null,"createdAt":1758506636662}],"source":"codeAction"}}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatHistorySession.json b/Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatHistorySession.json
deleted file mode 100644
index 0637a08..0000000
--- a/Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatHistorySession.json
+++ /dev/null
@@ -1 +0,0 @@
-[]
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db b/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db
deleted file mode 100644
index ebfbf61..0000000
--- a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db
+++ /dev/null
Binary files differ
diff --git a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db b/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db
deleted file mode 100644
index 5e343b9..0000000
--- a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db
+++ /dev/null
Binary files differ
diff --git a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/config/applicationhost.config b/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/config/applicationhost.config
index fd2cb23..cdd2df8 100644
--- a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/config/applicationhost.config
+++ b/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/config/applicationhost.config
@@ -1,4 +1,4 @@
-锘�<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!--
IIS configuration sections.
@@ -18,7 +18,8 @@
-->
<configuration>
- <!--
+
+ <!--
The <configSections> section controls the registration of sections.
Section is the basic unit of deployment, locking, searching and
@@ -45,954 +46,981 @@
</location>
-->
- <configSections>
- <sectionGroup name="system.applicationHost">
- <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- </sectionGroup>
- <sectionGroup name="system.webServer">
- <section name="asp" overrideModeDefault="Deny" />
- <section name="caching" overrideModeDefault="Allow" />
- <section name="cgi" overrideModeDefault="Deny" />
- <section name="defaultDocument" overrideModeDefault="Allow" />
- <section name="directoryBrowse" overrideModeDefault="Allow" />
- <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="globalModules" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="handlers" overrideModeDefault="Deny" />
- <section name="httpCompression" overrideModeDefault="Allow" allowDefinition="Everywhere" />
- <section name="httpErrors" overrideModeDefault="Allow" />
- <section name="httpLogging" overrideModeDefault="Deny" />
- <section name="httpProtocol" overrideModeDefault="Allow" />
- <section name="httpRedirect" overrideModeDefault="Allow" />
- <section name="httpTracing" overrideModeDefault="Deny" />
- <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
- <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
- <section name="applicationInitialization" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
- <section name="odbcLogging" overrideModeDefault="Deny" />
- <sectionGroup name="security">
- <section name="access" overrideModeDefault="Deny" />
- <section name="applicationDependencies" overrideModeDefault="Deny" />
- <sectionGroup name="authentication">
- <section name="anonymousAuthentication" overrideModeDefault="Deny" />
- <section name="basicAuthentication" overrideModeDefault="Deny" />
- <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" />
- <section name="digestAuthentication" overrideModeDefault="Deny" />
- <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" />
- <section name="windowsAuthentication" overrideModeDefault="Deny" />
+ <configSections>
+ <sectionGroup name="system.applicationHost">
+ <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
</sectionGroup>
- <section name="authorization" overrideModeDefault="Allow" />
- <section name="ipSecurity" overrideModeDefault="Deny" />
- <section name="dynamicIpSecurity" overrideModeDefault="Deny" />
- <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="requestFiltering" overrideModeDefault="Allow" />
- </sectionGroup>
- <section name="serverRuntime" overrideModeDefault="Deny" />
- <section name="serverSideInclude" overrideModeDefault="Deny" />
- <section name="staticContent" overrideModeDefault="Allow" />
- <sectionGroup name="tracing">
- <section name="traceFailedRequests" overrideModeDefault="Allow" />
- <section name="traceProviderDefinitions" overrideModeDefault="Deny" />
- </sectionGroup>
- <section name="urlCompression" overrideModeDefault="Allow" />
- <section name="validation" overrideModeDefault="Allow" />
- <sectionGroup name="webdav">
- <section name="globalSettings" overrideModeDefault="Deny" />
- <section name="authoring" overrideModeDefault="Deny" />
- <section name="authoringRules" overrideModeDefault="Deny" />
- </sectionGroup>
- <sectionGroup name="rewrite">
- <section name="allowedServerVariables" overrideModeDefault="Deny" />
- <section name="rules" overrideModeDefault="Allow" />
- <section name="outboundRules" overrideModeDefault="Allow" />
- <section name="globalRules" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
- <section name="providers" overrideModeDefault="Allow" />
- <section name="rewriteMaps" overrideModeDefault="Allow" />
- </sectionGroup>
- <section name="webSocket" overrideModeDefault="Deny" />
- <section name="aspNetCore" overrideModeDefault="Allow" />
- </sectionGroup>
- </configSections>
- <configProtectedData>
- <providers>
- <add name="IISWASOnlyRsaProvider" type="" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useMachineContainer="true" useOAEP="false" />
- <add name="AesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisConfigurationKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAA/HKxkz6alrlAPez0IUgujj/6k3WxCDriHp6jvpv3yEZmo7h6SMzGLxo4mTrIQVHSkB7tmElHKfUFTzE2BWF7nFWHY6Z6qmGBauFzwJMwESjril7Gjz69RBFH259HQ6aRDq9Xfx7U7H4HtdmnKNqGjgl/hwPQBGeIlWiDh+sYv3vKB0QU971tjX6H2B+9armlnC8UOuA6JYMDMI/VLLL16sng0fWAy5JYe0YVABVjiAWDW264RZW9Tr1Oax4qHZKg+SdjULxeOc2YmpX+d0yeITo1HkPF1hN1gHpIPIUDo05ilHUNfR3OkjVCIQK4cFKCq1s8NH+y+13MxUC4Fn1AlQ==" />
- <add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAALmU8lTC+v2qtfQiiiquvvLpUQqKLEXs+jSKoWCM/uPhyB++k4dwug19mGidNK5FYiWK2KYE1yhjVJcbp12E98Q0R2nT7eBiCMY2JairxQ591rqABK7keGaIjwH7PwGzSpILl3RJ4YFvJ/7ZXEJxeDZIjW8ZxWVXx+/VyHs9U3WguLEkgMUX3jrxJi8LouxaIVPJAv/YQ1ZCWs8zImitxX/C/7o7yaIxznfsN5nGQzQfpUDPeby99aw2zPVTtZI2LaWIBON8guABvZ6JtJVDWmfdK6sodbnwdZkr6/Z2rfvamT1dC1SpQrGG7ulR/f9/GXvCaW10ZVKxekBF/CYlNMg==" />
- </providers>
- </configProtectedData>
- <system.applicationHost>
- <applicationPools>
- <add name="Clr4IntegratedAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
- <add name="Clr4ClassicAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
- <add name="Clr2IntegratedAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
- <add name="Clr2ClassicAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
- <add name="UnmanagedClassicAppPool" managedRuntimeVersion="" managedPipelineMode="Classic" autoStart="true" />
- <add name="WIDESEAWCS_Server AppPool" managedRuntimeVersion="" />
- <applicationPoolDefaults managedRuntimeVersion="v4.0">
- <processModel loadUserProfile="true" setProfileEnvironment="false" />
- </applicationPoolDefaults>
- </applicationPools>
- <!--
+
+ <sectionGroup name="system.webServer">
+ <section name="asp" overrideModeDefault="Deny" />
+ <section name="caching" overrideModeDefault="Allow" />
+ <section name="cgi" overrideModeDefault="Deny" />
+ <section name="defaultDocument" overrideModeDefault="Allow" />
+ <section name="directoryBrowse" overrideModeDefault="Allow" />
+ <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="globalModules" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="handlers" overrideModeDefault="Deny" />
+ <section name="httpCompression" overrideModeDefault="Allow" allowDefinition="Everywhere" />
+ <section name="httpErrors" overrideModeDefault="Allow" />
+ <section name="httpLogging" overrideModeDefault="Deny" />
+ <section name="httpProtocol" overrideModeDefault="Allow" />
+ <section name="httpRedirect" overrideModeDefault="Allow" />
+ <section name="httpTracing" overrideModeDefault="Deny" />
+ <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+ <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+ <section name="applicationInitialization" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
+ <section name="odbcLogging" overrideModeDefault="Deny" />
+ <sectionGroup name="security">
+ <section name="access" overrideModeDefault="Deny" />
+ <section name="applicationDependencies" overrideModeDefault="Deny" />
+ <sectionGroup name="authentication">
+ <section name="anonymousAuthentication" overrideModeDefault="Deny" />
+ <section name="basicAuthentication" overrideModeDefault="Deny" />
+ <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+ <section name="digestAuthentication" overrideModeDefault="Deny" />
+ <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+ <section name="windowsAuthentication" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <section name="authorization" overrideModeDefault="Allow" />
+ <section name="ipSecurity" overrideModeDefault="Deny" />
+ <section name="dynamicIpSecurity" overrideModeDefault="Deny" />
+ <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="requestFiltering" overrideModeDefault="Allow" />
+ </sectionGroup>
+ <section name="serverRuntime" overrideModeDefault="Deny" />
+ <section name="serverSideInclude" overrideModeDefault="Deny" />
+ <section name="staticContent" overrideModeDefault="Allow" />
+ <sectionGroup name="tracing">
+ <section name="traceFailedRequests" overrideModeDefault="Allow" />
+ <section name="traceProviderDefinitions" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <section name="urlCompression" overrideModeDefault="Allow" />
+ <section name="validation" overrideModeDefault="Allow" />
+ <sectionGroup name="webdav">
+ <section name="globalSettings" overrideModeDefault="Deny" />
+ <section name="authoring" overrideModeDefault="Deny" />
+ <section name="authoringRules" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <sectionGroup name="rewrite">
+ <section name="allowedServerVariables" overrideModeDefault="Deny" />
+ <section name="rules" overrideModeDefault="Allow" />
+ <section name="outboundRules" overrideModeDefault="Allow" />
+ <section name="globalRules" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+ <section name="providers" overrideModeDefault="Allow" />
+ <section name="rewriteMaps" overrideModeDefault="Allow" />
+ </sectionGroup>
+ <section name="webSocket" overrideModeDefault="Deny" />
+ <section name="aspNetCore" overrideModeDefault="Allow" /></sectionGroup>
+ </configSections>
+
+ <configProtectedData>
+ <providers>
+ <add name="IISWASOnlyRsaProvider" type="" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useMachineContainer="true" useOAEP="false" />
+ <add name="AesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisConfigurationKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAA/HKxkz6alrlAPez0IUgujj/6k3WxCDriHp6jvpv3yEZmo7h6SMzGLxo4mTrIQVHSkB7tmElHKfUFTzE2BWF7nFWHY6Z6qmGBauFzwJMwESjril7Gjz69RBFH259HQ6aRDq9Xfx7U7H4HtdmnKNqGjgl/hwPQBGeIlWiDh+sYv3vKB0QU971tjX6H2B+9armlnC8UOuA6JYMDMI/VLLL16sng0fWAy5JYe0YVABVjiAWDW264RZW9Tr1Oax4qHZKg+SdjULxeOc2YmpX+d0yeITo1HkPF1hN1gHpIPIUDo05ilHUNfR3OkjVCIQK4cFKCq1s8NH+y+13MxUC4Fn1AlQ==" />
+ <add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAALmU8lTC+v2qtfQiiiquvvLpUQqKLEXs+jSKoWCM/uPhyB++k4dwug19mGidNK5FYiWK2KYE1yhjVJcbp12E98Q0R2nT7eBiCMY2JairxQ591rqABK7keGaIjwH7PwGzSpILl3RJ4YFvJ/7ZXEJxeDZIjW8ZxWVXx+/VyHs9U3WguLEkgMUX3jrxJi8LouxaIVPJAv/YQ1ZCWs8zImitxX/C/7o7yaIxznfsN5nGQzQfpUDPeby99aw2zPVTtZI2LaWIBON8guABvZ6JtJVDWmfdK6sodbnwdZkr6/Z2rfvamT1dC1SpQrGG7ulR/f9/GXvCaW10ZVKxekBF/CYlNMg==" />
+ </providers>
+ </configProtectedData>
+
+ <system.applicationHost>
+
+ <applicationPools>
+ <add name="Clr4IntegratedAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr4ClassicAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr2IntegratedAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr2ClassicAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="UnmanagedClassicAppPool" managedRuntimeVersion="" managedPipelineMode="Classic" autoStart="true" />
+ <applicationPoolDefaults managedRuntimeVersion="v4.0">
+ <processModel loadUserProfile="true" setProfileEnvironment="false" />
+ </applicationPoolDefaults>
+ </applicationPools>
+
+ <!--
The <listenerAdapters> section defines the protocols with which the
Windows Process Activation Service (WAS) binds.
-->
- <listenerAdapters>
- <add name="http" />
- </listenerAdapters>
- <sites>
- <site name="WebSite1" id="1" serverAutoStart="true">
- <application path="/">
- <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
- </application>
- <bindings>
- <binding protocol="http" bindingInformation=":8080:localhost" />
- </bindings>
- </site>
- <site name="WIDESEAWCS_Server" id="2">
- <application path="/" applicationPool="WIDESEAWCS_Server AppPool">
- <virtualDirectory path="/" physicalPath="E:\WIDESEAWCS\InfrastructureWCS\WIDESEAWCS_Server\WIDESEAWCS_Server" />
- </application>
- <bindings>
- <binding protocol="http" bindingInformation="*:27002:localhost" />
- </bindings>
- </site>
- <siteDefaults>
- <!-- To enable logging, please change the below attribute "enabled" to "true" -->
- <logFile logFormat="W3C" directory="%AppData%\Microsoft\IISExpressLogs" enabled="false" />
- <traceFailedRequestsLogging directory="%AppData%\Microsoft" enabled="false" maxLogFileSizeKB="1024" />
- </siteDefaults>
- <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
- <virtualDirectoryDefaults allowSubDirConfig="true" />
- </sites>
- <webLimits />
- </system.applicationHost>
- <system.webServer>
- <serverRuntime />
- <asp scriptErrorSentToBrowser="true">
- <cache diskTemplateCacheDirectory="%TEMP%\iisexpress\ASP Compiled Templates" />
- <limits />
- </asp>
- <caching enabled="true" enableKernelCache="true"></caching>
- <cgi />
- <defaultDocument enabled="true">
- <files>
- <add value="Default.htm" />
- <add value="Default.asp" />
- <add value="index.htm" />
- <add value="index.html" />
- <add value="iisstart.htm" />
- <add value="default.aspx" />
- </files>
- </defaultDocument>
- <directoryBrowse enabled="false" />
- <fastCgi />
- <!--
+ <listenerAdapters>
+ <add name="http" />
+ </listenerAdapters>
+
+ <sites>
+ <site name="WebSite1" id="1" serverAutoStart="true">
+ <application path="/">
+ <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
+ </application>
+ <bindings>
+ <binding protocol="http" bindingInformation=":8080:localhost" />
+ </bindings>
+ </site>
+ <siteDefaults>
+ <!-- To enable logging, please change the below attribute "enabled" to "true" -->
+ <logFile logFormat="W3C" directory="%AppData%\Microsoft\IISExpressLogs" enabled="false" />
+ <traceFailedRequestsLogging directory="%AppData%\Microsoft" enabled="false" maxLogFileSizeKB="1024" />
+ </siteDefaults>
+ <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
+ <virtualDirectoryDefaults allowSubDirConfig="true" />
+ </sites>
+
+ <webLimits />
+
+ </system.applicationHost>
+
+ <system.webServer>
+
+ <serverRuntime />
+
+ <asp scriptErrorSentToBrowser="true">
+ <cache diskTemplateCacheDirectory="%TEMP%\iisexpress\ASP Compiled Templates" />
+ <limits />
+ </asp>
+
+ <caching enabled="true" enableKernelCache="true">
+ </caching>
+
+ <cgi />
+
+ <defaultDocument enabled="true">
+ <files>
+ <add value="Default.htm" />
+ <add value="Default.asp" />
+ <add value="index.htm" />
+ <add value="index.html" />
+ <add value="iisstart.htm" />
+ <add value="default.aspx" />
+ </files>
+ </defaultDocument>
+
+ <directoryBrowse enabled="false" />
+
+ <fastCgi />
+
+ <!--
The <globalModules> section defines all native-code modules.
To enable a module, specify it in the <modules> section.
-->
- <globalModules>
- <add name="HttpLoggingModule" image="%IIS_BIN%\loghttp.dll" />
- <add name="UriCacheModule" image="%IIS_BIN%\cachuri.dll" />
- <add name="TokenCacheModule" image="%IIS_BIN%\cachtokn.dll" />
- <add name="DynamicCompressionModule" image="%IIS_BIN%\compdyn.dll" />
- <add name="StaticCompressionModule" image="%IIS_BIN%\compstat.dll" />
- <add name="DefaultDocumentModule" image="%IIS_BIN%\defdoc.dll" />
- <add name="DirectoryListingModule" image="%IIS_BIN%\dirlist.dll" />
- <add name="ProtocolSupportModule" image="%IIS_BIN%\protsup.dll" />
- <add name="HttpRedirectionModule" image="%IIS_BIN%\redirect.dll" />
- <add name="ServerSideIncludeModule" image="%IIS_BIN%\iis_ssi.dll" />
- <add name="StaticFileModule" image="%IIS_BIN%\static.dll" />
- <add name="AnonymousAuthenticationModule" image="%IIS_BIN%\authanon.dll" />
- <add name="CertificateMappingAuthenticationModule" image="%IIS_BIN%\authcert.dll" />
- <add name="UrlAuthorizationModule" image="%IIS_BIN%\urlauthz.dll" />
- <add name="BasicAuthenticationModule" image="%IIS_BIN%\authbas.dll" />
- <add name="WindowsAuthenticationModule" image="%IIS_BIN%\authsspi.dll" />
- <add name="IISCertificateMappingAuthenticationModule" image="%IIS_BIN%\authmap.dll" />
- <add name="IpRestrictionModule" image="%IIS_BIN%\iprestr.dll" />
- <add name="DynamicIpRestrictionModule" image="%IIS_BIN%\diprestr.dll" />
- <add name="RequestFilteringModule" image="%IIS_BIN%\modrqflt.dll" />
- <add name="CustomLoggingModule" image="%IIS_BIN%\logcust.dll" />
- <add name="CustomErrorModule" image="%IIS_BIN%\custerr.dll" />
- <add name="FailedRequestsTracingModule" image="%IIS_BIN%\iisfreb.dll" />
- <add name="RequestMonitorModule" image="%IIS_BIN%\iisreqs.dll" />
- <add name="IsapiModule" image="%IIS_BIN%\isapi.dll" />
- <add name="IsapiFilterModule" image="%IIS_BIN%\filter.dll" />
- <add name="CgiModule" image="%IIS_BIN%\cgi.dll" />
- <add name="FastCgiModule" image="%IIS_BIN%\iisfcgi.dll" />
- <!-- <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> -->
- <add name="RewriteModule" image="%IIS_BIN%\rewrite.dll" />
- <add name="ConfigurationValidationModule" image="%IIS_BIN%\validcfg.dll" />
- <add name="WebSocketModule" image="%IIS_BIN%\iiswsock.dll" />
- <add name="WebMatrixSupportModule" image="%IIS_BIN%\webmatrixsup.dll" />
- <add name="ManagedEngine" image="%windir%\Microsoft.NET\Framework\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness32" />
- <add name="ManagedEngine64" image="%windir%\Microsoft.NET\Framework64\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness64" />
- <add name="ManagedEngineV4.0_32bit" image="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness32" />
- <add name="ManagedEngineV4.0_64bit" image="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness64" />
- <add name="ApplicationInitializationModule" image="%IIS_BIN%\warmup.dll" />
- <add name="AspNetCoreModule" image="%IIS_BIN%\aspnetcore.dll" />
- <add name="AspNetCoreModuleV2" image="%IIS_BIN%\Asp.Net Core Module\V2\aspnetcorev2.dll" />
- </globalModules>
- <httpCompression directory="%TEMP%">
- <scheme name="gzip" dll="%IIS_BIN%\gzip.dll" />
- <dynamicTypes>
- <add mimeType="text/*" enabled="true" />
- <add mimeType="message/*" enabled="true" />
- <add mimeType="application/x-javascript" enabled="true" />
- <add mimeType="application/javascript" enabled="true" />
- <add mimeType="*/*" enabled="false" />
- <add mimeType="text/event-stream" enabled="false" />
- </dynamicTypes>
- <staticTypes>
- <add mimeType="text/*" enabled="true" />
- <add mimeType="message/*" enabled="true" />
- <add mimeType="application/javascript" enabled="true" />
- <add mimeType="application/atom+xml" enabled="true" />
- <add mimeType="application/xaml+xml" enabled="true" />
- <add mimeType="image/svg+xml" enabled="true" />
- <add mimeType="*/*" enabled="false" />
- </staticTypes>
- </httpCompression>
- <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">
- <error statusCode="401" prefixLanguageFilePath="%IIS_BIN%\custerr" path="401.htm" />
- <error statusCode="403" prefixLanguageFilePath="%IIS_BIN%\custerr" path="403.htm" />
- <error statusCode="404" prefixLanguageFilePath="%IIS_BIN%\custerr" path="404.htm" />
- <error statusCode="405" prefixLanguageFilePath="%IIS_BIN%\custerr" path="405.htm" />
- <error statusCode="406" prefixLanguageFilePath="%IIS_BIN%\custerr" path="406.htm" />
- <error statusCode="412" prefixLanguageFilePath="%IIS_BIN%\custerr" path="412.htm" />
- <error statusCode="500" prefixLanguageFilePath="%IIS_BIN%\custerr" path="500.htm" />
- <error statusCode="501" prefixLanguageFilePath="%IIS_BIN%\custerr" path="501.htm" />
- <error statusCode="502" prefixLanguageFilePath="%IIS_BIN%\custerr" path="502.htm" />
- </httpErrors>
- <httpLogging dontLog="false" />
- <httpProtocol>
- <customHeaders>
- <clear />
- <add name="X-Powered-By" value="ASP.NET" />
- </customHeaders>
- <redirectHeaders>
- <clear />
- </redirectHeaders>
- </httpProtocol>
- <httpRedirect enabled="false" />
- <httpTracing />
- <isapiFilters>
- <filter name="ASP.Net_2.0.50727-64" path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv2.0" />
- <filter name="ASP.Net_2.0.50727.0" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv2.0" />
- <filter name="ASP.Net_2.0_for_v1.1" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="runtimeVersionv1.1" />
- <filter name="ASP.Net_4.0_32bit" path="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv4.0" />
- <filter name="ASP.Net_4.0_64bit" path="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv4.0" />
- </isapiFilters>
- <odbcLogging />
- <security>
- <access sslFlags="None" />
- <applicationDependencies>
- <application name="Active Server Pages" groupId="ASP" />
- </applicationDependencies>
- <authentication>
- <anonymousAuthentication enabled="true" userName="" />
- <basicAuthentication enabled="false" />
- <clientCertificateMappingAuthentication enabled="false" />
- <digestAuthentication enabled="false" />
- <iisClientCertificateMappingAuthentication enabled="false"></iisClientCertificateMappingAuthentication>
- <windowsAuthentication enabled="false">
- <providers>
- <add value="Negotiate" />
- <add value="NTLM" />
- </providers>
- </windowsAuthentication>
- </authentication>
- <authorization>
- <add accessType="Allow" users="*" />
- </authorization>
- <ipSecurity allowUnlisted="true" />
- <isapiCgiRestriction notListedIsapisAllowed="true" notListedCgisAllowed="true">
- <add path="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
- <add path="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
- <add path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
- <add path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
- </isapiCgiRestriction>
- <requestFiltering>
- <fileExtensions allowUnlisted="true" applyToWebDAV="true">
- <add fileExtension=".asa" allowed="false" />
- <add fileExtension=".asax" allowed="false" />
- <add fileExtension=".ascx" allowed="false" />
- <add fileExtension=".master" allowed="false" />
- <add fileExtension=".skin" allowed="false" />
- <add fileExtension=".browser" allowed="false" />
- <add fileExtension=".sitemap" allowed="false" />
- <add fileExtension=".config" allowed="false" />
- <add fileExtension=".cs" allowed="false" />
- <add fileExtension=".csproj" allowed="false" />
- <add fileExtension=".vb" allowed="false" />
- <add fileExtension=".vbproj" allowed="false" />
- <add fileExtension=".webinfo" allowed="false" />
- <add fileExtension=".licx" allowed="false" />
- <add fileExtension=".resx" allowed="false" />
- <add fileExtension=".resources" allowed="false" />
- <add fileExtension=".mdb" allowed="false" />
- <add fileExtension=".vjsproj" allowed="false" />
- <add fileExtension=".java" allowed="false" />
- <add fileExtension=".jsl" allowed="false" />
- <add fileExtension=".ldb" allowed="false" />
- <add fileExtension=".dsdgm" allowed="false" />
- <add fileExtension=".ssdgm" allowed="false" />
- <add fileExtension=".lsad" allowed="false" />
- <add fileExtension=".ssmap" allowed="false" />
- <add fileExtension=".cd" allowed="false" />
- <add fileExtension=".dsprototype" allowed="false" />
- <add fileExtension=".lsaprototype" allowed="false" />
- <add fileExtension=".sdm" allowed="false" />
- <add fileExtension=".sdmDocument" allowed="false" />
- <add fileExtension=".mdf" allowed="false" />
- <add fileExtension=".ldf" allowed="false" />
- <add fileExtension=".ad" allowed="false" />
- <add fileExtension=".dd" allowed="false" />
- <add fileExtension=".ldd" allowed="false" />
- <add fileExtension=".sd" allowed="false" />
- <add fileExtension=".adprototype" allowed="false" />
- <add fileExtension=".lddprototype" allowed="false" />
- <add fileExtension=".exclude" allowed="false" />
- <add fileExtension=".refresh" allowed="false" />
- <add fileExtension=".compiled" allowed="false" />
- <add fileExtension=".msgx" allowed="false" />
- <add fileExtension=".vsdisco" allowed="false" />
- <add fileExtension=".rules" allowed="false" />
- </fileExtensions>
- <verbs allowUnlisted="true" applyToWebDAV="true" />
- <hiddenSegments applyToWebDAV="true">
- <add segment="web.config" />
- <add segment="bin" />
- <add segment="App_code" />
- <add segment="App_GlobalResources" />
- <add segment="App_LocalResources" />
- <add segment="App_WebReferences" />
- <add segment="App_Data" />
- <add segment="App_Browsers" />
- </hiddenSegments>
- </requestFiltering>
- </security>
- <serverSideInclude ssiExecDisable="false" />
- <staticContent lockAttributes="isDocFooterFileName">
- <mimeMap fileExtension=".323" mimeType="text/h323" />
- <mimeMap fileExtension=".3g2" mimeType="video/3gpp2" />
- <mimeMap fileExtension=".3gp2" mimeType="video/3gpp2" />
- <mimeMap fileExtension=".3gp" mimeType="video/3gpp" />
- <mimeMap fileExtension=".3gpp" mimeType="video/3gpp" />
- <mimeMap fileExtension=".aac" mimeType="audio/aac" />
- <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".aca" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".accdb" mimeType="application/msaccess" />
- <mimeMap fileExtension=".accde" mimeType="application/msaccess" />
- <mimeMap fileExtension=".accdt" mimeType="application/msaccess" />
- <mimeMap fileExtension=".acx" mimeType="application/internet-property-stream" />
- <mimeMap fileExtension=".adt" mimeType="audio/vnd.dlna.adts" />
- <mimeMap fileExtension=".adts" mimeType="audio/vnd.dlna.adts" />
- <mimeMap fileExtension=".afm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ai" mimeType="application/postscript" />
- <mimeMap fileExtension=".aif" mimeType="audio/x-aiff" />
- <mimeMap fileExtension=".aifc" mimeType="audio/aiff" />
- <mimeMap fileExtension=".aiff" mimeType="audio/aiff" />
- <mimeMap fileExtension=".appcache" mimeType="text/cache-manifest" />
- <mimeMap fileExtension=".application" mimeType="application/x-ms-application" />
- <mimeMap fileExtension=".art" mimeType="image/x-jg" />
- <mimeMap fileExtension=".asd" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".asf" mimeType="video/x-ms-asf" />
- <mimeMap fileExtension=".asi" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".asm" mimeType="text/plain" />
- <mimeMap fileExtension=".asr" mimeType="video/x-ms-asf" />
- <mimeMap fileExtension=".asx" mimeType="video/x-ms-asf" />
- <mimeMap fileExtension=".atom" mimeType="application/atom+xml" />
- <mimeMap fileExtension=".au" mimeType="audio/basic" />
- <mimeMap fileExtension=".avi" mimeType="video/avi" />
- <mimeMap fileExtension=".axs" mimeType="application/olescript" />
- <mimeMap fileExtension=".bas" mimeType="text/plain" />
- <mimeMap fileExtension=".bcpio" mimeType="application/x-bcpio" />
- <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".bmp" mimeType="image/bmp" />
- <mimeMap fileExtension=".c" mimeType="text/plain" />
- <mimeMap fileExtension=".cab" mimeType="application/vnd.ms-cab-compressed" />
- <mimeMap fileExtension=".calx" mimeType="application/vnd.ms-office.calx" />
- <mimeMap fileExtension=".cat" mimeType="application/vnd.ms-pki.seccat" />
- <mimeMap fileExtension=".cdf" mimeType="application/x-cdf" />
- <mimeMap fileExtension=".chm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".class" mimeType="application/x-java-applet" />
- <mimeMap fileExtension=".clp" mimeType="application/x-msclip" />
- <mimeMap fileExtension=".cmx" mimeType="image/x-cmx" />
- <mimeMap fileExtension=".cnf" mimeType="text/plain" />
- <mimeMap fileExtension=".cod" mimeType="image/cis-cod" />
- <mimeMap fileExtension=".cpio" mimeType="application/x-cpio" />
- <mimeMap fileExtension=".cpp" mimeType="text/plain" />
- <mimeMap fileExtension=".crd" mimeType="application/x-mscardfile" />
- <mimeMap fileExtension=".crl" mimeType="application/pkix-crl" />
- <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" />
- <mimeMap fileExtension=".csh" mimeType="application/x-csh" />
- <mimeMap fileExtension=".css" mimeType="text/css" />
- <mimeMap fileExtension=".csv" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".cur" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dcr" mimeType="application/x-director" />
- <mimeMap fileExtension=".deploy" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".der" mimeType="application/x-x509-ca-cert" />
- <mimeMap fileExtension=".dib" mimeType="image/bmp" />
- <mimeMap fileExtension=".dir" mimeType="application/x-director" />
- <mimeMap fileExtension=".disco" mimeType="text/xml" />
- <mimeMap fileExtension=".dll" mimeType="application/x-msdownload" />
- <mimeMap fileExtension=".dll.config" mimeType="text/xml" />
- <mimeMap fileExtension=".dlm" mimeType="text/dlm" />
- <mimeMap fileExtension=".doc" mimeType="application/msword" />
- <mimeMap fileExtension=".docm" mimeType="application/vnd.ms-word.document.macroEnabled.12" />
- <mimeMap fileExtension=".docx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
- <mimeMap fileExtension=".dot" mimeType="application/msword" />
- <mimeMap fileExtension=".dotm" mimeType="application/vnd.ms-word.template.macroEnabled.12" />
- <mimeMap fileExtension=".dotx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.template" />
- <mimeMap fileExtension=".dsp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dtd" mimeType="text/xml" />
- <mimeMap fileExtension=".dvi" mimeType="application/x-dvi" />
- <mimeMap fileExtension=".dvr-ms" mimeType="video/x-ms-dvr" />
- <mimeMap fileExtension=".dwf" mimeType="drawing/x-dwf" />
- <mimeMap fileExtension=".dwp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dxr" mimeType="application/x-director" />
- <mimeMap fileExtension=".eml" mimeType="message/rfc822" />
- <mimeMap fileExtension=".emz" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
- <mimeMap fileExtension=".eps" mimeType="application/postscript" />
- <mimeMap fileExtension=".esd" mimeType="application/vnd.ms-cab-compressed" />
- <mimeMap fileExtension=".etx" mimeType="text/x-setext" />
- <mimeMap fileExtension=".evy" mimeType="application/envoy" />
- <mimeMap fileExtension=".exe" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".exe.config" mimeType="text/xml" />
- <mimeMap fileExtension=".fdf" mimeType="application/vnd.fdf" />
- <mimeMap fileExtension=".fif" mimeType="application/fractals" />
- <mimeMap fileExtension=".fla" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".flr" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".flv" mimeType="video/x-flv" />
- <mimeMap fileExtension=".gif" mimeType="image/gif" />
- <mimeMap fileExtension=".glb" mimeType="model/gltf-binary" />
- <mimeMap fileExtension=".gtar" mimeType="application/x-gtar" />
- <mimeMap fileExtension=".gz" mimeType="application/x-gzip" />
- <mimeMap fileExtension=".h" mimeType="text/plain" />
- <mimeMap fileExtension=".hdf" mimeType="application/x-hdf" />
- <mimeMap fileExtension=".hdml" mimeType="text/x-hdml" />
- <mimeMap fileExtension=".hhc" mimeType="application/x-oleobject" />
- <mimeMap fileExtension=".hhk" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".hhp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".hlp" mimeType="application/winhlp" />
- <mimeMap fileExtension=".hqx" mimeType="application/mac-binhex40" />
- <mimeMap fileExtension=".hta" mimeType="application/hta" />
- <mimeMap fileExtension=".htc" mimeType="text/x-component" />
- <mimeMap fileExtension=".htm" mimeType="text/html" />
- <mimeMap fileExtension=".html" mimeType="text/html" />
- <mimeMap fileExtension=".htt" mimeType="text/webviewhtml" />
- <mimeMap fileExtension=".hxt" mimeType="text/html" />
- <mimeMap fileExtension=".ico" mimeType="image/x-icon" />
- <mimeMap fileExtension=".ics" mimeType="text/calendar" />
- <mimeMap fileExtension=".ief" mimeType="image/ief" />
- <mimeMap fileExtension=".iii" mimeType="application/x-iphone" />
- <mimeMap fileExtension=".inf" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ins" mimeType="application/x-internet-signup" />
- <mimeMap fileExtension=".isp" mimeType="application/x-internet-signup" />
- <mimeMap fileExtension=".IVF" mimeType="video/x-ivf" />
- <mimeMap fileExtension=".jar" mimeType="application/java-archive" />
- <mimeMap fileExtension=".java" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".jck" mimeType="application/liquidmotion" />
- <mimeMap fileExtension=".jcz" mimeType="application/liquidmotion" />
- <mimeMap fileExtension=".jfif" mimeType="image/pjpeg" />
- <mimeMap fileExtension=".jpb" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".jpe" mimeType="image/jpeg" />
- <mimeMap fileExtension=".jpeg" mimeType="image/jpeg" />
- <mimeMap fileExtension=".jpg" mimeType="image/jpeg" />
- <mimeMap fileExtension=".js" mimeType="application/javascript" />
- <mimeMap fileExtension=".json" mimeType="application/json" />
- <mimeMap fileExtension=".jsonld" mimeType="application/ld+json" />
- <mimeMap fileExtension=".jsx" mimeType="text/jscript" />
- <mimeMap fileExtension=".latex" mimeType="application/x-latex" />
- <mimeMap fileExtension=".less" mimeType="text/css" />
- <mimeMap fileExtension=".lit" mimeType="application/x-ms-reader" />
- <mimeMap fileExtension=".lpk" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".lsf" mimeType="video/x-la-asf" />
- <mimeMap fileExtension=".lsx" mimeType="video/x-la-asf" />
- <mimeMap fileExtension=".lzh" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".m13" mimeType="application/x-msmediaview" />
- <mimeMap fileExtension=".m14" mimeType="application/x-msmediaview" />
- <mimeMap fileExtension=".m1v" mimeType="video/mpeg" />
- <mimeMap fileExtension=".m2ts" mimeType="video/vnd.dlna.mpeg-tts" />
- <mimeMap fileExtension=".m3u" mimeType="audio/x-mpegurl" />
- <mimeMap fileExtension=".m4a" mimeType="audio/mp4" />
- <mimeMap fileExtension=".m4v" mimeType="video/mp4" />
- <mimeMap fileExtension=".man" mimeType="application/x-troff-man" />
- <mimeMap fileExtension=".manifest" mimeType="application/x-ms-manifest" />
- <mimeMap fileExtension=".map" mimeType="text/plain" />
- <mimeMap fileExtension=".mdb" mimeType="application/x-msaccess" />
- <mimeMap fileExtension=".mdp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".me" mimeType="application/x-troff-me" />
- <mimeMap fileExtension=".mht" mimeType="message/rfc822" />
- <mimeMap fileExtension=".mhtml" mimeType="message/rfc822" />
- <mimeMap fileExtension=".mid" mimeType="audio/mid" />
- <mimeMap fileExtension=".midi" mimeType="audio/mid" />
- <mimeMap fileExtension=".mix" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".mmf" mimeType="application/x-smaf" />
- <mimeMap fileExtension=".mno" mimeType="text/xml" />
- <mimeMap fileExtension=".mny" mimeType="application/x-msmoney" />
- <mimeMap fileExtension=".mov" mimeType="video/quicktime" />
- <mimeMap fileExtension=".movie" mimeType="video/x-sgi-movie" />
- <mimeMap fileExtension=".mp2" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mp3" mimeType="audio/mpeg" />
- <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
- <mimeMap fileExtension=".mp4v" mimeType="video/mp4" />
- <mimeMap fileExtension=".mpa" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mpe" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mpeg" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mpg" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mpp" mimeType="application/vnd.ms-project" />
- <mimeMap fileExtension=".mpv2" mimeType="video/mpeg" />
- <mimeMap fileExtension=".ms" mimeType="application/x-troff-ms" />
- <mimeMap fileExtension=".msi" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".mso" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".mvb" mimeType="application/x-msmediaview" />
- <mimeMap fileExtension=".mvc" mimeType="application/x-miva-compiled" />
- <mimeMap fileExtension=".nc" mimeType="application/x-netcdf" />
- <mimeMap fileExtension=".nsc" mimeType="video/x-ms-asf" />
- <mimeMap fileExtension=".nws" mimeType="message/rfc822" />
- <mimeMap fileExtension=".ocx" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".oda" mimeType="application/oda" />
- <mimeMap fileExtension=".odc" mimeType="text/x-ms-odc" />
- <mimeMap fileExtension=".ods" mimeType="application/oleobject" />
- <mimeMap fileExtension=".oga" mimeType="audio/ogg" />
- <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
- <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
- <mimeMap fileExtension=".one" mimeType="application/onenote" />
- <mimeMap fileExtension=".onea" mimeType="application/onenote" />
- <mimeMap fileExtension=".onetoc" mimeType="application/onenote" />
- <mimeMap fileExtension=".onetoc2" mimeType="application/onenote" />
- <mimeMap fileExtension=".onetmp" mimeType="application/onenote" />
- <mimeMap fileExtension=".onepkg" mimeType="application/onenote" />
- <mimeMap fileExtension=".osdx" mimeType="application/opensearchdescription+xml" />
- <mimeMap fileExtension=".otf" mimeType="font/otf" />
- <mimeMap fileExtension=".p10" mimeType="application/pkcs10" />
- <mimeMap fileExtension=".p12" mimeType="application/x-pkcs12" />
- <mimeMap fileExtension=".p7b" mimeType="application/x-pkcs7-certificates" />
- <mimeMap fileExtension=".p7c" mimeType="application/pkcs7-mime" />
- <mimeMap fileExtension=".p7m" mimeType="application/pkcs7-mime" />
- <mimeMap fileExtension=".p7r" mimeType="application/x-pkcs7-certreqresp" />
- <mimeMap fileExtension=".p7s" mimeType="application/pkcs7-signature" />
- <mimeMap fileExtension=".pbm" mimeType="image/x-portable-bitmap" />
- <mimeMap fileExtension=".pcx" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pcz" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pdf" mimeType="application/pdf" />
- <mimeMap fileExtension=".pfb" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pfm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pfx" mimeType="application/x-pkcs12" />
- <mimeMap fileExtension=".pgm" mimeType="image/x-portable-graymap" />
- <mimeMap fileExtension=".pko" mimeType="application/vnd.ms-pki.pko" />
- <mimeMap fileExtension=".pma" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".pmc" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".pml" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".pmr" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".pmw" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".png" mimeType="image/png" />
- <mimeMap fileExtension=".pnm" mimeType="image/x-portable-anymap" />
- <mimeMap fileExtension=".pnz" mimeType="image/png" />
- <mimeMap fileExtension=".pot" mimeType="application/vnd.ms-powerpoint" />
- <mimeMap fileExtension=".potm" mimeType="application/vnd.ms-powerpoint.template.macroEnabled.12" />
- <mimeMap fileExtension=".potx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.template" />
- <mimeMap fileExtension=".ppam" mimeType="application/vnd.ms-powerpoint.addin.macroEnabled.12" />
- <mimeMap fileExtension=".ppm" mimeType="image/x-portable-pixmap" />
- <mimeMap fileExtension=".pps" mimeType="application/vnd.ms-powerpoint" />
- <mimeMap fileExtension=".ppsm" mimeType="application/vnd.ms-powerpoint.slideshow.macroEnabled.12" />
- <mimeMap fileExtension=".ppsx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" />
- <mimeMap fileExtension=".ppt" mimeType="application/vnd.ms-powerpoint" />
- <mimeMap fileExtension=".pptm" mimeType="application/vnd.ms-powerpoint.presentation.macroEnabled.12" />
- <mimeMap fileExtension=".pptx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
- <mimeMap fileExtension=".prf" mimeType="application/pics-rules" />
- <mimeMap fileExtension=".prm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".prx" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ps" mimeType="application/postscript" />
- <mimeMap fileExtension=".psd" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".psm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".psp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pub" mimeType="application/x-mspublisher" />
- <mimeMap fileExtension=".qt" mimeType="video/quicktime" />
- <mimeMap fileExtension=".qtl" mimeType="application/x-quicktimeplayer" />
- <mimeMap fileExtension=".qxd" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ra" mimeType="audio/x-pn-realaudio" />
- <mimeMap fileExtension=".ram" mimeType="audio/x-pn-realaudio" />
- <mimeMap fileExtension=".rar" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ras" mimeType="image/x-cmu-raster" />
- <mimeMap fileExtension=".rf" mimeType="image/vnd.rn-realflash" />
- <mimeMap fileExtension=".rgb" mimeType="image/x-rgb" />
- <mimeMap fileExtension=".rm" mimeType="application/vnd.rn-realmedia" />
- <mimeMap fileExtension=".rmi" mimeType="audio/mid" />
- <mimeMap fileExtension=".roff" mimeType="application/x-troff" />
- <mimeMap fileExtension=".rpm" mimeType="audio/x-pn-realaudio-plugin" />
- <mimeMap fileExtension=".rtf" mimeType="application/rtf" />
- <mimeMap fileExtension=".rtx" mimeType="text/richtext" />
- <mimeMap fileExtension=".scd" mimeType="application/x-msschedule" />
- <mimeMap fileExtension=".sct" mimeType="text/scriptlet" />
- <mimeMap fileExtension=".sea" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".setpay" mimeType="application/set-payment-initiation" />
- <mimeMap fileExtension=".setreg" mimeType="application/set-registration-initiation" />
- <mimeMap fileExtension=".sgml" mimeType="text/sgml" />
- <mimeMap fileExtension=".sh" mimeType="application/x-sh" />
- <mimeMap fileExtension=".shar" mimeType="application/x-shar" />
- <mimeMap fileExtension=".sit" mimeType="application/x-stuffit" />
- <mimeMap fileExtension=".sldm" mimeType="application/vnd.ms-powerpoint.slide.macroEnabled.12" />
- <mimeMap fileExtension=".sldx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slide" />
- <mimeMap fileExtension=".smd" mimeType="audio/x-smd" />
- <mimeMap fileExtension=".smi" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".smx" mimeType="audio/x-smd" />
- <mimeMap fileExtension=".smz" mimeType="audio/x-smd" />
- <mimeMap fileExtension=".snd" mimeType="audio/basic" />
- <mimeMap fileExtension=".snp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".spc" mimeType="application/x-pkcs7-certificates" />
- <mimeMap fileExtension=".spl" mimeType="application/futuresplash" />
- <mimeMap fileExtension=".spx" mimeType="audio/ogg" />
- <mimeMap fileExtension=".src" mimeType="application/x-wais-source" />
- <mimeMap fileExtension=".ssm" mimeType="application/streamingmedia" />
- <mimeMap fileExtension=".sst" mimeType="application/vnd.ms-pki.certstore" />
- <mimeMap fileExtension=".stl" mimeType="application/vnd.ms-pki.stl" />
- <mimeMap fileExtension=".sv4cpio" mimeType="application/x-sv4cpio" />
- <mimeMap fileExtension=".sv4crc" mimeType="application/x-sv4crc" />
- <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
- <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" />
- <mimeMap fileExtension=".swf" mimeType="application/x-shockwave-flash" />
- <mimeMap fileExtension=".t" mimeType="application/x-troff" />
- <mimeMap fileExtension=".tar" mimeType="application/x-tar" />
- <mimeMap fileExtension=".tcl" mimeType="application/x-tcl" />
- <mimeMap fileExtension=".tex" mimeType="application/x-tex" />
- <mimeMap fileExtension=".texi" mimeType="application/x-texinfo" />
- <mimeMap fileExtension=".texinfo" mimeType="application/x-texinfo" />
- <mimeMap fileExtension=".tgz" mimeType="application/x-compressed" />
- <mimeMap fileExtension=".thmx" mimeType="application/vnd.ms-officetheme" />
- <mimeMap fileExtension=".thn" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".tif" mimeType="image/tiff" />
- <mimeMap fileExtension=".tiff" mimeType="image/tiff" />
- <mimeMap fileExtension=".toc" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".tr" mimeType="application/x-troff" />
- <mimeMap fileExtension=".trm" mimeType="application/x-msterminal" />
- <mimeMap fileExtension=".ts" mimeType="video/vnd.dlna.mpeg-tts" />
- <mimeMap fileExtension=".tsv" mimeType="text/tab-separated-values" />
- <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".tts" mimeType="video/vnd.dlna.mpeg-tts" />
- <mimeMap fileExtension=".txt" mimeType="text/plain" />
- <mimeMap fileExtension=".u32" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".uls" mimeType="text/iuls" />
- <mimeMap fileExtension=".ustar" mimeType="application/x-ustar" />
- <mimeMap fileExtension=".vbs" mimeType="text/vbscript" />
- <mimeMap fileExtension=".vcf" mimeType="text/x-vcard" />
- <mimeMap fileExtension=".vcs" mimeType="text/plain" />
- <mimeMap fileExtension=".vdx" mimeType="application/vnd.ms-visio.viewer" />
- <mimeMap fileExtension=".vml" mimeType="text/xml" />
- <mimeMap fileExtension=".vsd" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vss" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vst" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vsto" mimeType="application/x-ms-vsto" />
- <mimeMap fileExtension=".vsw" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vsx" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vtx" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".wasm" mimeType="application/wasm" />
- <mimeMap fileExtension=".wav" mimeType="audio/wav" />
- <mimeMap fileExtension=".wax" mimeType="audio/x-ms-wax" />
- <mimeMap fileExtension=".wbmp" mimeType="image/vnd.wap.wbmp" />
- <mimeMap fileExtension=".wcm" mimeType="application/vnd.ms-works" />
- <mimeMap fileExtension=".wdb" mimeType="application/vnd.ms-works" />
- <mimeMap fileExtension=".webm" mimeType="video/webm" />
- <mimeMap fileExtension=".wks" mimeType="application/vnd.ms-works" />
- <mimeMap fileExtension=".wm" mimeType="video/x-ms-wm" />
- <mimeMap fileExtension=".wma" mimeType="audio/x-ms-wma" />
- <mimeMap fileExtension=".wmd" mimeType="application/x-ms-wmd" />
- <mimeMap fileExtension=".wmf" mimeType="application/x-msmetafile" />
- <mimeMap fileExtension=".wml" mimeType="text/vnd.wap.wml" />
- <mimeMap fileExtension=".wmlc" mimeType="application/vnd.wap.wmlc" />
- <mimeMap fileExtension=".wmls" mimeType="text/vnd.wap.wmlscript" />
- <mimeMap fileExtension=".wmlsc" mimeType="application/vnd.wap.wmlscriptc" />
- <mimeMap fileExtension=".wmp" mimeType="video/x-ms-wmp" />
- <mimeMap fileExtension=".wmv" mimeType="video/x-ms-wmv" />
- <mimeMap fileExtension=".wmx" mimeType="video/x-ms-wmx" />
- <mimeMap fileExtension=".wmz" mimeType="application/x-ms-wmz" />
- <mimeMap fileExtension=".woff" mimeType="font/x-woff" />
- <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
- <mimeMap fileExtension=".wps" mimeType="application/vnd.ms-works" />
- <mimeMap fileExtension=".wri" mimeType="application/x-mswrite" />
- <mimeMap fileExtension=".wrl" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".wrz" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".wsdl" mimeType="text/xml" />
- <mimeMap fileExtension=".wtv" mimeType="video/x-ms-wtv" />
- <mimeMap fileExtension=".wvx" mimeType="video/x-ms-wvx" />
- <mimeMap fileExtension=".x" mimeType="application/directx" />
- <mimeMap fileExtension=".xaf" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".xaml" mimeType="application/xaml+xml" />
- <mimeMap fileExtension=".xap" mimeType="application/x-silverlight-app" />
- <mimeMap fileExtension=".xbap" mimeType="application/x-ms-xbap" />
- <mimeMap fileExtension=".xbm" mimeType="image/x-xbitmap" />
- <mimeMap fileExtension=".xdr" mimeType="text/plain" />
- <mimeMap fileExtension=".xht" mimeType="application/xhtml+xml" />
- <mimeMap fileExtension=".xhtml" mimeType="application/xhtml+xml" />
- <mimeMap fileExtension=".xla" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xlam" mimeType="application/vnd.ms-excel.addin.macroEnabled.12" />
- <mimeMap fileExtension=".xlc" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xlm" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xls" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xlsb" mimeType="application/vnd.ms-excel.sheet.binary.macroEnabled.12" />
- <mimeMap fileExtension=".xlsm" mimeType="application/vnd.ms-excel.sheet.macroEnabled.12" />
- <mimeMap fileExtension=".xlsx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
- <mimeMap fileExtension=".xlt" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xltm" mimeType="application/vnd.ms-excel.template.macroEnabled.12" />
- <mimeMap fileExtension=".xltx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.template" />
- <mimeMap fileExtension=".xlw" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xml" mimeType="text/xml" />
- <mimeMap fileExtension=".xof" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".xpm" mimeType="image/x-xpixmap" />
- <mimeMap fileExtension=".xps" mimeType="application/vnd.ms-xpsdocument" />
- <mimeMap fileExtension=".xsd" mimeType="text/xml" />
- <mimeMap fileExtension=".xsf" mimeType="text/xml" />
- <mimeMap fileExtension=".xsl" mimeType="text/xml" />
- <mimeMap fileExtension=".xslt" mimeType="text/xml" />
- <mimeMap fileExtension=".xsn" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".xtp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".xwd" mimeType="image/x-xwindowdump" />
- <mimeMap fileExtension=".z" mimeType="application/x-compress" />
- <mimeMap fileExtension=".zip" mimeType="application/x-zip-compressed" />
- </staticContent>
- <tracing>
- <traceFailedRequests>
- <add path="*">
- <traceAreas>
- <add provider="ASP" verbosity="Verbose" />
- <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
- <add provider="ISAPI Extension" verbosity="Verbose" />
- <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket" verbosity="Verbose" />
- </traceAreas>
- <failureDefinitions statusCodes="200-999" />
- </add>
- </traceFailedRequests>
- <traceProviderDefinitions>
- <add name="WWW Server" guid="{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}">
- <areas>
- <clear />
- <add name="Authentication" value="2" />
- <add name="Security" value="4" />
- <add name="Filter" value="8" />
- <add name="StaticFile" value="16" />
- <add name="CGI" value="32" />
- <add name="Compression" value="64" />
- <add name="Cache" value="128" />
- <add name="RequestNotifications" value="256" />
- <add name="Module" value="512" />
- <add name="Rewrite" value="1024" />
- <add name="FastCGI" value="4096" />
- <add name="WebSocket" value="16384" />
- <add name="ANCM" value="65536" />
- </areas>
- </add>
- <add name="ASP" guid="{06b94d9a-b15e-456e-a4ef-37c984a2cb4b}">
- <areas>
- <clear />
- </areas>
- </add>
- <add name="ISAPI Extension" guid="{a1c2040e-8840-4c31-ba11-9871031a19ea}">
- <areas>
- <clear />
- </areas>
- </add>
- <add name="ASPNET" guid="{AFF081FE-0247-4275-9C4E-021F3DC1DA35}">
- <areas>
- <add name="Infrastructure" value="1" />
- <add name="Module" value="2" />
- <add name="Page" value="4" />
- <add name="AppServices" value="8" />
- </areas>
- </add>
- </traceProviderDefinitions>
- </tracing>
- <urlCompression />
- <validation />
- <webdav>
- <globalSettings>
- <propertyStores>
- <add name="webdav_simple_prop" image="%IIS_BIN%\webdav_simple_prop.dll" image32="%IIS_BIN%\webdav_simple_prop.dll" />
- </propertyStores>
- <lockStores>
- <add name="webdav_simple_lock" image="%IIS_BIN%\webdav_simple_lock.dll" image32="%IIS_BIN%\webdav_simple_lock.dll" />
- </lockStores>
- </globalSettings>
- <authoring>
- <locks enabled="true" lockStore="webdav_simple_lock" />
- </authoring>
- <authoringRules />
- </webdav>
- <webSocket />
- <applicationInitialization />
- </system.webServer>
- <location path="" overrideMode="Allow">
- <system.webServer>
- <modules>
- <add name="IsapiFilterModule" lockItem="true" />
- <add name="BasicAuthenticationModule" lockItem="true" />
- <add name="IsapiModule" lockItem="true" />
- <add name="HttpLoggingModule" lockItem="true" />
- <add name="DynamicCompressionModule" lockItem="true" />
- <add name="StaticCompressionModule" lockItem="true" />
- <add name="DefaultDocumentModule" lockItem="true" />
- <add name="DirectoryListingModule" lockItem="true" />
- <add name="ProtocolSupportModule" lockItem="true" />
- <add name="HttpRedirectionModule" lockItem="true" />
- <add name="ServerSideIncludeModule" lockItem="true" />
- <add name="StaticFileModule" lockItem="true" />
- <add name="AnonymousAuthenticationModule" lockItem="true" />
- <add name="CertificateMappingAuthenticationModule" lockItem="true" />
- <add name="UrlAuthorizationModule" lockItem="true" />
- <add name="WindowsAuthenticationModule" lockItem="true" />
- <add name="IISCertificateMappingAuthenticationModule" lockItem="true" />
- <add name="WebMatrixSupportModule" lockItem="true" />
- <add name="IpRestrictionModule" lockItem="true" />
- <add name="DynamicIpRestrictionModule" lockItem="true" />
- <add name="RequestFilteringModule" lockItem="true" />
- <add name="CustomLoggingModule" lockItem="true" />
- <add name="CustomErrorModule" lockItem="true" />
- <add name="FailedRequestsTracingModule" lockItem="true" />
- <add name="CgiModule" lockItem="true" />
- <add name="FastCgiModule" lockItem="true" />
- <!-- <add name="WebDAVModule" /> -->
- <add name="RewriteModule" />
- <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" preCondition="managedHandler" />
- <add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="managedHandler" />
- <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" preCondition="managedHandler" />
- <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="managedHandler" />
- <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" preCondition="managedHandler" />
- <add name="RoleManager" type="System.Web.Security.RoleManagerModule" preCondition="managedHandler" />
- <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />
- <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" preCondition="managedHandler" />
- <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" preCondition="managedHandler" />
- <add name="Profile" type="System.Web.Profile.ProfileModule" preCondition="managedHandler" />
- <add name="UrlMappingsModule" type="System.Web.UrlMappingsModule" preCondition="managedHandler" />
- <add name="ApplicationInitializationModule" lockItem="true" />
- <add name="WebSocketModule" lockItem="true" />
- <add name="ServiceModel-4.0" type="System.ServiceModel.Activation.ServiceHttpModule,System.ServiceModel.Activation,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
- <add name="ConfigurationValidationModule" lockItem="true" />
- <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler,runtimeVersionv4.0" />
- <add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
- <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler,runtimeVersionv2.0" />
- <add name="AspNetCoreModule" lockItem="true" />
- <add name="AspNetCoreModuleV2" lockItem="true" />
- </modules>
- <handlers accessPolicy="Read, Script">
- <!-- <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" /> -->
- <add name="AXD-ISAPI-4.0_64bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="SimpleHandlerFactory-ISAPI-4.0_64bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="WebServiceHandlerFactory-ISAPI-4.0_64bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
- <add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
- <add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
- <add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
- <add name="aspq-ISAPI-4.0_64bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="cshtm-ISAPI-4.0_64bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="cshtml-ISAPI-4.0_64bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="vbhtm-ISAPI-4.0_64bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="vbhtml-ISAPI-4.0_64bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
- <add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
- <add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
- <add name="AXD-ISAPI-4.0_32bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="SimpleHandlerFactory-ISAPI-4.0_32bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="WebServiceHandlerFactory-ISAPI-4.0_32bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
- <add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
- <add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
- <add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
- <add name="aspq-ISAPI-4.0_32bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="cshtm-ISAPI-4.0_32bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="cshtml-ISAPI-4.0_32bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="vbhtm-ISAPI-4.0_32bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="vbhtml-ISAPI-4.0_32bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="TraceHandler-Integrated-4.0" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="WebAdminHandler-Integrated-4.0" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="AssemblyResourceLoader-Integrated-4.0" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="HttpRemotingHandlerFactory-rem-Integrated-4.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="HttpRemotingHandlerFactory-soap-Integrated-4.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="aspq-Integrated-4.0" path="*.aspq" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="cshtm-Integrated-4.0" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="cshtml-Integrated-4.0" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="vbhtm-Integrated-4.0" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="vbhtml-Integrated-4.0" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="ScriptHandlerFactoryAppServices-Integrated-4.0" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="ScriptResourceIntegrated-4.0" path="*ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
- <add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
- <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
- <add name="TraceHandler-Integrated" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="WebAdminHandler-Integrated" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="AssemblyResourceLoader-Integrated" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="SimpleHandlerFactory-Integrated" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="WebServiceHandlerFactory-Integrated" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Services.Protocols.WebServiceHandlerFactory,System.Web.Services,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="HttpRemotingHandlerFactory-rem-Integrated" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="HttpRemotingHandlerFactory-soap-Integrated" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="AXD-ISAPI-2.0" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="SimpleHandlerFactory-ISAPI-2.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="WebServiceHandlerFactory-ISAPI-2.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
- <add name="AXD-ISAPI-2.0-64" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="PageHandlerFactory-ISAPI-2.0-64" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="SimpleHandlerFactory-ISAPI-2.0-64" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="WebServiceHandlerFactory-ISAPI-2.0-64" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0-64" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0-64" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
- <add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
- <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
- <add name="SSINC-stm" path="*.stm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
- <add name="SSINC-shtm" path="*.shtm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
- <add name="SSINC-shtml" path="*.shtml" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
- <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
- <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" />
- <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
- <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
- </handlers>
+ <globalModules>
+ <add name="HttpLoggingModule" image="%IIS_BIN%\loghttp.dll" />
+ <add name="UriCacheModule" image="%IIS_BIN%\cachuri.dll" />
+ <add name="TokenCacheModule" image="%IIS_BIN%\cachtokn.dll" />
+ <add name="DynamicCompressionModule" image="%IIS_BIN%\compdyn.dll" />
+ <add name="StaticCompressionModule" image="%IIS_BIN%\compstat.dll" />
+ <add name="DefaultDocumentModule" image="%IIS_BIN%\defdoc.dll" />
+ <add name="DirectoryListingModule" image="%IIS_BIN%\dirlist.dll" />
+ <add name="ProtocolSupportModule" image="%IIS_BIN%\protsup.dll" />
+ <add name="HttpRedirectionModule" image="%IIS_BIN%\redirect.dll" />
+ <add name="ServerSideIncludeModule" image="%IIS_BIN%\iis_ssi.dll" />
+ <add name="StaticFileModule" image="%IIS_BIN%\static.dll" />
+ <add name="AnonymousAuthenticationModule" image="%IIS_BIN%\authanon.dll" />
+ <add name="CertificateMappingAuthenticationModule" image="%IIS_BIN%\authcert.dll" />
+ <add name="UrlAuthorizationModule" image="%IIS_BIN%\urlauthz.dll" />
+ <add name="BasicAuthenticationModule" image="%IIS_BIN%\authbas.dll" />
+ <add name="WindowsAuthenticationModule" image="%IIS_BIN%\authsspi.dll" />
+ <add name="IISCertificateMappingAuthenticationModule" image="%IIS_BIN%\authmap.dll" />
+ <add name="IpRestrictionModule" image="%IIS_BIN%\iprestr.dll" />
+ <add name="DynamicIpRestrictionModule" image="%IIS_BIN%\diprestr.dll" />
+ <add name="RequestFilteringModule" image="%IIS_BIN%\modrqflt.dll" />
+ <add name="CustomLoggingModule" image="%IIS_BIN%\logcust.dll" />
+ <add name="CustomErrorModule" image="%IIS_BIN%\custerr.dll" />
+ <add name="FailedRequestsTracingModule" image="%IIS_BIN%\iisfreb.dll" />
+ <add name="RequestMonitorModule" image="%IIS_BIN%\iisreqs.dll" />
+ <add name="IsapiModule" image="%IIS_BIN%\isapi.dll" />
+ <add name="IsapiFilterModule" image="%IIS_BIN%\filter.dll" />
+ <add name="CgiModule" image="%IIS_BIN%\cgi.dll" />
+ <add name="FastCgiModule" image="%IIS_BIN%\iisfcgi.dll" />
+<!-- <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> -->
+ <add name="RewriteModule" image="%IIS_BIN%\rewrite.dll" />
+ <add name="ConfigurationValidationModule" image="%IIS_BIN%\validcfg.dll" />
+ <add name="WebSocketModule" image="%IIS_BIN%\iiswsock.dll" />
+ <add name="WebMatrixSupportModule" image="%IIS_BIN%\webmatrixsup.dll" />
+ <add name="ManagedEngine" image="%windir%\Microsoft.NET\Framework\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness32" />
+ <add name="ManagedEngine64" image="%windir%\Microsoft.NET\Framework64\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness64" />
+ <add name="ManagedEngineV4.0_32bit" image="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness32" />
+ <add name="ManagedEngineV4.0_64bit" image="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness64" />
+ <add name="ApplicationInitializationModule" image="%IIS_BIN%\warmup.dll" />
+ <add name="AspNetCoreModule" image="%IIS_BIN%\aspnetcore.dll" />
+ <add name="AspNetCoreModuleV2" image="%IIS_BIN%\Asp.Net Core Module\V2\aspnetcorev2.dll" />
+ </globalModules>
+
+ <httpCompression directory="%TEMP%">
+ <scheme name="gzip" dll="%IIS_BIN%\gzip.dll" />
+ <dynamicTypes>
+ <add mimeType="text/*" enabled="true" />
+ <add mimeType="message/*" enabled="true" />
+ <add mimeType="application/x-javascript" enabled="true" />
+ <add mimeType="application/javascript" enabled="true" />
+ <add mimeType="*/*" enabled="false" />
+ <add mimeType="text/event-stream" enabled="false" />
+ </dynamicTypes>
+ <staticTypes>
+ <add mimeType="text/*" enabled="true" />
+ <add mimeType="message/*" enabled="true" />
+ <add mimeType="application/javascript" enabled="true" />
+ <add mimeType="application/atom+xml" enabled="true" />
+ <add mimeType="application/xaml+xml" enabled="true" />
+ <add mimeType="image/svg+xml" enabled="true" />
+ <add mimeType="*/*" enabled="false" />
+ </staticTypes>
+ </httpCompression>
+
+ <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">
+ <error statusCode="401" prefixLanguageFilePath="%IIS_BIN%\custerr" path="401.htm" />
+ <error statusCode="403" prefixLanguageFilePath="%IIS_BIN%\custerr" path="403.htm" />
+ <error statusCode="404" prefixLanguageFilePath="%IIS_BIN%\custerr" path="404.htm" />
+ <error statusCode="405" prefixLanguageFilePath="%IIS_BIN%\custerr" path="405.htm" />
+ <error statusCode="406" prefixLanguageFilePath="%IIS_BIN%\custerr" path="406.htm" />
+ <error statusCode="412" prefixLanguageFilePath="%IIS_BIN%\custerr" path="412.htm" />
+ <error statusCode="500" prefixLanguageFilePath="%IIS_BIN%\custerr" path="500.htm" />
+ <error statusCode="501" prefixLanguageFilePath="%IIS_BIN%\custerr" path="501.htm" />
+ <error statusCode="502" prefixLanguageFilePath="%IIS_BIN%\custerr" path="502.htm" />
+ </httpErrors>
+
+ <httpLogging dontLog="false" />
+
+ <httpProtocol>
+ <customHeaders>
+ <clear />
+ <add name="X-Powered-By" value="ASP.NET" />
+ </customHeaders>
+ <redirectHeaders>
+ <clear />
+ </redirectHeaders>
+ </httpProtocol>
+
+ <httpRedirect enabled="false" />
+
+ <httpTracing />
+
+ <isapiFilters>
+ <filter name="ASP.Net_2.0.50727-64" path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv2.0" />
+ <filter name="ASP.Net_2.0.50727.0" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv2.0" />
+ <filter name="ASP.Net_2.0_for_v1.1" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="runtimeVersionv1.1" />
+ <filter name="ASP.Net_4.0_32bit" path="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv4.0" />
+ <filter name="ASP.Net_4.0_64bit" path="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv4.0" />
+ </isapiFilters>
+
+ <odbcLogging />
+
+ <security>
+
+ <access sslFlags="None" />
+
+ <applicationDependencies>
+ <application name="Active Server Pages" groupId="ASP" />
+ </applicationDependencies>
+
+ <authentication>
+
+ <anonymousAuthentication enabled="true" userName="" />
+
+ <basicAuthentication enabled="false" />
+
+ <clientCertificateMappingAuthentication enabled="false" />
+
+ <digestAuthentication enabled="false" />
+
+ <iisClientCertificateMappingAuthentication enabled="false">
+ </iisClientCertificateMappingAuthentication>
+
+ <windowsAuthentication enabled="false">
+ <providers>
+ <add value="Negotiate" />
+ <add value="NTLM" />
+ </providers>
+ </windowsAuthentication>
+
+ </authentication>
+
+ <authorization>
+ <add accessType="Allow" users="*" />
+ </authorization>
+
+ <ipSecurity allowUnlisted="true" />
+
+ <isapiCgiRestriction notListedIsapisAllowed="true" notListedCgisAllowed="true">
+ <add path="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
+ <add path="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
+ <add path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
+ <add path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
+ </isapiCgiRestriction>
+
+ <requestFiltering>
+ <fileExtensions allowUnlisted="true" applyToWebDAV="true">
+ <add fileExtension=".asa" allowed="false" />
+ <add fileExtension=".asax" allowed="false" />
+ <add fileExtension=".ascx" allowed="false" />
+ <add fileExtension=".master" allowed="false" />
+ <add fileExtension=".skin" allowed="false" />
+ <add fileExtension=".browser" allowed="false" />
+ <add fileExtension=".sitemap" allowed="false" />
+ <add fileExtension=".config" allowed="false" />
+ <add fileExtension=".cs" allowed="false" />
+ <add fileExtension=".csproj" allowed="false" />
+ <add fileExtension=".vb" allowed="false" />
+ <add fileExtension=".vbproj" allowed="false" />
+ <add fileExtension=".webinfo" allowed="false" />
+ <add fileExtension=".licx" allowed="false" />
+ <add fileExtension=".resx" allowed="false" />
+ <add fileExtension=".resources" allowed="false" />
+ <add fileExtension=".mdb" allowed="false" />
+ <add fileExtension=".vjsproj" allowed="false" />
+ <add fileExtension=".java" allowed="false" />
+ <add fileExtension=".jsl" allowed="false" />
+ <add fileExtension=".ldb" allowed="false" />
+ <add fileExtension=".dsdgm" allowed="false" />
+ <add fileExtension=".ssdgm" allowed="false" />
+ <add fileExtension=".lsad" allowed="false" />
+ <add fileExtension=".ssmap" allowed="false" />
+ <add fileExtension=".cd" allowed="false" />
+ <add fileExtension=".dsprototype" allowed="false" />
+ <add fileExtension=".lsaprototype" allowed="false" />
+ <add fileExtension=".sdm" allowed="false" />
+ <add fileExtension=".sdmDocument" allowed="false" />
+ <add fileExtension=".mdf" allowed="false" />
+ <add fileExtension=".ldf" allowed="false" />
+ <add fileExtension=".ad" allowed="false" />
+ <add fileExtension=".dd" allowed="false" />
+ <add fileExtension=".ldd" allowed="false" />
+ <add fileExtension=".sd" allowed="false" />
+ <add fileExtension=".adprototype" allowed="false" />
+ <add fileExtension=".lddprototype" allowed="false" />
+ <add fileExtension=".exclude" allowed="false" />
+ <add fileExtension=".refresh" allowed="false" />
+ <add fileExtension=".compiled" allowed="false" />
+ <add fileExtension=".msgx" allowed="false" />
+ <add fileExtension=".vsdisco" allowed="false" />
+ <add fileExtension=".rules" allowed="false" />
+ </fileExtensions>
+ <verbs allowUnlisted="true" applyToWebDAV="true" />
+ <hiddenSegments applyToWebDAV="true">
+ <add segment="web.config" />
+ <add segment="bin" />
+ <add segment="App_code" />
+ <add segment="App_GlobalResources" />
+ <add segment="App_LocalResources" />
+ <add segment="App_WebReferences" />
+ <add segment="App_Data" />
+ <add segment="App_Browsers" />
+ </hiddenSegments>
+ </requestFiltering>
+
+ </security>
+
+ <serverSideInclude ssiExecDisable="false" />
+
+ <staticContent lockAttributes="isDocFooterFileName">
+ <mimeMap fileExtension=".323" mimeType="text/h323" />
+ <mimeMap fileExtension=".3g2" mimeType="video/3gpp2" />
+ <mimeMap fileExtension=".3gp2" mimeType="video/3gpp2" />
+ <mimeMap fileExtension=".3gp" mimeType="video/3gpp" />
+ <mimeMap fileExtension=".3gpp" mimeType="video/3gpp" />
+ <mimeMap fileExtension=".aac" mimeType="audio/aac" />
+ <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".aca" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".accdb" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".accde" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".accdt" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".acx" mimeType="application/internet-property-stream" />
+ <mimeMap fileExtension=".adt" mimeType="audio/vnd.dlna.adts" />
+ <mimeMap fileExtension=".adts" mimeType="audio/vnd.dlna.adts" />
+ <mimeMap fileExtension=".afm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ai" mimeType="application/postscript" />
+ <mimeMap fileExtension=".aif" mimeType="audio/x-aiff" />
+ <mimeMap fileExtension=".aifc" mimeType="audio/aiff" />
+ <mimeMap fileExtension=".aiff" mimeType="audio/aiff" />
+ <mimeMap fileExtension=".appcache" mimeType="text/cache-manifest" />
+ <mimeMap fileExtension=".application" mimeType="application/x-ms-application" />
+ <mimeMap fileExtension=".art" mimeType="image/x-jg" />
+ <mimeMap fileExtension=".asd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".asf" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".asi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".asm" mimeType="text/plain" />
+ <mimeMap fileExtension=".asr" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".asx" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".atom" mimeType="application/atom+xml" />
+ <mimeMap fileExtension=".au" mimeType="audio/basic" />
+ <mimeMap fileExtension=".avi" mimeType="video/avi" />
+ <mimeMap fileExtension=".axs" mimeType="application/olescript" />
+ <mimeMap fileExtension=".bas" mimeType="text/plain" />
+ <mimeMap fileExtension=".bcpio" mimeType="application/x-bcpio" />
+ <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".bmp" mimeType="image/bmp" />
+ <mimeMap fileExtension=".c" mimeType="text/plain" />
+ <mimeMap fileExtension=".cab" mimeType="application/vnd.ms-cab-compressed" />
+ <mimeMap fileExtension=".calx" mimeType="application/vnd.ms-office.calx" />
+ <mimeMap fileExtension=".cat" mimeType="application/vnd.ms-pki.seccat" />
+ <mimeMap fileExtension=".cdf" mimeType="application/x-cdf" />
+ <mimeMap fileExtension=".chm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".class" mimeType="application/x-java-applet" />
+ <mimeMap fileExtension=".clp" mimeType="application/x-msclip" />
+ <mimeMap fileExtension=".cmx" mimeType="image/x-cmx" />
+ <mimeMap fileExtension=".cnf" mimeType="text/plain" />
+ <mimeMap fileExtension=".cod" mimeType="image/cis-cod" />
+ <mimeMap fileExtension=".cpio" mimeType="application/x-cpio" />
+ <mimeMap fileExtension=".cpp" mimeType="text/plain" />
+ <mimeMap fileExtension=".crd" mimeType="application/x-mscardfile" />
+ <mimeMap fileExtension=".crl" mimeType="application/pkix-crl" />
+ <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" />
+ <mimeMap fileExtension=".csh" mimeType="application/x-csh" />
+ <mimeMap fileExtension=".css" mimeType="text/css" />
+ <mimeMap fileExtension=".csv" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".cur" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dcr" mimeType="application/x-director" />
+ <mimeMap fileExtension=".deploy" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".der" mimeType="application/x-x509-ca-cert" />
+ <mimeMap fileExtension=".dib" mimeType="image/bmp" />
+ <mimeMap fileExtension=".dir" mimeType="application/x-director" />
+ <mimeMap fileExtension=".disco" mimeType="text/xml" />
+ <mimeMap fileExtension=".dll" mimeType="application/x-msdownload" />
+ <mimeMap fileExtension=".dll.config" mimeType="text/xml" />
+ <mimeMap fileExtension=".dlm" mimeType="text/dlm" />
+ <mimeMap fileExtension=".doc" mimeType="application/msword" />
+ <mimeMap fileExtension=".docm" mimeType="application/vnd.ms-word.document.macroEnabled.12" />
+ <mimeMap fileExtension=".docx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
+ <mimeMap fileExtension=".dot" mimeType="application/msword" />
+ <mimeMap fileExtension=".dotm" mimeType="application/vnd.ms-word.template.macroEnabled.12" />
+ <mimeMap fileExtension=".dotx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.template" />
+ <mimeMap fileExtension=".dsp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dtd" mimeType="text/xml" />
+ <mimeMap fileExtension=".dvi" mimeType="application/x-dvi" />
+ <mimeMap fileExtension=".dvr-ms" mimeType="video/x-ms-dvr" />
+ <mimeMap fileExtension=".dwf" mimeType="drawing/x-dwf" />
+ <mimeMap fileExtension=".dwp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dxr" mimeType="application/x-director" />
+ <mimeMap fileExtension=".eml" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".emz" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
+ <mimeMap fileExtension=".eps" mimeType="application/postscript" />
+ <mimeMap fileExtension=".esd" mimeType="application/vnd.ms-cab-compressed" />
+ <mimeMap fileExtension=".etx" mimeType="text/x-setext" />
+ <mimeMap fileExtension=".evy" mimeType="application/envoy" />
+ <mimeMap fileExtension=".exe" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".exe.config" mimeType="text/xml" />
+ <mimeMap fileExtension=".fdf" mimeType="application/vnd.fdf" />
+ <mimeMap fileExtension=".fif" mimeType="application/fractals" />
+ <mimeMap fileExtension=".fla" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".flr" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".flv" mimeType="video/x-flv" />
+ <mimeMap fileExtension=".gif" mimeType="image/gif" />
+ <mimeMap fileExtension=".glb" mimeType="model/gltf-binary" />
+ <mimeMap fileExtension=".gtar" mimeType="application/x-gtar" />
+ <mimeMap fileExtension=".gz" mimeType="application/x-gzip" />
+ <mimeMap fileExtension=".h" mimeType="text/plain" />
+ <mimeMap fileExtension=".hdf" mimeType="application/x-hdf" />
+ <mimeMap fileExtension=".hdml" mimeType="text/x-hdml" />
+ <mimeMap fileExtension=".hhc" mimeType="application/x-oleobject" />
+ <mimeMap fileExtension=".hhk" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".hhp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".hlp" mimeType="application/winhlp" />
+ <mimeMap fileExtension=".hqx" mimeType="application/mac-binhex40" />
+ <mimeMap fileExtension=".hta" mimeType="application/hta" />
+ <mimeMap fileExtension=".htc" mimeType="text/x-component" />
+ <mimeMap fileExtension=".htm" mimeType="text/html" />
+ <mimeMap fileExtension=".html" mimeType="text/html" />
+ <mimeMap fileExtension=".htt" mimeType="text/webviewhtml" />
+ <mimeMap fileExtension=".hxt" mimeType="text/html" />
+ <mimeMap fileExtension=".ico" mimeType="image/x-icon" />
+ <mimeMap fileExtension=".ics" mimeType="text/calendar" />
+ <mimeMap fileExtension=".ief" mimeType="image/ief" />
+ <mimeMap fileExtension=".iii" mimeType="application/x-iphone" />
+ <mimeMap fileExtension=".inf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ins" mimeType="application/x-internet-signup" />
+ <mimeMap fileExtension=".isp" mimeType="application/x-internet-signup" />
+ <mimeMap fileExtension=".IVF" mimeType="video/x-ivf" />
+ <mimeMap fileExtension=".jar" mimeType="application/java-archive" />
+ <mimeMap fileExtension=".java" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".jck" mimeType="application/liquidmotion" />
+ <mimeMap fileExtension=".jcz" mimeType="application/liquidmotion" />
+ <mimeMap fileExtension=".jfif" mimeType="image/pjpeg" />
+ <mimeMap fileExtension=".jpb" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".jpe" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".jpeg" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".jpg" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".js" mimeType="application/javascript" />
+ <mimeMap fileExtension=".json" mimeType="application/json" />
+ <mimeMap fileExtension=".jsonld" mimeType="application/ld+json" />
+ <mimeMap fileExtension=".jsx" mimeType="text/jscript" />
+ <mimeMap fileExtension=".latex" mimeType="application/x-latex" />
+ <mimeMap fileExtension=".less" mimeType="text/css" />
+ <mimeMap fileExtension=".lit" mimeType="application/x-ms-reader" />
+ <mimeMap fileExtension=".lpk" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".lsf" mimeType="video/x-la-asf" />
+ <mimeMap fileExtension=".lsx" mimeType="video/x-la-asf" />
+ <mimeMap fileExtension=".lzh" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".m13" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".m14" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".m1v" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".m2ts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".m3u" mimeType="audio/x-mpegurl" />
+ <mimeMap fileExtension=".m4a" mimeType="audio/mp4" />
+ <mimeMap fileExtension=".m4v" mimeType="video/mp4" />
+ <mimeMap fileExtension=".man" mimeType="application/x-troff-man" />
+ <mimeMap fileExtension=".manifest" mimeType="application/x-ms-manifest" />
+ <mimeMap fileExtension=".map" mimeType="text/plain" />
+ <mimeMap fileExtension=".mdb" mimeType="application/x-msaccess" />
+ <mimeMap fileExtension=".mdp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".me" mimeType="application/x-troff-me" />
+ <mimeMap fileExtension=".mht" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".mhtml" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".mid" mimeType="audio/mid" />
+ <mimeMap fileExtension=".midi" mimeType="audio/mid" />
+ <mimeMap fileExtension=".mix" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mmf" mimeType="application/x-smaf" />
+ <mimeMap fileExtension=".mno" mimeType="text/xml" />
+ <mimeMap fileExtension=".mny" mimeType="application/x-msmoney" />
+ <mimeMap fileExtension=".mov" mimeType="video/quicktime" />
+ <mimeMap fileExtension=".movie" mimeType="video/x-sgi-movie" />
+ <mimeMap fileExtension=".mp2" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mp3" mimeType="audio/mpeg" />
+ <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
+ <mimeMap fileExtension=".mp4v" mimeType="video/mp4" />
+ <mimeMap fileExtension=".mpa" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpe" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpeg" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpg" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpp" mimeType="application/vnd.ms-project" />
+ <mimeMap fileExtension=".mpv2" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".ms" mimeType="application/x-troff-ms" />
+ <mimeMap fileExtension=".msi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mso" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mvb" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".mvc" mimeType="application/x-miva-compiled" />
+ <mimeMap fileExtension=".nc" mimeType="application/x-netcdf" />
+ <mimeMap fileExtension=".nsc" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".nws" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".ocx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".oda" mimeType="application/oda" />
+ <mimeMap fileExtension=".odc" mimeType="text/x-ms-odc" />
+ <mimeMap fileExtension=".ods" mimeType="application/oleobject" />
+ <mimeMap fileExtension=".oga" mimeType="audio/ogg" />
+ <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
+ <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
+ <mimeMap fileExtension=".one" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onea" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetoc" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetoc2" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetmp" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onepkg" mimeType="application/onenote" />
+ <mimeMap fileExtension=".osdx" mimeType="application/opensearchdescription+xml" />
+ <mimeMap fileExtension=".otf" mimeType="font/otf" />
+ <mimeMap fileExtension=".p10" mimeType="application/pkcs10" />
+ <mimeMap fileExtension=".p12" mimeType="application/x-pkcs12" />
+ <mimeMap fileExtension=".p7b" mimeType="application/x-pkcs7-certificates" />
+ <mimeMap fileExtension=".p7c" mimeType="application/pkcs7-mime" />
+ <mimeMap fileExtension=".p7m" mimeType="application/pkcs7-mime" />
+ <mimeMap fileExtension=".p7r" mimeType="application/x-pkcs7-certreqresp" />
+ <mimeMap fileExtension=".p7s" mimeType="application/pkcs7-signature" />
+ <mimeMap fileExtension=".pbm" mimeType="image/x-portable-bitmap" />
+ <mimeMap fileExtension=".pcx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pcz" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pdf" mimeType="application/pdf" />
+ <mimeMap fileExtension=".pfb" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pfm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pfx" mimeType="application/x-pkcs12" />
+ <mimeMap fileExtension=".pgm" mimeType="image/x-portable-graymap" />
+ <mimeMap fileExtension=".pko" mimeType="application/vnd.ms-pki.pko" />
+ <mimeMap fileExtension=".pma" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmc" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pml" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmr" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmw" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".png" mimeType="image/png" />
+ <mimeMap fileExtension=".pnm" mimeType="image/x-portable-anymap" />
+ <mimeMap fileExtension=".pnz" mimeType="image/png" />
+ <mimeMap fileExtension=".pot" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".potm" mimeType="application/vnd.ms-powerpoint.template.macroEnabled.12" />
+ <mimeMap fileExtension=".potx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.template" />
+ <mimeMap fileExtension=".ppam" mimeType="application/vnd.ms-powerpoint.addin.macroEnabled.12" />
+ <mimeMap fileExtension=".ppm" mimeType="image/x-portable-pixmap" />
+ <mimeMap fileExtension=".pps" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".ppsm" mimeType="application/vnd.ms-powerpoint.slideshow.macroEnabled.12" />
+ <mimeMap fileExtension=".ppsx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" />
+ <mimeMap fileExtension=".ppt" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".pptm" mimeType="application/vnd.ms-powerpoint.presentation.macroEnabled.12" />
+ <mimeMap fileExtension=".pptx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
+ <mimeMap fileExtension=".prf" mimeType="application/pics-rules" />
+ <mimeMap fileExtension=".prm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".prx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ps" mimeType="application/postscript" />
+ <mimeMap fileExtension=".psd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".psm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".psp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pub" mimeType="application/x-mspublisher" />
+ <mimeMap fileExtension=".qt" mimeType="video/quicktime" />
+ <mimeMap fileExtension=".qtl" mimeType="application/x-quicktimeplayer" />
+ <mimeMap fileExtension=".qxd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ra" mimeType="audio/x-pn-realaudio" />
+ <mimeMap fileExtension=".ram" mimeType="audio/x-pn-realaudio" />
+ <mimeMap fileExtension=".rar" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ras" mimeType="image/x-cmu-raster" />
+ <mimeMap fileExtension=".rf" mimeType="image/vnd.rn-realflash" />
+ <mimeMap fileExtension=".rgb" mimeType="image/x-rgb" />
+ <mimeMap fileExtension=".rm" mimeType="application/vnd.rn-realmedia" />
+ <mimeMap fileExtension=".rmi" mimeType="audio/mid" />
+ <mimeMap fileExtension=".roff" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".rpm" mimeType="audio/x-pn-realaudio-plugin" />
+ <mimeMap fileExtension=".rtf" mimeType="application/rtf" />
+ <mimeMap fileExtension=".rtx" mimeType="text/richtext" />
+ <mimeMap fileExtension=".scd" mimeType="application/x-msschedule" />
+ <mimeMap fileExtension=".sct" mimeType="text/scriptlet" />
+ <mimeMap fileExtension=".sea" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".setpay" mimeType="application/set-payment-initiation" />
+ <mimeMap fileExtension=".setreg" mimeType="application/set-registration-initiation" />
+ <mimeMap fileExtension=".sgml" mimeType="text/sgml" />
+ <mimeMap fileExtension=".sh" mimeType="application/x-sh" />
+ <mimeMap fileExtension=".shar" mimeType="application/x-shar" />
+ <mimeMap fileExtension=".sit" mimeType="application/x-stuffit" />
+ <mimeMap fileExtension=".sldm" mimeType="application/vnd.ms-powerpoint.slide.macroEnabled.12" />
+ <mimeMap fileExtension=".sldx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slide" />
+ <mimeMap fileExtension=".smd" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".smi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".smx" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".smz" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".snd" mimeType="audio/basic" />
+ <mimeMap fileExtension=".snp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".spc" mimeType="application/x-pkcs7-certificates" />
+ <mimeMap fileExtension=".spl" mimeType="application/futuresplash" />
+ <mimeMap fileExtension=".spx" mimeType="audio/ogg" />
+ <mimeMap fileExtension=".src" mimeType="application/x-wais-source" />
+ <mimeMap fileExtension=".ssm" mimeType="application/streamingmedia" />
+ <mimeMap fileExtension=".sst" mimeType="application/vnd.ms-pki.certstore" />
+ <mimeMap fileExtension=".stl" mimeType="application/vnd.ms-pki.stl" />
+ <mimeMap fileExtension=".sv4cpio" mimeType="application/x-sv4cpio" />
+ <mimeMap fileExtension=".sv4crc" mimeType="application/x-sv4crc" />
+ <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
+ <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" />
+ <mimeMap fileExtension=".swf" mimeType="application/x-shockwave-flash" />
+ <mimeMap fileExtension=".t" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".tar" mimeType="application/x-tar" />
+ <mimeMap fileExtension=".tcl" mimeType="application/x-tcl" />
+ <mimeMap fileExtension=".tex" mimeType="application/x-tex" />
+ <mimeMap fileExtension=".texi" mimeType="application/x-texinfo" />
+ <mimeMap fileExtension=".texinfo" mimeType="application/x-texinfo" />
+ <mimeMap fileExtension=".tgz" mimeType="application/x-compressed" />
+ <mimeMap fileExtension=".thmx" mimeType="application/vnd.ms-officetheme" />
+ <mimeMap fileExtension=".thn" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tif" mimeType="image/tiff" />
+ <mimeMap fileExtension=".tiff" mimeType="image/tiff" />
+ <mimeMap fileExtension=".toc" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tr" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".trm" mimeType="application/x-msterminal" />
+ <mimeMap fileExtension=".ts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".tsv" mimeType="text/tab-separated-values" />
+ <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".txt" mimeType="text/plain" />
+ <mimeMap fileExtension=".u32" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".uls" mimeType="text/iuls" />
+ <mimeMap fileExtension=".ustar" mimeType="application/x-ustar" />
+ <mimeMap fileExtension=".vbs" mimeType="text/vbscript" />
+ <mimeMap fileExtension=".vcf" mimeType="text/x-vcard" />
+ <mimeMap fileExtension=".vcs" mimeType="text/plain" />
+ <mimeMap fileExtension=".vdx" mimeType="application/vnd.ms-visio.viewer" />
+ <mimeMap fileExtension=".vml" mimeType="text/xml" />
+ <mimeMap fileExtension=".vsd" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vss" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vst" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vsto" mimeType="application/x-ms-vsto" />
+ <mimeMap fileExtension=".vsw" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vsx" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vtx" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".wasm" mimeType="application/wasm" />
+ <mimeMap fileExtension=".wav" mimeType="audio/wav" />
+ <mimeMap fileExtension=".wax" mimeType="audio/x-ms-wax" />
+ <mimeMap fileExtension=".wbmp" mimeType="image/vnd.wap.wbmp" />
+ <mimeMap fileExtension=".wcm" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wdb" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".webm" mimeType="video/webm" />
+ <mimeMap fileExtension=".wks" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wm" mimeType="video/x-ms-wm" />
+ <mimeMap fileExtension=".wma" mimeType="audio/x-ms-wma" />
+ <mimeMap fileExtension=".wmd" mimeType="application/x-ms-wmd" />
+ <mimeMap fileExtension=".wmf" mimeType="application/x-msmetafile" />
+ <mimeMap fileExtension=".wml" mimeType="text/vnd.wap.wml" />
+ <mimeMap fileExtension=".wmlc" mimeType="application/vnd.wap.wmlc" />
+ <mimeMap fileExtension=".wmls" mimeType="text/vnd.wap.wmlscript" />
+ <mimeMap fileExtension=".wmlsc" mimeType="application/vnd.wap.wmlscriptc" />
+ <mimeMap fileExtension=".wmp" mimeType="video/x-ms-wmp" />
+ <mimeMap fileExtension=".wmv" mimeType="video/x-ms-wmv" />
+ <mimeMap fileExtension=".wmx" mimeType="video/x-ms-wmx" />
+ <mimeMap fileExtension=".wmz" mimeType="application/x-ms-wmz" />
+ <mimeMap fileExtension=".woff" mimeType="font/x-woff" />
+ <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
+ <mimeMap fileExtension=".wps" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wri" mimeType="application/x-mswrite" />
+ <mimeMap fileExtension=".wrl" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".wrz" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".wsdl" mimeType="text/xml" />
+ <mimeMap fileExtension=".wtv" mimeType="video/x-ms-wtv" />
+ <mimeMap fileExtension=".wvx" mimeType="video/x-ms-wvx" />
+ <mimeMap fileExtension=".x" mimeType="application/directx" />
+ <mimeMap fileExtension=".xaf" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".xaml" mimeType="application/xaml+xml" />
+ <mimeMap fileExtension=".xap" mimeType="application/x-silverlight-app" />
+ <mimeMap fileExtension=".xbap" mimeType="application/x-ms-xbap" />
+ <mimeMap fileExtension=".xbm" mimeType="image/x-xbitmap" />
+ <mimeMap fileExtension=".xdr" mimeType="text/plain" />
+ <mimeMap fileExtension=".xht" mimeType="application/xhtml+xml" />
+ <mimeMap fileExtension=".xhtml" mimeType="application/xhtml+xml" />
+ <mimeMap fileExtension=".xla" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlam" mimeType="application/vnd.ms-excel.addin.macroEnabled.12" />
+ <mimeMap fileExtension=".xlc" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlm" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xls" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlsb" mimeType="application/vnd.ms-excel.sheet.binary.macroEnabled.12" />
+ <mimeMap fileExtension=".xlsm" mimeType="application/vnd.ms-excel.sheet.macroEnabled.12" />
+ <mimeMap fileExtension=".xlsx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
+ <mimeMap fileExtension=".xlt" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xltm" mimeType="application/vnd.ms-excel.template.macroEnabled.12" />
+ <mimeMap fileExtension=".xltx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.template" />
+ <mimeMap fileExtension=".xlw" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xml" mimeType="text/xml" />
+ <mimeMap fileExtension=".xof" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".xpm" mimeType="image/x-xpixmap" />
+ <mimeMap fileExtension=".xps" mimeType="application/vnd.ms-xpsdocument" />
+ <mimeMap fileExtension=".xsd" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsf" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsl" mimeType="text/xml" />
+ <mimeMap fileExtension=".xslt" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsn" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".xtp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".xwd" mimeType="image/x-xwindowdump" />
+ <mimeMap fileExtension=".z" mimeType="application/x-compress" />
+ <mimeMap fileExtension=".zip" mimeType="application/x-zip-compressed" />
+ </staticContent>
+
+ <tracing>
+
+ <traceFailedRequests>
+ <add path="*">
+ <traceAreas>
+ <add provider="ASP" verbosity="Verbose" />
+ <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
+ <add provider="ISAPI Extension" verbosity="Verbose" />
+ <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket" verbosity="Verbose" />
+ </traceAreas>
+ <failureDefinitions statusCodes="200-999" />
+ </add>
+ </traceFailedRequests>
+
+ <traceProviderDefinitions>
+ <add name="WWW Server" guid="{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}">
+ <areas>
+ <clear />
+ <add name="Authentication" value="2" />
+ <add name="Security" value="4" />
+ <add name="Filter" value="8" />
+ <add name="StaticFile" value="16" />
+ <add name="CGI" value="32" />
+ <add name="Compression" value="64" />
+ <add name="Cache" value="128" />
+ <add name="RequestNotifications" value="256" />
+ <add name="Module" value="512" />
+ <add name="Rewrite" value="1024" />
+ <add name="FastCGI" value="4096" />
+ <add name="WebSocket" value="16384" />
+ <add name="ANCM" value="65536" />
+ </areas>
+ </add>
+ <add name="ASP" guid="{06b94d9a-b15e-456e-a4ef-37c984a2cb4b}">
+ <areas>
+ <clear />
+ </areas>
+ </add>
+ <add name="ISAPI Extension" guid="{a1c2040e-8840-4c31-ba11-9871031a19ea}">
+ <areas>
+ <clear />
+ </areas>
+ </add>
+ <add name="ASPNET" guid="{AFF081FE-0247-4275-9C4E-021F3DC1DA35}">
+ <areas>
+ <add name="Infrastructure" value="1" />
+ <add name="Module" value="2" />
+ <add name="Page" value="4" />
+ <add name="AppServices" value="8" />
+ </areas>
+ </add>
+ </traceProviderDefinitions>
+
+ </tracing>
+
+ <urlCompression />
+
+ <validation />
+ <webdav>
+ <globalSettings>
+ <propertyStores>
+ <add name="webdav_simple_prop" image="%IIS_BIN%\webdav_simple_prop.dll" image32="%IIS_BIN%\webdav_simple_prop.dll" />
+ </propertyStores>
+ <lockStores>
+ <add name="webdav_simple_lock" image="%IIS_BIN%\webdav_simple_lock.dll" image32="%IIS_BIN%\webdav_simple_lock.dll" />
+ </lockStores>
+
+ </globalSettings>
+ <authoring>
+ <locks enabled="true" lockStore="webdav_simple_lock" />
+ </authoring>
+ <authoringRules />
+ </webdav>
+ <webSocket />
+ <applicationInitialization />
+
</system.webServer>
- </location>
- <location path="WIDESEAWCS_Server" inheritInChildApplications="false">
- <system.webServer>
- <modules>
- <remove name="WebMatrixSupportModule" />
- </modules>
- <handlers>
- <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
- </handlers>
- <aspNetCore processPath="%LAUNCHER_PATH%" stdoutLogEnabled="false" hostingModel="InProcess" startupTimeLimit="3600" requestTimeout="23:00:00" />
- <httpCompression>
- <dynamicTypes>
- <add mimeType="text/event-stream" enabled="false" />
- </dynamicTypes>
- </httpCompression>
- </system.webServer>
- </location>
-</configuration>
\ No newline at end of file
+ <location path="" overrideMode="Allow">
+ <system.webServer>
+ <modules>
+ <add name="IsapiFilterModule" lockItem="true" />
+ <add name="BasicAuthenticationModule" lockItem="true" />
+ <add name="IsapiModule" lockItem="true" />
+ <add name="HttpLoggingModule" lockItem="true" />
+ <add name="DynamicCompressionModule" lockItem="true" />
+ <add name="StaticCompressionModule" lockItem="true" />
+ <add name="DefaultDocumentModule" lockItem="true" />
+ <add name="DirectoryListingModule" lockItem="true" />
+ <add name="ProtocolSupportModule" lockItem="true" />
+ <add name="HttpRedirectionModule" lockItem="true" />
+ <add name="ServerSideIncludeModule" lockItem="true" />
+ <add name="StaticFileModule" lockItem="true" />
+ <add name="AnonymousAuthenticationModule" lockItem="true" />
+ <add name="CertificateMappingAuthenticationModule" lockItem="true" />
+ <add name="UrlAuthorizationModule" lockItem="true" />
+ <add name="WindowsAuthenticationModule" lockItem="true" />
+ <add name="IISCertificateMappingAuthenticationModule" lockItem="true" />
+ <add name="WebMatrixSupportModule" lockItem="true" />
+ <add name="IpRestrictionModule" lockItem="true" />
+ <add name="DynamicIpRestrictionModule" lockItem="true" />
+ <add name="RequestFilteringModule" lockItem="true" />
+ <add name="CustomLoggingModule" lockItem="true" />
+ <add name="CustomErrorModule" lockItem="true" />
+ <add name="FailedRequestsTracingModule" lockItem="true" />
+ <add name="CgiModule" lockItem="true" />
+ <add name="FastCgiModule" lockItem="true" />
+<!-- <add name="WebDAVModule" /> -->
+ <add name="RewriteModule" />
+ <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" preCondition="managedHandler" />
+ <add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="managedHandler" />
+ <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" preCondition="managedHandler" />
+ <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="managedHandler" />
+ <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" preCondition="managedHandler" />
+ <add name="RoleManager" type="System.Web.Security.RoleManagerModule" preCondition="managedHandler" />
+ <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />
+ <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" preCondition="managedHandler" />
+ <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" preCondition="managedHandler" />
+ <add name="Profile" type="System.Web.Profile.ProfileModule" preCondition="managedHandler" />
+ <add name="UrlMappingsModule" type="System.Web.UrlMappingsModule" preCondition="managedHandler" />
+ <add name="ApplicationInitializationModule" lockItem="true" />
+ <add name="WebSocketModule" lockItem="true" />
+ <add name="ServiceModel-4.0" type="System.ServiceModel.Activation.ServiceHttpModule,System.ServiceModel.Activation,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="ConfigurationValidationModule" lockItem="true" />
+ <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler,runtimeVersionv2.0" />
+ <add name="AspNetCoreModule" lockItem="true" />
+ <add name="AspNetCoreModuleV2" lockItem="true" />
+ </modules>
+ <handlers accessPolicy="Read, Script">
+<!-- <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" /> -->
+ <add name="AXD-ISAPI-4.0_64bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-4.0_64bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-4.0_64bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="aspq-ISAPI-4.0_64bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="cshtm-ISAPI-4.0_64bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="cshtml-ISAPI-4.0_64bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="vbhtm-ISAPI-4.0_64bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="vbhtml-ISAPI-4.0_64bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="AXD-ISAPI-4.0_32bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-4.0_32bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-4.0_32bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="aspq-ISAPI-4.0_32bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="cshtm-ISAPI-4.0_32bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="cshtml-ISAPI-4.0_32bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="vbhtm-ISAPI-4.0_32bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="vbhtml-ISAPI-4.0_32bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="TraceHandler-Integrated-4.0" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="WebAdminHandler-Integrated-4.0" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="AssemblyResourceLoader-Integrated-4.0" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="HttpRemotingHandlerFactory-rem-Integrated-4.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="HttpRemotingHandlerFactory-soap-Integrated-4.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="aspq-Integrated-4.0" path="*.aspq" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="cshtm-Integrated-4.0" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="cshtml-Integrated-4.0" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="vbhtm-Integrated-4.0" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="vbhtml-Integrated-4.0" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ScriptHandlerFactoryAppServices-Integrated-4.0" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ScriptResourceIntegrated-4.0" path="*ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
+ <add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
+ <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
+ <add name="TraceHandler-Integrated" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="WebAdminHandler-Integrated" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="AssemblyResourceLoader-Integrated" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="SimpleHandlerFactory-Integrated" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="WebServiceHandlerFactory-Integrated" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Services.Protocols.WebServiceHandlerFactory,System.Web.Services,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="HttpRemotingHandlerFactory-rem-Integrated" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="HttpRemotingHandlerFactory-soap-Integrated" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="AXD-ISAPI-2.0" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-2.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-2.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="AXD-ISAPI-2.0-64" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-2.0-64" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-2.0-64" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-2.0-64" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0-64" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0-64" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
+ <add name="SSINC-stm" path="*.stm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="SSINC-shtm" path="*.shtm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="SSINC-shtml" path="*.shtml" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
+ <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" />
+ <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
+ <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
+ </handlers>
+ </system.webServer>
+ </location>
+</configuration>
diff --git a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json b/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json
deleted file mode 100644
index c95b975..0000000
--- a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "D:\\Git\\InfrastructureWCS\\WIDESEAWCS_Server\\",
- "Documents": [],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": -1,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json b/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json
deleted file mode 100644
index 1fb6537..0000000
--- a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json
+++ /dev/null
@@ -1,211 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinejob\\commonconveyorlinejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\conveyorlinejob\\commonconveyorlinejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_taskinfoservice\\taskexecutedetailservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskexecutedetailservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_core\\loghelper\\requestlogmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|solutionrelative:wideseawcs_core\\loghelper\\requestlogmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_core\\loghelper\\quartzlogger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|solutionrelative:wideseawcs_core\\loghelper\\quartzlogger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_core\\loghelper\\loglock.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|solutionrelative:wideseawcs_core\\loghelper\\loglock.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_core\\loghelper\\logger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|solutionrelative:wideseawcs_core\\loghelper\\logger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_quartzjob\\jobbase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\jobbase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|e:\\4.\u91CD\u6784\\wideseawcs\\infrastructurewcs\\wideseawcs_server\\wideseawcs_core\\aop\\logaop.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|solutionrelative:wideseawcs_core\\aop\\logaop.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 1,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{0174dea2-fdbe-4ef1-8f99-c0beae78880f}"
- },
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "Program.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Program.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
- "RelativeToolTip": "WIDESEAWCS_Server\\Program.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:46:00.808Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "CommonStackerCraneJob.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
- "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
- "ViewState": "AgIAAPMAAAAAAAAAAAAUwCEBAAAcAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:44:49.199Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "CommonConveyorLineJob.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
- "RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
- "ViewState": "AgIAAKMAAAAAAAAAAIA0wM8AAAANAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:44:07.193Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "TaskService.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
- "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAABcAAAAcAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:43:45.4Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "TaskExecuteDetailService.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskExecuteDetailService.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskExecuteDetailService.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskExecuteDetailService.cs",
- "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskExecuteDetailService.cs",
- "ViewState": "AgIAAHIAAAAAAAAAAIAwwIwAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:43:21.921Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "RequestLogModel.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\LogHelper\\RequestLogModel.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_Core\\LogHelper\\RequestLogModel.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\LogHelper\\RequestLogModel.cs",
- "RelativeToolTip": "WIDESEAWCS_Core\\LogHelper\\RequestLogModel.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:41:43.681Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 6,
- "Title": "QuartzLogger.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\LogHelper\\QuartzLogger.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_Core\\LogHelper\\QuartzLogger.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\LogHelper\\QuartzLogger.cs",
- "RelativeToolTip": "WIDESEAWCS_Core\\LogHelper\\QuartzLogger.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:41:40.891Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 7,
- "Title": "LogLock.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\LogHelper\\LogLock.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_Core\\LogHelper\\LogLock.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\LogHelper\\LogLock.cs",
- "RelativeToolTip": "WIDESEAWCS_Core\\LogHelper\\LogLock.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:41:39.865Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 8,
- "Title": "Logger.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\LogHelper\\Logger.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_Core\\LogHelper\\Logger.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\LogHelper\\Logger.cs",
- "RelativeToolTip": "WIDESEAWCS_Core\\LogHelper\\Logger.cs",
- "ViewState": "AgIAAEIAAAAAAAAAAAAYwCMAAAAiAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:27:45.47Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 9,
- "Title": "JobBase.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\JobBase.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\JobBase.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\JobBase.cs",
- "RelativeToolTip": "WIDESEAWCS_QuartzJob\\JobBase.cs",
- "ViewState": "AgIAABcAAAAAAAAAAAAYwE0AAAAMAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-26T07:27:18.118Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 10,
- "Title": "LogAOP.cs",
- "DocumentMoniker": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\AOP\\LogAOP.cs",
- "RelativeDocumentMoniker": "WIDESEAWCS_Core\\AOP\\LogAOP.cs",
- "ToolTip": "E:\\4.\u91CD\u6784\\WIDESEAWCS\\InfrastructureWCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\AOP\\LogAOP.cs",
- "RelativeToolTip": "WIDESEAWCS_Core\\AOP\\LogAOP.cs",
- "ViewState": "AgIAAFAAAAAAAAAAAAAAwHkAAABAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-01-21T03:23:42.554Z",
- "EditorCaption": ""
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/.vscode/launch.json b/Code/WCS/WIDESEAWCS_Server/.vscode/launch.json
deleted file mode 100644
index f980ab9..0000000
--- a/Code/WCS/WIDESEAWCS_Server/.vscode/launch.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- // 浣跨敤 IntelliSense 浜嗚В鐩稿叧灞炴�с��
- // 鎮仠浠ユ煡鐪嬬幇鏈夊睘鎬х殑鎻忚堪銆�
- // 娆蹭簡瑙f洿澶氫俊鎭紝璇疯闂�: https://go.microsoft.com/fwlink/?linkid=830387
- "version": "0.2.0",
- "configurations": []
-}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/AGENTS.md b/Code/WCS/WIDESEAWCS_Server/AGENTS.md
deleted file mode 100644
index a63cedb..0000000
--- a/Code/WCS/WIDESEAWCS_Server/AGENTS.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Repository Guidelines
-
-## 项目结构与模块组织
-本仓库是一个按分层职责组织的多项目 .NET 解决方案(`WIDESEAWCS_Server.sln`)。
-- `WIDESEAWCS_Server/`:ASP.NET Core 主机、控制器、启动管线,静态资源位于 `wwwroot/`。
-- `WIDESEAWCS_Core/`:通用基础设施(DI、中间件、鉴权、数据库配置、基础抽象)。
-- `WIDESEAWCS_Model/` 与 `WIDESEAWCS_DTO/`:实体模型与传输对象。
-- `WIDESEAWCS_*Repository` + `WIDESEAWCS_*Service`:System、TaskInfo、BasicInfo 领域的接口/实现分层。
-- `WIDESEAWCS_Tasks/` 与 `WIDESEAWCS_QuartzJob/`:设备任务编排与调度。
-- `WIDESEAWCS_Tests/`:自动化单元测试(xUnit)。
-- `docs/superpowers/`:设计文档与实施计划。
-
-## 构建、测试与本地开发命令
-- `dotnet restore WIDESEAWCS_Server.sln`:还原所有 NuGet 依赖。
-- `dotnet build WIDESEAWCS_Server.sln -c Debug`:编译全部项目。
-- `dotnet test WIDESEAWCS_Tests/WIDESEAWCS_Tests.csproj`:运行单元测试。
-- `dotnet run --project WIDESEAWCS_Server/WIDESEAWCS_Server.csproj`:本地启动 API 服务。
-
-优先使用解决方案级命令;需要快速迭代时再切换到项目级命令。
-
-## 代码风格与命名规范
-- 语言:C#,各项目已启用可空引用(nullable)。
-- 缩进:4 个空格;大括号换行(与现有代码保持一致)。
-- 命名:类型/方法/属性使用 `PascalCase`,局部变量/参数使用 `camelCase`,接口以 `I` 前缀命名。
-- 文件命名与类型名保持一致(例如 `Sys_UserService.cs`、`TaskController.cs`)。
-- `.editorconfig` 当前对 `*.cs` 抑制 CS8618;未经团队确认不要新增大范围警告抑制。
-- 为新生成或者修改的代码的每一行添加详细注释,包括:
- - 方法的目的说明
- - 参数说明
- - 返回值说明
- - 每一行代码的作用
- - 异常情况的说明
-
-
-## 测试规范
-- 测试栈:xUnit + `Microsoft.NET.Test.Sdk`,并已引入 `Moq`、`FluentAssertions`、`coverlet.collector`。
-- 测试命名建议:`MethodName_ShouldExpectedBehavior`(例如 `WaitIntervalMs_ShouldBe500`)。
-- 修改业务逻辑、常量或服务行为时,需同步新增/更新测试。
-- 推送前请本地执行 `dotnet test`。
-
-## 提交与 Pull Request 规范
-- 最近提交历史倾向使用简短、聚焦的前缀风格:`feat:`、`fix:`、`docs:`、`chore:`、`config:`。
-- 提交标题使用祈使句,单次提交聚焦单一变更集。
-- PR 建议包含:
- - 变更内容与动机的清晰说明;
- - 受影响模块/项目路径;
- - 测试证据(`dotnet test` 输出或等价说明);
- - 关联任务/Issue(如有);
- - 仅在修改 UI/静态页面资源时附截图。
diff --git a/Code/WCS/WIDESEAWCS_Server/CLAUDE.md b/Code/WCS/WIDESEAWCS_Server/CLAUDE.md
index 90f1178..9518b9c 100644
--- a/Code/WCS/WIDESEAWCS_Server/CLAUDE.md
+++ b/Code/WCS/WIDESEAWCS_Server/CLAUDE.md
@@ -1,245 +1,132 @@
# CLAUDE.md
-鏈枃浠朵负 Claude Code (claude.ai/code) 鍦ㄦ浠g爜搴撲腑宸ヤ綔鏃舵彁渚涙寚瀵笺��
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
-## 鏋勫缓鍛戒护
+## 椤圭洰姒傝堪
+
+**WIDESEAWCS** 鏄竴涓粨搴撴帶鍒剁郴缁燂紝鍩轰簬 ASP.NET Core 6.0 鏋勫缓銆傜敤浜庣鐞嗚嚜鍔ㄥ寲鐗╂枡澶勭悊璁惧锛堝爢鍨涙満銆佽緭閫佺嚎銆佹満鍣ㄤ汉銆佺┛姊溅绛夛級鐨勫伐涓氫粨鍌ㄧ幆澧冦��
+
+## 鏋勫缓涓庤繍琛屽懡浠�
```bash
# 鏋勫缓鏁翠釜瑙e喅鏂规
dotnet build WIDESEAWCS_Server.sln
-# 鏋勫缓骞惰繍琛屾湇鍔″櫒
-cd WIDESEAWCS_Server
-dotnet run
+# 杩愯鏈嶅姟鍣紙绔彛 9292锛�
+dotnet run --project WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
# 杩愯娴嬭瘯
-cd WIDESEAWCS_Tests
-dotnet test
+dotnet test WIDESEAWCS_Tests/WIDESEAWCS_Tests.csproj
```
-## 鏋舵瀯姒傝堪
+## 鏋舵瀯
-杩欐槸涓�涓熀浜� ASP.NET Core 6.0 鏋勫缓鐨� **WCS锛堜粨搴撴帶鍒剁郴缁燂級**锛屼娇鐢ㄤ互涓嬫妧鏈細
+### 椤圭洰缁撴瀯
-- **Autofac** - 閫氳繃 `IDependency` 鏍囪鎺ュ彛瀹炵幇鑷姩鏈嶅姟鍙戠幇鐨勪緷璧栨敞鍏�
-- **Quartz.NET** - 瀹氭椂浠诲姟鎵ц锛堣澶囬�氫俊寰幆锛�
-- **SqlSugar ORM** - 鏁版嵁搴撹闂�
-- **Redis**锛堥�氳繃 `WIDESEAWCS_RedisService`锛�- 閲囩敤 L1+L2 娣峰悎妯″紡鐨勫垎甯冨紡缂撳瓨
-- **StackExchange.Redis** - Redis 鎿嶄綔
-- **TCP Socket Server** - 瀹炴椂璁惧閫氫俊
-- **HslCommunication** 搴� - PLC/纭欢閫氫俊
+| 椤圭洰 | 鐢ㄩ�� |
+| ------------------------- | ----------------------------------- |
+| `WIDESEAWCS_Server` | 涓� Web API 鍏ュ彛锛堢鍙� 9292锛� |
+| `WIDESEAWCS_Core` | 妗嗘灦宸ュ叿锛堟暟鎹簱銆佺紦瀛樸�佷緷璧栨敞鍏ャ�佹棩蹇椼�佽璇侊級 |
+| `WIDESEAWCS_Common` | 甯搁噺銆佹灇涓俱�丷edis 閿畾涔� |
+| `WIDESEAWCS_Model` | 鏁版嵁搴撳疄浣撴ā鍨� |
+| `WIDESEAWCS_DTO` | 鏁版嵁浼犺緭瀵硅薄 |
+| `WIDESEAWCS_Communicator` | 宸ヤ笟璁惧閫氫俊鍗忚锛圡odbus銆丼iemens S7銆丱mron 绛夛級 |
+| `WIDESEAWCS_Tasks` | 鍚庡彴璁惧鎺у埗浣滀笟 |
+| `WIDESEAWCS_QuartzJob` | Quartz.NET 璋冨害鍜屾淳鍙戦�昏緫 |
+| `WIDESEAWCS_RedisService` | L1+L2 娣峰悎缂撳瓨鏈嶅姟 |
-## 椤圭洰缁撴瀯
+### 鍏抽敭璁捐妯″紡
-```
-WIDESEAWCS_Server/ # 涓� ASP.NET Core API 鏈嶅姟鍣�
-WIDESEAWCS_Core/ # 鏍稿績鍩虹璁炬柦锛氬熀绫汇�丏I銆佹墿灞曘�佷腑闂翠欢
-WIDESEAWCS_Model/ # 鏁版嵁妯″瀷鍜� DTO
-WIDESEAWCS_Communicator/ # 纭欢閫氫俊椹卞姩锛圫iemens銆丱mron銆丮odbus 绛夛級
-WIDESEAWCS_QuartzJob/ # 浠诲姟璋冨害鍩虹璁炬柦鍜岃澶囨娊璞�
-WIDESEAWCS_Tasks/ # Quartz 浠诲姟瀹炵幇锛堣澶囬�氫俊寰幆锛�
-WIDESEAWCS_RedisService/ # Redis 鏈嶅姟锛氱紦瀛樸�侀攣銆佽鏁板櫒銆佸彂甯冭闃呯瓑
-WIDESEAWCS_*Repository/ # 鏁版嵁璁块棶灞傚疄鐜�
-WIDESEAWCS_*Service/ # 涓氬姟鏈嶅姟灞�
-WIDESEAWCS_Tests/ # 鍗曞厓娴嬭瘯
-```
+- **浠撳偍妯″紡**锛氭暟鎹闂娊璞★紙`WIDESEAWCS_*Repository` 椤圭洰锛�
+- **鏈嶅姟灞�**锛氫笟鍔¢�昏緫灏佽锛坄WIDESEAWCS_*Service` 椤圭洰锛�
+- **Autofac 渚濊禆娉ㄥ叆**锛氶�氳繃 `AutofacModuleRegister` 妯″潡娉ㄥ唽
+- **AOP 鎷︽埅**锛氶�氳繃 `UseServiceDIAttribute` 瀹炵幇缂撳瓨鍜屾棩蹇楀垏闈�
+- **SqlSugar ORM**锛氭敮鎸� MySQL銆丼QL Server銆丼QLite銆丱racle銆丳ostgreSQL
-## 渚濊禆娉ㄥ叆 - IDependency 妯″紡
+### 鏁版嵁娴佸悜
-鏈嶅姟閫氳繃瀹炵幇绌虹殑 `IDependency` 鏍囪鎺ュ彛琚� Autofac **鑷姩娉ㄥ唽**锛�
+1. API Controllers 鈫� Services 鈫� Repositories 鈫� SqlSugar 鈫� SQL Server
+2. Quartz Jobs锛堝畾鏃惰皟搴︼級 鈫� 璁惧鎺у埗浣滀笟 鈫� Communicators 鈫� 鐗╃悊璁惧
+3. Redis L1锛堝唴瀛橈級 + L2锛圧edis锛夌紦瀛樺眰浣嶄簬鏁版嵁搴撳墠鏂�
-```csharp
-// 鍦� WIDESEAWCS_Core/IDependency.cs 涓�
-public interface IDependency { }
+## 鍏抽敭閰嶇疆锛坅ppsettings.json锛�
-// 鎮ㄧ殑鏈嶅姟浼氳鑷姩娉ㄥ唽
-public class MyService : IDependency // 鑷姩娉ㄥ唽涓� scoped
-{
- // ...
-}
-```
+- **Web API锛�** `http://*:9292`
+- **WebSocket锛�** `http://localhost:9296`
+- **TCP Socket 鏈嶅姟鍣細** `0.0.0.0:2000`
+- **鏁版嵁搴擄細** SQL Server锛屽疄渚� `.\WIDESEAWCS_ShanMei`
+- **Redis锛�** `127.0.0.1:6379`锛屽瘑鐮� `P@ssw0rd`
+- **JWT 杩囨湡鏃堕棿锛�** 120 鍒嗛挓
+- **Quartz锛�** 鑷姩鍚姩
-娉ㄥ唽鍦� `AutofacModuleRegister` 涓繘琛岋紝瀹冧細鎵弿鎵�鏈夐」鐩▼搴忛泦鏌ユ壘 `IDependency` 瀹炵幇銆�
+## 璁惧閫氫俊
-**閲嶈鎻愮ず**锛氬悜 `IServiceCollection` 娣诲姞鏈嶅姟鏃讹紙渚嬪鍦� `Program.cs` 涓級锛屽畠浠彲鑳戒細琚� Autofac 鐨勬敞鍐岃鐩栥�備娇鐢� `Remove()` 鏉ユ浛鎹㈢幇鏈夋敞鍐岋細
+`WIDESEAWCS_Communicator` 椤圭洰瀹炵幇浜嗗绉嶅伐涓氬崗璁細
-```csharp
-// 鍦� RedisServiceSetup.cs 涓� - 娣诲姞 HybridCacheService 涔嬪墠绉婚櫎 MemoryCacheService
-var existing = services.FirstOrDefault(d => d.ServiceType == typeof(ICacheService));
-if (existing != null) services.Remove(existing);
-```
+- `ModbusTcpCommunicator`
+- `SiemensS7Communicator`銆乣SiemensS7200SmartCommunicator`
+- `OmronEtherNetCommunicator`
+- `AllenBrandlyEtherNetCommunicator`
+- `InovanceTcpCommunicator`銆乣InovanceAMTcp`
+- `SerialPortCommunicator`
-## 缂撳瓨 - ICacheService
+鍩虹鎺ュ彛锛歚IBaseCommunicator`
-绯荤粺閫氳繃 `ICacheService` 浣跨敤 **L1锛堝唴瀛橈級+ L2锛圧edis锛夋贩鍚堢紦瀛�**妯″紡銆傚瓨鍦ㄤ笁绉嶅疄鐜帮細
+## 鍚庡彴浣滀笟
-- `MemoryCacheService` - 浠呭唴瀛�
-- `RedisCacheService` - 浠� Redis
-- `HybridCacheService` - L1+L2 甯﹂檷绾э紙鍚敤 Redis 鏃剁殑榛樿閫夐」锛�
+璁惧鎺у埗浣滀笟浣嶄簬 `WIDESEAWCS_Tasks/`锛�
-**甯哥敤鏂规硶**锛�
+- `StackerCraneJob` - 鍫嗗灈鏈烘帶鍒�
+- `ConveyorLineJob`銆乣ConveyorLineNewJob` - 杈撻�佺嚎绠$悊
+- `RobotJob` - 鏈烘鎵嬫帶鍒�
+- `ShuttleCarJob` - 绌挎杞︽帶鍒�
+- `SocketServer` - 璁惧閫氫俊 TCP 鏈嶅姟鍣�
-- `Add/AddObject` - 娣诲姞缂撳瓨
-- `Get/Get<T>` - 鑾峰彇缂撳瓨鍊�
-- `Remove` - 鍒犻櫎鍗曚釜閿�
-- `RemoveByPrefix/RemoveByPattern` - 鎸夋ā寮忔壒閲忓垹闄�
-- `GetOrAdd<T>` - 鑾峰彇鎴栨坊鍔狅紙甯﹀伐鍘傛柟娉曪級
-- `TryAdd/TryUpdate/TryUpdateIfChanged` - ConcurrentDictionary 椋庢牸鐨勬搷浣�
+## API 缁撴瀯
-**閰嶇疆**锛堝湪 `appsettings.json` 涓級锛�
+- `QuartzJob/Controllers/` - 璁惧淇℃伅銆佸崗璁�佹淳鍙戙�佽皟搴﹀櫒
+- `System/Controllers/` - 鐢ㄦ埛銆佽鑹层�佽彍鍗曘�佸瓧鍏搞�佹棩蹇�
+- `Task/Controllers/` - 浠诲姟绠$悊鍜屾満鍣ㄤ汉浠诲姟
+- `BasicInfo/Controllers/` - 璺敱閰嶇疆
-```json
-"RedisConfig": {
- "Enabled": true,
- "ConnectionString": "127.0.0.1:6379,password=P@ssw0rd,...",
- "KeyPrefix": "wcs:"
-}
-```
+## 鏃ュ織
-## Quartz 浠诲姟 - 璁惧閫氫俊
+浣跨敤 Serilog锛屾寜澶╂粴鍔ㄤ繚鐣� 30 澶╂棩蹇楁枃浠讹紝鍚屾椂闆嗘垚 Seq锛坄http://localhost:5341`锛夈��
-浠诲姟缁ф壙 `JobBase` 骞跺疄鐜� Quartz 鐨� `IJob`锛�
+## 閲嶈瀹炵幇娉ㄦ剰浜嬮」
-```csharp
-public class MyDeviceJob : JobBase, IJob
-{
- public async Task Execute(IJobExecutionContext context)
- {
- ExecuteJob(context, async () => {
- // 浠诲姟閫昏緫
- WriteDebug("MyDevice", "璋冭瘯淇℃伅");
- WriteInfo("MyDevice", "淇℃伅");
- });
- }
-}
-```
+1. **鍚姩鍒濆鍖栭『搴忓緢閲嶈**锛歊edis 灏辩华鍚庢墠鑳借繍琛� `ApiRouteCacheWarmupHostedService`
+2. **Quartz 浠诲姟琛�** 閫氳繃 `QuartzJobDataTableHostedService` 鍦ㄥ惎鍔ㄦ椂鑷姩鍒涘缓
+3. **Socket 鏈嶅姟鍣�** 浣滀负鍗曚緥 `TcpSocketServer` 鐢辨墭绠℃湇鍔¤繍琛�
+4. **Redis 缂撳瓨鍚屾**锛氬彲閰嶇疆 `EnableAutoSync` 閫夐」锛屽畾鏈熷皢 Redis 鍚屾鍒� L1 鍐呭瓨缂撳瓨
+5. **璁惧鍗忚閰嶇疆** 瀛樺偍鍦ㄦ暟鎹簱锛坄Dt_DeviceProtocol` 琛級锛岃�岄潪閰嶇疆鏂囦欢涓�
-浠诲姟閫氳繃 `SchedulerCenterServer` 浣跨敤 `Dt_DeviceInfo` 琛ㄤ腑鐨勮澶囦俊鎭姩鎬佹敞鍐屻��
+## 娉ㄩ噴涓庢枃妗� (寮哄埗)
-**璁惧绫诲瀷**锛�
+- **XML 鏂囨。娉ㄩ噴**: 鎵�鏈� `public` 绫汇�佹帴鍙c�佹柟娉曘�佸睘鎬�**蹇呴』**鍖呭惈 XML 鏂囨。娉ㄩ噴 (`/// <summary>...</summary>`)锛岃В閲婂叾鐢ㄩ�斻�佸弬鏁板拰杩斿洖鍊笺��
+- **琛屽唴娉ㄩ噴**: 瀵逛簬澶嶆潅鐨勪笟鍔¢�昏緫銆佺畻娉曞疄鐜版垨闈炵洿瑙傜殑浠g爜鍧楋紝**蹇呴』**娣诲姞 `//` 琛屽唴娉ㄩ噴瑙i噴鈥滀负浠�涔堣繖涔堝仛鈥濄��
+- **TODO 鏍囪**: 濡傛灉浠g爜鏈畬鎴愭垨鏈変复鏃舵柟妗堬紝蹇呴』浣跨敤 `// TODO: 璇存槑` 鏍囪銆�
-- `IStackerCrane` - 鍫嗗灈鏈�
-- `IConveyorLine` - 杈撻�佺嚎
-- `IShuttleCar` - 绌挎杞�
-- `IRobot` - 鏈烘鎵�
+## 閫氱敤瑙勮寖
-## 纭欢閫氫俊
+- **寮傛缂栫▼**: 鎵�鏈� I/O 鎿嶄綔蹇呴』浣跨敤 `async/await`銆傚簱浠g爜璇蜂娇鐢� `ConfigureAwait(false)`銆�
+- **鍛藉悕**:
+ - 鎺ュ彛浠� "I" 寮�澶� (渚嬪: `IUserService`)銆�
+ - 绫诲悕銆佹柟娉曞悕浣跨敤 **PascalCase**銆�
+ - 绉佹湁瀛楁銆佸眬閮ㄥ彉閲忎娇鐢� **camelCase**銆�
+- **鍛藉悕绌洪棿**: 浣跨敤 **鏂囦欢浣滅敤鍩熷懡鍚嶇┖闂�** (`namespace MyApp.Api;`)銆�
-閫氫俊鍣ㄧ被灏佽 `HslCommunication` 搴擄細
+## 馃毇 涓ョ浜嬮」
+- **涓ョ** 鐢熸垚娌℃湁娉ㄩ噴鐨勪唬鐮� (灏ゅ叾鏄叕鍏辨柟娉�)銆�
+- **涓ョ** 浣跨敤 `Task.Result` 鎴� `Task.Wait()`銆�
+- **涓ョ** 鍦ㄥ紓姝ヤ笂涓嬫枃涓娇鐢� `.ToList()` (蹇呴』鐢� `.ToListAsync()`)銆�
+- **涓ョ** 鐩存帴鏆撮湶瀹炰綋 (Entity)锛屽繀椤讳娇鐢� DTO銆�
+- **涓ョ** 鎹曡幏 `Exception` 鑰屼笉璁板綍鏃ュ織銆�
-- `SiemensS7Communicator` / `SiemensS7200SmartCommunicator` - 瑗块棬瀛� PLC
-- `OmronEtherNetCommunicator` - 娆у榫� PLC
-- `ModbusTcpCommunicator` - Modbus TCP
-- `SerialPortCommunicator` - 涓插彛璁惧
-
-## TCP Socket 鏈嶅姟鍣�
-
-`TcpSocketServer`锛堢鍙� 2000锛夊鐞嗗疄鏃惰澶囬�氫俊锛�
-
-- 閫氳繃 `SocketServerHostedService` 浣滀负 Singleton 绠$悊
-- 瀹㈡埛绔繛鎺ュ瓨鍌ㄥ湪 `ConcurrentDictionary<string, TcpClient>` 涓�
-- 閫氳繃 `OnDataReceived` 浜嬩欢澶勭悊娑堟伅
-
-## 鏈烘鎵嬮�氫俊绯荤粺
-
-鏈烘鎵嬬郴缁熼噰鐢ㄦā鍧楀寲鏋舵瀯锛屽寘鍚笓闂ㄧ殑缁勪欢銆�
-
-**缁勪欢**锛�
-
-- `RobotClientManager` - 绠$悊 TCP 瀹㈡埛绔繛鎺ュ拰璁㈤槄
-- `RobotStateManager` - 绠$悊鏈烘鎵嬬姸鎬佺紦瀛橈紝鏀寔瀹夊叏鐨勫苟鍙戞洿鏂�
-- `RobotMessageHandler` - 澶勭悊鏉ヨ嚜鏈烘鎵嬬殑 TCP 娑堟伅
-- `RobotTaskProcessor` - 澶勭悊浠诲姟鎵ц鍜岀姸鎬佽浆鎹�
-- `RobotBarcodeGenerator` - 鐢熸垚鎵樼洏/鏉$爜鏍囪瘑绗�
-
-**浠诲姟绫诲瀷**锛堟潵鑷� `RobotTaskTypeEnum`锛夛細
-
-- `GroupPallet (500)` - 缁勭洏浠诲姟
-- `ChangePallet (510)` - 鎹㈢洏浠诲姟
-- `SplitPallet (520)` - 鎷嗙洏浠诲姟
-
-**鐘舵�佹祦杞�**锛�
-
-1. 鏈烘鎵嬮�氳繃 TCP 杩炴帴 鈫� ClientManager 璺熻釜杩炴帴
-2. 浠诲姟杞鑾峰彇浠诲姟 鈫� TaskProcessor 鑾峰彇寰呭鐞嗕换鍔�
-3. 鎺ユ敹娑堟伅 鈫� MessageHandler 瑙f瀽骞舵洿鏂扮姸鎬�
-4. 鐘舵�佽浆鎹� 鈫� TaskProcessor 鍚戞満姊版墜鍙戦�佸懡浠�
-
-## 閫氱敤甯搁噺
-
-**閫氫俊瓒呮椂**锛坄CommunicationConst`锛夛細
-
-- `WaitIntervalMs: 500` - 璁惧绛夊緟闂撮殧
-- `WaitTimeoutBaseMs: 6000` - 瓒呮椂鍩烘暟
-- `WaitTotalTimeoutMs: 60000` - 鎬昏秴鏃舵椂闂达紙10 脳 鍩烘暟锛�
-- `PingIntervalMs: 100` - Ping 妫�娴嬮棿闅�
-- `HttpDefaultTimeoutSeconds: 60` - HTTP 瓒呮椂
-
-**绯荤粺闆嗘垚 URL**锛坄BaseAPI`锛夛細
-
-- `WMSBaseUrl: "http://localhost:9291/api/"` - WMS 绯荤粺
-- `WCSBaseUrl: "http://localhost:9292/api/"` - WCS 绯荤粺锛堟湰鏈嶅姟鍣級
-- `MESBaseUrl: "http://localhost:9293/api/"` - MES 绯荤粺
-- `ERPBaseUrl: "http://localhost:9294/api/"` - ERP 绯荤粺
-
-**Redis 缂撳瓨鍓嶇紑**锛坄RedisPrefix`锛夛細
-
-- `System: "System"` - 绯荤粺绾х紦瀛�
-- `User: "User"` - 鐢ㄦ埛鐗瑰畾缂撳瓨
-- `Code: "Code"` - 浠g爜/閰嶇疆缂撳瓨
-
-浣跨敤杩欎簺鍓嶇紑閰嶅悎 `ICacheService.RemoveByPrefix()` 杩涜鎵归噺缂撳瓨澶辨晥銆�
-
-## 閰嶇疆璁剧疆
-
-`appsettings.json` 涓殑鍏抽敭璁剧疆锛�
-
-- `"urls": "http://*:9292"` - 鏈嶅姟鍣ㄧ鍙�
-- `"QuartzJobAutoStart": true` - 鑷姩鍚姩瀹氭椂浠诲姟
-- `"SocketServer:Enabled": true` - 鍚敤 TCP 鏈嶅姟鍣�
-- `"RedisConfig:Enabled": true` - 鍚敤 Redis 缂撳瓨
-- `"LogAOPEnable": false` - 鍚敤 AOP 鏃ュ織
-- `"DBType": "SqlServer"` - 鏁版嵁搴撶被鍨�
-
-## 鏈嶅姟灞傛ā寮�
-
-鏈嶅姟閬靛惊鍒嗗眰妯″紡锛�
-
-- **鎺ュ彛**鍦� `WIDESEAWCS_IService/` 涓紙渚嬪 `ITaskInfoService`锛�
-- **瀹炵幇**鍦� `WIDESEAWCS_Service/` 涓紙渚嬪 `TaskInfoService`锛�
-- 涓よ�呴兘瀹炵幇 `IDependency` 浠ヨ繘琛岃嚜鍔ㄦ敞鍐�
-
-## 鍩虹被
-
-- `ServiceBase<T, TKey>` - 甯︽湁 CRUD 鎿嶄綔鐨勫熀纭�鏈嶅姟
-- `RepositoryBase<TEntity>` - 鍩轰簬 SqlSugar ORM 鐨勫熀纭�浠撳偍
-- `ApiBaseController` - 甯︽湁閫氱敤鍔熻兘鐨勫熀纭� API 鎺у埗鍣�
-- `JobBase` - 甯︽湁鏃ュ織杈呭姪鏂规硶鐨勫熀纭� Quartz 浠诲姟
-
-## 娣诲姞鏂板姛鑳�
-
-1. **鏂版湇鍔�**锛氬湪 `I*Service/` 涓垱寤烘帴鍙o紝鍦� `*Service/` 涓垱寤虹被锛屽疄鐜� `IDependency`
-2. **鏂颁换鍔�**锛氬湪 `WIDESEAWCS_Tasks/` 涓户鎵� `JobBase` 鍜� `IJob`
-3. **鏂拌澶囩被鍨�**锛氬湪 `WIDESEAWCS_QuartzJob/Device/` 涓坊鍔犳帴鍙e苟瀹炵幇
-
-## 閲嶈璇存槑
-
-- 搴旂敤绋嬪簭浣跨敤 **CamelCase** JSON 搴忓垪鍖�
-- 鎵�鏈夋湇鍔¢粯璁ら�氳繃 Autofac 浣跨敤 **scoped** 鐢熷懡鍛ㄦ湡
-- Redis 杩炴帴浣跨敤 **寤惰繜鍒濆鍖�** - 棣栨璁块棶鏃惰Е鍙戣繛鎺�
-- 鍦ㄤ换鍔′腑浣跨敤 `ConsoleHelper.WriteSuccessLine()` / `WriteErrorLine()` 杩涜鎺у埗鍙拌緭鍑�
-- TCP Socket 鏈嶅姟鍣ㄧ嫭绔嬩簬 HTTP API 杩愯
-
-## 浠g爜椋庢牸涓庡懡鍚嶈鑼�
-
-- 璇█锛欳#锛屽悇椤圭洰宸插惎鐢ㄥ彲绌哄紩鐢紙nullable锛夈��
-- 缂╄繘锛�4 涓┖鏍硷紱澶ф嫭鍙锋崲琛岋紙涓庣幇鏈変唬鐮佷繚鎸佷竴鑷达級銆�
-- 鍛藉悕锛氱被鍨�/鏂规硶/灞炴�т娇鐢� `PascalCase`锛屽眬閮ㄥ彉閲�/鍙傛暟浣跨敤 `camelCase`锛屾帴鍙d互 `I` 鍓嶇紑鍛藉悕銆�
-- 鏂囦欢鍛藉悕涓庣被鍨嬪悕淇濇寔涓�鑷达紙渚嬪 `Sys_UserService.cs`銆乣TaskController.cs`锛夈��
-- `.editorconfig` 褰撳墠瀵� `*.cs` 鎶戝埗 CS8618锛涙湭缁忓洟闃熺‘璁や笉瑕佹柊澧炲ぇ鑼冨洿璀﹀憡鎶戝埗銆�
-- 涓烘柊鐢熸垚鎴栬�呬慨鏀圭殑浠g爜鐨勬瘡涓�琛屾坊鍔犺缁嗘敞閲婏紝鍖呮嫭锛�
- - 鏂规硶鐨勭洰鐨勮鏄�
- - 鍙傛暟璇存槑
- - 杩斿洖鍊艰鏄�
- - 姣忎竴琛屼唬鐮佺殑浣滅敤
- - 寮傚父鎯呭喌鐨勮鏄�
+## 馃洜 鎶�鏈爤
+- **妗嗘灦**: .NET 8.0 (LTS)
+- **璇█**: C# 12
+- **ORM**: SqlSugar
+- **鏁版嵁搴�**: SQL Server
+- **楠岃瘉**: FluentValidation
+- **搴忓垪鍖�**: Newtonsoft.Json
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj
index cf2a881..f5daf35 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj
index 599c5e4..dd2c44c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
index 132c02c..30402ac 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj
index 21e7936..e2918e6 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Version>2.2.14</Version>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
index 603dbcd..9e54046 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
@@ -1,7 +1,7 @@
锘�<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Version>1.0.32</Version>
@@ -58,7 +58,7 @@
<PackageReference Include="Magicodes.IE.EPPlus" Version="2.7.5.1" />
<PackageReference Include="Magicodes.IE.Excel" Version="2.7.5.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.29" />
- <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
+ <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.3.8" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="OfficeOpenXml.Core.ExcelPackage" Version="1.0.0" />
@@ -72,7 +72,7 @@
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.5.0" />
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.0" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
- <PackageReference Include="System.Security.Cryptography.Pkcs" Version="6.0.3" />
+ <PackageReference Include="System.Security.Cryptography.Pkcs" Version="8.0.0" />
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
</ItemGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj
index cc0b784..2f285bd 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj
index c159328..a7844b3 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj
index ebf0d65..6622593 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj
index c2103f2..247d1db 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj
@@ -1,7 +1,7 @@
锘�<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj
index 17032f0..0fefbba 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj
index 3732ca9..b81dff8 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj
index 2850c69..ad25702 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj
index bee676a..cebfe3b 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GenerateDocumentationFile>False</GenerateDocumentationFile>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
index aced664..9c20899 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Description>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_RedisService/WIDESEAWCS_RedisService.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_RedisService/WIDESEAWCS_RedisService.csproj
index 428d0ea..e6d27f6 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_RedisService/WIDESEAWCS_RedisService.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_RedisService/WIDESEAWCS_RedisService.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
index 0905a14..3d0d2f9 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
@@ -1,7 +1,7 @@
锘�<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj
index e29c7fd..bfe53a8 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj
index dd102f5..8218772 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj
index 297907e..baab3b4 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj
index f1fe745..c26556f 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj
@@ -1,7 +1,7 @@
锘�<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj
index 1a0c9ea..a5bcd6d 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-13-s7-plc-simulator-implementation.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-13-s7-plc-simulator-implementation.md
deleted file mode 100644
index 18331bc..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-13-s7-plc-simulator-implementation.md
+++ /dev/null
@@ -1,2478 +0,0 @@
-# S7 PLC妯℃嫙鍣ㄥ疄鏂借鍒�
-
-> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**鐩爣:** 鏋勫缓涓�涓熀浜嶩SL Communication搴撶殑瑗块棬瀛怱7 PLC妯℃嫙鍣ㄧ郴缁燂紝鏀寔澶氬疄渚嬨�乄eb绠$悊鐣岄潰鍜屾暟鎹寔涔呭寲銆�
-
-**鏋舵瀯:** 閲囩敤DDD鍒嗗眰鏋舵瀯锛孋ore灞傚疄鐜伴鍩熼�昏緫锛孉pplication灞傛彁渚涘簲鐢ㄦ湇鍔★紝Server灞傛彁渚沇eb API锛學eb灞傛彁渚涚鐞嗙晫闈€�備娇鐢℉SL Communication搴撳疄鐜癝7鏈嶅姟鍣紝SignalR瀹炵幇瀹炴椂鐘舵�佹帹閫併��
-
-**鎶�鏈爤:** ASP.NET Core 6.0, HslCommunication 12.6.3, SignalR, Razor Pages, Serilog, AutoMapper, xUnit
-
----
-
-## 鏂囦欢缁撴瀯鏄犲皠
-
-### Core椤圭洰
-| 鏂囦欢 | 鑱岃矗 |
-|------|------|
-| `Enums/SiemensPLCType.cs` | PLC鍨嬪彿鏋氫妇 |
-| `Enums/InstanceStatus.cs` | 瀹炰緥鐘舵�佹灇涓� |
-| `Entities/InstanceConfig.cs` | 瀹炰緥閰嶇疆瀹炰綋 |
-| `Entities/InstanceState.cs` | 瀹炰緥鐘舵�佸疄浣� |
-| `Entities/S7ClientConnection.cs` | 瀹㈡埛绔繛鎺ュ疄浣� |
-| `Entities/MemoryRegionConfig.cs` | 鍐呭瓨鍖哄煙閰嶇疆 |
-| `Interfaces/IMemoryRegion.cs` | 鍐呭瓨鍖哄煙鎺ュ彛 |
-| `Interfaces/IMemoryStore.cs` | 鍐呭瓨瀛樺偍鎺ュ彛 |
-| `Interfaces/IS7ServerInstance.cs` | 鏈嶅姟鍣ㄥ疄渚嬫帴鍙� |
-| `Interfaces/ISimulatorInstanceManager.cs` | 瀹炰緥绠$悊鍣ㄦ帴鍙� |
-| `Interfaces/IPersistenceService.cs` | 鎸佷箙鍖栨湇鍔℃帴鍙� |
-| `Memory/MemoryRegion.cs` | 鍐呭瓨鍖哄煙鍩虹被 |
-| `Memory/MRegion.cs` | M鍖哄疄鐜� |
-| `Memory/DBRegion.cs` | DB鍖哄疄鐜� |
-| `Memory/IRegion.cs` | I鍖哄疄鐜� |
-| `Memory/QRegion.cs` | Q鍖哄疄鐜� |
-| `Memory/TRegion.cs` | T鍖哄疄鐜� |
-| `Memory/CRegion.cs` | C鍖哄疄鐜� |
-| `Memory/MemoryStore.cs` | 鍐呭瓨瀛樺偍瀹炵幇 |
-| `Persistence/FilePersistenceService.cs` | 鏂囦欢鎸佷箙鍖栨湇鍔� |
-| `Server/S7ServerInstance.cs` | S7鏈嶅姟鍣ㄥ疄渚嬪疄鐜� |
-| `Manager/SimulatorInstanceManager.cs` | 瀹炰緥绠$悊鍣ㄥ疄鐜� |
-
-### Application椤圭洰
-| 鏂囦欢 | 鑱岃矗 |
-|------|------|
-| `DTOs/InstanceDTO.cs` | 瀹炰緥鏁版嵁浼犺緭瀵硅薄 |
-| `DTOs/CreateInstanceDTO.cs` | 鍒涘缓瀹炰緥DTO |
-| `DTOs/UpdateInstanceDTO.cs` | 鏇存柊瀹炰緥DTO |
-| `DTOs/InstanceDetailDTO.cs` | 瀹炰緥璇︽儏DTO |
-| `DTOs/MemoryReadDTO.cs` | 鍐呭瓨璇诲彇DTO |
-| `DTOs/MemoryWriteDTO.cs` | 鍐呭瓨鍐欏叆DTO |
-| `DTOs/ClientConnectionDTO.cs` | 瀹㈡埛绔繛鎺TO |
-| `DTOs/InstanceStateEventArgs.cs` | 鐘舵�佷簨浠跺弬鏁� |
-| `DTOs/ClientConnectionEventArgs.cs` | 瀹㈡埛绔繛鎺ヤ簨浠跺弬鏁� |
-| `Services/SimulatorInstanceAppService.cs` | 瀹炰緥搴旂敤鏈嶅姟 |
-| `Services/MemoryAppService.cs` | 鍐呭瓨搴旂敤鏈嶅姟 |
-| `Services/ClientAppService.cs` | 瀹㈡埛绔簲鐢ㄦ湇鍔� |
-| `Profiles/MappingProfile.cs` | AutoMapper閰嶇疆 |
-
-### Server椤圭洰
-| 鏂囦欢 | 鑱岃矗 |
-|------|------|
-| `Controllers/SimulatorInstancesController.cs` | 瀹炰緥鍒楄〃API |
-| `Controllers/SimulatorInstanceController.cs` | 瀹炰緥鎺у埗API |
-| `Controllers/MemoryController.cs` | 鍐呭瓨鎿嶄綔API |
-| `Controllers/ClientsController.cs` | 瀹㈡埛绔鐞咥PI |
-| `Hubs/SimulatorHub.cs` | SignalR瀹炴椂鎺ㄩ�� |
-| `Infrastructure/DependencyInjection.cs` | DI閰嶇疆 |
-| `Infrastructure/Middleware/ExceptionMiddleware.cs` | 寮傚父澶勭悊涓棿浠� |
-| `Program.cs` | 绋嬪簭鍏ュ彛 |
-
-### Web椤圭洰
-| 鏂囦欢 | 鑱岃矗 |
-|------|------|
-| `Pages/Index.cshtml` | 瀹炰緥鍒楄〃椤� |
-| `Pages/Index.cshtml.cs` | 瀹炰緥鍒楄〃椤垫ā鍨� |
-| `Pages/Create.cshtml` | 鍒涘缓瀹炰緥椤� |
-| `Pages/Create.cshtml.cs` | 鍒涘缓瀹炰緥椤垫ā鍨� |
-| `Pages/Edit.cshtml` | 缂栬緫瀹炰緥椤� |
-| `Pages/Edit.cshtml.cs` | 缂栬緫瀹炰緥椤垫ā鍨� |
-| `Pages/Details.cshtml` | 瀹炰緥璇︽儏椤� |
-| `Pages/Details.cshtml.cs` | 瀹炰緥璇︽儏椤垫ā鍨� |
-| `Pages/Shared/_Layout.cshtml` | 甯冨眬椤� |
-| `wwwroot/css/site.css` | 鏍峰紡鏂囦欢 |
-| `wwwroot/js/site.js` | JavaScript鏂囦欢 |
-
-### Tests椤圭洰
-| 鏂囦欢 | 鑱岃矗 |
-|------|------|
-| `Memory/MRegionTests.cs` | M鍖哄崟鍏冩祴璇� |
-| `Memory/DBRegionTests.cs` | DB鍖哄崟鍏冩祴璇� |
-| `Memory/MemoryStoreTests.cs` | 鍐呭瓨瀛樺偍鍗曞厓娴嬭瘯 |
-| `Server/S7ServerInstanceTests.cs` | 鏈嶅姟鍣ㄥ疄渚嬪崟鍏冩祴璇� |
-| `Persistence/FilePersistenceServiceTests.cs` | 鎸佷箙鍖栨湇鍔″崟鍏冩祴璇� |
-
----
-
-## Chunk 1: 椤圭洰鍩虹璁炬柦
-
-### Task 1: 鍒涘缓瑙e喅鏂规鍜岄」鐩粨鏋�
-
-- [ ] **Step 1: 鍦╓CS鐩綍涓嬪垱寤篠7妯℃嫙鍣ㄨВ鍐虫柟妗�**
-
-```bash
-cd D:\Git\ShanMeiXinNengYuan\Code\WCS
-dotnet new sln -n WIDESEAWCS_S7Simulator
-```
-
-棰勬湡杈撳嚭: 鍒涘缓 `WIDESEAWCS_S7Simulator.sln`
-
-- [ ] **Step 2: 鍒涘缓Core椤圭洰**
-
-```bash
-cd WIDESEAWCS_S7Simulator
-dotnet new classlib -n WIDESEAWCS_S7Simulator.Core -f net6.0
-dotnet sln add WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj
-```
-
-- [ ] **Step 3: 鍒涘缓Application椤圭洰**
-
-```bash
-dotnet new classlib -n WIDESEAWCS_S7Simulator.Application -f net6.0
-dotnet sln add WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj
-```
-
-- [ ] **Step 4: 鍒涘缓Server椤圭洰**
-
-```bash
-dotnet new webapi -n WIDESEAWCS_S7Simulator.Server -f net6.0
-dotnet sln add WIDESEAWCS_S7Simulator.Server/WIDESEAWCS_S7Simulator.Server.csproj
-```
-
-- [ ] **Step 5: 鍒涘缓Web椤圭洰**
-
-```bash
-dotnet new webapp -n WIDESEAWCS_S7Simulator.Web -f net6.0
-dotnet sln add WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj
-```
-
-- [ ] **Step 6: 鍒涘缓Tests椤圭洰**
-
-```bash
-dotnet new xunit -n WIDESEAWCS_S7Simulator.UnitTests -f net6.0
-dotnet sln add WIDESEAWCS_S7Simulator.UnitTests/WIDESEAWCS_S7Simulator.UnitTests.csproj
-```
-
-- [ ] **Step 7: 娣诲姞椤圭洰寮曠敤**
-
-```bash
-cd WIDESEAWCS_S7Simulator.Application
-dotnet add reference ../WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj
-
-cd ../WIDESEAWCS_S7Simulator.Server
-dotnet add reference ../WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj
-dotnet add reference ../WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj
-
-cd ../WIDESEAWCS_S7Simulator.Web
-dotnet add reference ../WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj
-
-cd ../WIDESEAWCS_S7Simulator.UnitTests
-dotnet add reference ../WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj
-```
-
-- [ ] **Step 8: 娣诲姞NuGet鍖呭埌Core椤圭洰**
-
-```bash
-cd ../WIDESEAWCS_S7Simulator.Core
-dotnet add package HslCommunication --version 12.6.3
-dotnet add package Microsoft.Extensions.Logging.Abstractions
-dotnet add package Microsoft.Extensions.Configuration.Abstractions
-dotnet add package Newtonsoft.Json
-```
-
-- [ ] **Step 9: 娣诲姞NuGet鍖呭埌Server椤圭洰**
-
-```bash
-cd ../WIDESEAWCS_S7Simulator.Server
-dotnet add package Serilog.AspNetCore
-dotnet add package AutoMapper
-dotnet add package Microsoft.AspNetCore.SignalR
-```
-
-- [ ] **Step 10: 娣诲姞NuGet鍖呭埌Web椤圭洰**
-
-```bash
-cd ../WIDESEAWCS_S7Simulator.Web
-dotnet add package Microsoft.AspNetCore.SignalR.Client
-```
-
-- [ ] **Step 11: 楠岃瘉瑙e喅鏂规鏋勫缓**
-
-```bash
-cd ..
-dotnet build
-```
-
-棰勬湡杈撳嚭: 鏋勫缓鎴愬姛
-
-- [ ] **Step 12: 鎻愪氦椤圭洰缁撴瀯**
-
-```bash
-git add .
-git commit -m "feat: create S7 simulator solution structure
-
-- Add Core, Application, Server, Web projects
-- Configure project references
-- Add required NuGet packages
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
-
----
-
-## Chunk 2: 鏍稿績鏋氫妇鍜屽疄浣�
-
-### Task 2: 鍒涘缓鏋氫妇绫诲瀷
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Core/Enums/SiemensPLCType.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Enums/InstanceStatus.cs`
-
-- [ ] **Step 1: 鍒涘缓PLC绫诲瀷鏋氫妇**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Enums
-{
- /// <summary>
- /// 瑗块棬瀛怭LC鍨嬪彿
- /// </summary>
- public enum SiemensPLCType
- {
- /// <summary>
- /// S7-200 Smart
- /// </summary>
- S7200Smart = 0,
-
- /// <summary>
- /// S7-1200
- /// </summary>
- S71200 = 1,
-
- /// <summary>
- /// S7-1500
- /// </summary>
- S71500 = 2,
-
- /// <summary>
- /// S7-300
- /// </summary>
- S7300 = 3,
-
- /// <summary>
- /// S7-400
- /// </summary>
- S7400 = 4
- }
-}
-```
-
-- [ ] **Step 2: 鍒涘缓瀹炰緥鐘舵�佹灇涓�**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Enums
-{
- /// <summary>
- /// S7鏈嶅姟鍣ㄥ疄渚嬭繍琛岀姸鎬�
- /// </summary>
- public enum InstanceStatus
- {
- /// <summary>
- /// 宸插仠姝�
- /// </summary>
- Stopped = 0,
-
- /// <summary>
- /// 鍚姩涓�
- /// </summary>
- Starting = 1,
-
- /// <summary>
- /// 杩愯涓�
- /// </summary>
- Running = 2,
-
- /// <summary>
- /// 鍋滄涓�
- /// </summary>
- Stopping = 3,
-
- /// <summary>
- /// 閿欒
- /// </summary>
- Error = 4
- }
-}
-```
-
-- [ ] **Step 3: 鍒犻櫎榛樿鐢熸垚鐨凜lass1.cs鏂囦欢**
-
-```bash
-rm WIDESEAWCS_S7Simulator.Core/Class1.cs
-```
-
-- [ ] **Step 4: 楠岃瘉鏋勫缓**
-
-```bash
-cd WIDESEAWCS_S7Simulator.Core
-dotnet build
-```
-
-- [ ] **Step 5: 鎻愪氦鏋氫妇绫诲瀷**
-
-```bash
-git add .
-git commit -m "feat: add PLC type and instance status enums
-
-- Add SiemensPLCType enum (S7-200/1200/1500/300/400)
-- Add InstanceStatus enum (Stopped/Starting/Running/Stopping/Error)
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
-
-### Task 3: 鍒涘缓鏍稿績瀹炰綋
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Core/Entities/MemoryRegionConfig.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Entities/InstanceConfig.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Entities/S7ClientConnection.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Entities/InstanceState.cs`
-
-- [ ] **Step 1: 鍒涘缓鍐呭瓨鍖哄煙閰嶇疆瀹炰綋**
-
-```csharp
-using Newtonsoft.Json;
-
-namespace WIDESEAWCS_S7Simulator.Core.Entities
-{
- /// <summary>
- /// 鍐呭瓨鍖哄煙閰嶇疆
- /// </summary>
- public class MemoryRegionConfig
- {
- /// <summary>
- /// M鍖哄ぇ灏忥紙瀛楄妭锛夛紝榛樿1KB
- /// </summary>
- [JsonProperty("mRegionSize")]
- public int MRegionSize { get; set; } = 1024;
-
- /// <summary>
- /// DB鍧楁暟閲忥紝榛樿100涓�
- /// </summary>
- [JsonProperty("dbBlockCount")]
- public int DBBlockCount { get; set; } = 100;
-
- /// <summary>
- /// 姣忎釜DB鍧楀ぇ灏忥紙瀛楄妭锛夛紝榛樿1KB
- /// </summary>
- [JsonProperty("dbBlockSize")]
- public int DBBlockSize { get; set; } = 1024;
-
- /// <summary>
- /// I鍖哄ぇ灏忥紙瀛楄妭锛夛紝榛樿256瀛楄妭
- /// </summary>
- [JsonProperty("iRegionSize")]
- public int IRegionSize { get; set; } = 256;
-
- /// <summary>
- /// Q鍖哄ぇ灏忥紙瀛楄妭锛夛紝榛樿256瀛楄妭
- /// </summary>
- [JsonProperty("qRegionSize")]
- public int QRegionSize { get; set; } = 256;
-
- /// <summary>
- /// T鍖烘暟閲忥紝榛樿64涓�
- /// </summary>
- [JsonProperty("tRegionCount")]
- public int TRegionCount { get; set; } = 64;
-
- /// <summary>
- /// C鍖烘暟閲忥紝榛樿64涓�
- /// </summary>
- [JsonProperty("cRegionCount")]
- public int CRegionCount { get; set; } = 64;
- }
-}
-```
-
-- [ ] **Step 2: 鍒涘缓瀹炰緥閰嶇疆瀹炰綋**
-
-```csharp
-using Newtonsoft.Json;
-using WIDESEAWCS_S7Simulator.Core.Enums;
-
-namespace WIDESEAWCS_S7Simulator.Core.Entities
-{
- /// <summary>
- /// S7鏈嶅姟鍣ㄥ疄渚嬮厤缃�
- /// </summary>
- public class InstanceConfig
- {
- /// <summary>
- /// 瀹炰緥鍞竴鏍囪瘑
- /// </summary>
- [JsonProperty("id")]
- public string Id { get; set; } = string.Empty;
-
- /// <summary>
- /// 瀹炰緥鍚嶇О
- /// </summary>
- [JsonProperty("name")]
- public string Name { get; set; } = string.Empty;
-
- /// <summary>
- /// PLC鍨嬪彿
- /// </summary>
- [JsonProperty("plcType")]
- public SiemensPLCType PLCType { get; set; }
-
- /// <summary>
- /// 鐩戝惉绔彛
- /// </summary>
- [JsonProperty("port")]
- public int Port { get; set; }
-
- /// <summary>
- /// HSL婵�娲荤爜
- /// </summary>
- [JsonProperty("activationKey")]
- public string ActivationKey { get; set; } = string.Empty;
-
- /// <summary>
- /// 鏄惁鑷姩鍚姩
- /// </summary>
- [JsonProperty("autoStart")]
- public bool AutoStart { get; set; }
-
- /// <summary>
- /// 鍐呭瓨鍖哄煙閰嶇疆
- /// </summary>
- [JsonProperty("memoryConfig")]
- public MemoryRegionConfig MemoryConfig { get; set; } = new();
- }
-}
-```
-
-- [ ] **Step 3: 鍒涘缓瀹㈡埛绔繛鎺ュ疄浣�**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Entities
-{
- /// <summary>
- /// S7瀹㈡埛绔繛鎺ヤ俊鎭�
- /// </summary>
- public class S7ClientConnection
- {
- /// <summary>
- /// 瀹㈡埛绔敮涓�鏍囪瘑
- /// </summary>
- public string ClientId { get; set; } = string.Empty;
-
- /// <summary>
- /// 瀹㈡埛绔疘P鍦板潃鍜岀鍙�
- /// </summary>
- public string RemoteEndPoint { get; set; } = string.Empty;
-
- /// <summary>
- /// 杩炴帴鏃堕棿
- /// </summary>
- public DateTime ConnectedTime { get; set; }
-
- /// <summary>
- /// 鏈�鍚庢椿鍔ㄦ椂闂�
- /// </summary>
- public DateTime LastActivityTime { get; set; }
- }
-}
-```
-
-- [ ] **Step 4: 鍒涘缓瀹炰緥鐘舵�佸疄浣�**
-
-```csharp
-using WIDESEAWCS_S7Simulator.Core.Enums;
-
-namespace WIDESEAWCS_S7Simulator.Core.Entities
-{
- /// <summary>
- /// S7鏈嶅姟鍣ㄥ疄渚嬬姸鎬�
- /// </summary>
- public class InstanceState
- {
- /// <summary>
- /// 瀹炰緥ID
- /// </summary>
- public string InstanceId { get; set; } = string.Empty;
-
- /// <summary>
- /// 杩愯鐘舵��
- /// </summary>
- public InstanceStatus Status { get; set; }
-
- /// <summary>
- /// 褰撳墠杩炴帴鐨勫鎴风鏁伴噺
- /// </summary>
- public int ClientCount { get; set; }
-
- /// <summary>
- /// 绱澶勭悊璇锋眰鏁�
- /// </summary>
- public long TotalRequests { get; set; }
-
- /// <summary>
- /// 鍚姩鏃堕棿
- /// </summary>
- public DateTime? StartTime { get; set; }
-
- /// <summary>
- /// 鏈�鍚庢椿鍔ㄦ椂闂�
- /// </summary>
- public DateTime? LastActivityTime { get; set; }
-
- /// <summary>
- /// 杩炴帴鐨勫鎴风鍒楄〃
- /// </summary>
- public List<S7ClientConnection> Clients { get; set; } = new();
-
- /// <summary>
- /// 閿欒淇℃伅锛堝綋鐘舵�佷负Error鏃讹級
- /// </summary>
- public string? ErrorMessage { get; set; }
- }
-}
-```
-
-- [ ] **Step 5: 楠岃瘉鏋勫缓**
-
-```bash
-cd WIDESEAWCS_S7Simulator.Core
-dotnet build
-```
-
-- [ ] **Step 6: 鎻愪氦鏍稿績瀹炰綋**
-
-```bash
-git add .
-git commit -m "feat: add core entities
-
-- Add MemoryRegionConfig for memory region sizes
-- Add InstanceConfig for server configuration
-- Add S7ClientConnection for client info
-- Add InstanceState for server state tracking
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
-
----
-
-## Chunk 3: 鍐呭瓨瀛樺偍瀹炵幇
-
-### Task 4: 鍒涘缓鍐呭瓨鍖哄煙鎺ュ彛鍜屽熀绫�
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs`
-
-- [ ] **Step 1: 鍒涘缓鍐呭瓨鍖哄煙鎺ュ彛**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Interfaces
-{
- /// <summary>
- /// 鍐呭瓨鍖哄煙鎺ュ彛
- /// </summary>
- public interface IMemoryRegion
- {
- /// <summary>
- /// 鍖哄煙绫诲瀷锛圡/DB/I/Q/T/C锛�
- /// </summary>
- string RegionType { get; }
-
- /// <summary>
- /// 鍖哄煙澶у皬锛堝瓧鑺傦級
- /// </summary>
- int Size { get; }
-
- /// <summary>
- /// 璇诲彇瀛楄妭鏁版嵁
- /// </summary>
- /// <param name="offset">鍋忕Щ閲�</param>
- /// <param name="length">闀垮害</param>
- /// <returns>瀛楄妭鏁扮粍</returns>
- byte[] Read(ushort offset, ushort length);
-
- /// <summary>
- /// 鍐欏叆瀛楄妭鏁版嵁
- /// </summary>
- /// <param name="offset">鍋忕Щ閲�</param>
- /// <param name="data">鏁版嵁</param>
- void Write(ushort offset, byte[] data);
-
- /// <summary>
- /// 娓呯┖鍖哄煙
- /// </summary>
- void Clear();
- }
-}
-```
-
-- [ ] **Step 2: 鍒涘缓鍐呭瓨鍖哄煙鍩虹被**
-
-```csharp
-using System.Threading;
-using WIDESEAWCS_S7Simulator.Core.Interfaces;
-
-namespace WIDESEAWCS_S7Simulator.Core.Memory
-{
- /// <summary>
- /// 鍐呭瓨鍖哄煙鍩虹被
- /// </summary>
- public abstract class MemoryRegion : IMemoryRegion
- {
- /// <summary>
- /// 鍐呭瓨鏁版嵁
- /// </summary>
- protected readonly byte[] _memory;
-
- /// <summary>
- /// 璇诲啓閿侊紙鏀寔骞跺彂璁块棶锛�
- /// </summary>
- protected readonly ReaderWriterLockSlim _lock;
-
- /// <summary>
- /// 鍖哄煙绫诲瀷
- /// </summary>
- public abstract string RegionType { get; }
-
- /// <summary>
- /// 鍖哄煙澶у皬锛堝瓧鑺傦級
- /// </summary>
- public int Size { get; }
-
- /// <summary>
- /// 鏋勯�犲嚱鏁�
- /// </summary>
- /// <param name="size">鍖哄煙澶у皬</param>
- protected MemoryRegion(int size)
- {
- Size = size;
- _memory = new byte[size];
- _lock = new ReaderWriterLockSlim();
- }
-
- /// <summary>
- /// 璇诲彇瀛楄妭鏁版嵁
- /// </summary>
- public virtual byte[] Read(ushort offset, ushort length)
- {
- _lock.EnterReadLock();
- try
- {
- if (offset + length > Size)
- throw new ArgumentOutOfRangeException(
- $"璇诲彇瓒呭嚭{RegionType}鍖鸿寖鍥�: offset={offset}, length={length}, size={Size}");
-
- byte[] result = new byte[length];
- Array.Copy(_memory, offset, result, 0, length);
- return result;
- }
- finally
- {
- _lock.ExitReadLock();
- }
- }
-
- /// <summary>
- /// 鍐欏叆瀛楄妭鏁版嵁
- /// </summary>
- public virtual void Write(ushort offset, byte[] data)
- {
- _lock.EnterWriteLock();
- try
- {
- if (offset + data.Length > Size)
- throw new ArgumentOutOfRangeException(
- $"鍐欏叆瓒呭嚭{RegionType}鍖鸿寖鍥�: offset={offset}, length={data.Length}, size={Size}");
-
- Array.Copy(data, 0, _memory, offset, data.Length);
- }
- finally
- {
- _lock.ExitWriteLock();
- }
- }
-
- /// <summary>
- /// 娓呯┖鍖哄煙
- /// </summary>
- public virtual void Clear()
- {
- _lock.EnterWriteLock();
- try
- {
- Array.Clear(_memory, 0, Size);
- }
- finally
- {
- _lock.ExitWriteLock();
- }
- }
-
- /// <summary>
- /// 閲婃斁璧勬簮
- /// </summary>
- public virtual void Dispose()
- {
- _lock?.Dispose();
- }
- }
-}
-```
-
-- [ ] **Step 3: 楠岃瘉鏋勫缓**
-
-```bash
-cd WIDESEAWCS_S7Simulator.Core
-dotnet build
-```
-
-- [ ] **Step 4: 鎻愪氦鍐呭瓨鍖哄煙鍩虹被**
-
-```bash
-git add .
-git commit -m "feat: add memory region interface and base class
-
-- Add IMemoryRegion interface
-- Add MemoryRegion base class with thread-safe read/write
-- Support offset-based read/write operations
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
-
-### Task 5: 瀹炵幇M鍖猴紙浣嶅瓨鍌ㄥ櫒锛�
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Core/Memory/MRegion.cs`
-- Test: `WIDESEAWCS_S7Simulator.UnitTests/Memory/MRegionTests.cs`
-
-- [ ] **Step 1: 缂栧啓M鍖烘祴璇�**
-
-```csharp
-using Xunit;
-using WIDESEAWCS_S7Simulator.Core.Memory;
-
-namespace WIDESEAWCS_S7Simulator.UnitTests.Memory
-{
- public class MRegionTests
- {
- [Fact]
- public void Constructor_WithValidSize_CreatesRegion()
- {
- // Arrange & Act
- var region = new MRegion(1024);
-
- // Assert
- Assert.Equal("M", region.RegionType);
- Assert.Equal(1024, region.Size);
- }
-
- [Fact]
- public void Read_WithinBounds_ReturnsData()
- {
- // Arrange
- var region = new MRegion(1024);
- var testData = new byte[] { 0x12, 0x34, 0x56, 0x78 };
- region.Write(0, testData);
-
- // Act
- var result = region.Read(0, 4);
-
- // Assert
- Assert.Equal(testData, result);
- }
-
- [Fact]
- public void Read_OutOfBounds_ThrowsArgumentOutOfRange()
- {
- // Arrange
- var region = new MRegion(100);
-
- // Act & Assert
- Assert.Throws<ArgumentOutOfRangeException>(() => region.Read(0, 101));
- }
-
- [Fact]
- public void Write_WithinBounds_WritesData()
- {
- // Arrange
- var region = new MRegion(1024);
- var testData = new byte[] { 0xAA, 0xBB, 0xCC, 0xDD };
-
- // Act
- region.Write(100, testData);
- var result = region.Read(100, 4);
-
- // Assert
- Assert.Equal(testData, result);
- }
-
- [Fact]
- public void Write_OutOfBounds_ThrowsArgumentOutOfRange()
- {
- // Arrange
- var region = new MRegion(100);
- var testData = new byte[] { 0x01, 0x02 };
-
- // Act & Assert
- Assert.Throws<ArgumentOutOfRangeException>(() => region.Write(99, testData));
- }
-
- [Fact]
- public void ReadBit_ValidBit_ReturnsCorrectValue()
- {
- // Arrange
- var region = new MRegion(1024);
- region.Write(0, new byte[] { 0xFF }); // 鎵�鏈変綅涓�1
-
- // Act
- var result = region.ReadBit(0, 0);
-
- // Assert
- Assert.True(result);
- }
-
- [Fact]
- public void WriteBit_ValidBit_SetsCorrectValue()
- {
- // Arrange
- var region = new MRegion(1024);
-
- // Act
- region.WriteBit(0, 3, true);
- var result = region.ReadBit(0, 3);
-
- // Assert
- Assert.True(result);
- }
-
- [Fact]
- public void WriteBit_InvalidBitOffset_ThrowsArgumentOutOfRange()
- {
- // Arrange
- var region = new MRegion(1024);
-
- // Act & Assert
- Assert.Throws<ArgumentOutOfRangeException>(() => region.WriteBit(0, 8, true));
- }
-
- [Fact]
- public void Clear_ZerosAllMemory()
- {
- // Arrange
- var region = new MRegion(100);
- region.Write(0, new byte[] { 0xFF, 0xFF, 0xFF });
-
- // Act
- region.Clear();
- var result = region.Read(0, 3);
-
- // Assert
- Assert.Equal(new byte[] { 0, 0, 0 }, result);
- }
-
- [Fact]
- public void ConcurrentReadWrite_ThreadSafe()
- {
- // Arrange
- var region = new MRegion(1024);
- var exceptions = new System.Collections.Concurrent.ConcurrentBag<Exception>();
- var cts = new CancellationTokenSource();
- cts.CancelAfter(1000); // 1绉掑悗鍙栨秷
-
- // Act
- var writeTask = Task.Run(() =>
- {
- try
- {
- var data = new byte[] { 0xAA, 0xBB };
- while (!cts.Token.IsCancellationRequested)
- {
- region.Write(0, data);
- }
- }
- catch (Exception ex)
- {
- exceptions.Add(ex);
- }
- }, cts.Token);
-
- var readTask = Task.Run(() =>
- {
- try
- {
- while (!cts.Token.IsCancellationRequested)
- {
- region.Read(0, 2);
- }
- }
- catch (Exception ex)
- {
- exceptions.Add(ex);
- }
- }, cts.Token);
-
- Task.WaitAll(writeTask, readTask);
-
- // Assert
- Assert.Empty(exceptions);
- }
- }
-}
-```
-
-- [ ] **Step 2: 杩愯娴嬭瘯楠岃瘉澶辫触**
-
-```bash
-cd WIDESEAWCS_S7Simulator.UnitTests
-dotnet test Memory/MRegionTests.cs -v n
-```
-
-棰勬湡杈撳嚭: 娴嬭瘯澶辫触锛圡Region绫讳笉瀛樺湪锛�
-
-- [ ] **Step 3: 瀹炵幇MRegion绫�**
-
-```csharp
-using System;
-using WIDESEAWCS_S7Simulator.Core.Interfaces;
-
-namespace WIDESEAWCS_S7Simulator.Core.Memory
-{
- /// <summary>
- /// M鍖猴紙浣嶅瓨鍌ㄥ櫒/Merker锛夊疄鐜�
- /// </summary>
- public class MRegion : MemoryRegion, IMemoryRegion
- {
- /// <summary>
- /// 鍖哄煙绫诲瀷
- /// </summary>
- public override string RegionType => "M";
-
- /// <summary>
- /// 鏋勯�犲嚱鏁�
- /// </summary>
- /// <param name="size">鍖哄煙澶у皬锛堝瓧鑺傦級</param>
- public MRegion(int size) : base(size)
- {
- }
-
- /// <summary>
- /// 璇诲彇浣�
- /// </summary>
- /// <param name="byteOffset">瀛楄妭鍋忕Щ</param>
- /// <param name="bitOffset">浣嶅亸绉伙紙0-7锛�</param>
- /// <returns>浣嶅��</returns>
- public bool ReadBit(ushort byteOffset, byte bitOffset)
- {
- if (bitOffset > 7)
- throw new ArgumentOutOfRangeException(nameof(bitOffset), "浣嶅亸绉诲繀椤诲湪0-7涔嬮棿");
-
- _lock.EnterReadLock();
- try
- {
- if (byteOffset >= Size)
- throw new ArgumentOutOfRangeException(nameof(byteOffset), "瀛楄妭鍋忕Щ瓒呭嚭鑼冨洿");
-
- return (_memory[byteOffset] & (1 << bitOffset)) != 0;
- }
- finally
- {
- _lock.ExitReadLock();
- }
- }
-
- /// <summary>
- /// 鍐欏叆浣�
- /// </summary>
- /// <param name="byteOffset">瀛楄妭鍋忕Щ</param>
- /// <param name="bitOffset">浣嶅亸绉伙紙0-7锛�</param>
- /// <param name="value">浣嶅��</param>
- public void WriteBit(ushort byteOffset, byte bitOffset, bool value)
- {
- if (bitOffset > 7)
- throw new ArgumentOutOfRangeException(nameof(bitOffset), "浣嶅亸绉诲繀椤诲湪0-7涔嬮棿");
-
- _lock.EnterWriteLock();
- try
- {
- if (byteOffset >= Size)
- throw new ArgumentOutOfRangeException(nameof(byteOffset), "瀛楄妭鍋忕Щ瓒呭嚭鑼冨洿");
-
- if (value)
- _memory[byteOffset] |= (byte)(1 << bitOffset);
- else
- _memory[byteOffset] &= (byte)~(1 << bitOffset);
- }
- finally
- {
- _lock.ExitWriteLock();
- }
- }
-
- /// <summary>
- /// 璇诲彇瀛楋紙Word锛�2瀛楄妭锛�
- /// </summary>
- public ushort ReadWord(ushort byteOffset)
- {
- var data = Read(byteOffset, 2);
- return (ushort)((data[0] << 8) | data[1]);
- }
-
- /// <summary>
- /// 鍐欏叆瀛楋紙Word锛�2瀛楄妭锛�
- /// </summary>
- public void WriteWord(ushort byteOffset, ushort value)
- {
- var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) };
- Write(byteOffset, data);
- }
-
- /// <summary>
- /// 璇诲彇鍙屽瓧锛圖Word锛�4瀛楄妭锛�
- /// </summary>
- public uint ReadDWord(ushort byteOffset)
- {
- var data = Read(byteOffset, 4);
- return (uint)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]);
- }
-
- /// <summary>
- /// 鍐欏叆鍙屽瓧锛圖Word锛�4瀛楄妭锛�
- /// </summary>
- public void WriteDWord(ushort byteOffset, uint value)
- {
- var data = new byte[] {
- (byte)(value >> 24),
- (byte)((value >> 16) & 0xFF),
- (byte)((value >> 8) & 0xFF),
- (byte)(value & 0xFF)
- };
- Write(byteOffset, data);
- }
-
- /// <summary>
- /// 璇诲彇鏁存暟锛圛nt锛�2瀛楄妭锛屾湁绗﹀彿锛�
- /// </summary>
- public short ReadInt(ushort byteOffset)
- {
- return (short)ReadWord(byteOffset);
- }
-
- /// <summary>
- /// 鍐欏叆鏁存暟锛圛nt锛�2瀛楄妭锛屾湁绗﹀彿锛�
- /// </summary>
- public void WriteInt(ushort byteOffset, short value)
- {
- WriteWord(byteOffset, (ushort)value);
- }
-
- /// <summary>
- /// 璇诲彇鍙屾暣鏁帮紙DInt锛�4瀛楄妭锛屾湁绗﹀彿锛�
- /// </summary>
- public int ReadDInt(ushort byteOffset)
- {
- return (int)ReadDWord(byteOffset);
- }
-
- /// <summary>
- /// 鍐欏叆鍙屾暣鏁帮紙DInt锛�4瀛楄妭锛屾湁绗﹀彿锛�
- /// </summary>
- public void WriteDInt(ushort byteOffset, int value)
- {
- WriteDWord(byteOffset, (uint)value);
- }
-
- /// <summary>
- /// 璇诲彇娴偣鏁帮紙Real锛�4瀛楄妭锛�
- /// </summary>
- public float ReadReal(ushort byteOffset)
- {
- var bytes = Read(byteOffset, 4);
- return BitConverter.ToSingle(bytes, 0);
- }
-
- /// <summary>
- /// 鍐欏叆娴偣鏁帮紙Real锛�4瀛楄妭锛�
- /// </summary>
- public void WriteReal(ushort byteOffset, float value)
- {
- var bytes = BitConverter.GetBytes(value);
- Write(byteOffset, bytes);
- }
- }
-}
-```
-
-- [ ] **Step 4: 杩愯娴嬭瘯楠岃瘉閫氳繃**
-
-```bash
-dotnet test Memory/MRegionTests.cs -v n
-```
-
-棰勬湡杈撳嚭: 鎵�鏈夋祴璇曢�氳繃
-
-- [ ] **Step 5: 鎻愪氦M鍖哄疄鐜�**
-
-```bash
-git add .
-git commit -m "feat: implement M region (Merker memory)
-
-- Add MRegion class with bit/word/dword/int/dint/real operations
-- Support individual bit read/write with thread-safety
-- Add comprehensive unit tests including concurrent access test
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
-
-### Task 6: 瀹炵幇DB鍖猴紙鏁版嵁鍧楋級
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Core/Memory/DBRegion.cs`
-- Test: `WIDESEAWCS_S7Simulator.UnitTests/Memory/DBRegionTests.cs`
-
-- [ ] **Step 1: 缂栧啓DB鍖烘祴璇�**
-
-```csharp
-using Xunit;
-using WIDESEAWCS_S7Simulator.Core.Memory;
-
-namespace WIDESEAWCS_S7Simulator.UnitTests.Memory
-{
- public class DBRegionTests
- {
- [Fact]
- public void Constructor_WithValidParameters_CreatesRegion()
- {
- // Arrange & Act
- var region = new DBRegion(100, 1024);
-
- // Assert
- Assert.Equal("DB", region.RegionType);
- Assert.Equal(100 * 1024, region.Size);
- }
-
- [Fact]
- public void Read_ValidDBNumberAndOffset_ReturnsData()
- {
- // Arrange
- var region = new DBRegion(10, 1024);
- var testData = new byte[] { 0x12, 0x34, 0x56, 0x78 };
- region.Write(1, 0, testData);
-
- // Act
- var result = region.Read(1, 0, 4);
-
- // Assert
- Assert.Equal(testData, result);
- }
-
- [Fact]
- public void Read_InvalidDBNumber_ThrowsArgumentException()
- {
- // Arrange
- var region = new DBRegion(10, 1024);
-
- // Act & Assert
- Assert.Throws<ArgumentException>(() => region.Read(99, 0, 1));
- }
-
- [Fact]
- public void Read_OutOfBounds_ThrowsArgumentOutOfRange()
- {
- // Arrange
- var region = new DBRegion(10, 100);
-
- // Act & Assert
- Assert.Throws<ArgumentOutOfRangeException>(() => region.Read(1, 0, 101));
- }
-
- [Fact]
- public void Write_MultipleDBs_StoresSeparately()
- {
- // Arrange
- var region = new DBRegion(10, 100);
- var data1 = new byte[] { 0x01, 0x02 };
- var data2 = new byte[] { 0x03, 0x04 };
-
- // Act
- region.Write(1, 0, data1);
- region.Write(2, 0, data2);
-
- var result1 = region.Read(1, 0, 2);
- var result2 = region.Read(2, 0, 2);
-
- // Assert
- Assert.Equal(data1, result1);
- Assert.Equal(data2, result2);
- }
-
- [Fact]
- public void Clear_AllBlocks_ZerosAllMemory()
- {
- // Arrange
- var region = new DBRegion(5, 100);
- region.Write(1, 0, new byte[] { 0xFF });
- region.Write(2, 0, new byte[] { 0xFF });
-
- // Act
- region.Clear();
-
- // Assert
- Assert.Equal(new byte[] { 0x00 }, region.Read(1, 0, 1));
- Assert.Equal(new byte[] { 0x00 }, region.Read(2, 0, 1));
- }
-
- [Fact]
- public void Read_IntType_ReturnsCorrectValue()
- {
- // Arrange
- var region = new DBRegion(10, 1024);
- region.WriteInt(1, 0, 12345);
-
- // Act
- var result = region.ReadInt(1, 0);
-
- // Assert
- Assert.Equal(12345, result);
- }
-
- [Fact]
- public void Read_DIntType_ReturnsCorrectValue()
- {
- // Arrange
- var region = new DBRegion(10, 1024);
- region.WriteDInt(1, 0, 123456789);
-
- // Act
- var result = region.ReadDInt(1, 0);
-
- // Assert
- Assert.Equal(123456789, result);
- }
-
- [Fact]
- public void Read_RealType_ReturnsCorrectValue()
- {
- // Arrange
- var region = new DBRegion(10, 1024);
- region.WriteReal(1, 0, 3.14159f);
-
- // Act
- var result = region.ReadReal(1, 0);
-
- // Assert
- Assert.Equal(3.14159f, result, 4);
- }
-
- [Fact]
- public void Read_BoolType_ReturnsCorrectValue()
- {
- // Arrange
- var region = new DBRegion(10, 1024);
- region.WriteBool(1, 0, 0, true);
-
- // Act
- var result = region.ReadBool(1, 0, 0);
-
- // Assert
- Assert.True(result);
- }
-
- [Fact]
- public void ReadString_WriteAndReadString_ReturnsOriginalString()
- {
- // Arrange
- var region = new DBRegion(10, 1024);
- var testString = "Hello";
-
- // Act
- region.WriteString(1, 0, 254, testString); // 鏈�澶ч暱搴�254
- var result = region.ReadString(1, 0, 254);
-
- // Assert
- Assert.Equal(testString, result);
- }
- }
-}
-```
-
-- [ ] **Step 2: 杩愯娴嬭瘯楠岃瘉澶辫触**
-
-```bash
-dotnet test Memory/DBRegionTests.cs -v n
-```
-
-棰勬湡杈撳嚭: 娴嬭瘯澶辫触
-
-- [ ] **Step 3: 瀹炵幇DBRegion绫�**
-
-```csharp
-using System;
-using System.Collections.Generic;
-using System.Text;
-using WIDESEAWCS_S7Simulator.Core.Interfaces;
-
-namespace WIDESEAWCS_S7Simulator.Core.Memory
-{
- /// <summary>
- /// DB鍖猴紙鏁版嵁鍧楋級瀹炵幇
- /// </summary>
- public class DBRegion : MemoryRegion, IMemoryRegion
- {
- /// <summary>
- /// DB鍧楀瓧鍏革紙鍧楀彿 -> 鏁版嵁锛�
- /// </summary>
- private readonly Dictionary<ushort, byte[]> _blocks;
-
- /// <summary>
- /// DB鍧楁暟閲�
- /// </summary>
- private readonly ushort _blockCount;
-
- /// <summary>
- /// 姣忎釜DB鍧楀ぇ灏�
- /// </summary>
- private readonly int _blockSize;
-
- /// <summary>
- /// 鍖哄煙绫诲瀷
- /// </summary>
- public override string RegionType => "DB";
-
- /// <summary>
- /// 鏋勯�犲嚱鏁�
- /// </summary>
- /// <param name="blockCount">DB鍧楁暟閲�</param>
- /// <param name="blockSize">姣忎釜DB鍧楀ぇ灏�</param>
- public DBRegion(ushort blockCount, int blockSize) : base(blockCount * blockSize)
- {
- _blockCount = blockCount;
- _blockSize = blockSize;
- _blocks = new Dictionary<ushort, byte[]>();
-
- // 棰勫垎閰嶆墍鏈塂B鍧�
- for (ushort i = 1; i <= blockCount; i++)
- {
- _blocks[i] = new byte[blockSize];
- }
- }
-
- /// <summary>
- /// 璇诲彇鎸囧畾DB鍧楃殑鏁版嵁
- /// </summary>
- /// <param name="dbNumber">DB鍧楀彿</param>
- /// <param name="offset">鍧楀唴鍋忕Щ</param>
- /// <param name="length">闀垮害</param>
- /// <returns>瀛楄妭鏁扮粍</returns>
- public byte[] Read(ushort dbNumber, ushort offset, ushort length)
- {
- _lock.EnterReadLock();
- try
- {
- if (!_blocks.ContainsKey(dbNumber))
- throw new ArgumentException($"DB鍧椾笉瀛樺湪: DB{dbNumber}");
-
- if (offset + length > _blockSize)
- throw new ArgumentOutOfRangeException(
- $"璇诲彇瓒呭嚭DB{dbNumber}鑼冨洿: offset={offset}, length={length}, size={_blockSize}");
-
- byte[] block = _blocks[dbNumber];
- byte[] result = new byte[length];
- Array.Copy(block, offset, result, 0, length);
- return result;
- }
- finally
- {
- _lock.ExitReadLock();
- }
- }
-
- /// <summary>
- /// 鍐欏叆鎸囧畾DB鍧楃殑鏁版嵁
- /// </summary>
- /// <param name="dbNumber">DB鍧楀彿</param>
- /// <param name="offset">鍧楀唴鍋忕Щ</param>
- /// <param name="data">鏁版嵁</param>
- public void Write(ushort dbNumber, ushort offset, byte[] data)
- {
- _lock.EnterWriteLock();
- try
- {
- if (!_blocks.ContainsKey(dbNumber))
- throw new ArgumentException($"DB鍧椾笉瀛樺湪: DB{dbNumber}");
-
- if (offset + data.Length > _blockSize)
- throw new ArgumentOutOfRangeException(
- $"鍐欏叆瓒呭嚭DB{dbNumber}鑼冨洿: offset={offset}, length={data.Length}, size={_blockSize}");
-
- byte[] block = _blocks[dbNumber];
- Array.Copy(data, 0, block, offset, data.Length);
- }
- finally
- {
- _lock.ExitWriteLock();
- }
- }
-
- /// <summary>
- /// 璇诲彇鏁版嵁锛堥粯璁B1锛�
- /// </summary>
- public override byte[] Read(ushort offset, ushort length)
- {
- return Read(1, offset, length);
- }
-
- /// <summary>
- /// 鍐欏叆鏁版嵁锛堥粯璁B1锛�
- /// </summary>
- public override void Write(ushort offset, byte[] data)
- {
- Write(1, offset, data);
- }
-
- /// <summary>
- /// 娓呯┖鎵�鏈塂B鍧�
- /// </summary>
- public override void Clear()
- {
- _lock.EnterWriteLock();
- try
- {
- foreach (var block in _blocks.Values)
- {
- Array.Clear(block, 0, block.Length);
- }
- }
- finally
- {
- _lock.ExitWriteLock();
- }
- }
-
- /// <summary>
- /// 璇诲彇浣�
- /// </summary>
- public bool ReadBool(ushort dbNumber, ushort byteOffset, byte bitOffset)
- {
- if (bitOffset > 7)
- throw new ArgumentOutOfRangeException(nameof(bitOffset), "浣嶅亸绉诲繀椤诲湪0-7涔嬮棿");
-
- var data = Read(dbNumber, byteOffset, 1);
- return (data[0] & (1 << bitOffset)) != 0;
- }
-
- /// <summary>
- /// 鍐欏叆浣�
- /// </summary>
- public void WriteBool(ushort dbNumber, ushort byteOffset, byte bitOffset, bool value)
- {
- if (bitOffset > 7)
- throw new ArgumentOutOfRangeException(nameof(bitOffset), "浣嶅亸绉诲繀椤诲湪0-7涔嬮棿");
-
- var data = Read(dbNumber, byteOffset, 1);
- if (value)
- data[0] |= (byte)(1 << bitOffset);
- else
- data[0] &= (byte)~(1 << bitOffset);
-
- Write(dbNumber, byteOffset, data);
- }
-
- /// <summary>
- /// 璇诲彇鏁存暟锛圛nt锛�2瀛楄妭锛�
- /// </summary>
- public short ReadInt(ushort dbNumber, ushort offset)
- {
- var data = Read(dbNumber, offset, 2);
- return (short)((data[0] << 8) | data[1]);
- }
-
- /// <summary>
- /// 鍐欏叆鏁存暟锛圛nt锛�2瀛楄妭锛�
- /// </summary>
- public void WriteInt(ushort dbNumber, ushort offset, short value)
- {
- var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) };
- Write(dbNumber, offset, data);
- }
-
- /// <summary>
- /// 璇诲彇鍙屾暣鏁帮紙DInt锛�4瀛楄妭锛�
- /// </summary>
- public int ReadDInt(ushort dbNumber, ushort offset)
- {
- var data = Read(dbNumber, offset, 4);
- return (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
- }
-
- /// <summary>
- /// 鍐欏叆鍙屾暣鏁帮紙DInt锛�4瀛楄妭锛�
- /// </summary>
- public void WriteDInt(ushort dbNumber, ushort offset, int value)
- {
- var data = new byte[] {
- (byte)(value >> 24),
- (byte)((value >> 16) & 0xFF),
- (byte)((value >> 8) & 0xFF),
- (byte)(value & 0xFF)
- };
- Write(dbNumber, offset, data);
- }
-
- /// <summary>
- /// 璇诲彇娴偣鏁帮紙Real锛�4瀛楄妭锛�
- /// </summary>
- public float ReadReal(ushort dbNumber, ushort offset)
- {
- var bytes = Read(dbNumber, offset, 4);
- return BitConverter.ToSingle(bytes, 0);
- }
-
- /// <summary>
- /// 鍐欏叆娴偣鏁帮紙Real锛�4瀛楄妭锛�
- /// </summary>
- public void WriteReal(ushort dbNumber, ushort offset, float value)
- {
- var bytes = BitConverter.GetBytes(value);
- Write(dbNumber, offset, bytes);
- }
-
- /// <summary>
- /// 璇诲彇瀛楃涓诧紙瑗块棬瀛怱7瀛楃涓叉牸寮忥細棣栧瓧鑺傛槸鏈�澶ч暱搴︼紝绗簩瀛楄妭鏄疄闄呴暱搴︼級
- /// </summary>
- public string ReadString(ushort dbNumber, ushort offset, byte maxLength)
- {
- var data = Read(dbNumber, offset, (ushort)(maxLength + 2));
- byte actualLength = data[1];
-
- if (actualLength > maxLength)
- actualLength = maxLength;
-
- return Encoding.ASCII.GetString(data, 2, actualLength);
- }
-
- /// <summary>
- /// 鍐欏叆瀛楃涓诧紙瑗块棬瀛怱7瀛楃涓叉牸寮忥級
- /// </summary>
- public void WriteString(ushort dbNumber, ushort offset, byte maxLength, string value)
- {
- if (string.IsNullOrEmpty(value))
- value = string.Empty;
-
- byte[] bytes = Encoding.ASCII.GetBytes(value);
- byte length = (byte)Math.Min(bytes.Length, maxLength);
-
- byte[] data = new byte[maxLength + 2];
- data[0] = maxLength;
- data[1] = length;
- Array.Copy(bytes, 0, data, 2, length);
-
- Write(dbNumber, offset, data);
- }
-
- /// <summary>
- /// 閲婃斁璧勬簮
- /// </summary>
- public override void Dispose()
- {
- _blocks.Clear();
- base.Dispose();
- }
- }
-}
-```
-
-- [ ] **Step 4: 杩愯娴嬭瘯楠岃瘉閫氳繃**
-
-```bash
-dotnet test Memory/DBRegionTests.cs -v n
-```
-
-棰勬湡杈撳嚭: 鎵�鏈夋祴璇曢�氳繃
-
-- [ ] **Step 5: 鎻愪氦DB鍖哄疄鐜�**
-
-```bash
-git add .
-git commit -m "feat: implement DB region (Data Blocks)
-
-- Add DBRegion class supporting multiple data blocks
-- Support bool/int/dint/real/string data types
-- Add comprehensive unit tests for all data types
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
-
-### Task 7: 瀹炵幇I/Q/T/C鍖�
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Core/Memory/IRegion.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Memory/QRegion.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Memory/TRegion.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Memory/CRegion.cs`
-
-- [ ] **Step 1: 瀹炵幇I鍖猴紙杈撳叆鍖猴級**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Memory
-{
- /// <summary>
- /// I鍖猴紙杈撳叆鍖�/Input锛夊疄鐜�
- /// </summary>
- public class IRegion : MemoryRegion
- {
- /// <summary>
- /// 鍖哄煙绫诲瀷
- /// </summary>
- public override string RegionType => "I";
-
- /// <summary>
- /// 鏋勯�犲嚱鏁�
- /// </summary>
- /// <param name="size">鍖哄煙澶у皬锛堝瓧鑺傦級</param>
- public IRegion(int size) : base(size)
- {
- }
-
- /// <summary>
- /// 璇诲彇浣�
- /// </summary>
- public bool ReadBit(ushort byteOffset, byte bitOffset)
- {
- if (bitOffset > 7)
- throw new ArgumentOutOfRangeException(nameof(bitOffset), "浣嶅亸绉诲繀椤诲湪0-7涔嬮棿");
-
- _lock.EnterReadLock();
- try
- {
- if (byteOffset >= Size)
- throw new ArgumentOutOfRangeException(nameof(byteOffset));
-
- return (_memory[byteOffset] & (1 << bitOffset)) != 0;
- }
- finally
- {
- _lock.ExitReadLock();
- }
- }
-
- /// <summary>
- /// 鍐欏叆浣�
- /// </summary>
- public void WriteBit(ushort byteOffset, byte bitOffset, bool value)
- {
- if (bitOffset > 7)
- throw new ArgumentOutOfRangeException(nameof(bitOffset), "浣嶅亸绉诲繀椤诲湪0-7涔嬮棿");
-
- _lock.EnterWriteLock();
- try
- {
- if (byteOffset >= Size)
- throw new ArgumentOutOfRangeException(nameof(byteOffset));
-
- if (value)
- _memory[byteOffset] |= (byte)(1 << bitOffset);
- else
- _memory[byteOffset] &= (byte)~(1 << bitOffset);
- }
- finally
- {
- _lock.ExitWriteLock();
- }
- }
- }
-}
-```
-
-- [ ] **Step 2: 瀹炵幇Q鍖猴紙杈撳嚭鍖猴級**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Memory
-{
- /// <summary>
- /// Q鍖猴紙杈撳嚭鍖�/Output锛夊疄鐜�
- /// </summary>
- public class QRegion : MemoryRegion
- {
- /// <summary>
- /// 鍖哄煙绫诲瀷
- /// </summary>
- public override string RegionType => "Q";
-
- /// <summary>
- /// 鏋勯�犲嚱鏁�
- /// </summary>
- /// <param name="size">鍖哄煙澶у皬锛堝瓧鑺傦級</param>
- public QRegion(int size) : base(size)
- {
- }
-
- /// <summary>
- /// 璇诲彇浣�
- /// </summary>
- public bool ReadBit(ushort byteOffset, byte bitOffset)
- {
- if (bitOffset > 7)
- throw new ArgumentOutOfRangeException(nameof(bitOffset), "浣嶅亸绉诲繀椤诲湪0-7涔嬮棿");
-
- _lock.EnterReadLock();
- try
- {
- if (byteOffset >= Size)
- throw new ArgumentOutOfRangeException(nameof(byteOffset));
-
- return (_memory[byteOffset] & (1 << bitOffset)) != 0;
- }
- finally
- {
- _lock.ExitReadLock();
- }
- }
-
- /// <summary>
- /// 鍐欏叆浣�
- /// </summary>
- public void WriteBit(ushort byteOffset, byte bitOffset, bool value)
- {
- if (bitOffset > 7)
- throw new ArgumentOutOfRangeException(nameof(bitOffset), "浣嶅亸绉诲繀椤诲湪0-7涔嬮棿");
-
- _lock.EnterWriteLock();
- try
- {
- if (byteOffset >= Size)
- throw new ArgumentOutOfRangeException(nameof(byteOffset));
-
- if (value)
- _memory[byteOffset] |= (byte)(1 << bitOffset);
- else
- _memory[byteOffset] &= (byte)~(1 << bitOffset);
- }
- finally
- {
- _lock.ExitWriteLock();
- }
- }
- }
-}
-```
-
-- [ ] **Step 3: 瀹炵幇T鍖猴紙瀹氭椂鍣ㄥ尯锛�**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Memory
-{
- /// <summary>
- /// T鍖猴紙瀹氭椂鍣ㄥ尯/Timer锛夊疄鐜�
- /// </summary>
- public class TRegion : MemoryRegion
- {
- /// <summary>
- /// 鍖哄煙绫诲瀷
- /// </summary>
- public override string RegionType => "T";
-
- /// <summary>
- /// 姣忎釜瀹氭椂鍣ㄥ崰鐢ㄧ殑瀛楄妭鏁帮紙S7瀹氭椂鍣ㄤ负2瀛楄妭锛�
- /// </summary>
- private const int TimerSize = 2;
-
- /// <summary>
- /// 鏋勯�犲嚱鏁�
- /// </summary>
- /// <param name="timerCount">瀹氭椂鍣ㄦ暟閲�</param>
- public TRegion(int timerCount) : base(timerCount * TimerSize)
- {
- }
-
- /// <summary>
- /// 璇诲彇瀹氭椂鍣ㄥ��
- /// </summary>
- /// <param name="timerNumber">瀹氭椂鍣ㄥ彿</param>
- /// <returns>瀹氭椂鍣ㄥ�硷紙姣锛�</returns>
- public ushort ReadTimer(ushort timerNumber)
- {
- ushort offset = (ushort)((timerNumber - 1) * TimerSize);
- var data = Read(offset, TimerSize);
- return (ushort)((data[0] << 8) | data[1]);
- }
-
- /// <summary>
- /// 鍐欏叆瀹氭椂鍣ㄥ��
- /// </summary>
- /// <param name="timerNumber">瀹氭椂鍣ㄥ彿</param>
- /// <param name="value">瀹氭椂鍣ㄥ�硷紙姣锛�</param>
- public void WriteTimer(ushort timerNumber, ushort value)
- {
- ushort offset = (ushort)((timerNumber - 1) * TimerSize);
- var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) };
- Write(offset, data);
- }
- }
-}
-```
-
-- [ ] **Step 4: 瀹炵幇C鍖猴紙璁℃暟鍣ㄥ尯锛�**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Memory
-{
- /// <summary>
- /// C鍖猴紙璁℃暟鍣ㄥ尯/Counter锛夊疄鐜�
- /// </summary>
- public class CRegion : MemoryRegion
- {
- /// <summary>
- /// 鍖哄煙绫诲瀷
- /// </summary>
- public override string RegionType => "C";
-
- /// <summary>
- /// 姣忎釜璁℃暟鍣ㄥ崰鐢ㄧ殑瀛楄妭鏁帮紙S7璁℃暟鍣ㄤ负2瀛楄妭锛�
- /// </summary>
- private const int CounterSize = 2;
-
- /// <summary>
- /// 鏋勯�犲嚱鏁�
- /// </summary>
- /// <param name="counterCount">璁℃暟鍣ㄦ暟閲�</param>
- public CRegion(int counterCount) : base(counterCount * CounterSize)
- {
- }
-
- /// <summary>
- /// 璇诲彇璁℃暟鍣ㄥ��
- /// </summary>
- /// <param name="counterNumber">璁℃暟鍣ㄥ彿</param>
- /// <returns>璁℃暟鍣ㄥ��</returns>
- public ushort ReadCounter(ushort counterNumber)
- {
- ushort offset = (ushort)((counterNumber - 1) * CounterSize);
- var data = Read(offset, CounterSize);
- return (ushort)((data[0] << 8) | data[1]);
- }
-
- /// <summary>
- /// 鍐欏叆璁℃暟鍣ㄥ��
- /// </summary>
- /// <param name="counterNumber">璁℃暟鍣ㄥ彿</param>
- /// <param name="value">璁℃暟鍣ㄥ��</param>
- public void WriteCounter(ushort counterNumber, ushort value)
- {
- ushort offset = (ushort)((counterNumber - 1) * CounterSize);
- var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) };
- Write(offset, data);
- }
- }
-}
-```
-
-- [ ] **Step 5: 楠岃瘉鏋勫缓**
-
-```bash
-cd WIDESEAWCS_S7Simulator.Core
-dotnet build
-```
-
-- [ ] **Step 6: 鎻愪氦I/Q/T/C鍖哄疄鐜�**
-
-```bash
-git add .
-git commit -m "feat: implement I/Q/T/C regions
-
-- Add IRegion (Input) with bit operations
-- Add QRegion (Output) with bit operations
-- Add TRegion (Timer) with timer read/write
-- Add CRegion (Counter) with counter read/write
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
-
-### Task 8: 瀹炵幇鍐呭瓨瀛樺偍
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryStore.cs`
-- Create: `WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs`
-- Test: `WIDESEAWCS_S7Simulator.UnitTests/Memory/MemoryStoreTests.cs`
-
-- [ ] **Step 1: 鍒涘缓鍐呭瓨瀛樺偍鎺ュ彛**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Core.Interfaces
-{
- /// <summary>
- /// 鍐呭瓨瀛樺偍鎺ュ彛
- /// </summary>
- public interface IMemoryStore
- {
- /// <summary>
- /// 璇诲彇瀛楄妭鏁版嵁
- /// </summary>
- /// <param name="address">鍦板潃锛堝 "M100", "DB1.DBD0"锛�</param>
- /// <param name="length">闀垮害</param>
- /// <returns>瀛楄妭鏁扮粍</returns>
- byte[] ReadBytes(string address, ushort length);
-
- /// <summary>
- /// 璇诲彇鎸囧畾绫诲瀷鏁版嵁
- /// </summary>
- T Read<T>(string address) where T : struct;
-
- /// <summary>
- /// 鍐欏叆瀛楄妭鏁版嵁
- /// </summary>
- /// <param name="address">鍦板潃</param>
- /// <param name="data">鏁版嵁</param>
- void WriteBytes(string address, byte[] data);
-
- /// <summary>
- /// 鍐欏叆鎸囧畾绫诲瀷鏁版嵁
- /// </summary>
- void Write<T>(string address, T value) where T : struct;
-
- /// <summary>
- /// 鑾峰彇鍐呭瓨鍖哄煙
- /// </summary>
- IMemoryRegion GetRegion(string regionType);
-
- /// <summary>
- /// 娓呯┖鎵�鏈夊唴瀛�
- /// </summary>
- void Clear();
-
- /// <summary>
- /// 瀵煎嚭鍐呭瓨鏁版嵁
- /// </summary>
- Dictionary<string, byte[]> Export();
-
- /// <summary>
- /// 瀵煎叆鍐呭瓨鏁版嵁
- /// </summary>
- void Import(Dictionary<string, byte[]> data);
- }
-}
-```
-
-- [ ] **Step 2: 缂栧啓鍐呭瓨瀛樺偍娴嬭瘯**
-
-```csharp
-using Xunit;
-using WIDESEAWCS_S7Simulator.Core.Memory;
-using WIDESEAWCS_S7Simulator.Core.Entities;
-
-namespace WIDESEAWCS_S7Simulator.UnitTests.Memory
-{
- public class MemoryStoreTests
- {
- [Fact]
- public void Constructor_WithConfig_CreatesAllRegions()
- {
- // Arrange
- var config = new MemoryRegionConfig
- {
- MRegionSize = 1024,
- DBBlockCount = 10,
- DBBlockSize = 1024,
- IRegionSize = 256,
- QRegionSize = 256,
- TRegionCount = 32,
- CRegionCount = 32
- };
-
- // Act
- var store = new MemoryStore(config);
-
- // Assert
- Assert.NotNull(store.GetRegion("M"));
- Assert.NotNull(store.GetRegion("DB"));
- Assert.NotNull(store.GetRegion("I"));
- Assert.NotNull(store.GetRegion("Q"));
- Assert.NotNull(store.GetRegion("T"));
- Assert.NotNull(store.GetRegion("C"));
- }
-
- [Fact]
- public void WriteBytes_MRegion_WritesToMRegion()
- {
- // Arrange
- var store = new MemoryStore(new MemoryRegionConfig());
- var data = new byte[] { 0x12, 0x34 };
-
- // Act
- store.WriteBytes("M100", data);
- var result = store.ReadBytes("M100", 2);
-
- // Assert
- Assert.Equal(data, result);
- }
-
- [Fact]
- public void Write_ReadInt_ReturnsCorrectValue()
- {
- // Arrange
- var store = new MemoryStore(new MemoryRegionConfig());
-
- // Act
- store.Write(100, 12345);
- var result = store.Read<int>("M100");
-
- // Assert
- Assert.Equal(12345, result);
- }
-
- [Fact]
- public void Write_ReadDInt_ReturnsCorrectValue()
- {
- // Arrange
- var store = new MemoryStore(new MemoryRegionConfig());
-
- // Act
- store.Write("M100", 123456789);
- var result = store.Read<int>("M100");
-
- // Assert
- Assert.Equal(123456789, result);
- }
-
- [Fact]
- public void Write_ReadReal_ReturnsCorrectValue()
- {
- // Arrange
- var store = new MemoryStore(new MemoryRegionConfig());
-
- // Act
- store.Write("M100", 3.14159f);
- var result = store.Read<float>("M100");
-
- // Assert
- Assert.Equal(3.14159f, result, 4);
- }
-
- [Fact]
- public void WriteBytes_DBRegion_WritesToSpecificDB()
- {
- // Arrange
- var store = new MemoryStore(new MemoryRegionConfig());
- var data = new byte[] { 0xAA, 0xBB };
-
- // Act
- store.WriteBytes("DB1.DBD0", data);
- var result = store.ReadBytes("DB1.DBD0", 2);
-
- // Assert
- Assert.Equal(data, result);
- }
-
- [Fact]
- public void Write_IRegion_WritesToIRegion()
- {
- // Arrange
- var store = new MemoryStore(new MemoryRegionConfig());
-
- // Act
- store.Write("I0", true);
- var result = store.Read<bool>("I0");
-
- // Assert
- Assert.True(result);
- }
-
- [Fact]
- public void Clear_AllRegions_ZerosAllMemory()
- {
- // Arrange
- var store = new MemoryStore(new MemoryRegionConfig());
- store.Write("M100", 12345);
-
- // Act
- store.Clear();
- var result = store.Read<int>("M100");
-
- // Assert
- Assert.Equal(0, result);
- }
-
- [Fact]
- public void ExportImport_PreservesAllMemory()
- {
- // Arrange
- var store = new MemoryStore(new MemoryRegionConfig());
- store.Write("M100", 12345);
- store.Write("DB1.DBD0", 67890);
-
- // Act
- var exported = store.Export();
- var newStore = new MemoryStore(new MemoryRegionConfig());
- newStore.Import(exported);
-
- // Assert
- Assert.Equal(12345, newStore.Read<int>("M100"));
- Assert.Equal(67890, newStore.Read<int>("DB1.DBD0"));
- }
- }
-}
-```
-
-- [ ] **Step 3: 杩愯娴嬭瘯楠岃瘉澶辫触**
-
-```bash
-dotnet test Memory/MemoryStoreTests.cs -v n
-```
-
-棰勬湡杈撳嚭: 娴嬭瘯澶辫触
-
-- [ ] **Step 4: 瀹炵幇MemoryStore绫�**
-
-```csharp
-using System.Collections.Generic;
-using System.Text.RegularExpressions;
-using WIDESEAWCS_S7Simulator.Core.Entities;
-using WIDESEAWCS_S7Simulator.Core.Interfaces;
-
-namespace WIDESEAWCS_S7Simulator.Core.Memory
-{
- /// <summary>
- /// 鍐呭瓨瀛樺偍瀹炵幇
- /// </summary>
- public class MemoryStore : IMemoryStore
- {
- /// <summary>
- /// 鍐呭瓨鍖哄煙瀛楀吀
- /// </summary>
- private readonly Dictionary<string, IMemoryRegion> _regions;
-
- /// <summary>
- /// 鍐呭瓨閰嶇疆
- /// </summary>
- private readonly MemoryRegionConfig _config;
-
- /// <summary>
- /// 鍦板潃瑙f瀽姝e垯琛ㄨ揪寮�
- /// </summary>
- private static readonly Regex AddressRegex = new Regex(
- @"^(M|DB(\d+)\.)?(I|Q|T|C)?(\d+)(?:\.([BWD]))?$",
- RegexOptions.IgnoreCase | RegexOptions.Compiled);
-
- /// <summary>
- /// 鏋勯�犲嚱鏁�
- /// </summary>
- /// <param name="config">鍐呭瓨閰嶇疆</param>
- public MemoryStore(MemoryRegionConfig config)
- {
- _config = config;
- _regions = new Dictionary<string, IMemoryRegion>();
- InitializeRegions();
- }
-
- /// <summary>
- /// 鍒濆鍖栨墍鏈夊唴瀛樺尯鍩�
- /// </summary>
- private void InitializeRegions()
- {
- _regions["M"] = new MRegion(_config.MRegionSize);
- _regions["DB"] = new DBRegion(
- (ushort)_config.DBBlockCount,
- _config.DBBlockSize);
- _regions["I"] = new IRegion(_config.IRegionSize);
- _regions["Q"] = new QRegion(_config.QRegionSize);
- _regions["T"] = new TRegion(_config.TRegionCount);
- _regions["C"] = new CRegion(_config.CRegionCount);
- }
-
- /// <summary>
- /// 鑾峰彇鍐呭瓨鍖哄煙
- /// </summary>
- public IMemoryRegion GetRegion(string regionType)
- {
- return _regions.TryGetValue(regionType.ToUpper(), out var region)
- ? region
- : throw new KeyNotFoundException($"鍐呭瓨鍖哄煙涓嶅瓨鍦�: {regionType}");
- }
-
- /// <summary>
- /// 璇诲彇瀛楄妭鏁版嵁
- /// </summary>
- public byte[] ReadBytes(string address, ushort length)
- {
- var (regionType, offset, dbNumber) = ParseAddress(address);
- var region = GetRegion(regionType);
-
- if (regionType == "DB" && dbNumber.HasValue)
- {
- return ((DBRegion)region).Read(dbNumber.Value, offset, length);
- }
-
- return region.Read(offset, length);
- }
-
- /// <summary>
- /// 璇诲彇鎸囧畾绫诲瀷鏁版嵁
- /// </summary>
- public T Read<T>(string address) where T : struct
- {
- var type = typeof(T);
- var (regionType, offset, dbNumber) = ParseAddress(address);
- var region = GetRegion(regionType);
-
- if (type == typeof(bool))
- {
- byte bitOffset = (byte)(offset % 8);
- ushort byteOffset = (ushort)(offset / 8);
-
- if (regionType == "M")
- return (T)(object)((MRegion)region).ReadBit(byteOffset, bitOffset);
- else if (regionType == "I")
- return (T)(object)((IRegion)region).ReadBit(byteOffset, bitOffset);
- else if (regionType == "Q")
- return (T)(object)((QRegion)region).ReadBit(byteOffset, bitOffset);
- else if (regionType == "DB" && dbNumber.HasValue)
- return (T)(object)((DBRegion)region).ReadBool(dbNumber.Value, byteOffset, bitOffset);
- }
- else if (type == typeof(short) || type == typeof(int))
- {
- if (regionType == "M")
- return (T)(object)((MRegion)region).ReadInt(offset);
- else if (regionType == "DB" && dbNumber.HasValue)
- return (T)(object)((DBRegion)region).ReadInt(dbNumber.Value, offset);
- }
- else if (type == typeof(int))
- {
- if (regionType == "M")
- return (T)(object)((MRegion)region).ReadDInt(offset);
- else if (regionType == "DB" && dbNumber.HasValue)
- return (T)(object)((DBRegion)region).ReadDInt(dbNumber.Value, offset);
- }
- else if (type == typeof(float))
- {
- if (regionType == "M")
- return (T)(object)((MRegion)region).ReadReal(offset);
- else if (regionType == "DB" && dbNumber.HasValue)
- return (T)(object)((DBRegion)region).ReadReal(dbNumber.Value, offset);
- }
-
- // 榛樿璇诲彇瀛楄妭
- var bytes = ReadBytes(address, 2);
- if (type == typeof(short))
- return (T)(object)((short)((bytes[0] << 8) | bytes[1]));
-
- throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {type.Name}");
- }
-
- /// <summary>
- /// 鍐欏叆瀛楄妭鏁版嵁
- /// </summary>
- public void WriteBytes(string address, byte[] data)
- {
- var (regionType, offset, dbNumber) = ParseAddress(address);
- var region = GetRegion(regionType);
-
- if (regionType == "DB" && dbNumber.HasValue)
- {
- ((DBRegion)region).Write(dbNumber.Value, offset, data);
- }
- else
- {
- region.Write(offset, data);
- }
- }
-
- /// <summary>
- /// 鍐欏叆鎸囧畾绫诲瀷鏁版嵁
- /// </summary>
- public void Write<T>(string address, T value) where T : struct
- {
- var type = typeof(T);
- var (regionType, offset, dbNumber) = ParseAddress(address);
- var region = GetRegion(regionType);
-
- if (type == typeof(bool))
- {
- byte bitOffset = (byte)(offset % 8);
- ushort byteOffset = (ushort)(offset / 8);
- bool boolValue = (bool)(object)value;
-
- if (regionType == "M")
- ((MRegion)region).WriteBit(byteOffset, bitOffset, boolValue);
- else if (regionType == "I")
- ((IRegion)region).WriteBit(byteOffset, bitOffset, boolValue);
- else if (regionType == "Q")
- ((QRegion)region).WriteBit(byteOffset, bitOffset, boolValue);
- else if (regionType == "DB" && dbNumber.HasValue)
- ((DBRegion)region).WriteBool(dbNumber.Value, byteOffset, bitOffset, boolValue);
- }
- else if (type == typeof(short))
- {
- short shortValue = (short)(object)value;
- if (regionType == "M")
- ((MRegion)region).WriteInt(offset, shortValue);
- else if (regionType == "DB" && dbNumber.HasValue)
- ((DBRegion)region).WriteInt(dbNumber.Value, offset, shortValue);
- }
- else if (type == typeof(int))
- {
- int intValue = (int)(object)value;
- if (regionType == "M")
- ((MRegion)region).WriteDInt(offset, intValue);
- else if (regionType == "DB" && dbNumber.HasValue)
- ((DBRegion)region).WriteDInt(dbNumber.Value, offset, intValue);
- }
- else if (type == typeof(float))
- {
- float floatValue = (float)(object)value;
- if (regionType == "M")
- ((MRegion)region).WriteReal(offset, floatValue);
- else if (regionType == "DB" && dbNumber.HasValue)
- ((DBRegion)region).WriteReal(dbNumber.Value, offset, floatValue);
- }
- else
- {
- throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {type.Name}");
- }
- }
-
- /// <summary>
- /// 娓呯┖鎵�鏈夊唴瀛�
- /// </summary>
- public void Clear()
- {
- foreach (var region in _regions.Values)
- {
- region.Clear();
- }
- }
-
- /// <summary>
- /// 瀵煎嚭鍐呭瓨鏁版嵁
- /// </summary>
- public Dictionary<string, byte[]> Export()
- {
- var data = new Dictionary<string, byte[]>();
-
- foreach (var kvp in _regions)
- {
- var region = kvp.Value;
- var regionData = region.Read(0, (ushort)region.Size);
- data[$"{kvp.Key}_data"] = regionData;
- }
-
- return data;
- }
-
- /// <summary>
- /// 瀵煎叆鍐呭瓨鏁版嵁
- /// </summary>
- public void Import(Dictionary<string, byte[]> data)
- {
- foreach (var kvp in data)
- {
- if (kvp.Key.EndsWith("_data"))
- {
- var regionType = kvp.Key.Replace("_data", "");
- if (_regions.ContainsKey(regionType))
- {
- _regions[regionType].Write(0, kvp.Value);
- }
- }
- }
- }
-
- /// <summary>
- /// 瑙f瀽鍦板潃
- /// </summary>
- /// <param name="address">鍦板潃瀛楃涓�</param>
- /// <returns>(鍖哄煙绫诲瀷, 鍋忕Щ閲�, DB鍧楀彿)</returns>
- private (string regionType, ushort offset, ushort? dbNumber) ParseAddress(string address)
- {
- address = address.ToUpper().Trim();
-
- // 瑙f瀽 M100
- if (address.StartsWith("M"))
- {
- var offset = ushort.Parse(address.Substring(1));
- return ("M", offset, null);
- }
-
- // 瑙f瀽 I0, Q0, T1, C1
- if (address.StartsWith("I"))
- return ("I", ushort.Parse(address.Substring(1)), null);
- if (address.StartsWith("Q"))
- return ("Q", ushort.Parse(address.Substring(1)), null);
- if (address.StartsWith("T"))
- return ("T", ushort.Parse(address.Substring(1)), null);
- if (address.StartsWith("C"))
- return ("C", ushort.Parse(address.Substring(1)), null);
-
- // 瑙f瀽 DB1.DBD0 鎴� DB1.DBW0
- if (address.StartsWith("DB"))
- {
- var parts = address.Substring(2).Split('.');
- var dbNumber = ushort.Parse(parts[0]);
- var offsetPart = parts[1];
-
- // DBD = DWord (4瀛楄妭), DBW = Word (2瀛楄妭), DBB = Byte (1瀛楄妭)
- ushort offset;
- if (offsetPart.StartsWith("DBD"))
- offset = ushort.Parse(offsetPart.Substring(3));
- else if (offsetPart.StartsWith("DBW"))
- offset = ushort.Parse(offsetPart.Substring(3));
- else if (offsetPart.StartsWith("DBB"))
- offset = ushort.Parse(offsetPart.Substring(3));
- else if (offsetPart.StartsWith("DBX"))
- {
- // DBX = Bit (浣嶅湴鍧�)
- var bitAddress = offsetPart.Substring(3).Split('.');
- offset = ushort.Parse(bitAddress[0]);
- // 杞崲涓哄瓧鑺傚亸绉�+浣嶅亸绉�
- offset = (ushort)(offset * 8 + byte.Parse(bitAddress[1]));
- }
- else
- offset = ushort.Parse(offsetPart);
-
- return ("DB", offset, dbNumber);
- }
-
- throw new ArgumentException($"鏃犳晥鐨勫湴鍧�鏍煎紡: {address}");
- }
-
- /// <summary>
- /// 閲婃斁璧勬簮
- /// </summary>
- public void Dispose()
- {
- foreach (var region in _regions.Values)
- {
- if (region is IDisposable disposable)
- {
- disposable.Dispose();
- }
- }
- _regions.Clear();
- }
- }
-}
-```
-
-- [ ] **Step 5: 杩愯娴嬭瘯楠岃瘉閫氳繃**
-
-```bash
-dotnet test Memory/MemoryStoreTests.cs -v n
-```
-
-棰勬湡杈撳嚭: 鎵�鏈夋祴璇曢�氳繃
-
-- [ ] **Step 6: 鎻愪氦鍐呭瓨瀛樺偍瀹炵幇**
-
-```bash
-git add .
-git commit -m "feat: implement MemoryStore with address parsing
-
-- Add MemoryStore class managing all memory regions
-- Support M/DB/I/Q/T/C address parsing
-- Support bool/short/int/float data types
-- Add export/import functionality for persistence
-- Add comprehensive unit tests
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
-
----
-
-**璁″垝缁х画涓�...** 鐢变簬璁″垝寰堥暱锛屾垜灏嗗垎澶氫釜chunk淇濆瓨銆傝繖鏄疌hunk 1-3锛屾兜鐩栦簡椤圭洰鍩虹璁炬柦銆佹牳蹇冨疄浣撳拰鍐呭瓨瀛樺偍瀹炵幇銆�
-
-**鏄惁缁х画鎵ц涓嬩竴閮ㄥ垎锛堟寔涔呭寲鏈嶅姟鍜屾湇鍔″櫒瀹炰緥锛夛紵**
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-cache.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-cache.md
deleted file mode 100644
index 8c65dee..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-cache.md
+++ /dev/null
@@ -1,239 +0,0 @@
-# 璺敱缂撳瓨瀹炵幇璁″垝
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 鍦� RouterService 涓紩鍏� HybridCacheService 娣峰悎缂撳瓨锛岀涓�娆℃煡璇㈠姞杞藉叏閲忚矾鐢卞埌缂撳瓨锛屽悗缁煡璇㈢洿鎺ヤ粠缂撳瓨璇诲彇锛孉ddRouters 鍐欏叆鍚庡悓姝ユ洿鏂扮紦瀛樸��
-
-**Architecture:** 鎸� InOutType 鍒嗗紑缂撳瓨涓や唤锛堝叆鍙�/鍑哄彛锛夛紝GetOrAdd 鎳掑姞杞斤紝鍐欑┛鏇存柊缂撳瓨锛屽崟瀹炰緥閮ㄧ讲鏃犲箍鎾渶姹傘��
-
-**Tech Stack:** ASP.NET Core 6.0, HybridCacheService, SqlSugar ORM
-
----
-
-## 鏂囦欢鍙樻洿姒傝
-
-**淇敼鏂囦欢锛�**
-- `WIDESEAWCS_QuartzJob/Service/RouterService.cs` 鈥� 鍏ㄩ儴缂撳瓨閫昏緫鏀瑰姩
-
-**涓嶅彉锛�**
-- `FindRoutesInMemory` 鈥� 鍙敼璋冪敤鏂癸紝绠楁硶閫昏緫涓嶅彉
-- `QueryAllPositions` 鈥� 宸叉湁鐙珛缂撳瓨锛屼笉渚濊禆鏈柟妗�
-
----
-
-## Task 1: 鏂板 GetAllRoutersFromCache 绉佹湁鏂规硶
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
-
-鍦ㄧ被鎴愬憳鍙橀噺澹版槑鍖轰箣鍚庛�佺幇鏈夋柟娉曚箣鍓嶏紝鏂板浠ヤ笅绉佹湁鏂规硶锛�
-
-```csharp
-/// <summary>
-/// 浠庣紦瀛樿幏鍙栨寚瀹氱被鍨嬬殑鍏ㄩ噺璺敱鏁版嵁锛岀紦瀛樹笉瀛樺湪鏃惰嚜鍔ㄤ粠鏁版嵁搴撳姞杞藉苟鍐欏叆缂撳瓨
-/// </summary>
-/// <param name="routeType">璺敱绫诲瀷锛堝叆鍙�/鍑哄彛锛�</param>
-/// <returns>璇ョ被鍨嬬殑鍏ㄩ儴璺敱鍒楄〃</returns>
-private List<Dt_Router> GetAllRoutersFromCache(int routeType)
-{
- string cacheKey = $"Router:AllRouters:{(routeType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
- return _cacheService.GetOrAdd(
- cacheKey,
- () => BaseDal.QueryData(x => x.InOutType == routeType)
- );
-}
-
----
-
-## Task 2: 鏀归�� QueryNextRoutes 閲嶈浇锛�2涓柟娉曪級
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:48-98`
-
-### QueryNextRoutes(string, string) 鈥� 绗�48-69琛�
-
-鍘熶唬鐮侊細
-```csharp
-List<Dt_Router> allRouters = BaseDal.QueryData(x => true);
-routers = FindRoutesInMemory(startPosi, endPosi, allRouters, null);
-```
-
-鏀逛负锛�
-```csharp
-List<Dt_Router> allRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
-// 鍏ュ彛+鍑哄彛閮藉姞杞斤紝FindRoutesInMemory 鍐呴儴鎸� routeType==null 涓嶅仛杩囨护
-List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
-allRouters.AddRange(outRouters);
-routers = FindRoutesInMemory(startPosi, endPosi, allRouters, null);
-```
-
-### QueryNextRoutes(string, string, int) 鈥� 绗�78-99琛�
-
-鍘熶唬鐮侊細
-```csharp
-List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType);
-routers = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType);
-```
-
-鏀逛负锛�
-```csharp
-List<Dt_Router> allRouters = GetAllRoutersFromCache(routeType);
-routers = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType);
-```
-
----
-
-## Task 3: 鏀归�� QueryNextRoute 閲嶈浇锛�4涓柟娉曪級
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:189-314`
-
-### QueryNextRoute(string) 鈥� 绗�189-205琛�
-
-鍘熶唬鐮侊細
-```csharp
-List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi, ...);
-return routes.FirstOrDefault();
-```
-
-鏀逛负锛�
-```csharp
-List<Dt_Router> routes = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt())
- .Where(x => x.StartPosi == startPosi)
- .ToList();
-routes = routes.OrderByDescending(x => x.IsEnd).ToList();
-return routes.FirstOrDefault();
-```
-
-### QueryNextRoute(string, int) 鈥� 绗�213-229琛�
-
-鍘熶唬鐮侊細
-```csharp
-List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi && x.InOutType == routeType, ...);
-return routes.FirstOrDefault();
-```
-
-鏀逛负锛�
-```csharp
-List<Dt_Router> routes = GetAllRoutersFromCache(routeType)
- .Where(x => x.StartPosi == startPosi)
- .ToList();
-routes = routes.OrderByDescending(x => x.IsEnd).ToList();
-return routes.FirstOrDefault();
-```
-
-### QueryNextRoute(string, string, int) 鈥� 绗�238-272琛�
-
-鍘熶唬鐮侊紙绗�255琛岋級锛�
-```csharp
-List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType);
-```
-
-鏀逛负锛�
-```csharp
-List<Dt_Router> allRouters = GetAllRoutersFromCache(routeType);
-```
-
-鍏朵綑鐩存帴璺敱鍒ゆ柇鍜� `FindRoutesInMemory` 璋冪敤閫昏緫涓嶅彉銆�
-
-### QueryNextRoute(string, string) 鈥� 绗�280-314琛�
-
-鍘熶唬鐮侊紙绗�285琛岋級锛�
-```csharp
-List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi, ...);
-```
-
-鏀逛负锛堝悎骞跺叆鍙�+鍑哄彛涓や唤缂撳瓨锛屼笌鍘熸柟娉曞叏閲忔煡璇㈣涔変竴鑷达級锛�
-```csharp
-List<Dt_Router> inRoutes = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
-List<Dt_Router> outRoutes = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
-List<Dt_Router> routes = inRoutes.Concat(outRoutes)
- .Where(x => x.StartPosi == startPosi)
- .ToList();
-routes = routes.OrderByDescending(x => x.IsEnd).ToList();
-```
-
-鐒跺悗澶嶇敤宸叉湁鐨勭洿鎺ヨ矾鐢卞垽鏂�昏緫銆�
-
----
-
-## Task 4: 鏀归�� QueryRoutePath
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:323-366`
-
-绗�355琛岄檮杩戯紝鍘熶唬鐮佷腑 `while` 寰幆閲屾瘡娆¤皟鐢� `QueryNextRoute` 鐨勯�昏緫**涓嶉渶瑕佹敼鍔�**锛堝洜涓� `QueryNextRoute` 宸茬粡鍦� Task3 涓敼閫犱簡锛夈�傛湰浠诲姟鐨勬敼鍔ㄤ粎纭 `QueryRoutePath` 鏂规硶鏈韩涓嶅啀鐩存帴璋冪敤 `BaseDal.QueryData`锛屽嵆涓嶉渶瑕佷换浣曟敼鍔� 鈥斺�� 瀹冭皟鐢ㄧ殑鏄� `QueryNextRoute`锛岃�屽悗鑰呭凡琚敼閫犮��
-
-**楠岃瘉锛�** 纭 `QueryRoutePath` 鏂规硶浣撳唴娌℃湁鐩存帴璋冪敤 `BaseDal.QueryData`锛屽彧鏈夊 `QueryNextRoute` 鐨勮皟鐢ㄣ��
-
----
-
-## Task 5: 鏀归�� GetAllWholeRouters
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:412-446`
-
-鍘熶唬鐮侊細
-```csharp
-List<Dt_Router> allRouters = BaseDal.QueryData(x => true);
-```
-
-鏀逛负锛�
-```csharp
-List<Dt_Router> inRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
-List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
-List<Dt_Router> allRouters = inRouters.Concat(outRouters).ToList();
-```
-
-鍚庣画閬嶅巻 `dt_Routers`锛堝彇 `IsEnd == true` 鐨勮矾鐢憋級鐨勯�昏緫涓嶅彉銆�
-
----
-
-## Task 6: 鏀归�� AddRouters锛屽啓鍏� DB 鍚庢洿鏂扮紦瀛�
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:511-594`
-
-鍦ㄧ568琛岄檮杩戯紝鎵惧埌锛�
-```csharp
-// 鏌ヨ鏁版嵁搴撲腑宸叉湁鐨勮矾鐢变俊鎭�
-List<Dt_Router> dt_Routers = BaseDal.QueryData(x => x.InOutType == routerType);
-```
-
-杩欎釜 `dt_Routers` 鏄�**娣诲姞涔嬪墠**鐨勫凡鏈夋暟鎹紝涓嶅寘鍚湰娆℃柊澧炵殑璺敱銆傚湪绗�586琛� `BaseDal.AddData(routers)` **涔嬪悗**銆乣content = WebResponseContent.Instance.OK()` **涔嬪墠**锛屽繀椤婚噸鏂版煡璇竴娆″叏閲忔暟鎹啀鍐欏叆缂撳瓨锛�
-
-```csharp
-// 娣诲姞鏂扮殑璺敱淇℃伅
-BaseDal.AddData(routers);
-
-// 閲嶆柊鏌ヨ鍏ㄩ噺璺敱锛堟鏃舵墠鍖呭惈鏂板鐨勮矾鐢憋級锛屽啀鍐欏叆缂撳瓨
-List<Dt_Router> updatedRouters = BaseDal.QueryData(x => x.InOutType == routerType);
-string cacheKey = $"Router:AllRouters:{(routerType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
-_cacheService.Set(cacheKey, updatedRouters);
-
-content = WebResponseContent.Instance.OK();
-```
-
----
-
-## Task 7: 缂栬瘧楠岃瘉
-
-**楠岃瘉鍛戒护锛�**
-```bash
-dotnet build WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
-```
-
-棰勬湡锛氭棤缂栬瘧閿欒锛圕S0103/CS0019 绛夌被鍨�/璇硶閿欒鍏ㄩ儴淇鍚庯級
-
----
-
-## 瀹炴柦椤哄簭
-
-1. Task 1 鈥� 鏂板 `GetAllRoutersFromCache` 绉佹湁鏂规硶
-2. Task 2 鈥� 鏀归�� `QueryNextRoutes` 涓や釜閲嶈浇
-3. Task 3 鈥� 鏀归�� `QueryNextRoute` 鍥涗釜閲嶈浇
-4. Task 4 鈥� 纭 `QueryRoutePath` 鏃犻渶鏀瑰姩锛堝畠渚濊禆宸叉敼閫犵殑 `QueryNextRoute`锛�
-5. Task 5 鈥� 鏀归�� `GetAllWholeRouters`
-6. Task 6 鈥� 鏀归�� `AddRouters` 鏇存柊缂撳瓨
-7. Task 7 鈥� 缂栬瘧楠岃瘉
-
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md
deleted file mode 100644
index bf28dd8..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md
+++ /dev/null
@@ -1,324 +0,0 @@
-# RouterService 閫昏緫淇涓庢柊鏂规硶瀹炵幇璁″垝
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 淇 RouterService 涓殑 3 涓�昏緫闂锛屾柊澧� 7 涓矾鐢辨煡璇�/绠$悊鏂规硶锛屽苟鏇存柊鎺ュ彛灞傘��
-
-**Architecture:** 鍦ㄧ幇鏈� RouterService 鍩虹涓婃柊澧炵紦瀛樼鐞嗘柟娉曞拰璺敱鏌ヨ澧炲己鏂规硶锛屼繚鎸佺幇鏈� HybridCacheService 缂撳瓨鏋舵瀯涓嶅彉銆�
-
-**Tech Stack:** ASP.NET Core 6.0, HybridCacheService, SqlSugar ORM
-
----
-
-## 鏂囦欢鍙樻洿姒傝
-
-**淇敼鏂囦欢锛�**
-- `WIDESEAWCS_QuartzJob/Service/RouterService.cs` 鈥� 閫昏緫淇 + 鏂板鏂规硶瀹炵幇
-- `WIDESEAWCS_QuartzJob/Service/IRouterService.cs` 鈥� 鎺ュ彛鏂板鏂规硶绛惧悕 + 鍘绘帀澶氫綑 `public` 淇グ绗�
-
----
-
-## Task 1: 淇 AddRouters 缂撳瓨涓�鑷存�ч棶棰�
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:605-613`
-
-**鍘熶唬鐮侊細**
-```csharp
-BaseDal.AddData(routers);
-
-List<Dt_Router> updatedRouters = BaseDal.QueryData(x => x.InOutType == routerType);
-string cacheKey = $"Router:AllRouters:{(routerType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
-_cacheService.AddOrUpdate(cacheKey, updatedRouters);
-
-content = WebResponseContent.Instance.OK();
-```
-
-**鏀逛负锛�**
-```csharp
-// 娣诲姞鏂扮殑璺敱淇℃伅
-BaseDal.AddData(routers);
-
-// 閲嶆柊鏌ヨ鍏ㄩ噺璺敱锛堟鏃舵墠鍖呭惈鏂板鐨勮矾鐢憋級锛屽啀鍐欏叆缂撳瓨
-List<Dt_Router> updatedRouters = BaseDal.QueryData(x => x.InOutType == routerType);
-string cacheKey = $"Router:AllRouters:{(routerType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
-
-try
-{
- _cacheService.AddOrUpdate(cacheKey, updatedRouters);
-}
-catch
-{
- // 缂撳瓨鏇存柊澶辫触鏃堕潤榛樺拷鐣ワ紝涓嬫鏌ヨ浼氫粠DB鑷姩閲嶅缓缂撳瓨
-}
-
-content = WebResponseContent.Instance.OK();
-```
-
-**璇存槑**锛氱敤 try-catch 鍖呰9缂撳瓨鏇存柊鎿嶄綔锛岄槻姝㈢紦瀛樺啓鍏ュけ璐ユ椂寮傚父閫冮�稿埌澶栧眰琚綋浣滈敊璇繑鍥炪�侱B 宸插啓鍏ユ垚鍔燂紝缂撳瓨澶辫触涓嶅奖鍝嶄笟鍔℃纭�с��
-
----
-
-## Task 2: 淇 QueryAllPositions 绌� catch 鍧�
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:412-415`
-
-**鍘熶唬鐮侊細**
-```csharp
-catch
-{
-
-}
-```
-
-**鏀逛负锛�**
-```csharp
-catch (Exception ex)
-{
- ConsoleHelper.WriteErrorLine($"RouterService.QueryAllPositions 鏌ヨ澶辫触: {ex.Message}");
-}
-```
-
-**璇存槑**锛氬鍔犻敊璇棩蹇楄褰曪紝渚夸簬鎺掓煡闂銆傝繑鍥炲�间粛涓虹┖鍒楄〃锛岃皟鐢ㄦ柟琛屼负涓嶅彉銆�
-
----
-
-## Task 3: 淇 IRouterService 鎺ュ彛 public 淇グ绗� + 鏂板鏂规硶绛惧悕
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/IRouterService.cs`
-
-鍘绘帀浠ヤ笅琛岀殑 `public` 淇グ绗︼細
-- 绗�40琛岋細`public Dt_Router QueryNextRoute(string startPosi);` 鈫� `Dt_Router QueryNextRoute(string startPosi);`
-- 绗�48琛�
-- 绗�57琛�
-- 绗�65琛�
-- 绗�74琛�
-
-鍚屾椂鍦ㄦ帴鍙f湯灏炬柊澧炰互涓嬫柟娉曠鍚嶏細
-
-```csharp
-/// <summary>
-/// 娓呴櫎璺敱缂撳瓨
-/// </summary>
-void ClearRouterCache();
-
-/// <summary>
-/// 鏍规嵁璁惧缂栧彿鏌ヨ缁忚繃璇ヨ澶囩殑鎵�鏈夎矾鐢�
-/// </summary>
-List<Dt_Router> QueryRoutersByDeviceCode(string deviceCode);
-
-/// <summary>
-/// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪璺敱锛堝叏绫诲瀷锛�
-/// </summary>
-bool ExistsRouter(string startPosi, string endPosi);
-
-/// <summary>
-/// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪鎸囧畾绫诲瀷鐨勮矾鐢�
-/// </summary>
-bool ExistsRouter(string startPosi, string endPosi, int routeType);
-
-/// <summary>
-/// 鑾峰彇鍏ㄩ噺璺敱鏁伴噺锛堝悎骞跺叆鍙�+鍑哄彛锛�
-/// </summary>
-int GetRouterCount();
-
-/// <summary>
-/// 鑾峰彇鎸囧畾绫诲瀷璺敱鏁伴噺
-/// </summary>
-int GetRouterCount(int routeType);
-
-/// <summary>
-/// 鎵归噺鍒犻櫎璺敱
-/// </summary>
-WebResponseContent DeleteRouters(List<long> routerIds);
-```
-
----
-
-## Task 4: 瀹炵幇 ClearRouterCache()
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
-
-鍦� `GetAllRoutersFromCache` 鏂规硶涔嬪悗鏂板锛�
-
-```csharp
-/// <summary>
-/// 娓呴櫎鎵�鏈夎矾鐢辩紦瀛橈紙鍏ュ彛鍜屽嚭鍙g被鍨嬶級
-/// </summary>
-public void ClearRouterCache()
-{
- _cacheService.Remove("Router:AllRouters:In");
- _cacheService.Remove("Router:AllRouters:Out");
-}
-```
-
----
-
-## Task 5: 瀹炵幇 QueryRoutersByDeviceCode
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
-
-鍦� `ClearRouterCache` 涔嬪悗鏂板锛�
-
-```csharp
-/// <summary>
-/// 鏍规嵁璁惧缂栧彿鏌ヨ缁忚繃璇ヨ澶囩殑鎵�鏈夎矾鐢憋紙鍚堝苟鍏ュ彛+鍑哄彛绫诲瀷锛�
-/// </summary>
-/// <param name="deviceCode">璁惧缂栧彿</param>
-/// <returns>缁忚繃璇ヨ澶囩殑璺敱鍒楄〃</returns>
-public List<Dt_Router> QueryRoutersByDeviceCode(string deviceCode)
-{
- List<Dt_Router> inRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
- List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
- return inRouters.Concat(outRouters)
- .Where(x => x.ChildPosiDeviceCode == deviceCode)
- .ToList();
-}
-```
-
----
-
-## Task 6: 瀹炵幇 ExistsRouter锛堜袱涓噸杞斤級
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
-
-鍦� `QueryRoutersByDeviceCode` 涔嬪悗鏂板锛�
-
-```csharp
-/// <summary>
-/// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪璺敱锛堝叏绫诲瀷锛�
-/// </summary>
-public bool ExistsRouter(string startPosi, string endPosi)
-{
- List<Dt_Router> inRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
- List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
- var allRouters = inRouters.Concat(outRouters).ToList();
- var routes = FindRoutesInMemory(startPosi, endPosi, allRouters, null);
- return routes.Count > 0;
-}
-
-/// <summary>
-/// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪鎸囧畾绫诲瀷鐨勮矾鐢�
-/// </summary>
-public bool ExistsRouter(string startPosi, string endPosi, int routeType)
-{
- List<Dt_Router> allRouters = GetAllRoutersFromCache(routeType);
- var routes = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType);
- return routes.Count > 0;
-}
-```
-
----
-
-## Task 7: 瀹炵幇 GetRouterCount锛堜袱涓噸杞斤級
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
-
-鍦� `ExistsRouter` 涔嬪悗鏂板锛�
-
-```csharp
-/// <summary>
-/// 鑾峰彇鍏ㄩ噺璺敱鏁伴噺锛堝叆鍙�+鍑哄彛鍚堣锛�
-/// </summary>
-public int GetRouterCount()
-{
- int inCount = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt()).Count;
- int outCount = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt()).Count;
- return inCount + outCount;
-}
-
-/// <summary>
-/// 鑾峰彇鎸囧畾绫诲瀷璺敱鏁伴噺
-/// </summary>
-public int GetRouterCount(int routeType)
-{
- return GetAllRoutersFromCache(routeType).Count;
-}
-```
-
----
-
-## Task 8: 瀹炵幇 DeleteRouters
-
-**鏂囦欢:**
-- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
-
-鍦� `AddRouters` 鏂规硶涔嬪悗鏂板锛�
-
-```csharp
-/// <summary>
-/// 鎵归噺鍒犻櫎鎸囧畾ID鐨勮矾鐢憋紝鍒犻櫎鍚庡悓姝ユ竻闄ゅ搴旂被鍨嬬殑缂撳瓨
-/// </summary>
-/// <param name="routerIds">寰呭垹闄ょ殑璺敱ID鍒楄〃</param>
-/// <returns>杩斿洖澶勭悊缁撴灉</returns>
-public WebResponseContent DeleteRouters(List<long> routerIds)
-{
- WebResponseContent content = new WebResponseContent();
- try
- {
- if (routerIds == null || routerIds.Count == 0)
- {
- return content = WebResponseContent.Instance.Error("寰呭垹闄ょ殑璺敱ID鍒楄〃涓嶈兘涓虹┖");
- }
-
- // 鏌ヨ寰呭垹闄よ矾鐢辩殑绫诲瀷锛堢敤浜庡悗缁竻闄ょ紦瀛橈級
- var routersToDelete = BaseDal.QueryData(x => routerIds.Contains(x.Id));
- if (routersToDelete.Count == 0)
- {
- return content = WebResponseContent.Instance.Error("鏈壘鍒板緟鍒犻櫎鐨勮矾鐢�");
- }
-
- // 璁板綍娑夊強鐨勭被鍨嬶紙鍘婚噸锛�
- var affectedTypes = routersToDelete.Select(x => x.InOutType).Distinct().ToList();
-
- // 鎵ц鎵归噺鍒犻櫎
- BaseDal.DeleteData(routersToDelete);
-
- // 娓呴櫎鍙楀奖鍝嶇被鍨嬬殑缂撳瓨
- foreach (var routeType in affectedTypes)
- {
- string cacheKey = $"Router:AllRouters:{(routeType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
- _cacheService.Remove(cacheKey);
- }
-
- content = WebResponseContent.Instance.OK();
- }
- catch (Exception ex)
- {
- content = WebResponseContent.Instance.Error(ex.Message);
- }
- return content;
-}
-```
-
----
-
-## Task 9: 缂栬瘧楠岃瘉
-
-**楠岃瘉鍛戒护锛�**
-```bash
-dotnet build WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
-```
-
-棰勬湡锛�0 errors
-
----
-
-## 瀹炴柦椤哄簭
-
-1. Task 1 鈥� 淇 AddRouters 缂撳瓨涓�鑷存��
-2. Task 2 鈥� 淇 QueryAllPositions 绌� catch 鍧�
-3. Task 3 鈥� 淇 IRouterService 鎺ュ彛锛堝幓鎺� public + 鏂板绛惧悕锛�
-4. Task 4 鈥� 瀹炵幇 ClearRouterCache
-5. Task 5 鈥� 瀹炵幇 QueryRoutersByDeviceCode
-6. Task 6 鈥� 瀹炵幇 ExistsRouter 涓や釜閲嶈浇
-7. Task 7 鈥� 瀹炵幇 GetRouterCount 涓や釜閲嶈浇
-8. Task 8 鈥� 瀹炵幇 DeleteRouters
-9. Task 9 鈥� 缂栬瘧楠岃瘉
-
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-13-s7-plc-simulator-design.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-13-s7-plc-simulator-design.md
deleted file mode 100644
index 7fc0a41..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-13-s7-plc-simulator-design.md
+++ /dev/null
@@ -1,450 +0,0 @@
-# S7 PLC妯℃嫙鍣ㄧ郴缁熻璁℃枃妗�
-
-**鏃ユ湡**: 2026-03-13
-**浣滆��**: Claude + 鐢ㄦ埛鍗忎綔
-**鐘舵��**: 宸叉壒鍑�
-
----
-
-## 1. 闇�姹傛杩�
-
-### 1.1 鐩爣
-鍒涘缓涓�涓熀浜嶩SL Communication搴撶殑瑗块棬瀛怱7 PLC妯℃嫙鍣ㄧ郴缁燂紝鐢ㄤ簬WCS绯荤粺鐨勫紑鍙戞祴璇曘��
-
-### 1.2 鏍稿績闇�姹�
-- 鏀寔澶氬疄渚嬪悓鏃惰繍琛岋紝姣忎釜瀹炰緥鐙珛閰嶇疆
-- 鏀寔澶氱PLC鍨嬪彿锛圫7-200 Smart, S7-1200, S7-1500绛夛級
-- 鍙厤缃洃鍚鍙�
-- Web绠$悊鐣岄潰
-- 鍐呭瓨鏁版嵁鎸佷箙鍖栧埌鏈湴鏂囦欢
-- 鏀寔M/DB/I/Q/T/C鎵�鏈夊父鐢ㄥ湴鍧�鍖哄煙
-
----
-
-## 2. 鏁翠綋鏋舵瀯
-
-```
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� WIDESEAWCS_S7Simulator 鈹�
-鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� Web绠$悊鐣岄潰 (Razor Pages/Blazor) 鈹� 鈹�
-鈹� 鈹� - 鏈嶅姟鍣ㄥ疄渚嬪垪琛紙鍗$墖瑙嗗浘锛� 鈹� 鈹�
-鈹� 鈹� - 瀹炰緥鍒涘缓/缂栬緫琛ㄥ崟 鈹� 鈹�
-鈹� 鈹� - 瀹炰緥璇︽儏椤碉紙鐘舵�併�佸唴瀛樸�佸鎴风锛� 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈫� HTTP API + SignalR 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� Web API 鎺у埗鍣� 鈹� 鈹�
-鈹� 鈹� - SimulatorInstancesController (CRUD) 鈹� 鈹�
-鈹� 鈹� - SimulatorInstanceController (鍚仠鎺у埗) 鈹� 鈹�
-鈹� 鈹� - MemoryController (鍐呭瓨璇诲啓) 鈹� 鈹�
-鈹� 鈹� - ClientsController (瀹㈡埛绔鐞�) 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈫� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� 瀹炰緥绠$悊鍣� 鈹� 鈹�
-鈹� 鈹� Dictionary<string, IS7ServerInstance> 绠$悊鎵�鏈夊疄渚� 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈫� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� 姣忎釜瀹炰緥鍖呭惈: IS7ServerInstance + IMemoryStore 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈫� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� 澶氫釜HSL S7鏈嶅姟鍣ㄥ疄渚� (涓嶅悓绔彛) 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈫� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� S7瀹㈡埛绔繛鎺� (WCS/娴嬭瘯宸ュ叿绛�) 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-```
-
----
-
-## 3. 椤圭洰缁撴瀯
-
-```
-WIDESEAWCS_S7Simulator/
-鈹溾攢鈹� WIDESEAWCS_S7Simulator.sln
-鈹�
-鈹溾攢鈹� src/
-鈹� 鈹溾攢鈹� WIDESEAWCS_S7Simulator.Core/ # 鏍稿績棰嗗煙灞�
-鈹� 鈹� 鈹溾攢鈹� Entities/ # 瀹炰綋
-鈹� 鈹� 鈹� 鈹溾攢鈹� SimulatorInstance.cs # 瀹炰緥瀹炰綋
-鈹� 鈹� 鈹� 鈹溾攢鈹� InstanceConfig.cs # 瀹炰緥閰嶇疆
-鈹� 鈹� 鈹� 鈹溾攢鈹� InstanceState.cs # 瀹炰緥鐘舵��
-鈹� 鈹� 鈹� 鈹斺攢鈹� S7ClientConnection.cs # 瀹㈡埛绔繛鎺�
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Interfaces/ # 鎺ュ彛
-鈹� 鈹� 鈹� 鈹溾攢鈹� IS7ServerInstance.cs # 鏈嶅姟鍣ㄥ疄渚嬫帴鍙�
-鈹� 鈹� 鈹� 鈹溾攢鈹� IMemoryStore.cs # 鍐呭瓨瀛樺偍鎺ュ彛
-鈹� 鈹� 鈹� 鈹溾攢鈹� IPersistenceService.cs # 鎸佷箙鍖栨湇鍔℃帴鍙�
-鈹� 鈹� 鈹� 鈹斺攢鈹� ISimulatorInstanceManager.cs # 瀹炰緥绠$悊鍣ㄦ帴鍙�
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Memory/ # 鍐呭瓨妯℃嫙
-鈹� 鈹� 鈹� 鈹溾攢鈹� MemoryStore.cs # 鍐呭瓨瀛樺偍瀹炵幇
-鈹� 鈹� 鈹� 鈹溾攢鈹� MemoryRegion.cs # 鍐呭瓨鍖哄煙鍩虹被
-鈹� 鈹� 鈹� 鈹溾攢鈹� MRegion.cs # M鍖哄疄鐜�
-鈹� 鈹� 鈹� 鈹溾攢鈹� DBRegion.cs # DB鍖哄疄鐜�
-鈹� 鈹� 鈹� 鈹溾攢鈹� IRegion.cs # I鍖哄疄鐜�
-鈹� 鈹� 鈹� 鈹溾攢鈹� QRegion.cs # Q鍖哄疄鐜�
-鈹� 鈹� 鈹� 鈹溾攢鈹� TRegion.cs # T鍖哄疄鐜�
-鈹� 鈹� 鈹� 鈹斺攢鈹� CRegion.cs # C鍖哄疄鐜�
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Server/ # S7鏈嶅姟鍣�
-鈹� 鈹� 鈹� 鈹斺攢鈹� S7ServerInstance.cs # 鏈嶅姟鍣ㄥ疄渚嬪疄鐜�
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Persistence/ # 鏁版嵁鎸佷箙鍖�
-鈹� 鈹� 鈹� 鈹溾攢鈹� FilePersistenceService.cs # 鏂囦欢鎸佷箙鍖栧疄鐜�
-鈹� 鈹� 鈹� 鈹斺攢鈹� Models/
-鈹� 鈹� 鈹� 鈹斺攢鈹� InstanceDataModel.cs # 鏁版嵁妯″瀷
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Manager/ # 绠$悊鍣�
-鈹� 鈹� 鈹� 鈹斺攢鈹� SimulatorInstanceManager.cs # 瀹炰緥绠$悊鍣ㄥ疄鐜�
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹斺攢鈹� Enums/ # 鏋氫妇
-鈹� 鈹� 鈹溾攢鈹� SiemensPLCType.cs # PLC鍨嬪彿
-鈹� 鈹� 鈹斺攢鈹� InstanceStatus.cs # 瀹炰緥鐘舵��
-鈹� 鈹�
-鈹� 鈹溾攢鈹� WIDESEAWCS_S7Simulator.Application/ # 搴旂敤鏈嶅姟灞�
-鈹� 鈹� 鈹溾攢鈹� DTOs/ # 鏁版嵁浼犺緭瀵硅薄
-鈹� 鈹� 鈹� 鈹溾攢鈹� InstanceDTO.cs
-鈹� 鈹� 鈹� 鈹溾攢鈹� CreateInstanceDTO.cs
-鈹� 鈹� 鈹� 鈹溾攢鈹� UpdateInstanceDTO.cs
-鈹� 鈹� 鈹� 鈹溾攢鈹� MemoryReadDTO.cs
-鈹� 鈹� 鈹� 鈹溾攢鈹� MemoryWriteDTO.cs
-鈹� 鈹� 鈹� 鈹斺攢鈹� ClientConnectionDTO.cs
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Services/ # 搴旂敤鏈嶅姟
-鈹� 鈹� 鈹� 鈹溾攢鈹� SimulatorInstanceAppService.cs
-鈹� 鈹� 鈹� 鈹溾攢鈹� MemoryAppService.cs
-鈹� 鈹� 鈹� 鈹斺攢鈹� ClientAppService.cs
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹斺攢鈹� Profiles/ # AutoMapper閰嶇疆
-鈹� 鈹� 鈹斺攢鈹� MappingProfile.cs
-鈹� 鈹�
-鈹� 鈹溾攢鈹� WIDESEAWCS_S7Simulator.Server/ # Web API Host
-鈹� 鈹� 鈹溾攢鈹� Controllers/
-鈹� 鈹� 鈹� 鈹溾攢鈹� SimulatorInstancesController.cs
-鈹� 鈹� 鈹� 鈹溾攢鈹� SimulatorInstanceController.cs
-鈹� 鈹� 鈹� 鈹溾攢鈹� MemoryController.cs
-鈹� 鈹� 鈹� 鈹斺攢鈹� ClientsController.cs
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Infrastructure/
-鈹� 鈹� 鈹� 鈹溾攢鈹� DependencyInjection.cs
-鈹� 鈹� 鈹� 鈹斺攢鈹� Middleware/
-鈹� 鈹� 鈹� 鈹斺攢鈹� ExceptionMiddleware.cs
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Hubs/ # SignalR Hub
-鈹� 鈹� 鈹� 鈹斺攢鈹� SimulatorHub.cs # 瀹炴椂鐘舵�佹帹閫�
-鈹� 鈹� 鈹�
-鈹� 鈹� 鈹溾攢鈹� Program.cs
-鈹� 鈹� 鈹溾攢鈹� appsettings.json
-鈹� 鈹� 鈹斺攢鈹� WIDESEAWCS_S7Simulator.Server.csproj
-鈹� 鈹�
-鈹� 鈹斺攢鈹� WIDESEAWCS_S7Simulator.Web/ # Web绠$悊鐣岄潰
-鈹� 鈹溾攢鈹� Pages/ # Razor Pages
-鈹� 鈹� 鈹溾攢鈹� Index.cshtml # 瀹炰緥鍒楄〃椤�
-鈹� 鈹� 鈹溾攢鈹� Create.cshtml # 鍒涘缓瀹炰緥椤�
-鈹� 鈹� 鈹溾攢鈹� Edit.cshtml # 缂栬緫瀹炰緥椤�
-鈹� 鈹� 鈹溾攢鈹� Details.cshtml # 瀹炰緥璇︽儏椤�
-鈹� 鈹� 鈹斺攢鈹� Shared/
-鈹� 鈹� 鈹溾攢鈹� _Layout.cshtml
-鈹� 鈹� 鈹斺攢鈹� _Components/
-鈹� 鈹�
-鈹� 鈹溾攢鈹� wwwroot/
-鈹� 鈹� 鈹溾攢鈹� css/site.css
-鈹� 鈹� 鈹溾攢鈹� js/site.js
-鈹� 鈹� 鈹斺攢鈹� lib/ # 鍓嶇搴�
-鈹� 鈹�
-鈹� 鈹斺攢鈹� WIDESEAWCS_S7Simulator.Web.csproj
-鈹�
-鈹溾攢鈹� tests/
-鈹� 鈹溾攢鈹� WIDESEAWCS_S7Simulator.UnitTests/
-鈹� 鈹� 鈹溾攢鈹� Memory/
-鈹� 鈹� 鈹� 鈹溾攢鈹� MRegionTests.cs
-鈹� 鈹� 鈹� 鈹溾攢鈹� DBRegionTests.cs
-鈹� 鈹� 鈹� 鈹斺攢鈹� MemoryStoreTests.cs
-鈹� 鈹� 鈹溾攢鈹� Server/
-鈹� 鈹� 鈹� 鈹斺攢鈹� S7ServerInstanceTests.cs
-鈹� 鈹� 鈹斺攢鈹� Persistence/
-鈹� 鈹� 鈹斺攢鈹� FilePersistenceServiceTests.cs
-鈹� 鈹�
-鈹� 鈹斺攢鈹� WIDESEAWCS_S7Simulator.IntegrationTests/
-鈹� 鈹溾攢鈹� S7ClientConnectionTests.cs
-鈹� 鈹斺攢鈹� APIEndpointTests.cs
-鈹�
-鈹斺攢鈹� docs/
- 鈹斺攢鈹� API.md
-```
-
----
-
-## 4. 鏍稿績缁勪欢璁捐
-
-### 4.1 瀹炰緥閰嶇疆 (InstanceConfig)
-
-```csharp
-public class InstanceConfig
-{
- public string Id { get; set; }
- public string Name { get; set; }
- public SiemensPLCType PLCType { get; set; }
- public int Port { get; set; }
- public string ActivationKey { get; set; }
- public bool AutoStart { get; set; }
- public MemoryRegionConfig MemoryConfig { get; set; }
-}
-
-public class MemoryRegionConfig
-{
- public int MRegionSize { get; set; } = 1024;
- public int DBBlockCount { get; set; } = 100;
- public int DBBlockSize { get; set; } = 1024;
- public int IRegionSize { get; set; } = 256;
- public int QRegionSize { get; set; } = 256;
- public int TRegionCount { get; set; } = 64;
- public int CRegionCount { get; set; } = 64;
-}
-```
-
-### 4.2 瀹炰緥鐘舵�� (InstanceState)
-
-```csharp
-public class InstanceState
-{
- public string InstanceId { get; set; }
- public InstanceStatus Status { get; set; }
- public int ClientCount { get; set; }
- public long TotalRequests { get; set; }
- public DateTime? StartTime { get; set; }
- public DateTime? LastActivityTime { get; set; }
- public List<S7ClientConnection> Clients { get; set; } = new();
-}
-
-public enum InstanceStatus
-{
- Stopped = 0,
- Starting = 1,
- Running = 2,
- Stopping = 3,
- Error = 4
-}
-```
-
-### 4.3 S7鏈嶅姟鍣ㄥ疄渚嬫帴鍙� (IS7ServerInstance)
-
-```csharp
-public interface IS7ServerInstance : IDisposable
-{
- InstanceConfig Config { get; }
- InstanceState State { get; }
- IMemoryStore MemoryStore { get; }
-
- Task<OperateResult> StartAsync();
- Task<OperateResult> StopAsync();
- Task<OperateResult> RestartAsync();
-
- event EventHandler<InstanceStateEventArgs> StatusChanged;
- event EventHandler<ClientConnectionEventArgs> ClientConnected;
- event EventHandler<ClientConnectionEventArgs> ClientDisconnected;
-}
-```
-
----
-
-## 5. 鍐呭瓨瀛樺偍璁捐
-
-### 5.1 鍐呭瓨瀛樺偍鎺ュ彛 (IMemoryStore)
-
-```csharp
-public interface IMemoryStore
-{
- byte[] ReadBytes(string address, ushort length);
- T Read<T>(string address) where T : struct;
- void WriteBytes(string address, byte[] data);
- void Write<T>(string address, T value) where T : struct;
- IMemoryRegion GetRegion(string regionType);
- void Clear();
- Dictionary<string, byte[]> Export();
- void Import(Dictionary<string, byte[]> data);
-}
-```
-
-### 5.2 鍐呭瓨鍖哄煙鎺ュ彛 (IMemoryRegion)
-
-```csharp
-public interface IMemoryRegion
-{
- string RegionType { get; }
- int Size { get; }
- byte[] Read(ushort offset, ushort length);
- void Write(ushort offset, byte[] data);
- void Clear();
-}
-```
-
----
-
-## 6. 鏁版嵁鎸佷箙鍖栬璁�
-
-### 6.1 鎸佷箙鍖栨湇鍔℃帴鍙�
-
-```csharp
-public interface IPersistenceService
-{
- Task SaveInstanceConfigAsync(InstanceConfig config);
- Task<InstanceConfig> LoadInstanceConfigAsync(string instanceId);
- Task<List<InstanceConfig>> LoadAllInstanceConfigsAsync();
- Task DeleteInstanceConfigAsync(string instanceId);
- Task SaveMemoryDataAsync(string instanceId, IMemoryStore memoryStore);
- Task LoadMemoryDataAsync(string instanceId, IMemoryStore memoryStore);
-}
-```
-
-### 6.2 鏁版嵁鐩綍缁撴瀯
-
-```
-Data/
-鈹溾攢鈹� instance-1/
-鈹� 鈹溾攢鈹� config.json
-鈹� 鈹斺攢鈹� memory.json
-鈹溾攢鈹� instance-2/
-鈹� 鈹溾攢鈹� config.json
-鈹� 鈹斺攢鈹� memory.json
-```
-
----
-
-## 7. 瀹炰緥绠$悊鍣ㄨ璁�
-
-```csharp
-public interface ISimulatorInstanceManager
-{
- IReadOnlyList<IS7ServerInstance> GetAllInstances();
- IS7ServerInstance GetInstance(string instanceId);
- Task<IS7ServerInstance> CreateInstanceAsync(CreateInstanceDTO createDto);
- Task UpdateInstanceAsync(string instanceId, UpdateInstanceDTO updateDto);
- Task DeleteInstanceAsync(string instanceId);
- Task<OperateResult> StartInstanceAsync(string instanceId);
- Task<OperateResult> StopInstanceAsync(string instanceId);
- Task<OperateResult> RestartInstanceAsync(string instanceId);
- Task StartAutoStartInstancesAsync();
- Task StopAllInstancesAsync();
-
- event EventHandler<InstanceStateEventArgs> InstanceStatusChanged;
-}
-```
-
----
-
-## 8. Web API璁捐
-
-| 鏂规硶 | 璺緞 | 鎻忚堪 |
-|------|------|------|
-| GET | /api/instances | 鑾峰彇鎵�鏈夊疄渚嬪垪琛� |
-| POST | /api/instances | 鍒涘缓鏂板疄渚� |
-| GET | /api/instances/{id} | 鑾峰彇鎸囧畾瀹炰緥璇︽儏 |
-| PUT | /api/instances/{id} | 鏇存柊瀹炰緥閰嶇疆 |
-| DELETE | /api/instances/{id} | 鍒犻櫎瀹炰緥 |
-| POST | /api/instances/{id}/start | 鍚姩瀹炰緥 |
-| POST | /api/instances/{id}/stop | 鍋滄瀹炰緥 |
-| POST | /api/instances/{id}/restart | 閲嶅惎瀹炰緥 |
-| GET | /api/instances/{id}/memory | 璇诲彇鍐呭瓨鏁版嵁 |
-| POST | /api/instances/{id}/memory | 鍐欏叆鍐呭瓨鏁版嵁 |
-| DELETE | /api/instances/{id}/memory | 娓呯┖鍐呭瓨鏁版嵁 |
-| POST | /api/instances/{id}/memory/save | 淇濆瓨鍐呭瓨蹇収 |
-| POST | /api/instances/{id}/memory/load | 鍔犺浇鍐呭瓨蹇収 |
-| GET | /api/instances/{id}/clients | 鑾峰彇杩炴帴鐨勫鎴风鍒楄〃 |
-| DELETE | /api/instances/{id}/clients/{clientId} | 鏂紑鎸囧畾瀹㈡埛绔� |
-| POST | /api/instances/start-all | 鍚姩鎵�鏈夎嚜鍔ㄥ惎鍔ㄥ疄渚� |
-| POST | /api/instances/stop-all | 鍋滄鎵�鏈夊疄渚� |
-
----
-
-## 9. Web鐣岄潰璁捐
-
-### 9.1 鎶�鏈爤
-- ASP.NET Core Razor Pages
-- Bootstrap 5 + Bootstrap Icons
-- Alpine.js (杞婚噺绾т氦浜�)
-- SignalR (瀹炴椂鐘舵�佹帹閫�)
-
-### 9.2 涓昏椤甸潰
-
-| 椤甸潰 | 鍔熻兘 |
-|------|------|
-| Index | 瀹炰緥鍒楄〃鍗$墖瑙嗗浘锛屾樉绀烘墍鏈夊疄渚嬬姸鎬� |
-| Create | 鍒涘缓鏂板疄渚嬭〃鍗� |
-| Edit | 缂栬緫瀹炰緥閰嶇疆 |
-| Details | 瀹炰緥璇︽儏锛氱姸鎬佷俊鎭�佸鎴风鍒楄〃銆佸唴瀛樻煡鐪�/缂栬緫 |
-
----
-
-## 10. 閰嶇疆鏂囦欢
-
-```json
-{
- "urls": "http://*:5000",
- "S7Simulator": {
- "DataPath": "Data",
- "DefaultActivationKey": "4b86f3fc-f650-3b08-5924-b0f8278d6ed2",
- "EnableAutoLoad": true,
- "AutoStartInstances": true
- },
- "MemoryDefaults": {
- "MRegionSize": 1024,
- "DBBlockCount": 100,
- "DBBlockSize": 1024,
- "IRegionSize": 256,
- "QRegionSize": 256,
- "TRegionCount": 64,
- "CRegionCount": 64
- }
-}
-```
-
----
-
-## 11. 娴嬭瘯绛栫暐
-
-### 11.1 鍗曞厓娴嬭瘯
-- `MemoryStoreTests` - 鍐呭瓨璇诲啓銆佽竟鐣屾鏌ャ�佸苟鍙戣闂�
-- `MRegionTests` - M鍖轰綅鎿嶄綔銆佸瓧鑺傛搷浣�
-- `DBRegionTests` - DB鍧楄鍐欍�佸鍧楃鐞�
-- `InstanceManagerTests` - 瀹炰緥鍒涘缓銆佸惎鍔ㄣ�佸仠姝€�佸垹闄�
-- `PersistenceServiceTests` - 閰嶇疆淇濆瓨/鍔犺浇銆佸唴瀛樺揩鐓�
-
-### 11.2 闆嗘垚娴嬭瘯
-- `S7ServerIntegrationTests` - 鐪熷疄S7瀹㈡埛绔繛鎺ユ祴璇�
-- `APIIntegrationTests` - Web API绔埌绔祴璇�
-- `MultiInstanceTests` - 澶氬疄渚嬪苟鍙戣繍琛屾祴璇�
-
----
-
-## 12. 渚濊禆鍖�
-
-| 鍖呭悕 | 鐗堟湰 | 鐢ㄩ�� |
-|------|------|------|
-| HslCommunication | 12.6.3 | S7鍗忚閫氫俊 |
-| Microsoft.AspNetCore.SignalR | 鏈�鏂� | 瀹炴椂鐘舵�佹帹閫� |
-| Serilog.AspNetCore | 鏈�鏂� | 鏃ュ織璁板綍 |
-| AutoMapper | 鏈�鏂� | 瀵硅薄鏄犲皠 |
-| xUnit | 鏈�鏂� | 鍗曞厓娴嬭瘯 |
-
----
-
-## 13. 鎬荤粨
-
-鏈璁″疄鐜颁簡涓�涓姛鑳藉畬鏁寸殑S7 PLC妯℃嫙鍣ㄧ郴缁燂細
-
-1. **澶氬疄渚嬬鐞�** - 鏀寔鍒涘缓鍜岀鐞嗗涓嫭绔嬬殑S7鏈嶅姟鍣ㄥ疄渚�
-2. **鐏垫椿閰嶇疆** - 姣忎釜瀹炰緥鍙嫭绔嬮厤缃甈LC鍨嬪彿銆佺鍙c�佸唴瀛樺ぇ灏忕瓑
-3. **鏁版嵁鎸佷箙鍖�** - 閰嶇疆鍜屽唴瀛樻暟鎹嚜鍔ㄤ繚瀛樺埌鏈湴鏂囦欢
-4. **Web绠$悊鐣岄潰** - 鎻愪緵鐩磋鐨刉eb UI杩涜瀹炰緥绠$悊
-5. **瀹屾暣鍐呭瓨妯℃嫙** - 鏀寔M/DB/I/Q/T/C鎵�鏈夊父鐢ㄥ尯鍩�
-6. **瀹炴椂鐩戞帶** - 鏄剧ず杩炴帴鐘舵�併�佽姹傛暟銆佸鎴风淇℃伅绛�
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-27-router-service-audit-design.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-27-router-service-audit-design.md
deleted file mode 100644
index e0c9072..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-27-router-service-audit-design.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# RouterService 閫昏緫淇涓庢柊鏂规硶璁捐
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:writing-plans to create implementation plan.
-
-**Goal:** 淇 `RouterService` 涓凡鍙戠幇鐨勯�昏緫閿欒锛屾柊澧� 5 涓矾鐢辨煡璇�/绠$悊鏂规硶锛屽苟鏇存柊鎺ュ彛灞傘��
-
-**Architecture:** 鍦ㄧ幇鏈� `RouterService` 鍩虹涓婃柊澧炵紦瀛樼鐞嗘柟娉曞拰璺敱鏌ヨ澧炲己鏂规硶锛屼繚鎸佺幇鏈夌紦瀛樻灦鏋勪笉鍙樸��
-
-**Tech Stack:** ASP.NET Core 6.0, HybridCacheService, SqlSugar ORM
-
----
-
-## 涓�銆佺幇鏈夐�昏緫闂淇
-
-### 1.1 AddRouters 缂撳瓨涓�鑷存��
-
-**闂**锛歚BaseDal.AddData` 鍜� `_cacheService.AddOrUpdate` 涔嬮棿鏃犱繚鎶ゃ�傚鏋� `AddOrUpdate` 鎶涘紓甯革紝DB 宸插啓鍏ヤ絾缂撳瓨鏈洿鏂帮紝涓嬫鏌ヨ璇诲埌鏃ф暟鎹��
-
-**淇**锛氫娇鐢� try-finally 閫昏緫锛屼繚璇� DB 鍐欏叆鍚庡啀鏇存柊缂撳瓨銆傚鏋滅紦瀛樻洿鏂板け璐ワ紝涓嬫鏌ヨ浼氫粠 DB 鑷姩閲嶅缓缂撳瓨锛坄GetOrAdd` 鎳掑姞杞戒繚璇侊級銆�
-
-### 1.2 QueryAllPositions 绌� catch 鍧�
-
-**闂**锛歝atch 鍧椾粎鏈夋敞閲婏紝鏃犲疄闄呮棩蹇楄褰曘�傚紓甯歌闈欓粯鍚炴帀锛岃皟鐢ㄦ柟鏃犳硶鍖哄垎"娌℃湁鏁版嵁"鍜�"鏌ヨ澶辫触"銆�
-
-**淇**锛氬鍔� `ConsoleHelper.WriteErrorLine` 璁板綍閿欒銆�
-
-### 1.3 鎺ュ彛灞� public 淇グ绗�
-
-**闂**锛歚IRouterService` 涓殑鏂规硶绛惧悕鏈夊浣欑殑 `public` 淇グ绗︺��
-
-**淇**锛氱Щ闄ゆ帴鍙f柟娉曚笂鐨� `public` 淇グ绗︺��
-
----
-
-## 浜屻�佹柊澧炴柟娉曡璁�
-
-### 2.1 ClearRouterCache()
-
-娓呴櫎 `Router:AllRouters:In` 鍜� `Router:AllRouters:Out` 涓や釜缂撳瓨閿��
-
-**绛惧悕**锛歚void ClearRouterCache()`
-**瀹炵幇**锛�
-```csharp
-_cacheService.Remove("Router:AllRouters:In");
-_cacheService.Remove("Router:AllRouters:Out");
-```
-
-### 2.2 QueryRoutersByDeviceCode(string deviceCode)
-
-鏌ヨ缁忚繃鎸囧畾璁惧鐨勬墍鏈夎矾鐢憋紙鍚堝苟鍏ュ彛/鍑哄彛绫诲瀷锛夈��
-
-**绛惧悕**锛歚List<Dt_Router> QueryRoutersByDeviceCode(string deviceCode)`
-**閫昏緫**锛氫粠缂撳瓨鍔犺浇 In + Out 璺敱锛岀瓫閫� `ChildPosiDeviceCode == deviceCode` 鐨勮矾鐢便��
-**缂撳瓨**锛氫笉鐙崰缂撳瓨锛岀洿鎺ヤ娇鐢ㄧ幇鏈� `GetAllRoutersFromCache` 鑾峰彇鏁版嵁銆�
-
-### 2.3 ExistsRouter锛堜袱涓噸杞斤級
-
-鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪璺敱銆�
-
-**绛惧悕**锛�
-- `bool ExistsRouter(string startPosi, string endPosi)` 鈥� 鍏ㄧ被鍨�
-- `bool ExistsRouter(string startPosi, string endPosi, int routeType)` 鈥� 鎸囧畾绫诲瀷
-
-**閫昏緫**锛氳皟鐢� `FindRoutesInMemory`锛岃繑鍥� `routers.Count > 0`銆�
-
-### 2.4 GetRouterCount锛堜袱涓噸杞斤級
-
-杩斿洖璺敱鏁伴噺銆�
-
-**绛惧悕**锛�
-- `int GetRouterCount()` 鈥� 鍚堝苟 In + Out 鎬绘暟
-- `int GetRouterCount(int routeType)` 鈥� 鎸囧畾绫诲瀷鏁伴噺
-
-**瀹炵幇**锛氫粠缂撳瓨鑾峰彇鍚� `.Count`銆�
-
-### 2.5 DeleteRouters(List<long> routerIds)
-
-鎵归噺鍒犻櫎鎸囧畾 ID 鐨勮矾鐢憋紝鍒犻櫎鍚庡悓姝ユ竻闄ゅ搴旂被鍨嬬紦瀛樸��
-
-**绛惧悕**锛歚WebResponseContent DeleteRouters(List<long> routerIds)`
-**閫昏緫**锛�
-1. 鏌ュ嚭寰呭垹闄よ矾鐢卞悇鑷殑 `InOutType`
-2. `BaseDal.DeleteData` 鎵归噺鍒犻櫎
-3. 鏍规嵁娑夊強鐨� `InOutType` 娓呴櫎瀵瑰簲缂撳瓨閿�
-4. 杩斿洖 `WebResponseContent`
-
----
-
-## 涓夈�佹秹鍙婃枃浠�
-
-| 鏂囦欢 | 鏀瑰姩 |
-|------|------|
-| `WIDESEAWCS_QuartzJob/Service/RouterService.cs` | 淇閫昏緫 + 鏂板鏂规硶瀹炵幇 |
-| `WIDESEAWCS_QuartzJob/Service/IRouterService.cs` | 鎺ュ彛鏂板鏂规硶绛惧悕锛屽幓鎺夊浣� `public` |
-
----
-
-## 鍥涖�佺紦瀛橀敭姹囨��
-
-| 閿� | 鐢ㄩ�� |
-|----|------|
-| `Router:AllRouters:In` | 鍏ュ彛绫诲瀷鍏ㄩ噺璺敱 |
-| `Router:AllRouters:Out` | 鍑哄彛绫诲瀷鍏ㄩ噺璺敱 |
-| `System:DevicePositions:{deviceCode}` | `QueryAllPositions` 宸叉湁缂撳瓨锛屼笉鍦ㄦ湰鏂规鑼冨洿鍐� |
diff --git "a/Code/WCS/docs\050superpowers\051/specs/2026-03-27-task-logging-design.md" "b/Code/WCS/docs\050superpowers\051/specs/2026-03-27-task-logging-design.md"
deleted file mode 100644
index 06d9025..0000000
--- "a/Code/WCS/docs\050superpowers\051/specs/2026-03-27-task-logging-design.md"
+++ /dev/null
@@ -1,167 +0,0 @@
-# 浠诲姟鏃ュ織澧炲己璁捐鏂囨。
-
-## 姒傝堪
-
-涓� `RobotJob`銆乣ConveyorLineNewJob`銆乣StackerCraneJob` 涓変釜妯″潡娣诲姞瀹屽杽鐨勬棩蹇楄褰曞姛鑳姐��
-
-## 鏃ュ織瑙勮寖
-
-### 鏃ュ織绾у埆瀹氫箟锛堜弗鏍兼寜璇箟锛�
-
-| 绾у埆 | 鐢ㄩ�� | 绀轰緥鍦烘櫙 |
-|------|------|----------|
-| `Info` | 姝e父娴佺▼鑺傜偣 | 浠诲姟寮�濮嬪鐞嗐�佸懡浠や笅鍙戞垚鍔熴�佺姸鎬佽浆鎹㈠畬鎴� |
-| `Warn` | 闇�瑕佸叧娉ㄤ絾闈為敊璇� | 瀹㈡埛绔柇杩為噸璇曘�佺珯鍙颁笉鍙敤銆佺増鏈啿绐� |
-| `Error` | 寮傚父/澶辫触 | WMS 璋冪敤澶辫触銆佸懡浠ゅ彂閫佸け璐ャ�佷换鍔℃煡璇㈠け璐� |
-| `Debug` | 璇︾粏淇℃伅 | 杞鎿嶄綔銆佺紦瀛樿鍙栵紙鍙�夛級 |
-
-### 鏃ュ織杈撳嚭鏂瑰紡
-
-1. **ILogger<T>** - 閫氳繃渚濊禆娉ㄥ叆鎴栫埗绫讳紶閫�
-2. **QuartzLogger** - 寮傛鏂囦欢鏃ュ織锛屽悓鏃惰褰�
-
-```csharp
-// 鏍囧噯鏃ュ織鍐欐硶
-_logger.LogInformation("娑堟伅鍐呭");
-QuartzLogger.Info("娑堟伅鍐呭", source);
-```
-
-## 淇敼娓呭崟
-
-### RobotJob 妯″潡
-
-#### RobotJob.cs
-- 鐘舵�侊細宸叉湁 ILogger锛屾棤闇�淇敼
-
-#### RobotClientManager.cs
-- 娣诲姞 `ILogger<RobotClientManager>`
-- 淇鏂繛鏃ュ織锛歐arn 鈫� Info锛堝鎴风鏂紑鏄甯告祦绋嬶級
-- 娣诲姞 EnsureClientSubscribed 涓殑閲嶈瘯/涓嶅彲鐢ㄦ棩蹇�
-
-#### RobotTaskProcessor.cs
-- 娣诲姞 `ILogger<RobotTaskProcessor>`
-- 淇 SendSocketRobotPickAsync锛欵rror 鈫� Info锛堟垚鍔熶笅鍙戝簲璁板綍 Info锛�
-- 娣诲姞 HandleInboundTaskAsync 鐨� WMS 璋冪敤缁撴灉鏃ュ織
-
-#### RobotStateManager.cs
-- 娣诲姞 `ILogger<RobotStateManager>`
-- 鏋勯�犲嚱鏁扮殑 GetOrCreateState 娣诲姞 Info 鏃ュ織
-- TryUpdateStateSafely 娣诲姞鐗堟湰鍐茬獊 Warn 鏃ュ織
-
-#### RobotMessageHandler.cs
-- 宸叉湁 ILogger锛屽凡鏈夎壇濂芥棩蹇楋紝淇濇寔涓嶅彉
-
-#### RobotWorkflowOrchestrator.cs
-- 娣诲姞 `ILogger<RobotWorkflowOrchestrator>`
-- ExecuteAsync 娣诲姞鐘舵�佹満鍐崇瓥鏃ュ織锛堟弧瓒虫潯浠舵椂璁板綍 Info锛�
-- HandlePickFinishedStateAsync 娣诲姞鏀捐揣鎸囦护涓嬪彂鏃ュ織
-- HandlePutFinishedStateAsync 娣诲姞鍙栬揣鎸囦护涓嬪彂鏃ュ織
-
-### ConveyorLineNewJob 妯″潡
-
-#### CommonConveyorLineNewJob.cs
-- 娣诲姞 `ILogger<CommonConveyorLineNewJob>`
-- Execute 鏂规硶锛�
- - 瀛愯澶囨暟閲忎负 0锛欼nfo
- - Parallel.For 寮�濮嬶細Debug
- - 鍛戒护涓虹┖璺宠繃锛欴ebug
- - WCS_ACK 澶勭悊锛欴ebug
- - 妫�鏌ユ墭鐩樹綅缃細Info
- - PLC_STB 妫�鏌ワ細Debug
- - 鏃犳潯鐮佽姹傚嚭搴擄細Info
- - 鏈変换鍔″彿澶勭悊浠诲姟锛欼nfo
- - 寮傚父鎹曡幏锛欵rror
-- ProcessTaskState 鏂规硶锛氭坊鍔犲悇鐘舵�佸垎鏀殑鍏ュ彛鏃ュ織
-
-#### ConveyorLineDispatchHandler.cs
-- 娣诲姞 `ILogger<ConveyorLineDispatchHandler>`
-- HeartBeat锛欴ebug
-- RequestInbound锛欼nfo锛堝叆搴撹姹傚紑濮嬶級
-- RequestInNextAddress锛欼nfo锛堝叆搴撲笅涓�鍦板潃锛�
-- ConveyorLineInFinish锛欼nfo锛堝叆搴撳畬鎴愶級
-- RequestOutbound锛欼nfo锛堝嚭搴撹姹傦級
-- RequestOutNextAddress锛欼nfo锛堝嚭搴撲笅涓�鍦板潃锛�
-- ConveyorLineOutFinish锛欼nfo锛堝嚭搴撳畬鎴愶級
-
-#### ConveyorLineTaskFilter.cs
-- 娣诲姞 `ILogger<ConveyorLineTaskFilter>`
-- QueryPendingTask锛欴ebug
-- QueryExecutingTask锛欴ebug
-- RequestWmsTask锛欼nfo锛圵MS 璇锋眰锛�
-
-#### ConveyorLineTargetAddressSelector.cs
-- 娣诲姞 `ILogger<ConveyorLineTargetAddressSelector>`
-- HandleInboundNextAddress锛欴ebug
-- HandleOutboundNextAddress锛欴ebug
-- HandleDeviceRequest锛欴ebug
-- ProcessDeviceRequest锛欴ebug
-
-### StackerCraneJob 妯″潡
-
-#### CommonStackerCraneJob.cs
-- 娣诲姞 `ILogger<CommonStackerCraneJob>`
-- Execute 鏂规硶锛�
- - 鍙傛暟鏃犳晥锛歐arn
- - 浜嬩欢璁㈤槄锛欼nfo
- - 浠诲姟瀹屾垚妫�鏌ワ細Debug
- - 涓嶅彲鍙戦�佷换鍔★細Debug
- - 浠诲姟閫夋嫨缁撴灉锛欼nfo锛堥�変腑浠诲姟鍙锋垨鏃犱换鍔★級
- - 鍛戒护鏋勫缓缁撴灉锛欼nfo
- - 鍛戒护鍙戦�佺粨鏋滐細Info
- - 寮傚父鎹曡幏锛欵rror
-- CommonStackerCrane_StackerCraneTaskCompletedEventHandler锛欼nfo
-- LoadConfig 澶辫触锛歐arn
-
-#### StackerCraneTaskSelector.cs
-- 娣诲姞 `ILogger<StackerCraneTaskSelector>`
-- SelectTask锛欼nfo锛堜换鍔¢�夋嫨寮�濮嬨�侀�夋嫨缁撴灉锛�
-- TrySelectOutboundTask锛欴ebug
-- IsOutTaskStationAvailable锛欼nfo锛堢珯鍙板彲鐢�/涓嶅彲鐢級
-- TryAddTaskFromWms锛欼nfo
-
-#### StackerCraneCommandBuilder.cs
-- 娣诲姞 `ILogger<StackerCraneCommandBuilder>`
-- ConvertToStackerCraneTaskCommand锛欼nfo锛堝懡浠ょ被鍨嬨�佷换鍔″彿锛�
-- GetCommandType锛欴ebug
-- BuildInboundCommand锛欼nfo锛堝叆搴撳懡浠ゆ瀯寤猴級
-- BuildOutboundCommand锛欼nfo锛堝嚭搴撳懡浠ゆ瀯寤猴級
-- BuildRelocationCommand锛欼nfo锛堢Щ搴撳懡浠ゆ瀯寤猴級
-- 鍦板潃瑙f瀽澶辫触锛欵rror
-
-## ILogger 渚濊禆浼犻�掓柟妗�
-
-瀵逛簬閫氳繃 `new` 鐩存帴瀹炰緥鍖栫殑杈呭姪绫伙紝閫氳繃鐖剁被鏋勯�犲嚱鏁颁紶鍏� ILogger锛�
-
-```csharp
-// 杈呭姪绫绘帴鏀� ILogger
-public class RobotStateManager
-{
- private readonly ILogger _logger;
- public RobotStateManager(ICacheService cache, ILogger<RobotStateManager> logger)
- {
- _logger = logger;
- }
-}
-
-// Job 鍦ㄥ垱寤鸿緟鍔╃被鏃朵紶鍏ヨ嚜宸辩殑 logger
-public RobotJob(..., ILogger<RobotJob> logger)
-{
- _stateManager = new RobotStateManager(cache, logger);
-}
-```
-
-## 闇�淇鐨勬棩蹇楄涔夐棶棰�
-
-| 浣嶇疆 | 鍘熷啓娉� | 淇鍚� |
-|------|--------|--------|
-| RobotTaskProcessor.SendSocketRobotPickAsync | QuartzLogger.Error (鎴愬姛鏃�) | QuartzLogger.Info |
-| RobotClientManager.EnsureClientSubscribed | QuartzLogger.Info (寮傚父鏃�) | QuartzLogger.Error |
-| RobotClientManager.OnRobotReceived | QuartzLogger.Warn (鏂繛) | QuartzLogger.Info |
-
-## 楠屾敹鏍囧噯
-
-1. 鎵�鏈夊叧閿笟鍔¤妭鐐规湁 Info 鏃ュ織
-2. 寮傚父鎯呭喌鏈� Error 鏃ュ織骞跺寘鍚紓甯镐俊鎭�
-3. 闇�瑕佸叧娉ㄧ殑鎯呭喌鏈� Warn 鏃ュ織
-4. 鏃ュ織鍚屾椂杈撳嚭鍒� ILogger 鍜� QuartzLogger
-5. 鏃ュ織娑堟伅娓呮櫚锛屽寘鍚叧閿笂涓嬫枃锛堝浠诲姟鍙枫�佽澶囩紪鐮侊級
diff --git a/Code/WMS/.claude/settings.local.json b/Code/WMS/.claude/settings.local.json
deleted file mode 100644
index 783fdf1..0000000
--- a/Code/WMS/.claude/settings.local.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "permissions": {
- "allow": [
- "Bash(git:*)",
- "Bash(dotnet build:*)"
- ]
- }
-}
diff --git a/Code/WMS/.omc/state/agent-replay-4cd1f4b9-ad6a-4b8f-8a01-8260579d1f66.jsonl b/Code/WMS/.omc/state/agent-replay-4cd1f4b9-ad6a-4b8f-8a01-8260579d1f66.jsonl
deleted file mode 100644
index 638b15d..0000000
--- a/Code/WMS/.omc/state/agent-replay-4cd1f4b9-ad6a-4b8f-8a01-8260579d1f66.jsonl
+++ /dev/null
@@ -1,2 +0,0 @@
-{"t":0,"agent":"a1dd170","agent_type":"unknown","event":"agent_stop","success":true}
-{"t":0,"agent":"a5ca246","agent_type":"unknown","event":"agent_stop","success":true}
diff --git a/Code/WMS/.omc/state/idle-notif-cooldown.json b/Code/WMS/.omc/state/idle-notif-cooldown.json
deleted file mode 100644
index 20c6478..0000000
--- a/Code/WMS/.omc/state/idle-notif-cooldown.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "lastSentAt": "2026-03-24T02:40:56.392Z"
-}
\ No newline at end of file
diff --git a/Code/WMS/.omc/state/subagent-tracking.json b/Code/WMS/.omc/state/subagent-tracking.json
deleted file mode 100644
index a44828a..0000000
--- a/Code/WMS/.omc/state/subagent-tracking.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "agents": [],
- "total_spawned": 0,
- "total_completed": 0,
- "total_failed": 0,
- "last_updated": "2026-03-24T02:41:20.073Z"
-}
\ No newline at end of file
diff --git a/Code/WMS/AGENTS.md b/Code/WMS/AGENTS.md
deleted file mode 100644
index 5497ed3..0000000
--- a/Code/WMS/AGENTS.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# Repository Guidelines
-
-## 项目结构与模块组织
-仓库由两个主项目组成:
-- `WIDESEA_WMSServer/`:ASP.NET Core 后端(解决方案:`WIDESEA_WMSServer.sln`)。
-- `WIDESEA_WMSClient/`:Vue 3 前端(Vite + Yarn)。
-
-后端按职责拆分:`WIDESEA_WMSServer/`(API 启动项目)、`WIDESEA_Core/`(基础设施/基类能力)、`WIDESEA_Model/`(实体模型)、`WIDESEA_DTO/`(数据传输对象)、`WIDESEA_I*Service/`(服务接口)、`WIDESEA_*Service/`(服务实现)。前端源码位于 `WIDESEA_WMSClient/src/`,单元测试位于 `WIDESEA_WMSClient/tests/unit/`。
-
-## 构建、测试与开发命令
-后端(在 `WIDESEA_WMSServer` 目录执行):
-- `dotnet restore WIDESEA_WMSServer.sln`:还原 NuGet 依赖。
-- `dotnet build WIDESEA_WMSServer.sln`:构建全部后端项目。
-- `dotnet run --project WIDESEA_WMSServer/WIDESEA_WMSServer.csproj`:本地启动 API。
-
-前端(在 `WIDESEA_WMSClient` 目录执行):
-- `npm install`:安装依赖。
-- `npm run serve`:启动本地开发服务(Vite)。
-- `npm run build`:构建生产资源。
-- `npm run lint`:执行 ESLint 检查。
-
-## 开发流程强制规范
-
-- 所有任务必须在 `Code/WMS/.worktrees/<task-name>` 独立 worktree 中开发,不直接在主工作区改动。
-- 分支命名统一:`feat/<模块>-<主题>`、`fix/<模块>-<问题>`、`refactor/<模块>-<主题>`、`docs/<主题>`。
-- 每次提交前至少执行与改动相关的最小验证(前端改动跑 `npm run lint`;后端改动跑 `dotnet test` 或最小可运行验证)。
-- 禁止一次提交混入无关重构、格式化噪声或大面积文件移动。
-
-## 代码风格与命名约定
-
-前端使用 Vue Standard ESLint 规则,缩进为 4 空格(见 `package.json`)。Vue 组件采用 PascalCase;扩展配置建议放在 `src/extension/{domain}/{entity}.js`。
-
-后端遵循现有分层与命名:`I{Entity}Service`(接口)、`{Entity}Service`(实现)、`{Entity}Controller`(控制器)。新增代码应保持与现有 Autofac 注册、基础 Controller/Service 模式一致。
-
-默认要求:对新增或修改的代码添加详细中文注释,至少包含方法目的、参数含义、返回值、关键逻辑步骤和异常处理说明。
-
-注释要求可读、可维护,禁止“重复代码字面意思”的无效注释。
-
-## 数据一致性与事务规范
-
-- 同一业务操作涉及多个数据对象(多表、多仓储、跨服务写入)同时改动时,必须使用数据库事务(Transaction)保证原子性。
-- 事务范围只覆盖必要写操作,禁止将长耗时 IO/网络调用放入事务内,避免长事务锁表。
-- 发生异常时必须回滚事务,并记录事务上下文(业务单号、关键主键、调用链标识)。
-- 若涉及分布式或跨边界写入,需在 PR 中明确一致性策略(补偿、重试、幂等键)。
-
-## 接口、日志与异常规范
-
-- API 返回结构保持统一,字段命名与现有后端序列化策略一致,避免随意变更响应字段。
-- Service 层抛出的业务异常需包含可定位上下文(任务号、设备号、关键参数)。
-- 日志级别规范:调试细节用 `Debug`,业务关键路径用 `Information`,可恢复异常用 `Warning`,不可恢复错误用 `Error`。
-- 严禁吞异常;捕获后必须记录上下文并决定重抛或转换为业务错误。
-- 涉及外部系统调用、IO、网络通信、设备通信、数据库访问的关键路径必须使用 `try-catch`;`catch` 中至少记录错误信息与关键参数,并保留原始堆栈(`throw;`),禁止仅 `throw ex;`。
-
-## 测试指南
-
-前端测试采用 Vue 单元测试(`tests/unit/*.spec.js`)。涉及 UI 逻辑或接口交互变更时,应补充或更新测试,并执行 `yarn test:unit`。
-
-当前解决方案中未包含独立后端测试项目。后端改动至少需完成构建与关键 API 手工验证;复杂业务逻辑建议新增测试项目(如 xUnit)并纳入解决方案。
-
-## 提交与合并请求规范
-最近提交普遍采用 Conventional Commit 前缀:`feat:`、`fix:`、`refactor:`、`docs:`、`chore:`(中文描述)。建议一次提交聚焦一个明确改动点。
-
-PR 建议包含:
-- 变更目的与业务影响说明;
-- 涉及模块与目录范围(前端/后端);
-- 验证证据(已执行命令与结果);
-- UI 变更截图或录屏;
-- 关联任务或问题编号(如有)。
diff --git a/Code/WMS/CLAUDE.md b/Code/WMS/CLAUDE.md
deleted file mode 100644
index 7208508..0000000
--- a/Code/WMS/CLAUDE.md
+++ /dev/null
@@ -1,187 +0,0 @@
-# CLAUDE.md
-
-姝ゆ枃浠朵负 Claude Code (claude.ai/code) 鎻愪緵鍦ㄦ浠g爜搴撲腑宸ヤ綔鐨勬寚瀵笺��
-
-## 椤圭洰姒傝堪
-
-杩欐槸涓�涓� WMS锛堜粨搴撶鐞嗙郴缁燂級锛屽悗绔噰鐢� ASP.NET Core 6.0锛屽墠绔噰鐢� Vue 3銆傜郴缁熺鐞嗕粨搴撹繍钀ワ紝鍖呮嫭鍏ュ簱銆佸嚭搴撱�佸簱瀛樸�佷换鍔″拰鍩虹涓绘暟鎹��
-
-```
-WMS/
-鈹溾攢鈹� WIDESEA_WMSServer/ # 鍚庣 (ASP.NET Core 6.0)
-鈹� 鈹溾攢鈹� WIDESEA_WMSServer/ # 涓� API 椤圭洰
-鈹� 鈹溾攢鈹� WIDESEA_Core/ # 鏍稿績妗嗘灦锛堝熀纭�鎺у埗鍣ㄣ�佹湇鍔°�佷粨鍌級
-鈹� 鈹溾攢鈹� WIDESEA_Model/ # 鎸夐鍩熺粍缁囩殑鏁版嵁妯″瀷
-鈹� 鈹溾攢鈹� WIDESEA_*Service/ # 鏈嶅姟瀹炵幇锛圔asic銆両nbound銆丱utbound銆丼tock 绛夛級
-鈹� 鈹溾攢鈹� WIDESEA_I*Service/ # 鏈嶅姟鎺ュ彛
-鈹� 鈹溾攢鈹� WIDESEA_DTO/ # 鏁版嵁浼犺緭瀵硅薄
-鈹� 鈹斺攢鈹� WIDESEA_Common/ # 鍏叡宸ュ叿绫�
-鈹斺攢鈹� WIDESEA_WMSClient/ # 鍓嶇 (Vue 3 + Vite)
- 鈹溾攢鈹� src/api/ # HTTP 瀹㈡埛绔拰 API 璋冪敤
- 鈹溾攢鈹� src/components/basic/ # 鍙鐢ㄧ粍浠讹紙ViewGrid銆乂olForm銆乂olTable锛�
- 鈹溾攢鈹� src/extension/ # 涓庡悗绔尮閰嶇殑棰嗗煙鐗瑰畾閰嶇疆
- 鈹溾攢鈹� src/views/ # Vue 椤甸潰缁勪欢
- 鈹溾攢鈹� src/router/ # Vue Router 閰嶇疆
- 鈹斺攢鈹� src/store/ # Vuex 鐘舵�佺鐞�
-```
-
-## 寮�鍙戝懡浠�
-
-### 鍚庣 (ASP.NET Core)
-```bash
-# 鏋勫缓瑙e喅鏂规
-cd WIDESEA_WMSServer
-dotnet build WIDESEA_WMSServer.sln
-
-# 杩愯鏈嶅姟鍣紙榛樿绔彛锛�9291锛�
-cd WIDESEA_WMSServer/WIDESEA_WMSServer
-dotnet run
-
-# 杩樺師鍖�
-dotnet restore
-
-# 浣跨敤鐗瑰畾閰嶇疆杩愯
-dotnet run --configuration Release
-```
-
-### 鍓嶇 (Vue 3 + Vite)
-```bash
-cd WIDESEA_WMSClient
-
-# 瀹夎渚濊禆锛堜娇鐢� yarn锛�
-yarn install
-
-# 寮�鍙戞湇鍔″櫒锛堢鍙� 8080锛�
-yarn dev
-
-# 鐢熶骇鏋勫缓
-yarn build
-
-# 棰勮鐢熶骇鏋勫缓
-yarn preview
-
-# 杩愯鍗曞厓娴嬭瘯
-yarn test:unit
-
-# 浠g爜妫�鏌�
-yarn lint
-```
-
-## 鏋舵瀯
-
-### 鍚庣鏋舵瀯
-
-**閲囩敤娓呮磥鏋舵瀯鍘熷垯鐨勫垎灞傛灦鏋勶細**
-
-- **鎺у埗鍣�** (`WIDESEA_WMSServer/Controllers/`)锛氱户鎵胯嚜 `ApiBaseController<TService, TEntity>`锛岃嚜鍔ㄦ彁渚� CRUD 绔偣銆傞鍩熺壒瀹氭帶鍒跺櫒鎸夋枃浠跺す缁勭粐锛圔asic銆両nbound銆丱utbound銆丼tock銆丼ystem銆乀askInfo 绛夛級銆�
-
-- **鏈嶅姟灞�** (`WIDESEA_*Service/`)锛氫笟鍔¢�昏緫灞傘�傛湇鍔$户鎵胯嚜 `ServiceBase<T, TEntity>` 骞跺疄鐜� `WIDESEA_I*Service/` 涓殑棰嗗煙鎺ュ彛銆傞�氳繃 Autofac DI 娉ㄥ唽銆�
-
-- **浠撳偍灞�** (`WIDESEA_Core/BaseRepository/`)锛氫娇鐢� SqlSugar ORM 鐨勬暟鎹闂眰銆傛硾鍨� `IRepository<T>` 鍜� `RepositoryBase<T>` 鎻愪緵閫氱敤 CRUD 鎿嶄綔銆�
-
-- **妯″瀷** (`WIDESEA_Model/Models/`)锛氭寜棰嗗煙缁勭粐锛圔asic銆丆heck銆両nbound銆丱utbound銆丼tock銆丼ystem銆乀askInfo銆丷ecord銆丆onfig銆丄pprovalFlow锛夈�傛ā鍨嬬户鎵胯嚜 `BaseEntity` 鎴� `BaseWarehouseEntity`銆�
-
-- **DTO** (`WIDESEA_DTO/`)锛欰PI 璇锋眰/鍝嶅簲鐨勬暟鎹紶杈撳璞★紝鎸夐鍩熺粍缁囥��
-
-**鍏抽敭鍩虹璁炬柦缁勪欢锛�**
-- `WIDESEA_Core/BaseController/ApiBaseController.cs`锛氬叿鏈夎嚜鍔� CRUD 璺敱鐨勫熀纭�鎺у埗鍣�
-- `WIDESEA_Core/BaseServices/IService.cs`锛氬熀纭�鏈嶅姟鎺ュ彛
-- `WIDESEA_Core/Extensions/AutofacModuleRegister.cs`锛欰utofac DI 娉ㄥ唽
-- `WIDESEA_Core/DB/`锛歋qlSugar 鏁版嵁搴撻厤缃�
-- `WIDESEA_Core/Authorization/`锛欽WT 韬唤楠岃瘉
-- `WIDESEA_Core/Filter/`锛氬叏灞�寮傚父澶勭悊鍜屾搷浣滆繃婊ゅ櫒
-
-### 鍓嶇鏋舵瀯
-
-**甯︽湁鑷畾涔夌粍浠舵鏋剁殑 Vue 3 缁勫悎寮� API锛�**
-
-- **ViewGrid 缁勪欢** (`src/components/basic/ViewGrid/`)锛氭牳蹇冭〃鏍�/缃戞牸缁勪欢锛屽鐞嗘暟鎹樉绀恒�佸垎椤点�佹悳绱㈠拰 CRUD 鎿嶄綔銆傞�氳繃鎵╁睍鏂囦欢楂樺害鍙厤缃��
-
-- **鎵╁睍鏂囦欢** (`src/extension/`)锛氶厤缃瘡涓疄浣撶殑 ViewGrid 琛屼负鐨� JavaScript 鏂囦欢銆傚畠浠畾涔夎〃鏍煎垪銆佽〃鍗曞瓧娈点�佹悳绱㈡潯浠跺拰鑷畾涔夋搷浣溿�傛ā寮忥細`src/extension/{domain}/{entityName}.js` 鍖归厤鍚庣鎺у埗鍣ㄣ��
-
-- **API 灞�** (`src/api/`)锛氬皝瑁� Axios 鐨� HTTP 瀹㈡埛绔紝鍏锋湁韬唤楠岃瘉鍜岄敊璇鐞嗘嫤鎴櫒銆�
-
-- **璺敱鍣�** (`src/router/index.js`)锛氬甫鏈夊搱甯屾ā寮忋�佽韩浠介獙璇佸畧鍗拰浠� `viewGird.js` 鍔ㄦ�佽矾鐢卞姞杞界殑 Vue Router銆�
-
-**鍏抽敭鍓嶇妯″紡锛�**
-- 鎵╁睍鏂囦欢锛堝 `src/extension/basic/materielInfo.js`锛夊畾涔夎〃澶淬�佽〃鍗曞瓧娈靛拰鑷畾涔変笟鍔¢�昏緫
-- `src/views/` 涓殑瑙嗗浘寰堢簿绠�锛屽ぇ澶氫娇鐢ㄧ敱鎵╁睍閰嶇疆鐨� ViewGrid 缁勪欢
-- Vuex 瀛樺偍绠$悊韬唤楠岃瘉鐘舵�佸拰鍔犺浇鎸囩ず鍣�
-
-## 閰嶇疆
-
-### 鍚庣閰嶇疆
-
-`WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json` 涓殑鍏抽敭璁剧疆锛�
-- `urls`锛氭湇鍔″櫒绔彛锛堥粯璁わ細`http://*:9291`锛�
-- `ConnectionString`锛歋QL Server 鏁版嵁搴撹繛鎺�
-- `MainDB`锛氫富鏁版嵁搴撳悕绉�
-- `Cors`锛氬墠绔簮澶寸殑 CORS 绛栫暐
-- `WebSocketPort`锛氬疄鏃舵洿鏂扮殑 WebSocket 绔彛锛堥粯璁わ細9296锛�
-- `AutoOutboundTask`锛氳嚜鍔ㄥ嚭搴撴搷浣滅殑鍚庡彴浠诲姟閰嶇疆
-
-### 鍓嶇閰嶇疆
-
-- `vite.config.js`锛歏ite 鏋勫缓閰嶇疆锛宍@` 鍒悕鎸囧悜 `src/`
-- 鏈嶅姟鍣ㄩ粯璁よ繍琛屽湪绔彛 8080
-- 鍩轰簬鍝堝笇鐨勮矾鐢憋紙`createWebHashHistory`锛�
-
-## 浠g爜绾﹀畾
-
-### 鍚庣
-
-1. **鍛藉悕瑙勮寖**锛�
- - 鎺у埗鍣細`{Entity}Controller.cs`
- - 鏈嶅姟锛歚{Entity}Service.cs`锛堝疄鐜� `I{Entity}Service`锛�
- - 妯″瀷锛歚Dt_{EntityName}.cs`锛堟暟鎹簱瀹炰綋浣跨敤 `Dt_` 鍓嶇紑锛�
- - API 璺敱锛歚api/{ControllerName}`
-
-2. **鏈嶅姟娉ㄥ唽**锛氬疄鐜� `IDependency` 鐨勬湇鍔′細閫氳繃 Autofac 浠庢墍鏈夐」鐩▼搴忛泦涓嚜鍔ㄦ敞鍐屻��
-
-3. **鎺у埗鍣ㄦā寮�**锛氬ぇ澶氭暟鎺у埗鍣ㄧ户鎵胯嚜 `ApiBaseController<TService, TEntity>`锛屽彧闇�瑕佹瀯閫犲嚱鏁般�傛牴鎹渶瑕佹坊鍔犺嚜瀹氫箟鎿嶄綔銆�
-
-4. **鍝嶅簲鏍煎紡**锛歚WebResponseContent` 鍖呰鍣紝鍖呭惈 `Status`锛堝竷灏斿�硷級鍜� `Data` 灞炴�с��
-
-### 鍓嶇
-
-1. **鎵╁睍鏂囦欢妯″紡**锛氬浜庢瘡涓悗绔疄浣擄紝鍦� `src/extension/{domain}/{entity}.js` 鍒涘缓鎵╁睍鏂囦欢锛屽寘鍚細
- - 琛ㄦ牸鍒楀畾涔�
- - 琛ㄥ崟瀛楁閰嶇疆
- - 鑷畾涔� URL 妯″紡
- - 涓氬姟閫昏緫閽╁瓙
-
-2. **缁勪欢鍛藉悕**锛歏ue 缁勪欢浣跨敤 PascalCase锛屽敖鍙兘鍖归厤鍚庣瀹炰綋鍚嶇О銆�
-
-3. **API 璋冪敤**锛氫娇鐢ㄥ叏灞� `this.http` 瀵硅薄杩涜 HTTP 璇锋眰銆�
-
-## 娣诲姞鏂板姛鑳�
-
-### 鍚庣
-1. 鍦� `WIDESEA_Model/Models/{Domain}/` 涓垱寤烘ā鍨�
-2. 鍦� `WIDESEA_I{Domain}Service/` 涓垱寤烘湇鍔℃帴鍙�
-3. 鍦� `WIDESEA_{Domain}Service/` 涓垱寤烘湇鍔″疄鐜�
-4. 鍦� `WIDESEA_WMSServer/Controllers/{Domain}/` 涓垱寤烘帶鍒跺櫒锛岀户鎵胯嚜 `ApiBaseController<TService, TEntity>`
-5. 鏈嶅姟閫氳繃 `IDependency` 鎺ュ彛鑷姩娉ㄥ唽
-
-### 鍓嶇
-1. 鍦� `src/extension/{domain}/{entity}.js` 鍒涘缓鎵╁睍鏂囦欢
-2. 濡傞渶鑷畾涔� UI锛屽湪 `src/views/{domain}/{entity}.vue` 鍒涘缓鍙�夎鍥剧粍浠�
-3. 濡傞渶瑕侊紝娣诲姞璺敱閰嶇疆
-4. ViewGrid 缁勪欢閰嶅悎鎵╁睍閰嶇疆鍙嚜鍔ㄥ鐞嗗ぇ澶氭暟 CRUD 鎿嶄綔
-
-## 鏁版嵁搴�
-
-- **ORM**锛歋qlSugar
-- **鏁版嵁搴�**锛歋QL Server
-- **杩炴帴瀛楃涓�**锛氬湪 `appsettings.json` 涓厤缃�
-- **杩佺Щ**锛氶�氳繃 SqlSugar 鐨� Code First 鏂瑰紡澶勭悊
-
-## 瀹炴椂鍔熻兘
-
-- SignalR 鐢ㄤ簬鏈嶅姟鍣ㄥ拰瀹㈡埛绔箣闂寸殑瀹炴椂鏇存柊
-- WebSocket 鏈嶅姟鍣ㄥ湪鍗曠嫭绔彛锛堝彲鍦� `appsettings.json` 涓厤缃級
-- 鍓嶇 SignalR 瀹㈡埛绔泦鎴愬湪 `src/main.js` 涓�
-
-## API 鏂囨。
-
-杩愯鍚庣鏈嶅姟鍣ㄦ椂鍙敤 Swagger UI锛堟煡鐪� `/swagger` 绔偣锛夈��
diff --git a/Code/WMS/WIDESEA_WMSClient/.omc/project-memory.json b/Code/WMS/WIDESEA_WMSClient/.omc/project-memory.json
deleted file mode 100644
index 2d7870a..0000000
--- a/Code/WMS/WIDESEA_WMSClient/.omc/project-memory.json
+++ /dev/null
@@ -1,185 +0,0 @@
-{
- "version": "1.0.0",
- "lastScanned": 1774489415859,
- "projectRoot": "d:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSClient",
- "techStack": {
- "languages": [
- {
- "name": "JavaScript/TypeScript",
- "version": null,
- "confidence": "high",
- "markers": [
- "package.json"
- ]
- }
- ],
- "frameworks": [
- {
- "name": "vue",
- "version": "3.2.37",
- "category": "frontend"
- },
- {
- "name": "vite",
- "version": "5.0.0",
- "category": "build"
- }
- ],
- "packageManager": "pnpm",
- "runtime": null
- },
- "build": {
- "buildCommand": "pnpm build",
- "testCommand": null,
- "lintCommand": "pnpm lint",
- "devCommand": null,
- "scripts": {
- "serve": "vite",
- "build": "vite build",
- "preview": "vite preview --port 8080",
- "test:unit": "vue-cli-service test:unit",
- "lint": "vue-cli-service lint"
- }
- },
- "conventions": {
- "namingStyle": null,
- "importStyle": null,
- "testPattern": null,
- "fileOrganization": "type-based"
- },
- "structure": {
- "isMonorepo": false,
- "workspaces": [],
- "mainDirectories": [
- "public",
- "src",
- "tests"
- ],
- "gitBranches": {
- "defaultBranch": "master",
- "branchingStrategy": null
- }
- },
- "customNotes": [],
- "directoryMap": {
- "config": {
- "path": "config",
- "purpose": "Configuration files",
- "fileCount": 1,
- "lastAccessed": 1774489415781,
- "keyFiles": [
- "buttons.js"
- ]
- },
- "dist": {
- "path": "dist",
- "purpose": "Distribution/build output",
- "fileCount": 4,
- "lastAccessed": 1774489415782,
- "keyFiles": [
- "index.html",
- "wcslogo.png",
- "webconfig.js",
- "wms_d.png"
- ]
- },
- "public": {
- "path": "public",
- "purpose": "Public files",
- "fileCount": 4,
- "lastAccessed": 1774489415810,
- "keyFiles": [
- "index.html",
- "wcslogo.png",
- "webconfig.js",
- "wms_d.png"
- ]
- },
- "src": {
- "path": "src",
- "purpose": "Source code",
- "fileCount": 2,
- "lastAccessed": 1774489415810,
- "keyFiles": [
- "App.vue",
- "main.js"
- ]
- },
- "tests": {
- "path": "tests",
- "purpose": "Test files",
- "fileCount": 0,
- "lastAccessed": 1774489415811,
- "keyFiles": []
- },
- "dist\\assets": {
- "path": "dist\\assets",
- "purpose": "Static assets",
- "fileCount": 107,
- "lastAccessed": 1774489415814,
- "keyFiles": [
- "401-cNgsEGiV.js",
- "404-CZEj1mZh.js",
- "Audit-C52MvHzW.css"
- ]
- },
- "dist\\static": {
- "path": "dist\\static",
- "purpose": "Static files",
- "fileCount": 1,
- "lastAccessed": 1774489415815,
- "keyFiles": [
- "login_bg.png"
- ]
- },
- "public\\static": {
- "path": "public\\static",
- "purpose": "Static files",
- "fileCount": 1,
- "lastAccessed": 1774489415815,
- "keyFiles": [
- "login_bg.png"
- ]
- },
- "src\\api": {
- "path": "src\\api",
- "purpose": "API routes",
- "fileCount": 3,
- "lastAccessed": 1774489415816,
- "keyFiles": [
- "http.js",
- "permission.js",
- "useTest.js"
- ]
- },
- "src\\assets": {
- "path": "src\\assets",
- "purpose": "Static assets",
- "fileCount": 1,
- "lastAccessed": 1774489415817,
- "keyFiles": [
- "logo.png"
- ]
- },
- "src\\components": {
- "path": "src\\components",
- "purpose": "UI components",
- "fileCount": 0,
- "lastAccessed": 1774489415817,
- "keyFiles": []
- },
- "src\\views": {
- "path": "src\\views",
- "purpose": "View templates",
- "fileCount": 3,
- "lastAccessed": 1774489415818,
- "keyFiles": [
- "Home.vue",
- "Index.vue",
- "Login.vue"
- ]
- }
- },
- "hotPaths": [],
- "userDirectives": []
-}
\ No newline at end of file
diff --git a/Code/WMS/WIDESEA_WMSServer/.claude/settings.local.json b/Code/WMS/WIDESEA_WMSServer/.claude/settings.local.json
deleted file mode 100644
index 6a55688..0000000
--- a/Code/WMS/WIDESEA_WMSServer/.claude/settings.local.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "permissions": {
- "allow": [
- "Bash(claude plugin:*)",
- "Bash(cp:*)",
- "Bash(xargs wc:*)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Common/WIDESEA_Common.csproj --no-incremental 2>&1 | head -50)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Core/WIDESEA_Core.csproj --no-incremental 2>&1 | head -50)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Model/WIDESEA_Model.csproj --no-incremental 2>&1 | head -50)",
- "Bash(find /e/杩呴浄涓嬭浇/WIDESEA_WMSServer -name \"*.cs\" -not -path \"*/bin/*\" -not -path \"*/obj/*\" -not -path \"*/.vs/*\" | xargs grep -l \"console.log\\\\|Console.WriteLine\\\\|debugger\" | head -10)",
- "Bash(find /e/杩呴浄涓嬭浇/WIDESEA_WMSServer -name \"*.cs\" -not -path \"*/bin/*\" -not -path \"*/obj/*\" -not -path \"*/.vs/*\" | xargs grep -h \"catch\\\\s*{\\\\s*}\" | wc -l)",
- "Bash(find /e/杩呴浄涓嬭浇/WIDESEA_WMSServer -name \"*.cs\" -not -path \"*/bin/*\" -not -path \"*/obj/*\" -not -path \"*/.vs/*\" -exec grep -l \"public\\\\s+.*\\\\\\(\\\\\\)\" {} \\\\; | wc -l)",
- "Bash(find /e/杩呴浄涓嬭浇/WIDESEA_WMSServer -name \"*.cs\" -not -path \"*/bin/*\" -not -path \"*/obj/*\" -not -path \"*/.vs/*\" -exec grep -l \"new\\\\s+List\\\\|new\\\\s+Dictionary\" {} \\\\; | wc -l)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_IBasicService/WIDESEA_IBasicService.csproj)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_BasicService/WIDESEA_BasicService.csproj)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_BasicService/WIDESEA_BasicService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Common/WIDESEA_Common.csproj --no-incremental 2>&1)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Core/WIDESEA_Core.csproj --no-incremental 2>&1)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Model/WIDESEA_Model.csproj --no-incremental 2>&1)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Core/WIDESEA_Core.csproj --no-incremental 2>&1 | tail -20)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_IInboundService/WIDESEA_IInboundService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_InboundService/WIDESEA_InboundService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Common/WIDESEA_Common.csproj --no-incremental 2>&1 | grep -E \"\\(閿欒|閿欒|宸叉垚鍔熺敓鎴恷warning\\)\" | tail -10)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_IOutboundService/WIDESEA_IOutboundService.csproj WIDESEA_OutboundService/WIDESEA_OutboundService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Core/WIDESEA_Core.csproj --no-incremental 2>&1 | grep -E \"\\(閿欒|error|宸叉垚鍔熺敓鎴恷warnings\\)\" | tail -10)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_Model/WIDESEA_Model.csproj --no-incremental 2>&1 | grep -E \"\\(閿欒|error|宸叉垚鍔熺敓鎴恷warnings\\)\" | tail -10)",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_OutboundService/WIDESEA_OutboundService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_StockService/WIDESEA_StockService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_ICheckService/WIDESEA_ICheckService.csproj WIDESEA_CheckService/WIDESEA_CheckService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_CheckService/WIDESEA_CheckService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_IRecordRecordService/WIDESEA_IRecordService.csproj WIDESEA_RecordService/WIDESEA_RecordService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_RecordService/WIDESEA_RecordService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:\\\\杩呴浄涓嬭浇\\\\WIDESEA_WMSServer\" && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj 2>&1 | grep -i \"error\")",
- "Bash(cd \"E:/杩呴浄涓嬭浇/WIDESEA_WMSServer/WIDESEA_DTO\" && mv GradingMachine/OutPutDto.cs GradingMachine/OutputDto.cs && mv GradingMachine/InputDto.cs GradingMachine/GradingMachineInputDto.cs)",
- "Bash(cd \"E:/杩呴浄涓嬭浇/WIDESEA_WMSServer\" && dotnet build WIDESEA_WMSServer/WIDESEA_WMSServer.csproj --configuration Debug 2>&1 | head -100)",
- "Bash(cd \"E:/杩呴浄涓嬭浇/WIDESEA_WMSServer\" && dotnet build --configuration Debug 2>&1 | tail -50)",
- "Bash(cd \"E:/杩呴浄涓嬭浇/WIDESEA_WMSServer\" && dotnet build --configuration Debug 2>&1 | tail -30)",
- "Bash(cd \"E:/杩呴浄涓嬭浇/WIDESEA_WMSServer\" && dotnet build --configuration Debug 2>&1 | tail -20)",
- "Bash(cd \"E:/杩呴浄涓嬭浇/WIDESEA_WMSServer\" && dotnet build --configuration Debug 2>&1 | tail -25)",
- "Bash(cd \"E:/杩呴浄涓嬭浇/WIDESEA_WMSServer\" && dotnet build --configuration Debug 2>&1 | grep -A 2 -B 2 \"error CS0\")",
- "Bash(cd \"E:/杩呴浄涓嬭浇/WIDESEA_WMSServer\" && dotnet build --configuration Debug 2>&1 | tail -10)",
- "Bash(dotnet build:*)",
- "Bash(git add:*)",
- "Bash(git commit:*)"
- ]
- }
-}
diff --git a/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/config/applicationhost.config b/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/config/applicationhost.config
deleted file mode 100644
index 269dc55..0000000
--- a/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/config/applicationhost.config
+++ /dev/null
@@ -1,1021 +0,0 @@
-锘�<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- IIS configuration sections.
-
- For schema documentation, see
- %IIS_BIN%\config\schema\IIS_schema.xml.
-
- Please make a backup of this file before making any changes to it.
-
- NOTE: The following environment variables are available to be used
- within this file and are understood by the IIS Express.
-
- %IIS_USER_HOME% - The IIS Express home directory for the user
- %IIS_SITES_HOME% - The default home directory for sites
- %IIS_BIN% - The location of the IIS Express binaries
- %SYSTEMDRIVE% - The drive letter of %IIS_BIN%
-
--->
-
-<configuration>
-
- <!--
-
- The <configSections> section controls the registration of sections.
- Section is the basic unit of deployment, locking, searching and
- containment for configuration settings.
-
- Every section belongs to one section group.
- A section group is a container of logically-related sections.
-
- Sections cannot be nested.
- Section groups may be nested.
-
- <section
- name="" [Required, Collection Key] [XML name of the section]
- allowDefinition="Everywhere" [MachineOnly|MachineToApplication|AppHostOnly|Everywhere] [Level where it can be set]
- overrideModeDefault="Allow" [Allow|Deny] [Default delegation mode]
- allowLocation="true" [true|false] [Allowed in location tags]
- />
-
- The recommended way to unlock sections is by using a location tag:
- <location path="Default Web Site" overrideMode="Allow">
- <system.webServer>
- <asp />
- </system.webServer>
- </location>
-
- -->
- <configSections>
- <sectionGroup name="system.applicationHost">
- <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- </sectionGroup>
-
- <sectionGroup name="system.webServer">
- <section name="asp" overrideModeDefault="Deny" />
- <section name="caching" overrideModeDefault="Allow" />
- <section name="cgi" overrideModeDefault="Deny" />
- <section name="defaultDocument" overrideModeDefault="Allow" />
- <section name="directoryBrowse" overrideModeDefault="Allow" />
- <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="globalModules" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="handlers" overrideModeDefault="Deny" />
- <section name="httpCompression" overrideModeDefault="Allow" allowDefinition="Everywhere" />
- <section name="httpErrors" overrideModeDefault="Allow" />
- <section name="httpLogging" overrideModeDefault="Deny" />
- <section name="httpProtocol" overrideModeDefault="Allow" />
- <section name="httpRedirect" overrideModeDefault="Allow" />
- <section name="httpTracing" overrideModeDefault="Deny" />
- <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
- <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
- <section name="applicationInitialization" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
- <section name="odbcLogging" overrideModeDefault="Deny" />
- <sectionGroup name="security">
- <section name="access" overrideModeDefault="Deny" />
- <section name="applicationDependencies" overrideModeDefault="Deny" />
- <sectionGroup name="authentication">
- <section name="anonymousAuthentication" overrideModeDefault="Deny" />
- <section name="basicAuthentication" overrideModeDefault="Deny" />
- <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" />
- <section name="digestAuthentication" overrideModeDefault="Deny" />
- <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" />
- <section name="windowsAuthentication" overrideModeDefault="Deny" />
- </sectionGroup>
- <section name="authorization" overrideModeDefault="Allow" />
- <section name="ipSecurity" overrideModeDefault="Deny" />
- <section name="dynamicIpSecurity" overrideModeDefault="Deny" />
- <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
- <section name="requestFiltering" overrideModeDefault="Allow" />
- </sectionGroup>
- <section name="serverRuntime" overrideModeDefault="Deny" />
- <section name="serverSideInclude" overrideModeDefault="Deny" />
- <section name="staticContent" overrideModeDefault="Allow" />
- <sectionGroup name="tracing">
- <section name="traceFailedRequests" overrideModeDefault="Allow" />
- <section name="traceProviderDefinitions" overrideModeDefault="Deny" />
- </sectionGroup>
- <section name="urlCompression" overrideModeDefault="Allow" />
- <section name="validation" overrideModeDefault="Allow" />
- <sectionGroup name="webdav">
- <section name="globalSettings" overrideModeDefault="Deny" />
- <section name="authoring" overrideModeDefault="Deny" />
- <section name="authoringRules" overrideModeDefault="Deny" />
- </sectionGroup>
- <sectionGroup name="rewrite">
- <section name="allowedServerVariables" overrideModeDefault="Deny" />
- <section name="rules" overrideModeDefault="Allow" />
- <section name="outboundRules" overrideModeDefault="Allow" />
- <section name="globalRules" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
- <section name="providers" overrideModeDefault="Allow" />
- <section name="rewriteMaps" overrideModeDefault="Allow" />
- </sectionGroup>
- <section name="webSocket" overrideModeDefault="Deny" />
- </sectionGroup>
- </configSections>
-
- <configProtectedData>
- <providers>
- <add name="IISWASOnlyRsaProvider" type="" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useMachineContainer="true" useOAEP="false" />
- <add name="AesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisConfigurationKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAA/HKxkz6alrlAPez0IUgujj/6k3WxCDriHp6jvpv3yEZmo7h6SMzGLxo4mTrIQVHSkB7tmElHKfUFTzE2BWF7nFWHY6Z6qmGBauFzwJMwESjril7Gjz69RBFH259HQ6aRDq9Xfx7U7H4HtdmnKNqGjgl/hwPQBGeIlWiDh+sYv3vKB0QU971tjX6H2B+9armlnC8UOuA6JYMDMI/VLLL16sng0fWAy5JYe0YVABVjiAWDW264RZW9Tr1Oax4qHZKg+SdjULxeOc2YmpX+d0yeITo1HkPF1hN1gHpIPIUDo05ilHUNfR3OkjVCIQK4cFKCq1s8NH+y+13MxUC4Fn1AlQ==" />
- <add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAALmU8lTC+v2qtfQiiiquvvLpUQqKLEXs+jSKoWCM/uPhyB++k4dwug19mGidNK5FYiWK2KYE1yhjVJcbp12E98Q0R2nT7eBiCMY2JairxQ591rqABK7keGaIjwH7PwGzSpILl3RJ4YFvJ/7ZXEJxeDZIjW8ZxWVXx+/VyHs9U3WguLEkgMUX3jrxJi8LouxaIVPJAv/YQ1ZCWs8zImitxX/C/7o7yaIxznfsN5nGQzQfpUDPeby99aw2zPVTtZI2LaWIBON8guABvZ6JtJVDWmfdK6sodbnwdZkr6/Z2rfvamT1dC1SpQrGG7ulR/f9/GXvCaW10ZVKxekBF/CYlNMg==" />
- </providers>
- </configProtectedData>
-
- <system.applicationHost>
-
- <applicationPools>
- <add name="Clr4IntegratedAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
- <add name="Clr4ClassicAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
- <add name="Clr2IntegratedAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
- <add name="Clr2ClassicAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
- <add name="UnmanagedClassicAppPool" managedRuntimeVersion="" managedPipelineMode="Classic" autoStart="true" />
- <applicationPoolDefaults managedRuntimeVersion="v4.0">
- <processModel loadUserProfile="true" setProfileEnvironment="false" />
- </applicationPoolDefaults>
- </applicationPools>
-
- <!--
-
- The <listenerAdapters> section defines the protocols with which the
- Windows Process Activation Service (WAS) binds.
-
- -->
- <listenerAdapters>
- <add name="http" />
- </listenerAdapters>
-
- <sites>
- <site name="WebSite1" id="1" serverAutoStart="true">
- <application path="/">
- <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
- </application>
- <bindings>
- <binding protocol="http" bindingInformation=":8080:localhost" />
- </bindings>
- </site>
- <siteDefaults>
- <!-- To enable logging, please change the below attribute "enabled" to "true" -->
- <logFile logFormat="W3C" directory="%AppData%\Microsoft\IISExpressLogs" enabled="false"/>
- <traceFailedRequestsLogging directory="%AppData%\Microsoft" enabled="false" maxLogFileSizeKB="1024" />
- </siteDefaults>
- <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
- <virtualDirectoryDefaults allowSubDirConfig="true" />
- </sites>
-
- <webLimits />
-
- </system.applicationHost>
-
- <system.webServer>
-
- <serverRuntime />
-
- <asp scriptErrorSentToBrowser="true">
- <cache diskTemplateCacheDirectory="%TEMP%\iisexpress\ASP Compiled Templates" />
- <limits />
- </asp>
-
- <caching enabled="true" enableKernelCache="true">
- </caching>
-
- <cgi />
-
- <defaultDocument enabled="true">
- <files>
- <add value="Default.htm" />
- <add value="Default.asp" />
- <add value="index.htm" />
- <add value="index.html" />
- <add value="iisstart.htm" />
- <add value="default.aspx" />
- </files>
- </defaultDocument>
-
- <directoryBrowse enabled="false" />
-
- <fastCgi />
-
- <!--
-
- The <globalModules> section defines all native-code modules.
- To enable a module, specify it in the <modules> section.
-
- -->
- <globalModules>
- <add name="HttpLoggingModule" image="%IIS_BIN%\loghttp.dll" />
- <add name="UriCacheModule" image="%IIS_BIN%\cachuri.dll" />
- <add name="TokenCacheModule" image="%IIS_BIN%\cachtokn.dll" />
- <add name="DynamicCompressionModule" image="%IIS_BIN%\compdyn.dll" />
- <add name="StaticCompressionModule" image="%IIS_BIN%\compstat.dll" />
- <add name="DefaultDocumentModule" image="%IIS_BIN%\defdoc.dll" />
- <add name="DirectoryListingModule" image="%IIS_BIN%\dirlist.dll" />
- <add name="ProtocolSupportModule" image="%IIS_BIN%\protsup.dll" />
- <add name="HttpRedirectionModule" image="%IIS_BIN%\redirect.dll" />
- <add name="ServerSideIncludeModule" image="%IIS_BIN%\iis_ssi.dll" />
- <add name="StaticFileModule" image="%IIS_BIN%\static.dll" />
- <add name="AnonymousAuthenticationModule" image="%IIS_BIN%\authanon.dll" />
- <add name="CertificateMappingAuthenticationModule" image="%IIS_BIN%\authcert.dll" />
- <add name="UrlAuthorizationModule" image="%IIS_BIN%\urlauthz.dll" />
- <add name="BasicAuthenticationModule" image="%IIS_BIN%\authbas.dll" />
- <add name="WindowsAuthenticationModule" image="%IIS_BIN%\authsspi.dll" />
- <add name="IISCertificateMappingAuthenticationModule" image="%IIS_BIN%\authmap.dll" />
- <add name="IpRestrictionModule" image="%IIS_BIN%\iprestr.dll" />
- <add name="DynamicIpRestrictionModule" image="%IIS_BIN%\diprestr.dll" />
- <add name="RequestFilteringModule" image="%IIS_BIN%\modrqflt.dll" />
- <add name="CustomLoggingModule" image="%IIS_BIN%\logcust.dll" />
- <add name="CustomErrorModule" image="%IIS_BIN%\custerr.dll" />
- <add name="FailedRequestsTracingModule" image="%IIS_BIN%\iisfreb.dll" />
- <add name="RequestMonitorModule" image="%IIS_BIN%\iisreqs.dll" />
- <add name="IsapiModule" image="%IIS_BIN%\isapi.dll" />
- <add name="IsapiFilterModule" image="%IIS_BIN%\filter.dll" />
- <add name="CgiModule" image="%IIS_BIN%\cgi.dll" />
- <add name="FastCgiModule" image="%IIS_BIN%\iisfcgi.dll" />
-<!-- <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> -->
- <add name="RewriteModule" image="%IIS_BIN%\rewrite.dll" />
- <add name="ConfigurationValidationModule" image="%IIS_BIN%\validcfg.dll" />
- <add name="WebSocketModule" image="%IIS_BIN%\iiswsock.dll" />
- <add name="WebMatrixSupportModule" image="%IIS_BIN%\webmatrixsup.dll" />
- <add name="ManagedEngine" image="%windir%\Microsoft.NET\Framework\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness32" />
- <add name="ManagedEngine64" image="%windir%\Microsoft.NET\Framework64\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness64" />
- <add name="ManagedEngineV4.0_32bit" image="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness32" />
- <add name="ManagedEngineV4.0_64bit" image="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness64" />
- <add name="ApplicationInitializationModule" image="%IIS_BIN%\warmup.dll" />
- </globalModules>
-
- <httpCompression directory="%TEMP%">
- <scheme name="gzip" dll="%IIS_BIN%\gzip.dll" />
- <dynamicTypes>
- <add mimeType="text/*" enabled="true" />
- <add mimeType="message/*" enabled="true" />
- <add mimeType="application/x-javascript" enabled="true" />
- <add mimeType="application/javascript" enabled="true" />
- <add mimeType="*/*" enabled="false" />
- </dynamicTypes>
- <staticTypes>
- <add mimeType="text/*" enabled="true" />
- <add mimeType="message/*" enabled="true" />
- <add mimeType="application/javascript" enabled="true" />
- <add mimeType="application/atom+xml" enabled="true" />
- <add mimeType="application/xaml+xml" enabled="true" />
- <add mimeType="image/svg+xml" enabled="true" />
- <add mimeType="*/*" enabled="false" />
- </staticTypes>
- </httpCompression>
-
- <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">
- <error statusCode="401" prefixLanguageFilePath="%IIS_BIN%\custerr" path="401.htm" />
- <error statusCode="403" prefixLanguageFilePath="%IIS_BIN%\custerr" path="403.htm" />
- <error statusCode="404" prefixLanguageFilePath="%IIS_BIN%\custerr" path="404.htm" />
- <error statusCode="405" prefixLanguageFilePath="%IIS_BIN%\custerr" path="405.htm" />
- <error statusCode="406" prefixLanguageFilePath="%IIS_BIN%\custerr" path="406.htm" />
- <error statusCode="412" prefixLanguageFilePath="%IIS_BIN%\custerr" path="412.htm" />
- <error statusCode="500" prefixLanguageFilePath="%IIS_BIN%\custerr" path="500.htm" />
- <error statusCode="501" prefixLanguageFilePath="%IIS_BIN%\custerr" path="501.htm" />
- <error statusCode="502" prefixLanguageFilePath="%IIS_BIN%\custerr" path="502.htm" />
- </httpErrors>
-
- <httpLogging dontLog="false" />
-
- <httpProtocol>
- <customHeaders>
- <clear />
- <add name="X-Powered-By" value="ASP.NET" />
- </customHeaders>
- <redirectHeaders>
- <clear />
- </redirectHeaders>
- </httpProtocol>
-
- <httpRedirect enabled="false" />
-
- <httpTracing />
-
- <isapiFilters>
- <filter name="ASP.Net_2.0.50727-64" path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv2.0" />
- <filter name="ASP.Net_2.0.50727.0" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv2.0" />
- <filter name="ASP.Net_2.0_for_v1.1" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="runtimeVersionv1.1" />
- <filter name="ASP.Net_4.0_32bit" path="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv4.0" />
- <filter name="ASP.Net_4.0_64bit" path="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv4.0" />
- </isapiFilters>
-
- <odbcLogging />
-
- <security>
-
- <access sslFlags="None" />
-
- <applicationDependencies>
- <application name="Active Server Pages" groupId="ASP" />
- </applicationDependencies>
-
- <authentication>
-
- <anonymousAuthentication enabled="true" userName="" />
-
- <basicAuthentication enabled="false" />
-
- <clientCertificateMappingAuthentication enabled="false" />
-
- <digestAuthentication enabled="false" />
-
- <iisClientCertificateMappingAuthentication enabled="false">
- </iisClientCertificateMappingAuthentication>
-
- <windowsAuthentication enabled="false">
- <providers>
- <add value="Negotiate" />
- <add value="NTLM" />
- </providers>
- </windowsAuthentication>
-
- </authentication>
-
- <authorization>
- <add accessType="Allow" users="*" />
- </authorization>
-
- <ipSecurity allowUnlisted="true" />
-
- <isapiCgiRestriction notListedIsapisAllowed="true" notListedCgisAllowed="true">
- <add path="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
- <add path="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
- <add path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
- <add path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
- </isapiCgiRestriction>
-
- <requestFiltering>
- <fileExtensions allowUnlisted="true" applyToWebDAV="true">
- <add fileExtension=".asa" allowed="false" />
- <add fileExtension=".asax" allowed="false" />
- <add fileExtension=".ascx" allowed="false" />
- <add fileExtension=".master" allowed="false" />
- <add fileExtension=".skin" allowed="false" />
- <add fileExtension=".browser" allowed="false" />
- <add fileExtension=".sitemap" allowed="false" />
- <add fileExtension=".config" allowed="false" />
- <add fileExtension=".cs" allowed="false" />
- <add fileExtension=".csproj" allowed="false" />
- <add fileExtension=".vb" allowed="false" />
- <add fileExtension=".vbproj" allowed="false" />
- <add fileExtension=".webinfo" allowed="false" />
- <add fileExtension=".licx" allowed="false" />
- <add fileExtension=".resx" allowed="false" />
- <add fileExtension=".resources" allowed="false" />
- <add fileExtension=".mdb" allowed="false" />
- <add fileExtension=".vjsproj" allowed="false" />
- <add fileExtension=".java" allowed="false" />
- <add fileExtension=".jsl" allowed="false" />
- <add fileExtension=".ldb" allowed="false" />
- <add fileExtension=".dsdgm" allowed="false" />
- <add fileExtension=".ssdgm" allowed="false" />
- <add fileExtension=".lsad" allowed="false" />
- <add fileExtension=".ssmap" allowed="false" />
- <add fileExtension=".cd" allowed="false" />
- <add fileExtension=".dsprototype" allowed="false" />
- <add fileExtension=".lsaprototype" allowed="false" />
- <add fileExtension=".sdm" allowed="false" />
- <add fileExtension=".sdmDocument" allowed="false" />
- <add fileExtension=".mdf" allowed="false" />
- <add fileExtension=".ldf" allowed="false" />
- <add fileExtension=".ad" allowed="false" />
- <add fileExtension=".dd" allowed="false" />
- <add fileExtension=".ldd" allowed="false" />
- <add fileExtension=".sd" allowed="false" />
- <add fileExtension=".adprototype" allowed="false" />
- <add fileExtension=".lddprototype" allowed="false" />
- <add fileExtension=".exclude" allowed="false" />
- <add fileExtension=".refresh" allowed="false" />
- <add fileExtension=".compiled" allowed="false" />
- <add fileExtension=".msgx" allowed="false" />
- <add fileExtension=".vsdisco" allowed="false" />
- <add fileExtension=".rules" allowed="false" />
- </fileExtensions>
- <verbs allowUnlisted="true" applyToWebDAV="true" />
- <hiddenSegments applyToWebDAV="true">
- <add segment="web.config" />
- <add segment="bin" />
- <add segment="App_code" />
- <add segment="App_GlobalResources" />
- <add segment="App_LocalResources" />
- <add segment="App_WebReferences" />
- <add segment="App_Data" />
- <add segment="App_Browsers" />
- </hiddenSegments>
- </requestFiltering>
-
- </security>
-
- <serverSideInclude ssiExecDisable="false" />
-
- <staticContent lockAttributes="isDocFooterFileName">
- <mimeMap fileExtension=".323" mimeType="text/h323" />
- <mimeMap fileExtension=".3g2" mimeType="video/3gpp2" />
- <mimeMap fileExtension=".3gp2" mimeType="video/3gpp2" />
- <mimeMap fileExtension=".3gp" mimeType="video/3gpp" />
- <mimeMap fileExtension=".3gpp" mimeType="video/3gpp" />
- <mimeMap fileExtension=".aac" mimeType="audio/aac" />
- <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".aca" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".accdb" mimeType="application/msaccess" />
- <mimeMap fileExtension=".accde" mimeType="application/msaccess" />
- <mimeMap fileExtension=".accdt" mimeType="application/msaccess" />
- <mimeMap fileExtension=".acx" mimeType="application/internet-property-stream" />
- <mimeMap fileExtension=".adt" mimeType="audio/vnd.dlna.adts" />
- <mimeMap fileExtension=".adts" mimeType="audio/vnd.dlna.adts" />
- <mimeMap fileExtension=".afm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ai" mimeType="application/postscript" />
- <mimeMap fileExtension=".aif" mimeType="audio/x-aiff" />
- <mimeMap fileExtension=".aifc" mimeType="audio/aiff" />
- <mimeMap fileExtension=".aiff" mimeType="audio/aiff" />
- <mimeMap fileExtension=".appcache" mimeType="text/cache-manifest" />
- <mimeMap fileExtension=".application" mimeType="application/x-ms-application" />
- <mimeMap fileExtension=".art" mimeType="image/x-jg" />
- <mimeMap fileExtension=".asd" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".asf" mimeType="video/x-ms-asf" />
- <mimeMap fileExtension=".asi" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".asm" mimeType="text/plain" />
- <mimeMap fileExtension=".asr" mimeType="video/x-ms-asf" />
- <mimeMap fileExtension=".asx" mimeType="video/x-ms-asf" />
- <mimeMap fileExtension=".atom" mimeType="application/atom+xml" />
- <mimeMap fileExtension=".au" mimeType="audio/basic" />
- <mimeMap fileExtension=".avi" mimeType="video/avi" />
- <mimeMap fileExtension=".axs" mimeType="application/olescript" />
- <mimeMap fileExtension=".bas" mimeType="text/plain" />
- <mimeMap fileExtension=".bcpio" mimeType="application/x-bcpio" />
- <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".bmp" mimeType="image/bmp" />
- <mimeMap fileExtension=".c" mimeType="text/plain" />
- <mimeMap fileExtension=".cab" mimeType="application/vnd.ms-cab-compressed" />
- <mimeMap fileExtension=".calx" mimeType="application/vnd.ms-office.calx" />
- <mimeMap fileExtension=".cat" mimeType="application/vnd.ms-pki.seccat" />
- <mimeMap fileExtension=".cdf" mimeType="application/x-cdf" />
- <mimeMap fileExtension=".chm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".class" mimeType="application/x-java-applet" />
- <mimeMap fileExtension=".clp" mimeType="application/x-msclip" />
- <mimeMap fileExtension=".cmx" mimeType="image/x-cmx" />
- <mimeMap fileExtension=".cnf" mimeType="text/plain" />
- <mimeMap fileExtension=".cod" mimeType="image/cis-cod" />
- <mimeMap fileExtension=".cpio" mimeType="application/x-cpio" />
- <mimeMap fileExtension=".cpp" mimeType="text/plain" />
- <mimeMap fileExtension=".crd" mimeType="application/x-mscardfile" />
- <mimeMap fileExtension=".crl" mimeType="application/pkix-crl" />
- <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" />
- <mimeMap fileExtension=".csh" mimeType="application/x-csh" />
- <mimeMap fileExtension=".css" mimeType="text/css" />
- <mimeMap fileExtension=".csv" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".cur" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dcr" mimeType="application/x-director" />
- <mimeMap fileExtension=".deploy" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".der" mimeType="application/x-x509-ca-cert" />
- <mimeMap fileExtension=".dib" mimeType="image/bmp" />
- <mimeMap fileExtension=".dir" mimeType="application/x-director" />
- <mimeMap fileExtension=".disco" mimeType="text/xml" />
- <mimeMap fileExtension=".dll" mimeType="application/x-msdownload" />
- <mimeMap fileExtension=".dll.config" mimeType="text/xml" />
- <mimeMap fileExtension=".dlm" mimeType="text/dlm" />
- <mimeMap fileExtension=".doc" mimeType="application/msword" />
- <mimeMap fileExtension=".docm" mimeType="application/vnd.ms-word.document.macroEnabled.12" />
- <mimeMap fileExtension=".docx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
- <mimeMap fileExtension=".dot" mimeType="application/msword" />
- <mimeMap fileExtension=".dotm" mimeType="application/vnd.ms-word.template.macroEnabled.12" />
- <mimeMap fileExtension=".dotx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.template" />
- <mimeMap fileExtension=".dsp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dtd" mimeType="text/xml" />
- <mimeMap fileExtension=".dvi" mimeType="application/x-dvi" />
- <mimeMap fileExtension=".dvr-ms" mimeType="video/x-ms-dvr" />
- <mimeMap fileExtension=".dwf" mimeType="drawing/x-dwf" />
- <mimeMap fileExtension=".dwp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dxr" mimeType="application/x-director" />
- <mimeMap fileExtension=".eml" mimeType="message/rfc822" />
- <mimeMap fileExtension=".emz" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
- <mimeMap fileExtension=".eps" mimeType="application/postscript" />
- <mimeMap fileExtension=".esd" mimeType="application/vnd.ms-cab-compressed" />
- <mimeMap fileExtension=".etx" mimeType="text/x-setext" />
- <mimeMap fileExtension=".evy" mimeType="application/envoy" />
- <mimeMap fileExtension=".exe" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".exe.config" mimeType="text/xml" />
- <mimeMap fileExtension=".fdf" mimeType="application/vnd.fdf" />
- <mimeMap fileExtension=".fif" mimeType="application/fractals" />
- <mimeMap fileExtension=".fla" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".flr" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".flv" mimeType="video/x-flv" />
- <mimeMap fileExtension=".gif" mimeType="image/gif" />
- <mimeMap fileExtension=".glb" mimeType="model/gltf-binary" />
- <mimeMap fileExtension=".gtar" mimeType="application/x-gtar" />
- <mimeMap fileExtension=".gz" mimeType="application/x-gzip" />
- <mimeMap fileExtension=".h" mimeType="text/plain" />
- <mimeMap fileExtension=".hdf" mimeType="application/x-hdf" />
- <mimeMap fileExtension=".hdml" mimeType="text/x-hdml" />
- <mimeMap fileExtension=".hhc" mimeType="application/x-oleobject" />
- <mimeMap fileExtension=".hhk" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".hhp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".hlp" mimeType="application/winhlp" />
- <mimeMap fileExtension=".hqx" mimeType="application/mac-binhex40" />
- <mimeMap fileExtension=".hta" mimeType="application/hta" />
- <mimeMap fileExtension=".htc" mimeType="text/x-component" />
- <mimeMap fileExtension=".htm" mimeType="text/html" />
- <mimeMap fileExtension=".html" mimeType="text/html" />
- <mimeMap fileExtension=".htt" mimeType="text/webviewhtml" />
- <mimeMap fileExtension=".hxt" mimeType="text/html" />
- <mimeMap fileExtension=".ico" mimeType="image/x-icon" />
- <mimeMap fileExtension=".ics" mimeType="text/calendar" />
- <mimeMap fileExtension=".ief" mimeType="image/ief" />
- <mimeMap fileExtension=".iii" mimeType="application/x-iphone" />
- <mimeMap fileExtension=".inf" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ins" mimeType="application/x-internet-signup" />
- <mimeMap fileExtension=".isp" mimeType="application/x-internet-signup" />
- <mimeMap fileExtension=".IVF" mimeType="video/x-ivf" />
- <mimeMap fileExtension=".jar" mimeType="application/java-archive" />
- <mimeMap fileExtension=".java" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".jck" mimeType="application/liquidmotion" />
- <mimeMap fileExtension=".jcz" mimeType="application/liquidmotion" />
- <mimeMap fileExtension=".jfif" mimeType="image/pjpeg" />
- <mimeMap fileExtension=".jpb" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".jpe" mimeType="image/jpeg" />
- <mimeMap fileExtension=".jpeg" mimeType="image/jpeg" />
- <mimeMap fileExtension=".jpg" mimeType="image/jpeg" />
- <mimeMap fileExtension=".js" mimeType="application/javascript" />
- <mimeMap fileExtension=".json" mimeType="application/json" />
- <mimeMap fileExtension=".jsonld" mimeType="application/ld+json" />
- <mimeMap fileExtension=".jsx" mimeType="text/jscript" />
- <mimeMap fileExtension=".latex" mimeType="application/x-latex" />
- <mimeMap fileExtension=".less" mimeType="text/css" />
- <mimeMap fileExtension=".lit" mimeType="application/x-ms-reader" />
- <mimeMap fileExtension=".lpk" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".lsf" mimeType="video/x-la-asf" />
- <mimeMap fileExtension=".lsx" mimeType="video/x-la-asf" />
- <mimeMap fileExtension=".lzh" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".m13" mimeType="application/x-msmediaview" />
- <mimeMap fileExtension=".m14" mimeType="application/x-msmediaview" />
- <mimeMap fileExtension=".m1v" mimeType="video/mpeg" />
- <mimeMap fileExtension=".m2ts" mimeType="video/vnd.dlna.mpeg-tts" />
- <mimeMap fileExtension=".m3u" mimeType="audio/x-mpegurl" />
- <mimeMap fileExtension=".m4a" mimeType="audio/mp4" />
- <mimeMap fileExtension=".m4v" mimeType="video/mp4" />
- <mimeMap fileExtension=".man" mimeType="application/x-troff-man" />
- <mimeMap fileExtension=".manifest" mimeType="application/x-ms-manifest" />
- <mimeMap fileExtension=".map" mimeType="text/plain" />
- <mimeMap fileExtension=".mdb" mimeType="application/x-msaccess" />
- <mimeMap fileExtension=".mdp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".me" mimeType="application/x-troff-me" />
- <mimeMap fileExtension=".mht" mimeType="message/rfc822" />
- <mimeMap fileExtension=".mhtml" mimeType="message/rfc822" />
- <mimeMap fileExtension=".mid" mimeType="audio/mid" />
- <mimeMap fileExtension=".midi" mimeType="audio/mid" />
- <mimeMap fileExtension=".mix" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".mmf" mimeType="application/x-smaf" />
- <mimeMap fileExtension=".mno" mimeType="text/xml" />
- <mimeMap fileExtension=".mny" mimeType="application/x-msmoney" />
- <mimeMap fileExtension=".mov" mimeType="video/quicktime" />
- <mimeMap fileExtension=".movie" mimeType="video/x-sgi-movie" />
- <mimeMap fileExtension=".mp2" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mp3" mimeType="audio/mpeg" />
- <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
- <mimeMap fileExtension=".mp4v" mimeType="video/mp4" />
- <mimeMap fileExtension=".mpa" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mpe" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mpeg" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mpg" mimeType="video/mpeg" />
- <mimeMap fileExtension=".mpp" mimeType="application/vnd.ms-project" />
- <mimeMap fileExtension=".mpv2" mimeType="video/mpeg" />
- <mimeMap fileExtension=".ms" mimeType="application/x-troff-ms" />
- <mimeMap fileExtension=".msi" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".mso" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".mvb" mimeType="application/x-msmediaview" />
- <mimeMap fileExtension=".mvc" mimeType="application/x-miva-compiled" />
- <mimeMap fileExtension=".nc" mimeType="application/x-netcdf" />
- <mimeMap fileExtension=".nsc" mimeType="video/x-ms-asf" />
- <mimeMap fileExtension=".nws" mimeType="message/rfc822" />
- <mimeMap fileExtension=".ocx" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".oda" mimeType="application/oda" />
- <mimeMap fileExtension=".odc" mimeType="text/x-ms-odc" />
- <mimeMap fileExtension=".ods" mimeType="application/oleobject" />
- <mimeMap fileExtension=".oga" mimeType="audio/ogg" />
- <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
- <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
- <mimeMap fileExtension=".one" mimeType="application/onenote" />
- <mimeMap fileExtension=".onea" mimeType="application/onenote" />
- <mimeMap fileExtension=".onetoc" mimeType="application/onenote" />
- <mimeMap fileExtension=".onetoc2" mimeType="application/onenote" />
- <mimeMap fileExtension=".onetmp" mimeType="application/onenote" />
- <mimeMap fileExtension=".onepkg" mimeType="application/onenote" />
- <mimeMap fileExtension=".osdx" mimeType="application/opensearchdescription+xml" />
- <mimeMap fileExtension=".otf" mimeType="font/otf" />
- <mimeMap fileExtension=".p10" mimeType="application/pkcs10" />
- <mimeMap fileExtension=".p12" mimeType="application/x-pkcs12" />
- <mimeMap fileExtension=".p7b" mimeType="application/x-pkcs7-certificates" />
- <mimeMap fileExtension=".p7c" mimeType="application/pkcs7-mime" />
- <mimeMap fileExtension=".p7m" mimeType="application/pkcs7-mime" />
- <mimeMap fileExtension=".p7r" mimeType="application/x-pkcs7-certreqresp" />
- <mimeMap fileExtension=".p7s" mimeType="application/pkcs7-signature" />
- <mimeMap fileExtension=".pbm" mimeType="image/x-portable-bitmap" />
- <mimeMap fileExtension=".pcx" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pcz" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pdf" mimeType="application/pdf" />
- <mimeMap fileExtension=".pfb" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pfm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pfx" mimeType="application/x-pkcs12" />
- <mimeMap fileExtension=".pgm" mimeType="image/x-portable-graymap" />
- <mimeMap fileExtension=".pko" mimeType="application/vnd.ms-pki.pko" />
- <mimeMap fileExtension=".pma" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".pmc" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".pml" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".pmr" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".pmw" mimeType="application/x-perfmon" />
- <mimeMap fileExtension=".png" mimeType="image/png" />
- <mimeMap fileExtension=".pnm" mimeType="image/x-portable-anymap" />
- <mimeMap fileExtension=".pnz" mimeType="image/png" />
- <mimeMap fileExtension=".pot" mimeType="application/vnd.ms-powerpoint" />
- <mimeMap fileExtension=".potm" mimeType="application/vnd.ms-powerpoint.template.macroEnabled.12" />
- <mimeMap fileExtension=".potx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.template" />
- <mimeMap fileExtension=".ppam" mimeType="application/vnd.ms-powerpoint.addin.macroEnabled.12" />
- <mimeMap fileExtension=".ppm" mimeType="image/x-portable-pixmap" />
- <mimeMap fileExtension=".pps" mimeType="application/vnd.ms-powerpoint" />
- <mimeMap fileExtension=".ppsm" mimeType="application/vnd.ms-powerpoint.slideshow.macroEnabled.12" />
- <mimeMap fileExtension=".ppsx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" />
- <mimeMap fileExtension=".ppt" mimeType="application/vnd.ms-powerpoint" />
- <mimeMap fileExtension=".pptm" mimeType="application/vnd.ms-powerpoint.presentation.macroEnabled.12" />
- <mimeMap fileExtension=".pptx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
- <mimeMap fileExtension=".prf" mimeType="application/pics-rules" />
- <mimeMap fileExtension=".prm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".prx" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ps" mimeType="application/postscript" />
- <mimeMap fileExtension=".psd" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".psm" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".psp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".pub" mimeType="application/x-mspublisher" />
- <mimeMap fileExtension=".qt" mimeType="video/quicktime" />
- <mimeMap fileExtension=".qtl" mimeType="application/x-quicktimeplayer" />
- <mimeMap fileExtension=".qxd" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ra" mimeType="audio/x-pn-realaudio" />
- <mimeMap fileExtension=".ram" mimeType="audio/x-pn-realaudio" />
- <mimeMap fileExtension=".rar" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".ras" mimeType="image/x-cmu-raster" />
- <mimeMap fileExtension=".rf" mimeType="image/vnd.rn-realflash" />
- <mimeMap fileExtension=".rgb" mimeType="image/x-rgb" />
- <mimeMap fileExtension=".rm" mimeType="application/vnd.rn-realmedia" />
- <mimeMap fileExtension=".rmi" mimeType="audio/mid" />
- <mimeMap fileExtension=".roff" mimeType="application/x-troff" />
- <mimeMap fileExtension=".rpm" mimeType="audio/x-pn-realaudio-plugin" />
- <mimeMap fileExtension=".rtf" mimeType="application/rtf" />
- <mimeMap fileExtension=".rtx" mimeType="text/richtext" />
- <mimeMap fileExtension=".scd" mimeType="application/x-msschedule" />
- <mimeMap fileExtension=".sct" mimeType="text/scriptlet" />
- <mimeMap fileExtension=".sea" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".setpay" mimeType="application/set-payment-initiation" />
- <mimeMap fileExtension=".setreg" mimeType="application/set-registration-initiation" />
- <mimeMap fileExtension=".sgml" mimeType="text/sgml" />
- <mimeMap fileExtension=".sh" mimeType="application/x-sh" />
- <mimeMap fileExtension=".shar" mimeType="application/x-shar" />
- <mimeMap fileExtension=".sit" mimeType="application/x-stuffit" />
- <mimeMap fileExtension=".sldm" mimeType="application/vnd.ms-powerpoint.slide.macroEnabled.12" />
- <mimeMap fileExtension=".sldx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slide" />
- <mimeMap fileExtension=".smd" mimeType="audio/x-smd" />
- <mimeMap fileExtension=".smi" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".smx" mimeType="audio/x-smd" />
- <mimeMap fileExtension=".smz" mimeType="audio/x-smd" />
- <mimeMap fileExtension=".snd" mimeType="audio/basic" />
- <mimeMap fileExtension=".snp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".spc" mimeType="application/x-pkcs7-certificates" />
- <mimeMap fileExtension=".spl" mimeType="application/futuresplash" />
- <mimeMap fileExtension=".spx" mimeType="audio/ogg" />
- <mimeMap fileExtension=".src" mimeType="application/x-wais-source" />
- <mimeMap fileExtension=".ssm" mimeType="application/streamingmedia" />
- <mimeMap fileExtension=".sst" mimeType="application/vnd.ms-pki.certstore" />
- <mimeMap fileExtension=".stl" mimeType="application/vnd.ms-pki.stl" />
- <mimeMap fileExtension=".sv4cpio" mimeType="application/x-sv4cpio" />
- <mimeMap fileExtension=".sv4crc" mimeType="application/x-sv4crc" />
- <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
- <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" />
- <mimeMap fileExtension=".swf" mimeType="application/x-shockwave-flash" />
- <mimeMap fileExtension=".t" mimeType="application/x-troff" />
- <mimeMap fileExtension=".tar" mimeType="application/x-tar" />
- <mimeMap fileExtension=".tcl" mimeType="application/x-tcl" />
- <mimeMap fileExtension=".tex" mimeType="application/x-tex" />
- <mimeMap fileExtension=".texi" mimeType="application/x-texinfo" />
- <mimeMap fileExtension=".texinfo" mimeType="application/x-texinfo" />
- <mimeMap fileExtension=".tgz" mimeType="application/x-compressed" />
- <mimeMap fileExtension=".thmx" mimeType="application/vnd.ms-officetheme" />
- <mimeMap fileExtension=".thn" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".tif" mimeType="image/tiff" />
- <mimeMap fileExtension=".tiff" mimeType="image/tiff" />
- <mimeMap fileExtension=".toc" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".tr" mimeType="application/x-troff" />
- <mimeMap fileExtension=".trm" mimeType="application/x-msterminal" />
- <mimeMap fileExtension=".ts" mimeType="video/vnd.dlna.mpeg-tts" />
- <mimeMap fileExtension=".tsv" mimeType="text/tab-separated-values" />
- <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".tts" mimeType="video/vnd.dlna.mpeg-tts" />
- <mimeMap fileExtension=".txt" mimeType="text/plain" />
- <mimeMap fileExtension=".u32" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".uls" mimeType="text/iuls" />
- <mimeMap fileExtension=".ustar" mimeType="application/x-ustar" />
- <mimeMap fileExtension=".vbs" mimeType="text/vbscript" />
- <mimeMap fileExtension=".vcf" mimeType="text/x-vcard" />
- <mimeMap fileExtension=".vcs" mimeType="text/plain" />
- <mimeMap fileExtension=".vdx" mimeType="application/vnd.ms-visio.viewer" />
- <mimeMap fileExtension=".vml" mimeType="text/xml" />
- <mimeMap fileExtension=".vsd" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vss" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vst" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vsto" mimeType="application/x-ms-vsto" />
- <mimeMap fileExtension=".vsw" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vsx" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".vtx" mimeType="application/vnd.visio" />
- <mimeMap fileExtension=".wasm" mimeType="application/wasm" />
- <mimeMap fileExtension=".wav" mimeType="audio/wav" />
- <mimeMap fileExtension=".wax" mimeType="audio/x-ms-wax" />
- <mimeMap fileExtension=".wbmp" mimeType="image/vnd.wap.wbmp" />
- <mimeMap fileExtension=".wcm" mimeType="application/vnd.ms-works" />
- <mimeMap fileExtension=".wdb" mimeType="application/vnd.ms-works" />
- <mimeMap fileExtension=".webm" mimeType="video/webm" />
- <mimeMap fileExtension=".wks" mimeType="application/vnd.ms-works" />
- <mimeMap fileExtension=".wm" mimeType="video/x-ms-wm" />
- <mimeMap fileExtension=".wma" mimeType="audio/x-ms-wma" />
- <mimeMap fileExtension=".wmd" mimeType="application/x-ms-wmd" />
- <mimeMap fileExtension=".wmf" mimeType="application/x-msmetafile" />
- <mimeMap fileExtension=".wml" mimeType="text/vnd.wap.wml" />
- <mimeMap fileExtension=".wmlc" mimeType="application/vnd.wap.wmlc" />
- <mimeMap fileExtension=".wmls" mimeType="text/vnd.wap.wmlscript" />
- <mimeMap fileExtension=".wmlsc" mimeType="application/vnd.wap.wmlscriptc" />
- <mimeMap fileExtension=".wmp" mimeType="video/x-ms-wmp" />
- <mimeMap fileExtension=".wmv" mimeType="video/x-ms-wmv" />
- <mimeMap fileExtension=".wmx" mimeType="video/x-ms-wmx" />
- <mimeMap fileExtension=".wmz" mimeType="application/x-ms-wmz" />
- <mimeMap fileExtension=".woff" mimeType="font/x-woff" />
- <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
- <mimeMap fileExtension=".wps" mimeType="application/vnd.ms-works" />
- <mimeMap fileExtension=".wri" mimeType="application/x-mswrite" />
- <mimeMap fileExtension=".wrl" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".wrz" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".wsdl" mimeType="text/xml" />
- <mimeMap fileExtension=".wtv" mimeType="video/x-ms-wtv" />
- <mimeMap fileExtension=".wvx" mimeType="video/x-ms-wvx" />
- <mimeMap fileExtension=".x" mimeType="application/directx" />
- <mimeMap fileExtension=".xaf" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".xaml" mimeType="application/xaml+xml" />
- <mimeMap fileExtension=".xap" mimeType="application/x-silverlight-app" />
- <mimeMap fileExtension=".xbap" mimeType="application/x-ms-xbap" />
- <mimeMap fileExtension=".xbm" mimeType="image/x-xbitmap" />
- <mimeMap fileExtension=".xdr" mimeType="text/plain" />
- <mimeMap fileExtension=".xht" mimeType="application/xhtml+xml" />
- <mimeMap fileExtension=".xhtml" mimeType="application/xhtml+xml" />
- <mimeMap fileExtension=".xla" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xlam" mimeType="application/vnd.ms-excel.addin.macroEnabled.12" />
- <mimeMap fileExtension=".xlc" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xlm" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xls" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xlsb" mimeType="application/vnd.ms-excel.sheet.binary.macroEnabled.12" />
- <mimeMap fileExtension=".xlsm" mimeType="application/vnd.ms-excel.sheet.macroEnabled.12" />
- <mimeMap fileExtension=".xlsx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
- <mimeMap fileExtension=".xlt" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xltm" mimeType="application/vnd.ms-excel.template.macroEnabled.12" />
- <mimeMap fileExtension=".xltx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.template" />
- <mimeMap fileExtension=".xlw" mimeType="application/vnd.ms-excel" />
- <mimeMap fileExtension=".xml" mimeType="text/xml" />
- <mimeMap fileExtension=".xof" mimeType="x-world/x-vrml" />
- <mimeMap fileExtension=".xpm" mimeType="image/x-xpixmap" />
- <mimeMap fileExtension=".xps" mimeType="application/vnd.ms-xpsdocument" />
- <mimeMap fileExtension=".xsd" mimeType="text/xml" />
- <mimeMap fileExtension=".xsf" mimeType="text/xml" />
- <mimeMap fileExtension=".xsl" mimeType="text/xml" />
- <mimeMap fileExtension=".xslt" mimeType="text/xml" />
- <mimeMap fileExtension=".xsn" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".xtp" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".xwd" mimeType="image/x-xwindowdump" />
- <mimeMap fileExtension=".z" mimeType="application/x-compress" />
- <mimeMap fileExtension=".zip" mimeType="application/x-zip-compressed" />
- </staticContent>
-
- <tracing>
-
- <traceFailedRequests>
- <add path="*">
- <traceAreas>
- <add provider="ASP" verbosity="Verbose" />
- <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
- <add provider="ISAPI Extension" verbosity="Verbose" />
- <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket" verbosity="Verbose" />
- </traceAreas>
- <failureDefinitions statusCodes="200-999" />
- </add>
- </traceFailedRequests>
-
- <traceProviderDefinitions>
- <add name="WWW Server" guid="{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}">
- <areas>
- <clear />
- <add name="Authentication" value="2" />
- <add name="Security" value="4" />
- <add name="Filter" value="8" />
- <add name="StaticFile" value="16" />
- <add name="CGI" value="32" />
- <add name="Compression" value="64" />
- <add name="Cache" value="128" />
- <add name="RequestNotifications" value="256" />
- <add name="Module" value="512" />
- <add name="Rewrite" value="1024" />
- <add name="FastCGI" value="4096" />
- <add name="WebSocket" value="16384" />
- </areas>
- </add>
- <add name="ASP" guid="{06b94d9a-b15e-456e-a4ef-37c984a2cb4b}">
- <areas>
- <clear />
- </areas>
- </add>
- <add name="ISAPI Extension" guid="{a1c2040e-8840-4c31-ba11-9871031a19ea}">
- <areas>
- <clear />
- </areas>
- </add>
- <add name="ASPNET" guid="{AFF081FE-0247-4275-9C4E-021F3DC1DA35}">
- <areas>
- <add name="Infrastructure" value="1" />
- <add name="Module" value="2" />
- <add name="Page" value="4" />
- <add name="AppServices" value="8" />
- </areas>
- </add>
- </traceProviderDefinitions>
-
- </tracing>
-
- <urlCompression />
-
- <validation />
- <webdav>
- <globalSettings>
- <propertyStores>
- <add name="webdav_simple_prop" image="%IIS_BIN%\webdav_simple_prop.dll" image32="%IIS_BIN%\webdav_simple_prop.dll" />
- </propertyStores>
- <lockStores>
- <add name="webdav_simple_lock" image="%IIS_BIN%\webdav_simple_lock.dll" image32="%IIS_BIN%\webdav_simple_lock.dll" />
- </lockStores>
-
- </globalSettings>
- <authoring>
- <locks enabled="true" lockStore="webdav_simple_lock" />
- </authoring>
- <authoringRules />
- </webdav>
- <webSocket />
- <applicationInitialization />
-
- </system.webServer>
- <location path="" overrideMode="Allow">
- <system.webServer>
- <modules>
- <add name="IsapiFilterModule" lockItem="true" />
- <add name="BasicAuthenticationModule" lockItem="true" />
- <add name="IsapiModule" lockItem="true" />
- <add name="HttpLoggingModule" lockItem="true" />
- <add name="DynamicCompressionModule" lockItem="true" />
- <add name="StaticCompressionModule" lockItem="true" />
- <add name="DefaultDocumentModule" lockItem="true" />
- <add name="DirectoryListingModule" lockItem="true" />
- <add name="ProtocolSupportModule" lockItem="true" />
- <add name="HttpRedirectionModule" lockItem="true" />
- <add name="ServerSideIncludeModule" lockItem="true" />
- <add name="StaticFileModule" lockItem="true" />
- <add name="AnonymousAuthenticationModule" lockItem="true" />
- <add name="CertificateMappingAuthenticationModule" lockItem="true" />
- <add name="UrlAuthorizationModule" lockItem="true" />
- <add name="WindowsAuthenticationModule" lockItem="true" />
- <add name="IISCertificateMappingAuthenticationModule" lockItem="true" />
- <add name="WebMatrixSupportModule" lockItem="true" />
- <add name="IpRestrictionModule" lockItem="true" />
- <add name="DynamicIpRestrictionModule" lockItem="true" />
- <add name="RequestFilteringModule" lockItem="true" />
- <add name="CustomLoggingModule" lockItem="true" />
- <add name="CustomErrorModule" lockItem="true" />
- <add name="FailedRequestsTracingModule" lockItem="true" />
- <add name="CgiModule" lockItem="true" />
- <add name="FastCgiModule" lockItem="true" />
-<!-- <add name="WebDAVModule" /> -->
- <add name="RewriteModule" />
- <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" preCondition="managedHandler" />
- <add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="managedHandler" />
- <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" preCondition="managedHandler" />
- <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="managedHandler" />
- <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" preCondition="managedHandler" />
- <add name="RoleManager" type="System.Web.Security.RoleManagerModule" preCondition="managedHandler" />
- <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />
- <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" preCondition="managedHandler" />
- <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" preCondition="managedHandler" />
- <add name="Profile" type="System.Web.Profile.ProfileModule" preCondition="managedHandler" />
- <add name="UrlMappingsModule" type="System.Web.UrlMappingsModule" preCondition="managedHandler" />
- <add name="ApplicationInitializationModule" lockItem="true" />
- <add name="WebSocketModule" lockItem="true" />
- <add name="ServiceModel-4.0" type="System.ServiceModel.Activation.ServiceHttpModule,System.ServiceModel.Activation,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
- <add name="ConfigurationValidationModule" lockItem="true" />
- <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler,runtimeVersionv4.0" />
- <add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
- <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler,runtimeVersionv2.0" />
- </modules>
- <handlers accessPolicy="Read, Script">
-<!-- <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" /> -->
- <add name="AXD-ISAPI-4.0_64bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="SimpleHandlerFactory-ISAPI-4.0_64bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="WebServiceHandlerFactory-ISAPI-4.0_64bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
- <add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
- <add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
- <add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
- <add name="aspq-ISAPI-4.0_64bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="cshtm-ISAPI-4.0_64bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="cshtml-ISAPI-4.0_64bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="vbhtm-ISAPI-4.0_64bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="vbhtml-ISAPI-4.0_64bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
- <add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
- <add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
- <add name="AXD-ISAPI-4.0_32bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="SimpleHandlerFactory-ISAPI-4.0_32bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="WebServiceHandlerFactory-ISAPI-4.0_32bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
- <add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
- <add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
- <add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
- <add name="aspq-ISAPI-4.0_32bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="cshtm-ISAPI-4.0_32bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="cshtml-ISAPI-4.0_32bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="vbhtm-ISAPI-4.0_32bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="vbhtml-ISAPI-4.0_32bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="TraceHandler-Integrated-4.0" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="WebAdminHandler-Integrated-4.0" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="AssemblyResourceLoader-Integrated-4.0" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="HttpRemotingHandlerFactory-rem-Integrated-4.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="HttpRemotingHandlerFactory-soap-Integrated-4.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="aspq-Integrated-4.0" path="*.aspq" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="cshtm-Integrated-4.0" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="cshtml-Integrated-4.0" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="vbhtm-Integrated-4.0" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="vbhtml-Integrated-4.0" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="ScriptHandlerFactoryAppServices-Integrated-4.0" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="ScriptResourceIntegrated-4.0" path="*ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
- <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
- <add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
- <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
- <add name="TraceHandler-Integrated" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="WebAdminHandler-Integrated" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="AssemblyResourceLoader-Integrated" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="SimpleHandlerFactory-Integrated" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="WebServiceHandlerFactory-Integrated" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Services.Protocols.WebServiceHandlerFactory,System.Web.Services,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="HttpRemotingHandlerFactory-rem-Integrated" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="HttpRemotingHandlerFactory-soap-Integrated" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
- <add name="AXD-ISAPI-2.0" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="SimpleHandlerFactory-ISAPI-2.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="WebServiceHandlerFactory-ISAPI-2.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
- <add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
- <add name="AXD-ISAPI-2.0-64" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="PageHandlerFactory-ISAPI-2.0-64" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="SimpleHandlerFactory-ISAPI-2.0-64" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="WebServiceHandlerFactory-ISAPI-2.0-64" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0-64" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0-64" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
- <add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
- <add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
- <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
- <add name="SSINC-stm" path="*.stm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
- <add name="SSINC-shtm" path="*.shtm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
- <add name="SSINC-shtml" path="*.shtml" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
- <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
- <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" />
- <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
- <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
- <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
- <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
- </handlers>
- </system.webServer>
- </location>
-</configuration>
diff --git a/Code/WMS/WIDESEA_WMSServer/.vscode/settings.json b/Code/WMS/WIDESEA_WMSServer/.vscode/settings.json
deleted file mode 100644
index 23f1cb8..0000000
--- a/Code/WMS/WIDESEA_WMSServer/.vscode/settings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "workbench.editor.openPositioning": "left"
-}
\ No newline at end of file
diff --git a/Code/WMS/WIDESEA_WMSServer/REFACTOR_PLAN.md b/Code/WMS/WIDESEA_WMSServer/REFACTOR_PLAN.md
deleted file mode 100644
index 26c023a..0000000
--- a/Code/WMS/WIDESEA_WMSServer/REFACTOR_PLAN.md
+++ /dev/null
@@ -1,738 +0,0 @@
-# WIDESEA WMS 绯荤粺閲嶆瀯璁″垝
-
-## 椤圭洰姒傚喌
-
-### 椤圭洰鍩烘湰淇℃伅
-- **椤圭洰鍚嶇О**: WIDESEA_WMSServer 浠撳簱绠$悊绯荤粺
-- **椤圭洰绫诲瀷**: ASP.NET Core 6.0 Web API
-- **浠g爜瑙勬ā**: 351涓狢#鏂囦欢,绾�912琛屼唬鐮�
-- **妯″潡鏁伴噺**: 20涓ā鍧�
-- **鏋舵瀯妯″紡**: 鍒嗗眰鏋舵瀯 (Model-DTO-Repository-Service-API)
-
-### 椤圭洰缁撴瀯
-```
-WIDESEA_WMSServer/ # 涓籄PI椤圭洰
-WIDESEA_Model/ # 鏁版嵁妯″瀷灞�
-WIDESEA_DTO/ # 鏁版嵁浼犺緭瀵硅薄灞�
-WIDESEA_Core/ # 鏍稿績鍩虹鏋舵瀯灞�
- 鈹溾攢鈹� BaseRepository/ # 鏁版嵁浠撳偍灞�
- 鈹溾攢鈹� BaseServices/ # 鍩虹鏈嶅姟灞�
- 鈹溾攢鈹� DB/ # 鏁版嵁搴撻厤缃�
- 鈹溾攢鈹� Helper/ # 杈呭姪宸ュ叿绫�
- 鈹溾攢鈹� Utilities/ # 宸ュ叿绫�
- 鈹溾攢鈹� Middlewares/ # 涓棿浠�
- 鈹斺攢鈹� ...
-WIDESEA_Common/ # 鍏叡鏋氫妇鍜屽父閲�
-WIDESEA_BasicService/ # 鍩虹淇℃伅鏈嶅姟瀹炵幇
-WIDESEA_InboundService/ # 鍏ュ簱鏈嶅姟瀹炵幇
-WIDESEA_OutboundService/ # 鍑哄簱鏈嶅姟瀹炵幇
-WIDESEA_StockService/ # 搴撳瓨鏈嶅姟瀹炵幇
-WIDESEA_CheckService/ # 鐩樼偣鏈嶅姟瀹炵幇
-WIDESEA_SystemService/ # 绯荤粺鏈嶅姟瀹炵幇
-WIDESEA_RecordService/ # 璁板綍鏈嶅姟瀹炵幇
-WIDESEA_TaskInfoService/ # 浠诲姟淇℃伅鏈嶅姟瀹炵幇
-```
-
----
-
-## 鍙戠幇鐨勯棶棰樻竻鍗�
-
-### 涓�銆侀珮浼樺厛绾ч棶棰� (P0 - 绔嬪嵆澶勭悊)
-
-#### 1.1 绌哄紓甯告崟鑾峰潡 (涓ラ噸)
-**闂鎻忚堪**: 澶氬浠g爜涓瓨鍦ㄧ┖鐨刢atch鍧�,浼氶殣钘忓紓甯稿鑷撮毦浠ヨ皟璇�
-**褰卞搷鑼冨洿**: 7涓枃浠�
-**绀轰緥浣嶇疆**:
-- `WIDESEA_Core/BaseServices/ServiceBase.cs:114` - 绌篶atch鍧�
-- `WIDESEA_Core/Helper/ObjectExtension.cs:51-54` - 绌篶atch鍧�
-- `WIDESEA_Core/DB/BaseDBConfig.cs:32-34` - 绌篶atch鍧�
-- `WIDESEA_Core/BaseModels/PageDataOptions.cs` - 绌篶atch鍧�
-- `WIDESEA_Core/Middlewares/ApiLogMiddleware.cs` - 绌篶atch鍧�
-- `WIDESEA_Core/Utilities/EntityProperties.cs` - 绌篶atch鍧�
-- `WIDESEA_SystemService/Sys_MenuService.cs` - 绌篶atch鍧�
-- `WIDESEA_SystemService/Sys_UserService.cs` - 绌篶atch鍧�
-
-**閲嶆瀯寤鸿**:
-```csharp
-// 涓嶅ソ鐨勫仛娉�
-try { ... } catch { }
-
-// 濂界殑鍋氭硶
-try
-{
- // 涓氬姟閫昏緫
-}
-catch (Exception ex)
-{
- _logger.LogError(ex, "鎿嶄綔澶辫触");
- throw;
-}
-```
-
-**棰勪及宸ヤ綔閲�**: 2浜哄ぉ
-
----
-
-#### 1.2 鍛藉悕瑙勮寖閿欒 (涓ラ噸)
-**闂鎻忚堪**: 鍏抽敭瀹炰綋绫诲瓨鍦ㄦ嫾鍐欓敊璇�
-**褰卞搷鑼冨洿**: 鍩虹瀹炰綋灞�
-**绀轰緥浣嶇疆**:
-- `WIDESEA_Core/DB/Models/BaseEntity.cs:44` - `Creater` 搴斾负 `Creator`
-- 璇ユ嫾鍐欓敊璇湪鏁版嵁搴撴槧灏勩�佸簭鍒楀寲銆佸鍏ュ鍑虹瓑澶氬浣跨敤
-
-**閲嶆瀯寤鸿**:
-1. 淇 `BaseEntity.Creater` 涓� `Creator`
-2. 娣诲姞鏁版嵁搴撳垪鍒悕鏄犲皠淇濇寔鍏煎鎬�
-3. 鍏ㄥ眬鎼滅储鏇挎崲鎵�鏈夊紩鐢�
-
-**棰勪及宸ヤ綔閲�**: 3浜哄ぉ
-
----
-
-#### 1.3 鏃犻檺寰幆绾跨▼椋庨櫓 (涓ラ噸)
-**闂鎻忚堪**: Logger绫讳娇鐢� `while(true)` 鏃犻檺寰幆,缂轰箯鍙栨秷鏈哄埗
-**褰卞搷浣嶇疆**: `WIDESEA_Core/LogHelper/Logger.cs:32-66`
-
-**閲嶆瀯寤鸿**:
-```csharp
-// 浣跨敤CancellationToken鏇夸唬while(true)
-private readonly CancellationTokenSource _cts = new();
-
-static async void StartWriteLog()
-{
- try
- {
- while (!_cts.IsCancellationRequested)
- {
- // 澶勭悊閫昏緫
- await Task.Delay(5000, _cts.Token);
- }
- }
- catch (OperationCanceledException)
- {
- // 姝e父鍙栨秷
- }
-}
-
-// 娣诲姞Dispose鏂规硶閲婃斁璧勬簮
-public static void Dispose() => _cts.Cancel();
-```
-
-**棰勪及宸ヤ綔閲�**: 1浜哄ぉ
-
----
-
-#### 1.4 TODO娉ㄩ噴鏈畬鎴� (楂�)
-**闂鎻忚堪**: 浠g爜涓瓨鍦ㄦ湭瀹屾垚鐨凾ODO娉ㄩ噴
-**褰卞搷鑼冨洿**: 5涓枃浠�
-**绀轰緥浣嶇疆**:
-- `WIDESEA_Core/Helper/HTTP/HttpClientHelper.cs:181,211,222` - TODO:鏃ュ織璁板綍
-- `WIDESEA_WMSServer/Program.cs` - TODO椤�
-
-**閲嶆瀯寤鸿**: 瀹屾垚鎵�鏈塗ODO鏍囪鐨勫姛鑳芥垨鍒犻櫎鏃犵敤鐨凾ODO
-
-**棰勪及宸ヤ綔閲�**: 1浜哄ぉ
-
----
-
-### 浜屻�佷腑浼樺厛绾ч棶棰� (P1 - 杩戞湡澶勭悊)
-
-#### 2.1 浠g爜閲嶅涓ラ噸 (楂�)
-**闂鎻忚堪**: RepositoryBase鍜孲erviceBase涓瓨鍦ㄥぇ閲忛噸澶嶄唬鐮�
-
-**RepositoryBase閲嶅**:
-- 鍚屾鏂规硶涓庡紓姝ユ柟娉曢�昏緫瀹屽叏閲嶅 (绾�50涓柟娉�)
-- 绀轰緥: `QureyDataById` 鍜� `QureyDataByIdAsync` 鍙槸璋冪敤寮傛鐗堟湰
-
-**ServiceBase閲嶅**:
-- CRUD鎿嶄綔浠g爜閲嶅
-- 鍒嗛〉鏌ヨ閫昏緫閲嶅
-- 瀵煎叆瀵煎嚭閫昏緫閲嶅
-
-**閲嶆瀯寤鸿**:
-1. 浣跨敤婧愪唬鐮佺敓鎴愬櫒鑷姩鐢熸垚寮傛鏂规硶
-2. 鎻愬彇鍏叡閫昏緫鍒版墿灞曟柟娉�
-3. 浣跨敤Template Method妯″紡鍑忓皯閲嶅
-
-**棰勪及宸ヤ綔閲�**: 5浜哄ぉ
-
----
-
-#### 2.2 鏂规硶杩囬暱 (涓�)
-**闂鎻忚堪**: 鍗曚釜鏂规硶琛屾暟杩囧,鍙鎬у樊
-
-**绀轰緥**:
-- `ServiceBase.GetPageData()` - 43琛�
-- `ServiceBase.ValidatePageOptions()` - 52琛�
-- `ServiceBase.GetWhereExpression()` - 121琛�
-- `ServiceBase.UpdateData()` - 63琛�
-
-**閲嶆瀯寤鸿**: 灏嗗ぇ鏂规硶鎷嗗垎涓哄皬鏂规硶,姣忎釜鏂规硶涓嶈秴杩�20琛�
-
-**棰勪及宸ヤ綔閲�**: 4浜哄ぉ
-
----
-
-#### 2.3 娣风敤JSON搴忓垪鍖栧簱 (涓�)
-**闂鎻忚堪**: 鍚屾椂浣跨敤 Newtonsoft.Json 鍜� System.Text.Json
-
-**褰卞搷鑼冨洿**: 16涓枃浠舵贩鐢�
-**绀轰緥**:
-- `HttpClientHelper.cs` 浣跨敤 Newtonsoft.Json
-- `ServiceBase.cs` 浣跨敤 Newtonsoft.Json
-- `Program.cs` 浣跨敤 System.Text.Json
-
-**閲嶆瀯寤鸿**: 缁熶竴浣跨敤 System.Text.Json (.NET Core瀹樻柟鎺ㄨ崘)
-
-**棰勪及宸ヤ綔閲�**: 3浜烘棩
-
----
-
-#### 2.4 杩囧害浣跨敤dynamic绫诲瀷 (涓�)
-**闂鎻忚堪**: 澶ч噺浣跨敤dynamic,闄嶄綆绫诲瀷瀹夊叏鍜孖DE鏀寔
-
-**绀轰緥浣嶇疆**:
-- `Logger.cs:19,151-169` - 浣跨敤dynamic浣滀负鏃ュ織瀵硅薄
-- `BaseDBConfig.cs:57` - 浣跨敤dynamic鎺ユ敹鏁版嵁搴撴煡璇㈢粨鏋�
-
-**閲嶆瀯寤鸿**:
-```csharp
-// 瀹氫箟鏄庣‘鐨勬棩蹇楀疄浣�
-public class LogEntry
-{
- public DateTime BeginDate { get; set; }
- public DateTime EndDate { get; set; }
- public string RequestParam { get; set; }
- public string ResponseParam { get; set; }
- // ...
-}
-```
-
-**棰勪及宸ヤ綔閲�**: 2浜哄ぉ
-
----
-
-#### 2.5 纭紪鐮佸瓧绗︿覆鍜岄瓟娉曟暟瀛� (涓�)
-**闂鎻忚堪**: 澶ч噺纭紪鐮佸��,缂轰箯甯搁噺瀹氫箟
-
-**绀轰緥**:
-- `Logger.cs:37` - 纭紪鐮�500 (鎵归噺鎻掑叆澶у皬)
-- `Logger.cs:42` - 纭紪鐮�5000 (杞闂撮殧)
-- `PDAController.cs:79` - 纭紪鐮佹枃浠跺悕鏍煎紡
-- 鍚勭璺緞瀛楃涓茬‖缂栫爜
-
-**閲嶆瀯寤鸿**: 鎻愬彇涓哄父閲忔垨閰嶇疆椤�
-
-```csharp
-public static class LogConstants
-{
- public const int BatchSize = 500;
- public const int FlushIntervalMs = 5000;
-}
-```
-
-**棰勪及宸ヤ綔閲�**: 2浜哄ぉ
-
----
-
-#### 2.6 鍙嶅皠鎬ц兘寮�閿� (涓�)
-**闂鎻忚堪**: ServiceBase涓绻佷娇鐢ㄥ弽灏勮幏鍙栧睘鎬т俊鎭�
-
-**绀轰緥浣嶇疆**:
-- `ServiceBase.TProperties` - 姣忔閮介噸鏂拌幏鍙�
-- `ObjectExtension.DicToModel` - 浣跨敤鍙嶅皠璧嬪��
-
-**閲嶆瀯寤鸿**:
-1. 缂撳瓨 PropertyInfo
-2. 鑰冭檻浣跨敤缂栬瘧琛ㄨ揪寮忔浛浠e弽灏�
-3. 浣跨敤 Source Generator 鐢熸垚鏄犲皠浠g爜
-
-**棰勪及宸ヤ綔閲�**: 3浜哄ぉ
-
----
-
-#### 2.7 娉ㄩ噴缂哄け (涓�)
-**闂鎻忚堪**: 澶ч噺鏂规硶缂哄皯XML鏂囨。娉ㄩ噴
-
-**缁熻**: 绾�50%鐨勫叕鍏辨柟娉曟病鏈夋敞閲�
-
-**绀轰緥**:
-- `RepositoryBase` 涓ぇ閮ㄥ垎鏂规硶缂哄皯娉ㄩ噴
-- `ServiceBase` 涓鏉傞�昏緫缂哄皯娉ㄩ噴
-- 涓氬姟鏈嶅姟灞傛柟娉曠己灏戞敞閲�
-
-**閲嶆瀯寤鸿**: 涓烘墍鏈夊叕鍏盇PI娣诲姞XML鏂囨。娉ㄩ噴
-
-```csharp
-/// <summary>
-/// 閫氳繃涓婚敭鏌ヨ鏁版嵁
-/// </summary>
-/// <param name="id">涓婚敭鍊�</param>
-/// <returns>鏌ヨ鍒扮殑瀹炰綋,鏈壘鍒拌繑鍥瀗ull</returns>
-public TEntity QueryById(object id) { ... }
-```
-
-**棰勪及宸ヤ綔閲�**: 5浜哄ぉ
-
----
-
-### 涓夈�佷綆浼樺厛绾ч棶棰� (P2 - 闀挎湡浼樺寲)
-
-#### 3.1 澶氱鎴蜂唬鐮佽娉ㄩ噴 (浣�)
-**闂鎻忚堪**: RepositoryBase涓殑澶氱鎴锋灦鏋勪唬鐮佸叏閮ㄨ娉ㄩ噴
-
-**褰卞搷浣嶇疆**: `RepositoryBase.cs:24-55`
-
-**閲嶆瀯寤鸿**: 瑕佷箞鍒犻櫎鏃犵敤浠g爜,瑕佷箞瀹屾垚澶氱鎴峰姛鑳�
-
-**棰勪及宸ヤ綔閲�**: 2浜哄ぉ
-
----
-
-#### 3.2 浠庡簱閰嶇疆浠g爜琚敞閲� (浣�)
-**闂鎻忚堪**: SqlsugarSetup涓殑璇诲啓鍒嗙閰嶇疆琚敞閲�
-
-**褰卞搷浣嶇疆**: `SqlsugarSetup.cs:66-119`
-
-**閲嶆瀯寤鸿**: 鍒犻櫎鎴栧惎鐢ㄨ鍐欏垎绂诲姛鑳�
-
-**棰勪及宸ヤ綔閲�**: 1浜哄ぉ
-
----
-
-#### 3.3 缂哄皯鍗曞厓娴嬭瘯 (楂�)
-**闂鎻忚堪**: 椤圭洰涓畬鍏ㄦ病鏈夊崟鍏冩祴璇�
-
-**寤鸿**: 娣诲姞鏍稿績涓氬姟閫昏緫鐨勫崟鍏冩祴璇�
-
-**棰勪及宸ヤ綔閲�**: 10浜哄ぉ
-
----
-
-#### 3.4 缂哄皯API鏂囨。 (涓�)
-**闂鎻忚堪**: 鍙緷璧朣wagger鑷姩鐢熸垚,缂哄皯璇︾粏鐨勪娇鐢ㄦ枃妗�
-
-**寤鸿**: 缂栧啓API浣跨敤鏂囨。鍜屾灦鏋勮璁℃枃妗�
-
-**棰勪及宸ヤ綔閲�**: 5浜哄ぉ
-
----
-
-#### 3.5 Console.WriteLine鍦ㄧ敓浜т唬鐮� (浣�)
-**闂鎻忚堪**: 澶氬浣跨敤Console.WriteLine
-
-**绀轰緥浣嶇疆**:
-- `Logger.cs:64` - 寮傚父鏃惰緭鍑哄埌Console
-- `BaseDBConfig.cs:52` - SQL閿欒杈撳嚭鍒癈onsole
-- `SqlsugarSetup.cs:58-60` - SQL鎵撳嵃
-
-**閲嶆瀯寤鸿**: 浣跨敤姝e紡鐨勬棩蹇楁鏋�
-
-**棰勪及宸ヤ綔閲�**: 2浜哄ぉ
-
----
-
-#### 3.6 璧勬簮閲婃斁涓嶅綋 (涓�)
-**闂鎻忚堪**: 閮ㄥ垎IDisposable璧勬簮鏈纭噴鏀�
-
-**绀轰緥**:
-- `Logger` 绫绘病鏈夊疄鐜癐Disposable
-- `HttpClientHelper` 鐨凷qlConnection鍙兘鏈噴鏀�
-
-**閲嶆瀯寤鸿**: 瀹炵幇IDisposable妯″紡
-
-**棰勪及宸ヤ綔閲�**: 2浜哄ぉ
-
----
-
-## 閲嶆瀯浼樺厛绾ф帓搴�
-
-### 绗竴闃舵: 淇涓ラ噸闂 (棰勮10浜哄ぉ)
-1. 鉁� 淇鎵�鏈夌┖寮傚父鎹曡幏鍧� (2浜哄ぉ)
-2. 鉁� 淇鍛藉悕瑙勮寖閿欒 - Creater -> Creator (3浜哄ぉ)
-3. 鉁� 淇鏃犻檺寰幆绾跨▼椋庨櫓 (1浜哄ぉ)
-4. 鉁� 瀹屾垚鎴栨竻鐞員ODO娉ㄩ噴 (1浜哄ぉ)
-5. 鉁� 鍒犻櫎娉ㄩ噴鎺夌殑澶氫綑浠g爜 (2浜哄ぉ)
-6. 鉁� 浣跨敤缁熶竴鏃ュ織妗嗘灦鏇夸唬Console (1浜哄ぉ)
-
-### 绗簩闃舵: 鏀瑰杽浠g爜璐ㄩ噺 (棰勮19浜哄ぉ)
-7. 鉁� 鍑忓皯浠g爜閲嶅 - Repository寮傛鏂规硶 (5浜哄ぉ)
-8. 鉁� 鎷嗗垎杩囬暱鏂规硶 (4浜哄ぉ)
-9. 鉁� 缁熶竴JSON搴忓垪鍖栧簱 (3浜烘棩)
-10. 鉁� 鍑忓皯dynamic浣跨敤 (2浜哄ぉ)
-11. 鉁� 鎻愬彇榄旀硶鏁板瓧鍜岀‖缂栫爜 (2浜哄ぉ)
-12. 鉁� 浼樺寲鍙嶅皠鎬ц兘 (3浜哄ぉ)
-
-### 绗笁闃舵: 瀹屽杽鏂囨。鍜屾祴璇� (棰勮15浜哄ぉ)
-13. 鉁� 娣诲姞XML鏂囨。娉ㄩ噴 (5浜哄ぉ)
-14. 鉁� 娣诲姞鍗曞厓娴嬭瘯 (10浜哄ぉ)
-
-### 绗洓闃舵: 鏋舵瀯浼樺寲 (棰勮10浜哄ぉ)
-15. 鉁� 瀹炵幇IDisposable妯″紡 (2浜哄ぉ)
-16. 鉁� 浼樺寲璧勬簮绠$悊 (2浜哄ぉ)
-17. 鉁� 娣诲姞鎬ц兘鐩戞帶 (2浜哄ぉ)
-18. 鉁� 浼樺寲缂撳瓨绛栫暐 (2浜哄ぉ)
-19. 鉁� 缂栧啓鏋舵瀯鏂囨。 (2浜哄ぉ)
-
-**鎬婚浼板伐浣滈噺**: 绾�54浜烘棩 (绾�10.8浜哄懆)
-
----
-
-## 璇︾粏閲嶆瀯寤鸿
-
-### 寤鸿1: 瀹炵幇缁熶竴鐨勫紓甯稿鐞嗘満鍒�
-
-**褰撳墠闂**: 寮傜被澶勭悊鍒嗘暎,娌℃湁缁熶竴绛栫暐
-
-**瑙e喅鏂规**:
-```csharp
-// 瀹氫箟鑷畾涔夊紓甯稿熀绫�
-public abstract class WmsException : Exception
-{
- public string ErrorCode { get; }
- public WmsException(string code, string message) : base(message)
- {
- ErrorCode = code;
- }
-}
-
-// 涓氬姟寮傚父
-public class BusinessException : WmsException
-{
- public BusinessException(string code, string message) : base(code, message) { }
-}
-
-// 缁熶竴寮傚父澶勭悊涓棿浠�
-public class GlobalExceptionHandlerMiddleware
-{
- public async Task InvokeAsync(HttpContext context, RequestDelegate next)
- {
- try
- {
- await next(context);
- }
- catch (WmsException ex)
- {
- context.Response.StatusCode = 400;
- await context.Response.WriteAsJsonAsync(new {
- success = false,
- errorCode = ex.ErrorCode,
- message = ex.Message
- });
- }
- catch (Exception ex)
- {
- context.Response.StatusCode = 500;
- await context.Response.WriteAsJsonAsync(new {
- success = false,
- message = "鏈嶅姟鍣ㄥ唴閮ㄩ敊璇�"
- });
- }
- }
-}
-```
-
----
-
-### 寤鸿2: 閲嶆瀯鏃ュ織绯荤粺
-
-**褰撳墠闂**: Logger绫讳娇鐢ㄦ棤闄愬惊鐜�,绫诲瀷涓嶅畨鍏�
-
-**瑙e喅鏂规**:
-```csharp
-public class WmsLogger : ILogger, IDisposable
-{
- private readonly Channel<LogEntry> _logChannel;
- private readonly Task _processingTask;
- private readonly CancellationTokenSource _cts;
-
- public WmsLogger()
- {
- var options = new BoundedChannelOptions(1000)
- {
- FullMode = BoundedChannelFullMode.Wait
- };
- _logChannel = Channel.CreateBounded<LogEntry>(options);
- _cts = new CancellationTokenSource();
- _processingTask = Task.Run(() => ProcessLogsAsync(_cts.Token));
- }
-
- public async Task LogAsync(LogEntry entry)
- {
- await _logChannel.Writer.WriteAsync(entry);
- }
-
- private async Task ProcessLogsAsync(CancellationToken token)
- {
- var batch = new List<LogEntry>(LogConstants.BatchSize);
-
- while (!token.IsCancellationRequested)
- {
- try
- {
- // 鏀堕泦鎵归噺鏁版嵁
- while (batch.Count < LogConstants.BatchSize &&
- await _logChannel.Reader.WaitToReadAsync(token))
- {
- while (_logChannel.Reader.TryRead(out var entry))
- {
- batch.Add(entry);
- }
- }
-
- if (batch.Count > 0)
- {
- await BatchInsertAsync(batch);
- batch.Clear();
- }
-
- await Task.Delay(LogConstants.FlushIntervalMs, token);
- }
- catch (OperationCanceledException)
- {
- break;
- }
- catch (Exception ex)
- {
- // 璁板綍鍒板鐢ㄤ綅缃�
- System.Diagnostics.Debug.WriteLine($"鏃ュ織澶勭悊澶辫触: {ex.Message}");
- }
- }
-
- // 澶勭悊鍓╀綑鏁版嵁
- if (batch.Count > 0)
- {
- await BatchInsertAsync(batch);
- }
- }
-
- public void Dispose()
- {
- _cts.Cancel();
- _processingTask.Wait();
- _cts.Dispose();
- }
-}
-```
-
----
-
-### 寤鸿3: 浣跨敤缂栬瘧鏃跺弽灏勪紭鍖�
-
-**褰撳墠闂**: 杩愯鏃跺弽灏勬�ц兘宸�
-
-**瑙e喅鏂规**: 浣跨敤Source Generator
-```csharp
-// 瀹氫箟鏍囪鎺ュ彛
-public interface IModelMapper<T> where T : class
-{
- T MapFrom(Dictionary<string, object> dict);
-}
-
-// Source Generator鑷姩鐢熸垚瀹炵幇
-// 鐢熸垚浠g爜绀轰緥:
-public partial class ModelMapper : IModelMapper<YourEntity>
-{
- public YourEntity MapFrom(Dictionary<string, object> dict)
- {
- return new YourEntity
- {
- Id = dict.TryGetValue("Id", out var id) ? (int)id : 0,
- Name = dict.TryGetValue("Name", out var name) ? (string)name : null,
- // ... 鍏朵粬灞炴��
- };
- }
-}
-```
-
----
-
-### 寤鸿4: 瀹炵幇Repository妯″紡鏈�浣冲疄璺�
-
-**褰撳墠闂**: Repository鑱岃矗涓嶆竻鏅�
-
-**瑙e喅鏂规**:
-```csharp
-// 瀹氫箟瑙勮寖鎺ュ彛
-public interface IRepository<T> where T : class
-{
- Task<T?> GetByIdAsync(object id);
- Task<IEnumerable<T>> GetAllAsync();
- Task<IEnumerable<T>> FindAsync(Expression<Func<T, bool>> predicate);
- Task AddAsync(T entity);
- Task AddRangeAsync(IEnumerable<T> entities);
- Task UpdateAsync(T entity);
- Task DeleteAsync(object id);
- Task<int> CountAsync(Expression<Func<T, bool>> predicate = null);
-}
-
-// 瀹炵幇鍩虹被
-public abstract class RepositoryBase<T> : IRepository<T> where T : class
-{
- protected readonly ISqlSugarClient Db;
-
- public RepositoryBase(ISqlSugarClient db)
- {
- Db = db;
- }
-
- public virtual async Task<T?> GetByIdAsync(object id)
- {
- return await Db.Queryable<T>().In(id).FirstAsync();
- }
-
- // ... 鍏朵粬瀹炵幇
-}
-
-// 閽堝鐗瑰畾瀹炰綋鐨凴epository鍙互鎵╁睍
-public interface IUserRepository : IRepository<User>
-{
- Task<User?> GetByUsernameAsync(string username);
-}
-
-public class UserRepository : RepositoryBase<User>, IUserRepository
-{
- public UserRepository(ISqlSugarClient db) : base(db) { }
-
- public async Task<User?> GetByUsernameAsync(string username)
- {
- return await Db.Queryable<User>()
- .Where(u => u.Username == username)
- .FirstAsync();
- }
-}
-```
-
----
-
-### 寤鸿5: 瀹炵幇CQRS妯″紡鍒嗙璇诲啓
-
-**褰撳墠闂**: 鎵�鏈夋搷浣滈兘鍦⊿ervice涓贩鍚�
-
-**瑙e喅鏂规**:
-```csharp
-// 鍛戒护鎺ュ彛
-public interface ICommandHandler<TCommand, TResult>
-{
- Task<TResult> HandleAsync(TCommand command);
-}
-
-// 鏌ヨ鎺ュ彛
-public interface IQueryHandler<TQuery, TResult>
-{
- Task<TResult> HandleAsync(TQuery query);
-}
-
-// 绀轰緥鍛戒护
-public record CreateInboundOrderCommand(
- string OrderNo,
- int SupplierId,
- List<InboundOrderItem> Items
-) : IRequest<InboundOrder>;
-
-// 绀轰緥鏌ヨ
-public record GetInboundOrderQuery(int OrderId) : IRequest<InboundOrderDto>;
-
-// 鍛戒护澶勭悊鍣�
-public class CreateInboundOrderCommandHandler
- : ICommandHandler<CreateInboundOrderCommand, InboundOrder>
-{
- public async Task<InboundOrder> HandleAsync(CreateInboundOrderCommand command)
- {
- // 鍒涘缓閫昏緫
- }
-}
-```
-
----
-
-## 閲嶆瀯鎵ц妫�鏌ユ竻鍗�
-
-### 浠g爜璐ㄩ噺妫�鏌�
-- [ ] 鎵�鏈夌┖catch鍧楀凡绉婚櫎鎴栨坊鍔犳棩蹇�
-- [ ] 鎵�鏈塸ublic鏂规硶閮芥湁XML娉ㄩ噴
-- [ ] 娌℃湁浣跨敤Console.WriteLine鐨勪唬鐮�
-- [ ] 娌℃湁榄旀硶鏁板瓧鍜岀‖缂栫爜瀛楃涓�
-- [ ] 鍗曚釜鏂规硶涓嶈秴杩�50琛�
-- [ ] 鍗曚釜绫讳笉瓒呰繃500琛�
-- [ ] 鍦堝鏉傚害鎺у埗鍦�10浠ュ唴
-
-### 鏋舵瀯妫�鏌�
-- [ ] 渚濊禆娉ㄥ叆浣跨敤鏋勯�犲嚱鏁版敞鍏�
-- [ ] 鎵�鏈塈Disposable璧勬簮閮芥纭噴鏀�
-- [ ] 娌℃湁寰幆渚濊禆
-- [ ] 鎺ュ彛鍜屽疄鐜板垎绂绘竻鏅�
-- [ ] 灞傛鍒嗘槑,娌℃湁瓒婂眰璋冪敤
-
-### 鎬ц兘妫�鏌�
-- [ ] 鏁版嵁搴撴煡璇娇鐢ㄥ紓姝ユ柟娉�
-- [ ] 鍙嶅皠浣跨敤宸蹭紭鍖栨垨缂撳瓨
-- [ ] 闆嗗悎鎿嶄綔浣跨敤LINQ鑰岄潪寰幆
-- [ ] 瀛楃涓叉搷浣滀娇鐢⊿tringBuilder
-
-### 瀹夊叏妫�鏌�
-- [ ] SQL娉ㄥ叆椋庨櫓宸叉秷闄�
-- [ ] 鏁忔劅淇℃伅宸插姞瀵嗗瓨鍌�
-- [ ] API鏈夐�傚綋鐨勮璇佸拰鎺堟潈
-- [ ] 寮傚父淇℃伅涓嶆毚闇插唴閮ㄧ粏鑺�
-
-### 娴嬭瘯妫�鏌�
-- [ ] 鏍稿績涓氬姟閫昏緫鏈夊崟鍏冩祴璇�
-- [ ] 鍏抽敭API鏈夐泦鎴愭祴璇�
-- [ ] 娴嬭瘯瑕嗙洊鐜囦笉浣庝簬60%
-
----
-
-## 椋庨櫓璇勪及
-
-### 楂橀闄╅」
-1. **鏁版嵁妯″瀷淇敼椋庨櫓**: 淇 `Creater` 涓� `Creator` 鍙兘褰卞搷鐜版湁鏁版嵁搴�
- - **缂撹В鎺柦**: 娣诲姞鏁版嵁搴撳垪鍒悕鏄犲皠,鍒嗘壒娆¤縼绉�
-
-2. **閲嶆瀯ServiceBase椋庨櫓**: 璇ョ被琚ぇ閲忔湇鍔$户鎵�
- - **缂撹В鎺柦**: 淇濇寔鍏叡鎺ュ彛涓嶅彉,鍏堥噸鏋勫唴閮ㄥ疄鐜�
-
-### 涓闄╅」
-1. **缁熶竴JSON搴撻闄�**: 鍙兘褰卞搷搴忓垪鍖栧吋瀹规��
- - **缂撹В鎺柦**: 浣跨敤JsonConverter淇濇寔鍏煎鎬�
-
-2. **鏇挎崲鏃ュ織绯荤粺椋庨櫓**: 鏃ュ織涓㈠け椋庨櫓
- - **缂撹В鎺柦**: 鏂版棫绯荤粺骞惰杩愯涓�娈垫椂闂�
-
----
-
-## 寤鸿鐨勯噸鏋勫伐鍏�
-
-1. **Roslyn Analyzers**: 鑷姩妫�娴嬩唬鐮侀棶棰�
-2. **SonarQube**: 浠g爜璐ㄩ噺鍒嗘瀽
-3. **Resharper**: 浠g爜閲嶆瀯杈呭姪
-4. **Source Generator**: 鑷姩鐢熸垚浠g爜
-5. **xUnit/NUnit**: 鍗曞厓娴嬭瘯妗嗘灦
-6. **Moq/NSubstitute**: Mock妗嗘灦
-
----
-
-## 鎬荤粨
-
-### 鍏抽敭鍙戠幇
-1. 椤圭洰閲囩敤缁忓吀鍒嗗眰鏋舵瀯,浣嗗疄鐜颁笉澶熻鑼�
-2. 瀛樺湪涓ラ噸鐨勪唬鐮侀噸澶嶅拰绌哄紓甯告崟鑾烽棶棰�
-3. 缂哄皯娴嬭瘯鍜屾枃妗�
-4. 鏈変竴瀹氱殑鎶�鏈�哄姟闇�瑕佹竻鐞�
-
-### 鏍稿績寤鸿
-1. **绔嬪嵆淇**: 绌哄紓甯告崟鑾峰潡銆佸懡鍚嶉敊璇�佹棤闄愬惊鐜闄�
-2. **鐭湡鏀硅繘**: 鍑忓皯浠g爜閲嶅銆佺粺涓�鎶�鏈爤銆佹坊鍔犳敞閲�
-3. **闀挎湡浼樺寲**: 瀹屽杽娴嬭瘯銆佷紭鍖栨灦鏋勩�佹彁鍗囨�ц兘
-
-### 棰勬湡鏀剁泭
-- 浠g爜鍙淮鎶ゆ�ф彁鍗� 50%
-- Bug鏁伴噺闄嶄綆 30%
-- 鏂板姛鑳藉紑鍙戞晥鐜囨彁鍗� 25%
-- 绯荤粺鎬ц兘鎻愬崌 15%
-
----
-
-**鏂囨。鐢熸垚鏃堕棿**: 2026-03-10
-**鍒嗘瀽宸ュ叿鐗堟湰**: Claude Code Analysis
-**椤圭洰鐗堟湰**: WIDESEA_WMSServer v1.0
diff --git a/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-design.md b/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-design.md
deleted file mode 100644
index d684f04..0000000
--- a/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-design.md
+++ /dev/null
@@ -1,368 +0,0 @@
-# 鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟璁捐鏂囨。
-
-**鏃ユ湡**: 2026-03-06
-**浣滆��**: Claude Code
-**鐘舵��**: 寰呭疄鏂�
-
-## 姒傝堪
-
-鏈璁℃棬鍦ㄥ疄鐜颁竴涓嚜鍔ㄥ嚭搴撲换鍔″悗鍙版湇鍔★紝璇ユ湇鍔″湪 WMS 搴旂敤绋嬪簭鍚姩鍚庤嚜鍔ㄨ繍琛岋紝瀹氭湡妫�鏌ュ簱瀛樹腑鍒版湡闇�瑕佸嚭搴撶殑鐗╂枡锛屽苟鑷姩鍒涘缓鍑哄簱浠诲姟閫氱煡 WCS 绯荤粺鎵ц銆�
-
-## 闇�姹傝儗鏅�
-
-褰撳墠绯荤粺涓紝搴撳瓨璁板綍鍖呭惈 `OutboundDate` 瀛楁锛岃〃绀洪鏈熺殑鍑哄簱鏃ユ湡銆傞渶瑕佸疄鐜颁竴涓悗鍙版湇鍔★紝鑷姩妫�娴嬪凡鍒版湡锛坄OutboundDate <= 褰撳墠鏃堕棿`锛夌殑搴撳瓨锛屽苟鍒涘缓鐩稿簲鐨勫嚭搴撲换鍔°��
-
-## 鎶�鏈柟妗�
-
-### 鏋舵瀯閫夋嫨
-
-閲囩敤 **BackgroundService** 妯″紡瀹炵幇鍚庡彴瀹氭椂浠诲姟銆�
-
-**鐞嗙敱**锛�
-- .NET 鏍囧噯妯″紡锛岀畝鍗曟槗鎳�
-- 鏃犻渶棰濆渚濊禆
-- 鐢熷懡鍛ㄦ湡涓庡簲鐢ㄧ▼搴忕粦瀹氾紝鑷姩绠$悊鍚姩/鍋滄
-- 鏄撲簬閰嶇疆妫�鏌ラ棿闅�
-
-### 缁勪欢缁撴瀯
-
-```
-WIDESEA_WMSServer/
-鈹溾攢鈹� BackgroundServices/
-鈹� 鈹斺攢鈹� AutoOutboundTaskBackgroundService.cs # 鏂板缓锛氬悗鍙版湇鍔$被
-鈹溾攢鈹� WIDESEA_TaskInfoService/
-鈹� 鈹斺攢鈹� TaskService.cs # 淇敼锛氭坊鍔犳柊鏂规硶
-鈹溾攢鈹� WIDESEA_ITaskInfoService/
-鈹� 鈹斺攢鈹� ITaskService.cs # 淇敼锛氭坊鍔犳帴鍙e畾涔�
-鈹溾攢鈹� WIDESEA_Core/Core/
-鈹� 鈹斺攢鈹� AutoOutboundTaskOptions.cs # 鏂板缓锛氶厤缃ā鍨嬬被
-鈹斺攢鈹� Program.cs # 淇敼锛氭敞鍐屽悗鍙版湇鍔″拰閰嶇疆
-```
-
-## 璇︾粏璁捐
-
-### 1. 閰嶇疆璁捐
-
-鍦� `appsettings.json` 涓坊鍔犻厤缃妭锛�
-
-```json
-{
- "AutoOutboundTask": {
- "Enable": true, // 鏄惁鍚敤鑷姩鍑哄簱浠诲姟
- "CheckIntervalSeconds": 300, // 妫�鏌ラ棿闅旓紙绉掞級锛岄粯璁�5鍒嗛挓
- "TargetAddresses": { // 鎸夊贩閬撻厤缃洰鏍囧湴鍧�
- "GW": "10081", // 楂樻俯宸烽亾鐩爣鍦板潃
- "CW": "10080" // 甯告俯宸烽亾鐩爣鍦板潃
- }
- }
-}
-```
-
-### 2. 閰嶇疆妯″瀷绫�
-
-**鏂囦欢**: `WIDESEA_Core/Core/AutoOutboundTaskOptions.cs`
-
-```csharp
-namespace WIDESEA_Core.Core
-{
- public class AutoOutboundTaskOptions
- {
- /// <summary>
- /// 鏄惁鍚敤鑷姩鍑哄簱浠诲姟
- /// </summary>
- public bool Enable { get; set; } = true;
-
- /// <summary>
- /// 妫�鏌ラ棿闅旓紙绉掞級
- /// </summary>
- public int CheckIntervalSeconds { get; set; } = 300;
-
- /// <summary>
- /// 鎸夊贩閬撳墠缂�閰嶇疆鐩爣鍦板潃
- /// </summary>
- public Dictionary<string, string> TargetAddresses { get; set; }
- = new()
- {
- { "GW", "10081" },
- { "CW", "10080" }
- };
- }
-}
-```
-
-### 3. 鍚庡彴鏈嶅姟绫�
-
-**鏂囦欢**: `WIDESEA_WMSServer/BackgroundServices/AutoOutboundTaskBackgroundService.cs`
-
-```csharp
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-
-namespace WIDESEA_WMSServer.BackgroundServices
-{
- public class AutoOutboundTaskBackgroundService : BackgroundService
- {
- private readonly ILogger<AutoOutboundTaskBackgroundService> _logger;
- private readonly ITaskService _taskService;
- private readonly AutoOutboundTaskOptions _options;
-
- public AutoOutboundTaskBackgroundService(
- ILogger<AutoOutboundTaskBackgroundService> logger,
- ITaskService taskService,
- IOptions<AutoOutboundTaskOptions> options)
- {
- _logger = logger;
- _taskService = taskService;
- _options = options.Value;
- }
-
- protected override async Task ExecuteAsync(CancellationToken stoppingToken)
- {
- _logger.LogInformation("鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟宸插惎鍔�");
-
- if (!_options.Enable)
- {
- _logger.LogInformation("鑷姩鍑哄簱浠诲姟鍔熻兘宸茬鐢�");
- return;
- }
-
- while (!stoppingToken.IsCancellationRequested)
- {
- try
- {
- _logger.LogDebug("寮�濮嬫鏌ュ埌鏈熷簱瀛�...");
- var result = await _taskService.CreateAutoOutboundTasksAsync();
- _logger.LogInformation("鍒版湡搴撳瓨妫�鏌ュ畬鎴�: {Message}", result.Message);
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "鑷姩鍑哄簱浠诲姟鍒涘缓澶辫触");
- }
-
- var delay = TimeSpan.FromSeconds(_options.CheckIntervalSeconds);
- _logger.LogDebug("绛夊緟 {Seconds} 绉掑悗杩涜涓嬫妫�鏌�", delay.TotalSeconds);
- await Task.Delay(delay, stoppingToken);
- }
-
- _logger.LogInformation("鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟宸插仠姝�");
- }
- }
-}
-```
-
-### 4. TaskService 鏂板鏂规硶
-
-**鎺ュ彛瀹氫箟**: `WIDESEA_ITaskInfoService/ITaskService.cs`
-
-```csharp
-/// <summary>
-/// 鑷姩鍒涘缓鍑哄簱浠诲姟 - 鏌ヨ鍒版湡搴撳瓨骞跺垱寤轰换鍔�
-/// </summary>
-/// <returns>鍖呭惈鍒涘缓缁撴灉鐨勫搷搴斿璞�</returns>
-Task<WebResponseContent> CreateAutoOutboundTasksAsync();
-```
-
-**瀹炵幇**: `WIDESEA_TaskInfoService/TaskService.cs`
-
-```csharp
-public async Task<WebResponseContent> CreateAutoOutboundTasksAsync()
-{
- try
- {
- // 1. 鏌ヨ鍒版湡搴撳瓨
- var expiredStocks = await _stockInfoService.Repository
- .QueryAsync(s => s.OutboundDate <= DateTime.Now
- && s.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.GetHashCode()
- && s.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode(),
- nameof(Dt_StockInfo.LocationDetails));
-
- if (!expiredStocks.Any())
- {
- return WebResponseContent.Instance.OK("鏃犲埌鏈熷簱瀛橀渶瑕佸鐞�");
- }
-
- // 2. 妫�鏌ュ凡瀛樺湪鐨勪换鍔�
- var palletCodes = expiredStocks.Select(s => s.PalletCode).ToList();
- var existingTasks = await Repository.QueryAsync(t =>
- palletCodes.Contains(t.PalletCode)
- && t.TaskType == TaskTypeEnum.Outbound.GetHashCode()
- && t.TaskStatus != TaskStatusEnum.Completed.GetHashCode());
-
- var processedPallets = existingTasks.Select(t => t.PalletCode).ToHashSet();
-
- // 3. 绛涢�夐渶瑕佸鐞嗙殑搴撳瓨
- var stocksToProcess = expiredStocks
- .Where(s => !processedPallets.Contains(s.PalletCode))
- .ToList();
-
- if (!stocksToProcess.Any())
- {
- return WebResponseContent.Instance.OK("鎵�鏈夊埌鏈熷簱瀛樺凡瀛樺湪浠诲姟");
- }
-
- // 4. 鑾峰彇閰嶇疆鐨勭洰鏍囧湴鍧�鏄犲皠
- var targetAddressMap = _appSettings.Get<Dictionary<string, string>>("AutoOutboundTask:TargetAddresses")
- ?? new Dictionary<string, string>();
-
- // 5. 鎵归噺鍒涘缓浠诲姟
- var taskList = new List<Dt_Task>();
- foreach (var stock in stocksToProcess)
- {
- // 鏍规嵁宸烽亾纭畾鐩爣鍦板潃
- var targetAddress = DetermineTargetAddress(stock.LocationDetails.RoadwayNo, targetAddressMap);
-
- var task = new Dt_Task
- {
- WarehouseId = stock.WarehouseId,
- PalletCode = stock.PalletCode,
- PalletType = stock.PalletType,
- SourceAddress = stock.LocationCode,
- CurrentAddress = stock.LocationCode,
- NextAddress = targetAddress,
- TargetAddress = targetAddress,
- Roadway = stock.LocationDetails.RoadwayNo,
- TaskType = TaskTypeEnum.Outbound.GetHashCode(),
- TaskStatus = TaskStatusEnum.New.GetHashCode(),
- Grade = 1,
- TaskNum = await Repository.GetTaskNo(),
- Creater = "system_auto"
- };
- taskList.Add(task);
- }
-
- var addResult = await BaseDal.AddDataAsync(taskList) > 0;
- if (!addResult)
- {
- return WebResponseContent.Instance.Error($"鎵归噺鍒涘缓浠诲姟澶辫触锛屽叡 {taskList.Count} 涓换鍔�");
- }
-
- // 6. 閫氱煡 WCS
- var notifyTasks = taskList.Select(async task =>
- {
- try
- {
- var wmstaskDto = _mapper.Map<WMSTaskDTO>(task);
- await _httpClientHelper.Post<WebResponseContent>(
- "http://logistics-service/api/logistics/notifyoutbound",
- JsonSerializer.Serialize(wmstaskDto));
- }
- catch (Exception ex)
- {
- _logger.LogWarning(ex, "WCS 閫氱煡澶辫触锛屼换鍔$紪鍙�: {TaskNum}", task.TaskNum);
- }
- });
-
- await Task.WhenAll(notifyTasks);
-
- return WebResponseContent.Instance.OK($"鎴愬姛鍒涘缓 {taskList.Count} 涓嚭搴撲换鍔�", taskList.Count);
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "鑷姩鍒涘缓鍑哄簱浠诲姟鏃跺彂鐢熼敊璇�");
- return WebResponseContent.Instance.Error($"鑷姩鍒涘缓鍑哄簱浠诲姟澶辫触: {ex.Message}");
- }
-}
-
-private string DetermineTargetAddress(string roadway, Dictionary<string, string> addressMap)
-{
- if (string.IsNullOrWhiteSpace(roadway))
- return "10080"; // 榛樿鍦板潃
-
- foreach (var kvp in addressMap)
- {
- if (roadway.Contains(kvp.Key))
- return kvp.Value;
- }
-
- return "10080"; // 榛樿鍦板潃
-}
-```
-
-### 5. Program.cs 娉ㄥ唽鏈嶅姟
-
-```csharp
-// 閰嶇疆鑷姩鍑哄簱浠诲姟閫夐」
-builder.Services.Configure<AutoOutboundTaskOptions>(
- builder.Configuration.GetSection("AutoOutboundTask"));
-
-// 娉ㄥ唽鍚庡彴鏈嶅姟
-builder.Services.AddHostedService<AutoOutboundTaskBackgroundService>();
-```
-
-## 鏁版嵁娴佺▼
-
-```mermaid
-graph TD
- A[搴旂敤绋嬪簭鍚姩] --> B[娉ㄥ唽 AutoOutboundTaskBackgroundService]
- B --> C[鍚庡彴鏈嶅姟鍚姩]
- C --> D{妫�鏌� Enable 閰嶇疆}
- D -->|绂佺敤| E[鏈嶅姟閫�鍑篯
- D -->|鍚敤| F[杩涘叆瀹氭椂寰幆]
- F --> G[璋冪敤 CreateAutoOutboundTasksAsync]
- G --> H[鏌ヨ鍒版湡搴撳瓨]
- H --> I[妫�鏌ュ凡瀛樺湪鐨勪换鍔
- I --> J[绛涢�夐渶瑕佸鐞嗙殑搴撳瓨]
- J --> K[鎵归噺鍒涘缓 Dt_Task]
- K --> L[閫氱煡 WCS 绯荤粺]
- L --> M[杩斿洖缁撴灉]
- M --> N[璁板綍鏃ュ織]
- N --> O[绛夊緟閰嶇疆鐨勯棿闅旀椂闂碷
- O --> F
-```
-
-## 閿欒澶勭悊
-
-### 鍚庡彴鏈嶅姟绾у埆
-- 鎹曡幏鎵�鏈夊紓甯革紝璁板綍閿欒鏃ュ織
-- 涓嶄腑鏂湇鍔″惊鐜�
-- 浣跨敤 `try-catch` 鍖呰9鏁翠釜寰幆浣�
-
-### 浠诲姟鍒涘缓绾у埆
-- 鍗曚釜浠诲姟鍒涘缓澶辫触涓嶅奖鍝嶅叾浠栦换鍔�
-- 璁板綍澶辫触鐨勬墭鐩樼爜鍜屽師鍥�
-- 杩斿洖璇︾粏鐨勬垚鍔�/澶辫触缁熻
-
-### WCS 閫氱煡澶辫触
-- 浠诲姟宸插垱寤哄埌鏁版嵁搴擄紝浣� WCS 閫氱煡澶辫触
-- 璁板綍璀﹀憡鏃ュ織
-- 涓嶉噸璇曪紙WCS 浼氫富鍔ㄨ疆璇㈣幏鍙栦换鍔★級
-
-## 鏃ュ織璁板綍
-
-| 绾у埆 | 鍦烘櫙 |
-|------|------|
-| Information | 鏈嶅姟鍚姩/鍋滄銆佹鏌ュ懆鏈熴�佸垱寤轰换鍔℃暟閲� |
-| Warning | WCS 閫氱煡澶辫触銆佹棤鍒版湡搴撳瓨 |
-| Error | 寮傚父鎯呭喌銆佹暟鎹簱鎿嶄綔澶辫触 |
-
-## 娴嬭瘯璁″垝
-
-1. **鍗曞厓娴嬭瘯**
- - `CreateAutoOutboundTasksAsync` 鏂规硶閫昏緫
- - `DetermineTargetAddress` 鍦板潃鏄犲皠閫昏緫
-
-2. **闆嗘垚娴嬭瘯**
- - 鍚庡彴鏈嶅姟鍚姩鍜屽仠姝�
- - 閰嶇疆椤规纭姞杞�
- - 鏁版嵁搴撴煡璇㈠拰浠诲姟鍒涘缓
- - WCS 閫氱煡鎺ュ彛璋冪敤
-
-3. **鎵嬪姩娴嬭瘯**
- - 淇敼搴撳瓨 `OutboundDate` 涓鸿繃鍘绘椂闂�
- - 瑙傚療鏃ュ織纭浠诲姟鍒涘缓
- - 楠岃瘉 WCS 鏄惁鏀跺埌閫氱煡
-
-## 閮ㄧ讲娉ㄦ剰浜嬮」
-
-1. 纭繚 `appsettings.json` 涓厤缃簡姝g‘鐨� `AutoOutboundTask` 鑺�
-2. 鏍规嵁瀹為檯闇�姹傝皟鏁� `CheckIntervalSeconds`
-3. 楠岃瘉 WCS 閫氱煡鎺ュ彛鍦板潃鏄惁姝g‘
-4. 鐩戞帶搴旂敤绋嬪簭鏃ュ織锛岀‘璁ゅ悗鍙版湇鍔℃甯歌繍琛�
-
-## 鏈潵鏀硅繘
-
-1. 鏀寔鏇村鏉傜殑鐩爣鍦板潃閰嶇疆瑙勫垯
-2. 娣诲姞浠诲姟鍒涘缓鐨勭粺璁℃暟鎹拰鐩戞帶
-3. 鏀寔鎵嬪姩瑙﹀彂浠诲姟鍒涘缓鐨勭鐞嗘帴鍙�
-4. 鑰冭檻浣跨敤鍒嗗竷寮忛攣鏀寔澶氬疄渚嬮儴缃�
diff --git a/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-implementation.md b/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-implementation.md
deleted file mode 100644
index e5cac54..0000000
--- a/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-implementation.md
+++ /dev/null
@@ -1,729 +0,0 @@
-# 鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟瀹炵幇璁″垝
-
-> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
-
-**鐩爣:** 瀹炵幇涓�涓悗鍙版湇鍔★紝鑷姩妫�娴嬪埌鏈熷簱瀛樺苟鍒涘缓鍑哄簱浠诲姟閫氱煡 WCS 绯荤粺
-
-**鏋舵瀯:** 浣跨敤 BackgroundService 妯″紡瀹炵幇瀹氭椂浠诲姟锛岄�氳繃 ITaskService 鏌ヨ鍒版湡搴撳瓨銆佸垱寤轰换鍔″苟閫氱煡 WCS
-
-**鎶�鏈爤:** .NET 6, BackgroundService, SqlSugar, Autofac, appsettings.json 閰嶇疆
-
----
-
-## 鍓嶇疆妫�鏌�
-
-鍦ㄥ紑濮嬪疄鐜板墠锛岃纭锛�
-- 椤圭洰浣嶄簬: `d:\Git\ShanMeiXinNengYuan\Code\WMS\WIDESEA_WMSServer`
-- 涓婚」鐩枃浠�: `WIDESEA_WMSServer\WIDESEA_WMSServer.csproj`
-- 宸查槄璇昏璁℃枃妗�: `docs/plans/2026-03-06-auto-outbound-task-design.md`
-
----
-
-## Task 1: 鍒涘缓閰嶇疆妯″瀷绫�
-
-**Files:**
-- Create: `WIDESEA_Core/Core/AutoOutboundTaskOptions.cs`
-
-**Step 1: 鍒涘缓閰嶇疆妯″瀷绫�**
-
-鍒涘缓鏂囦欢 `WIDESEA_Core/Core/AutoOutboundTaskOptions.cs`:
-
-```csharp
-using System.Collections.Generic;
-
-namespace WIDESEA_Core.Core
-{
- /// <summary>
- /// 鑷姩鍑哄簱浠诲姟閰嶇疆閫夐」
- /// </summary>
- public class AutoOutboundTaskOptions
- {
- /// <summary>
- /// 鏄惁鍚敤鑷姩鍑哄簱浠诲姟
- /// </summary>
- public bool Enable { get; set; } = true;
-
- /// <summary>
- /// 妫�鏌ラ棿闅旓紙绉掞級
- /// </summary>
- public int CheckIntervalSeconds { get; set; } = 300;
-
- /// <summary>
- /// 鎸夊贩閬撳墠缂�閰嶇疆鐩爣鍦板潃
- /// </summary>
- public Dictionary<string, string> TargetAddresses { get; set; }
- = new()
- {
- { "GW", "10081" },
- { "CW", "10080" }
- };
- }
-}
-```
-
-**Step 2: 鎻愪氦閰嶇疆妯″瀷绫�**
-
-```bash
-git add WIDESEA_Core/Core/AutoOutboundTaskOptions.cs
-git commit -m "feat: 娣诲姞鑷姩鍑哄簱浠诲姟閰嶇疆妯″瀷绫�"
-```
-
----
-
-## Task 2: 鏇存柊 appsettings.json 閰嶇疆
-
-**Files:**
-- Modify: `WIDESEA_WMSServer/appsettings.json`
-
-**Step 1: 娣诲姞閰嶇疆鑺�**
-
-鍦� `appsettings.json` 涓坊鍔� `AutoOutboundTask` 閰嶇疆鑺傦紙鍦� `WebSocketPort` 鍚庨潰锛�:
-
-```json
-{
- ...,
- "WebSocketPort": 9296,
- "AutoOutboundTask": {
- "Enable": true,
- "CheckIntervalSeconds": 300,
- "TargetAddresses": {
- "GW": "10081",
- "CW": "10080"
- }
- }
-}
-```
-
-**Step 2: 鎻愪氦閰嶇疆鏇存柊**
-
-```bash
-git add WIDESEA_WMSServer/appsettings.json
-git commit -m "config: 娣诲姞鑷姩鍑哄簱浠诲姟閰嶇疆"
-```
-
----
-
-## Task 3: 鍦� ITaskService 鎺ュ彛涓坊鍔犳柟娉曞畾涔�
-
-**Files:**
-- Modify: `WIDESEA_ITaskInfoService/ITaskService.cs`
-
-**Step 1: 娣诲姞鎺ュ彛鏂规硶**
-
-鍦� `ITaskService.cs` 涓坊鍔犳柟娉曞畾涔夛紙鍦ㄦ枃浠舵湯灏撅紝`}` 涔嬪墠锛�:
-
-```csharp
-/// <summary>
-/// 鑷姩鍒涘缓鍑哄簱浠诲姟 - 鏌ヨ鍒版湡搴撳瓨骞跺垱寤轰换鍔�
-/// </summary>
-/// <returns>鍖呭惈鍒涘缓缁撴灉鐨勫搷搴斿璞�</returns>
-Task<WebResponseContent> CreateAutoOutboundTasksAsync();
-```
-
-**Step 2: 鎻愪氦鎺ュ彛鏇存柊**
-
-```bash
-git add WIDESEA_ITaskInfoService/ITaskService.cs
-git commit -m "feat: 娣诲姞鑷姩鍑哄簱浠诲姟鍒涘缓鎺ュ彛鏂规硶"
-```
-
----
-
-## Task 4: 鍦� TaskService 涓疄鐜版牳蹇冮�昏緫
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`
-
-**Step 1: 娣诲姞渚濊禆娉ㄥ叆瀛楁**
-
-鍦� `TaskService` 绫荤殑绉佹湁瀛楁鍖哄煙锛堢 20-25 琛岄檮杩戯級娣诲姞:
-
-```csharp
-private readonly IConfiguration _configuration;
-```
-
-淇敼鏋勯�犲嚱鏁扮鍚嶏紙绗� 37-48 琛岋級锛屾坊鍔� `IConfiguration` 鍙傛暟:
-
-```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;
-}
-```
-
-**Step 2: 娣诲姞鍦板潃鏄犲皠杈呭姪鏂规硶**
-
-鍦� `TaskService` 绫讳腑娣诲姞绉佹湁鏂规硶锛堝湪 `GetTasksByPalletCodeAsync` 鏂规硶鍚庨潰锛宍#endregion` 涔嬪墠锛�:
-
-```csharp
-/// <summary>
-/// 鏍规嵁宸烽亾纭畾鐩爣鍦板潃
-/// </summary>
-private string DetermineTargetAddress(string roadway, Dictionary<string, string> addressMap)
-{
- if (string.IsNullOrWhiteSpace(roadway))
- return "10080"; // 榛樿鍦板潃
-
- foreach (var kvp in addressMap)
- {
- if (roadway.Contains(kvp.Key))
- return kvp.Value;
- }
-
- return "10080"; // 榛樿鍦板潃
-}
-```
-
-**Step 3: 瀹炵幇鑷姩鍑哄簱浠诲姟鍒涘缓鏂规硶**
-
-鍦� `TaskService` 绫荤殑 `#endregion WCS閫昏緫澶勭悊` 涔嬪墠娣诲姞瀹屾暣鏂规硶:
-
-```csharp
-/// <summary>
-/// 鑷姩鍒涘缓鍑哄簱浠诲姟 - 鏌ヨ鍒版湡搴撳瓨骞跺垱寤轰换鍔�
-/// </summary>
-public async Task<WebResponseContent> CreateAutoOutboundTasksAsync()
-{
- try
- {
- // 1. 鏌ヨ鍒版湡搴撳瓨
- var expiredStocks = await _stockInfoService.Repository
- .QueryAsync(s => s.OutboundDate <= DateTime.Now
- && s.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.GetHashCode());
-
- if (expiredStocks == null || !expiredStocks.Any())
- {
- return WebResponseContent.Instance.OK("鏃犲埌鏈熷簱瀛橀渶瑕佸鐞�");
- }
-
- // 鍔犺浇浣嶇疆璇︽儏
- foreach (var stock in expiredStocks)
- {
- if (stock.LocationId > 0)
- {
- stock.LocationDetails = await _locationInfoService.Repository
- .GetFirstAsync(s => s.Id == stock.LocationId);
- }
- }
-
- // 杩囨护鏈変綅缃笖浣嶇疆鏈夊簱瀛樼殑璁板綍
- expiredStocks = expiredStocks
- .Where(s => s.LocationDetails != null
- && s.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode())
- .ToList();
-
- if (!expiredStocks.Any())
- {
- return WebResponseContent.Instance.OK("鏃犵鍚堟潯浠剁殑鍒版湡搴撳瓨");
- }
-
- // 2. 妫�鏌ュ凡瀛樺湪鐨勪换鍔�
- var palletCodes = expiredStocks.Select(s => s.PalletCode).ToList();
- var existingTasks = await Repository.QueryAsync(t =>
- palletCodes.Contains(t.PalletCode)
- && (t.TaskStatus == TaskStatusEnum.New.GetHashCode()
- || t.TaskStatus == TaskStatusEnum.Executing.GetHashCode()
- || t.TaskStatus == TaskInStatusEnum.InNew.GetHashCode()));
-
- var processedPallets = existingTasks.Select(t => t.PalletCode).ToHashSet();
-
- // 3. 绛涢�夐渶瑕佸鐞嗙殑搴撳瓨
- var stocksToProcess = expiredStocks
- .Where(s => !processedPallets.Contains(s.PalletCode))
- .ToList();
-
- if (!stocksToProcess.Any())
- {
- return WebResponseContent.Instance.OK("鎵�鏈夊埌鏈熷簱瀛樺凡瀛樺湪浠诲姟");
- }
-
- // 4. 鑾峰彇閰嶇疆鐨勭洰鏍囧湴鍧�鏄犲皠
- var targetAddressMap = _configuration.GetSection("AutoOutboundTask:TargetAddresses")
- .Get<Dictionary<string, string>>()
- ?? new Dictionary<string, string>();
-
- // 5. 鎵归噺鍒涘缓浠诲姟
- var taskList = new List<Dt_Task>();
- foreach (var stock in stocksToProcess)
- {
- // 鏍规嵁宸烽亾纭畾鐩爣鍦板潃
- var targetAddress = DetermineTargetAddress(
- stock.LocationDetails?.RoadwayNo ?? "",
- targetAddressMap);
-
- var task = new Dt_Task
- {
- WarehouseId = stock.WarehouseId,
- PalletCode = stock.PalletCode,
- PalletType = stock.PalletType,
- SourceAddress = stock.LocationCode,
- CurrentAddress = stock.LocationCode,
- NextAddress = targetAddress,
- TargetAddress = targetAddress,
- Roadway = stock.LocationDetails?.RoadwayNo ?? "",
- TaskType = TaskTypeEnum.Outbound.GetHashCode(),
- TaskStatus = TaskStatusEnum.New.GetHashCode(),
- Grade = 1,
- TaskNum = await Repository.GetTaskNo(),
- Creater = "system_auto"
- };
- taskList.Add(task);
- }
-
- var addResult = await BaseDal.AddDataAsync(taskList) > 0;
- if (!addResult)
- {
- return WebResponseContent.Instance.Error($"鎵归噺鍒涘缓浠诲姟澶辫触锛屽叡 {taskList.Count} 涓换鍔�");
- }
-
- // 6. 閫氱煡 WCS锛堝紓姝ワ紝涓嶅奖鍝嶄富娴佺▼锛�
- _ = Task.Run(async () =>
- {
- foreach (var task in taskList)
- {
- try
- {
- var wmstaskDto = _mapper.Map<WMSTaskDTO>(task);
- await _httpClientHelper.Post<WebResponseContent>(
- "http://logistics-service/api/logistics/notifyoutbound",
- JsonSerializer.Serialize(wmstaskDto));
- }
- catch (Exception ex)
- {
- // WCS 閫氱煡澶辫触涓嶅奖鍝嶄换鍔″垱寤猴紝璁板綍鏃ュ織鍗冲彲
- Console.WriteLine($"WCS 閫氱煡澶辫触锛屼换鍔$紪鍙�: {task.TaskNum}, 閿欒: {ex.Message}");
- }
- }
- });
-
- return WebResponseContent.Instance.OK($"鎴愬姛鍒涘缓 {taskList.Count} 涓嚭搴撲换鍔�", taskList.Count);
- }
- catch (Exception ex)
- {
- return WebResponseContent.Instance.Error($"鑷姩鍒涘缓鍑哄簱浠诲姟澶辫触: {ex.Message}");
- }
-}
-```
-
-**Step 4: 鎻愪氦瀹炵幇**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat: 瀹炵幇鑷姩鍑哄簱浠诲姟鍒涘缓鏂规硶"
-```
-
----
-
-## Task 5: 鍒涘缓鍚庡彴鏈嶅姟绫�
-
-**Files:**
-- Create: `WIDESEA_WMSServer/BackgroundServices/AutoOutboundTaskBackgroundService.cs`
-
-**Step 1: 鍒涘缓 BackgroundServices 鐩綍**
-
-```bash
-mkdir -p WIDESEA_WMSServer/BackgroundServices
-```
-
-**Step 2: 鍒涘缓鍚庡彴鏈嶅姟绫�**
-
-鍒涘缓鏂囦欢 `WIDESEA_WMSServer/BackgroundServices/AutoOutboundTaskBackgroundService.cs`:
-
-```csharp
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using WIDESEA_Core.Core;
-using WIDESEA_ITaskInfoService;
-
-namespace WIDESEA_WMSServer.BackgroundServices
-{
- /// <summary>
- /// 鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟
- /// 瀹氭湡妫�鏌ュ埌鏈熷簱瀛樺苟鍒涘缓鍑哄簱浠诲姟
- /// </summary>
- public class AutoOutboundTaskBackgroundService : BackgroundService
- {
- private readonly ILogger<AutoOutboundTaskBackgroundService> _logger;
- private readonly ITaskService _taskService;
- private readonly AutoOutboundTaskOptions _options;
-
- public AutoOutboundTaskBackgroundService(
- ILogger<AutoOutboundTaskBackgroundService> logger,
- ITaskService taskService,
- IOptions<AutoOutboundTaskOptions> options)
- {
- _logger = logger;
- _taskService = taskService;
- _options = options.Value;
- }
-
- protected override async Task ExecuteAsync(CancellationToken stoppingToken)
- {
- _logger.LogInformation("鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟宸插惎鍔�");
-
- if (!_options.Enable)
- {
- _logger.LogInformation("鑷姩鍑哄簱浠诲姟鍔熻兘宸茬鐢紝鏈嶅姟閫�鍑�");
- return;
- }
-
- _logger.LogInformation("鑷姩鍑哄簱浠诲姟妫�鏌ラ棿闅�: {Seconds} 绉�", _options.CheckIntervalSeconds);
-
- while (!stoppingToken.IsCancellationRequested)
- {
- try
- {
- _logger.LogDebug("寮�濮嬫鏌ュ埌鏈熷簱瀛�...");
- var result = await _taskService.CreateAutoOutboundTasksAsync();
-
- if (result.Status)
- {
- _logger.LogInformation("鍒版湡搴撳瓨妫�鏌ュ畬鎴�: {Message}", result.Message);
- }
- else
- {
- _logger.LogWarning("鍒版湡搴撳瓨妫�鏌ュけ璐�: {Message}", result.Message);
- }
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "鑷姩鍑哄簱浠诲姟鍒涘缓杩囩▼涓彂鐢熷紓甯�");
- }
-
- var delay = TimeSpan.FromSeconds(_options.CheckIntervalSeconds);
- _logger.LogDebug("绛夊緟 {Seconds} 绉掑悗杩涜涓嬫妫�鏌�", delay.TotalSeconds);
- await Task.Delay(delay, stoppingToken);
- }
-
- _logger.LogInformation("鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟宸插仠姝�");
- }
-
- public override async Task StopAsync(CancellationToken cancellationToken)
- {
- _logger.LogInformation("姝e湪鍋滄鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟...");
- await base.StopAsync(cancellationToken);
- }
- }
-}
-```
-
-**Step 3: 鎻愪氦鍚庡彴鏈嶅姟绫�**
-
-```bash
-git add WIDESEA_WMSServer/BackgroundServices/AutoOutboundTaskBackgroundService.cs
-git commit -m "feat: 娣诲姞鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟"
-```
-
----
-
-## Task 6: 娉ㄥ唽鏈嶅姟鍜岄厤缃�
-
-**Files:**
-- Modify: `WIDESEA_WMSServer/Program.cs`
-
-**Step 1: 娣诲姞閰嶇疆娉ㄥ唽**
-
-鍦� `Program.cs` 涓殑 `builder.Services.AddAllOptionRegister();` 涔嬪悗娣诲姞:
-
-```csharp
-builder.Services.Configure<AutoOutboundTaskOptions>(
- builder.Configuration.GetSection("AutoOutboundTask"));
-```
-
-**Step 2: 娣诲姞鍚庡彴鏈嶅姟娉ㄥ唽**
-
-鍦� `Program.cs` 涓殑 `builder.Services.AddInitializationHostServiceSetup();` 涔嬪悗娣诲姞:
-
-```csharp
-builder.Services.AddHostedService<AutoOutboundTaskBackgroundService>();
-```
-
-**Step 3: 娣诲姞鍛藉悕绌洪棿寮曠敤**
-
-鍦� `Program.cs` 鏂囦欢椤堕儴鐨� using 鍖哄煙娣诲姞:
-
-```csharp
-using WIDESEA_WMSServer.BackgroundServices;
-using WIDESEA_Core.Core;
-```
-
-**Step 4: 鎻愪氦 Program.cs 鏇存柊**
-
-```bash
-git add WIDESEA_WMSServer/Program.cs
-git commit -m "config: 娉ㄥ唽鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟鍜岄厤缃�"
-```
-
----
-
-## Task 7: 缂栬瘧楠岃瘉
-
-**Step 1: 缂栬瘧椤圭洰**
-
-```bash
-cd WIDESEA_WMSServer
-dotnet build --configuration Release
-```
-
-棰勬湡杈撳嚭: 缂栬瘧鎴愬姛锛屾棤閿欒
-
-**Step 2: 妫�鏌ョ紪璇戣緭鍑�**
-
-纭杈撳嚭鍖呭惈:
-```
-Build succeeded.
- 0 Warning(s)
- 0 Error(s)
-```
-
-**Step 3: 濡傛灉鏈夐敊璇紝鏍规嵁閿欒淇℃伅淇**
-
-甯歌闂:
-- 缂哄皯 using 寮曠敤 鈫� 娣诲姞鐩稿簲鐨� namespace
-- 绫诲瀷涓嶅尮閰� 鈫� 妫�鏌ュ睘鎬у悕绉板拰绫诲瀷鏄惁姝g‘
-
----
-
-## Task 8: 鎵嬪姩娴嬭瘯
-
-**Step 1: 鍑嗗娴嬭瘯鏁版嵁**
-
-鍦ㄦ暟鎹簱涓墽琛� SQL锛屽垱寤轰竴鏉℃祴璇曞簱瀛樿褰�:
-
-```sql
--- 纭繚鏈変竴涓凡鍏ュ簱鐨勫簱瀛樿褰曪紝OutboundDate 璁剧疆涓鸿繃鍘绘椂闂�
-UPDATE Dt_StockInfo
-SET OutboundDate = DATEADD(MINUTE, -5, GETDATE())
-WHERE PalletCode = 'TEST001' AND StockStatus = 1; -- 1 = 鍏ュ簱瀹屾垚
-
--- 濡傛灉娌℃湁娴嬭瘯璁板綍锛屾彃鍏ヤ竴鏉�
-INSERT INTO Dt_StockInfo (PalletCode, PalletType, LocationId, LocationCode, WarehouseId, StockStatus, OutboundDate, CreateDate)
-VALUES ('TEST001', 1, 1, '01-01-01', 1, 1, DATEADD(MINUTE, -5, GETDATE()), GETDATE())
-```
-
-**Step 2: 鍚姩搴旂敤绋嬪簭**
-
-```bash
-cd WIDESEA_WMSServer
-dotnet run
-```
-
-**Step 3: 瑙傚療鎺у埗鍙拌緭鍑�**
-
-棰勬湡鐪嬪埌绫讳技鏃ュ織:
-```
-info: WIDESEA_WMSServer.BackgroundServices.AutoOutboundTaskBackgroundService[0]
- 鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟宸插惎鍔�
-info: WIDESEA_WMSServer.BackgroundServices.AutoOutboundTaskBackgroundService[0]
- 鑷姩鍑哄簱浠诲姟妫�鏌ラ棿闅�: 300 绉�
-...
-info: WIDESEA_WMSServer.BackgroundServices.AutoOutboundTaskBackgroundService[0]
- 鍒版湡搴撳瓨妫�鏌ュ畬鎴�: 鎴愬姛鍒涘缓 X 涓嚭搴撲换鍔�
-```
-
-**Step 4: 楠岃瘉鏁版嵁搴�**
-
-鏌ヨ浠诲姟琛ㄧ‘璁や换鍔″凡鍒涘缓:
-
-```sql
-SELECT * FROM Dt_Task WHERE PalletCode = 'TEST001' AND Creater = 'system_auto'
-```
-
-**Step 5: 娴嬭瘯瀹屾垚锛屾竻鐞嗘祴璇曟暟鎹�**
-
-```sql
--- 鍒犻櫎娴嬭瘯浠诲姟
-DELETE FROM Dt_Task WHERE PalletCode = 'TEST001'
--- 鍒犻櫎娴嬭瘯搴撳瓨
-DELETE FROM Dt_StockInfo WHERE PalletCode = 'TEST001'
-```
-
----
-
-## Task 9: 閰嶇疆楠岃瘉娴嬭瘯
-
-**Step 1: 娴嬭瘯绂佺敤鍔熻兘**
-
-淇敼 `appsettings.json`:
-```json
-"AutoOutboundTask": {
- "Enable": false,
- ...
-}
-```
-
-**Step 2: 鍚姩搴旂敤楠岃瘉**
-
-```bash
-dotnet run
-```
-
-棰勬湡杈撳嚭搴斿寘鍚�: `鑷姩鍑哄簱浠诲姟鍔熻兘宸茬鐢紝鏈嶅姟閫�鍑篳
-
-**Step 3: 鎭㈠閰嶇疆**
-
-```json
-"AutoOutboundTask": {
- "Enable": true,
- ...
-}
-```
-
-**Step 4: 娴嬭瘯涓嶅悓鐨勬鏌ラ棿闅�**
-
-淇敼涓� 10 绉掓柟渚胯瀵�:
-```json
-"CheckIntervalSeconds": 10
-```
-
-鍚姩搴旂敤锛岃瀵熸鏌ユ槸鍚︽寜 10 绉掗棿闅旀墽琛�
-
-**Step 5: 鎻愪氦娴嬭瘯缁撹**
-
-鍒涘缓娴嬭瘯璇存槑鏂囦欢 `WIDESEA_WMSServer/BackgroundServices/README.md`:
-
-```markdown
-# 鑷姩鍑哄簱浠诲姟鍚庡彴鏈嶅姟
-
-## 鍔熻兘璇存槑
-鏈湇鍔¤嚜鍔ㄦ娴嬪埌鏈熷簱瀛樺苟鍒涘缓鍑哄簱浠诲姟銆�
-
-## 閰嶇疆
-鍦� `appsettings.json` 涓厤缃�:
-
-```json
-{
- "AutoOutboundTask": {
- "Enable": true,
- "CheckIntervalSeconds": 300,
- "TargetAddresses": {
- "GW": "10081",
- "CW": "10080"
- }
- }
-}
-```
-
-## 娴嬭瘯鏂规硶
-1. 璁剧疆搴撳瓨鐨� OutboundDate 涓鸿繃鍘绘椂闂�
-2. 鍚姩搴旂敤锛岃瀵熸棩蹇�
-3. 纭浠诲姟宸插垱寤哄埌鏁版嵁搴�
-```
-
-**Step 6: 鎻愪氦娴嬭瘯鏂囨。**
-
-```bash
-git add WIDESEA_WMSServer/BackgroundServices/README.md
-git commit -m "docs: 娣诲姞鍚庡彴鏈嶅姟娴嬭瘯璇存槑"
-```
-
----
-
-## Task 10: 鏈�缁堥獙璇佸拰鏂囨。
-
-**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: 鍒涘缓鍔熻兘鎬荤粨**
-
-鏇存柊璁捐鏂囨。锛屾坊鍔犲疄鏂界姸鎬�:
-
-鍦� `docs/plans/2026-03-06-auto-outbound-task-design.md` 鏈熬娣诲姞:
-
-```markdown
-## 瀹炴柦鐘舵��
-
-- [x] 璁捐瀹屾垚
-- [x] 閰嶇疆妯″瀷绫诲垱寤�
-- [x] TaskService 鏂规硶瀹炵幇
-- [x] 鍚庡彴鏈嶅姟绫诲垱寤�
-- [x] Program.cs 娉ㄥ唽瀹屾垚
-- [x] 缂栬瘧楠岃瘉閫氳繃
-- [x] 鎵嬪姩娴嬭瘯瀹屾垚
-
-**瀹炴柦鏃ユ湡**: 2026-03-06
-**瀹炴柦浜�**: Claude Code
-```
-
-**Step 5: 鎻愪氦鏂囨。鏇存柊**
-
-```bash
-git add docs/plans/2026-03-06-auto-outbound-task-design.md
-git commit -m "docs: 鏇存柊璁捐鏂囨。瀹炴柦鐘舵��"
-```
-
----
-
-## 瀹屾垚妫�鏌ユ竻鍗�
-
-- [ ] 鎵�鏈変唬鐮佹枃浠跺凡鍒涘缓
-- [ ] 鎵�鏈変唬鐮佸凡缂栬瘧閫氳繃
-- [ ] 閰嶇疆鏂囦欢宸叉洿鏂�
-- [ ] 鎵嬪姩娴嬭瘯宸插畬鎴�
-- [ ] 鏃ュ織杈撳嚭绗﹀悎棰勬湡
-- [ ] 鏁版嵁搴撻獙璇侀�氳繃
-- [ ] 鏂囨。宸叉洿鏂�
-- [ ] 鎵�鏈夋洿鏀瑰凡鎻愪氦鍒� git
-
----
-
-## 鏁呴殰鎺掓煡
-
-### 缂栬瘧閿欒
-
-**闂**: 鎵句笉鍒扮被鍨嬫垨鍛藉悕绌洪棿
-**瑙e喅**: 纭繚宸叉坊鍔犳纭殑 using 寮曠敤
-
-**闂**: 渚濊禆娉ㄥ叆澶辫触
-**瑙e喅**: 妫�鏌� Program.cs 涓殑鏈嶅姟娉ㄥ唽椤哄簭
-
-### 杩愯鏃堕敊璇�
-
-**闂**: 鍚庡彴鏈嶅姟娌℃湁鍚姩
-**瑙e喅**:
-1. 妫�鏌� `appsettings.json` 涓� `Enable` 鏄惁涓� `true`
-2. 鏌ョ湅鍚姩鏃ュ織涓殑閿欒淇℃伅
-
-**闂**: 娌℃湁鍒涘缓浠诲姟
-**瑙e喅**:
-1. 纭搴撳瓨璁板綍鐨� `OutboundDate` 宸茶繃鏈�
-2. 纭搴撳瓨鐘舵�佷负"鍏ュ簱瀹屾垚"
-3. 妫�鏌ユ槸鍚﹀凡瀛樺湪鐩稿悓鎵樼洏鐨勪换鍔�
-
-**闂**: WCS 閫氱煡澶辫触
-**瑙e喅**:
-1. 妫�鏌� WCS 鏈嶅姟鏄惁杩愯
-2. 楠岃瘉閫氱煡鍦板潃鏄惁姝g‘
-3. 娉ㄦ剰: WCS 閫氱煡澶辫触涓嶅奖鍝嶄换鍔″垱寤�
diff --git a/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-design.md b/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-design.md
deleted file mode 100644
index 0e6e2af..0000000
--- a/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-design.md
+++ /dev/null
@@ -1,327 +0,0 @@
-# 澶氬嚭搴撳彛杞鍔熻兘璁捐鏂囨。
-
-**鏃ユ湡**: 2026-03-09
-**浣滆��**: Claude Code
-**鐘舵��**: 寰呭疄鏂�
-
-## 姒傝堪
-
-鏈璁℃棬鍦ㄦ敼杩涜嚜鍔ㄥ嚭搴撲换鍔$殑鐩爣鍦板潃閰嶇疆鍔熻兘锛屾敮鎸佷竴涓贩閬撻厤缃涓嚭搴撳彛锛屽苟閫氳繃杞绠楁硶瀹炵幇璐熻浇鍧囪 銆�
-
-## 闇�姹傝儗鏅�
-
-褰撳墠绯荤粺涓紝`TargetAddresses` 閰嶇疆閲囩敤涓�瀵逛竴鏄犲皠锛堝贩閬撳墠缂� 鈫� 鍑哄簱鍙e湴鍧�锛夈�備絾瀹為檯涓氬姟涓紝涓�涓贩閬撳彲鑳芥湁澶氫釜鍑哄簱鍙o紝闇�瑕佹敮鎸侊細
-
-1. **涓�瀵瑰鍏崇郴**锛氫竴涓贩閬撳彲浠ラ厤缃涓嚭搴撳彛
-2. **璐熻浇鍧囪 **锛氶�氳繃杞绠楁硶閫夋嫨鍑哄簱鍙o紝閬垮厤鍗曠偣鍘嬪姏
-3. **鍚戝悗鍏煎**锛氫繚鎸佸鍗曞嚭鍙i厤缃殑鏀寔
-
-## 鎶�鏈柟妗�
-
-### 鏋舵瀯閫夋嫨
-
-閲囩敤 **鍐呭瓨杞璁℃暟鍣� + 鐙珛鏈嶅姟绫�** 鐨勬ā寮忥細
-
-1. **RoundRobinService**锛氱嫭绔嬬殑杞鏈嶅姟绫伙紝绠$悊杞璁℃暟鍣�
-2. **閰嶇疆妯″瀷鍙樻洿**锛歚Dictionary<string, string>` 鈫� `Dictionary<string, List<string>>`
-3. **绾跨▼瀹夊叏**锛氫娇鐢� `ConcurrentDictionary` 淇濊瘉澶氱嚎绋嬪畨鍏�
-
-### 鏍稿績璁捐
-
-#### 1. 閰嶇疆鏍煎紡鍙樻洿
-
-**appsettings.json:**
-```json
-{
- "AutoOutboundTask": {
- "TargetAddresses": {
- "GW": ["10081", "10082", "10083"],
- "CW": ["10080"]
- }
- }
-}
-```
-
-**璇存槑锛�**
-- 鍊肩被鍨嬩粠 `string` 鏀逛负 `string[]`锛圝SON 鏁扮粍锛�
-- 鏀寔涓�涓贩閬撻厤缃涓嚭搴撳彛
-- 鍗曚釜鍑哄簱鍙d篃鍙敤鏁扮粍鏍煎紡锛堝彧鏈変竴涓厓绱狅級
-
-#### 2. 閰嶇疆妯″瀷绫�
-
-**AutoOutboundTaskOptions.cs:**
-```csharp
-public class AutoOutboundTaskOptions
-{
- public bool Enable { get; set; } = true;
- public int CheckIntervalSeconds { get; set; } = 300;
-
- public Dictionary<string, List<string>> TargetAddresses { get; set; }
- = new()
- {
- { "GW", new List<string> { "10081" } },
- { "CW", new List<string> { "10080" } }
- };
-}
-```
-
-#### 3. 杞鏈嶅姟绫�
-
-**RoundRobinService.cs** (鏂板缓):
-```csharp
-using System.Collections.Concurrent;
-
-namespace WIDESEA_Core.Core
-{
- /// <summary>
- /// 杞鏈嶅姟 - 绾跨▼瀹夊叏鐨勫湴鍧�杞閫夋嫨
- /// </summary>
- public class RoundRobinService
- {
- 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, old) => (old + 1) % addresses.Count // 杞锛氶�掑鍚庡彇妯�
- );
-
- return addresses[index];
- }
- }
-}
-```
-
-**鍏抽敭鐗规�э細**
-- 浣跨敤 `ConcurrentDictionary<string, int>` 瀛樺偍姣忎釜宸烽亾鐨勫綋鍓嶇储寮�
-- `AddOrUpdate` 鏂规硶淇濊瘉鍘熷瓙鎬э紝鏃犻渶棰濆閿�
-- 妯¤繍绠楀疄鐜板惊鐜疆璇�
-- 绾跨▼瀹夊叏锛屾敮鎸佸悗鍙版湇鍔$殑骞跺彂璋冪敤
-
-#### 4. TaskService 鏂规硶淇敼
-
-**DetermineTargetAddress 鏂规硶:**
-```csharp
-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);
-}
-```
-
-**渚濊禆娉ㄥ叆:**
-```csharp
-public class TaskService
-{
- private readonly RoundRobinService _roundRobinService;
-
- public TaskService(
- // ... 鍏朵粬渚濊禆
- RoundRobinService roundRobinService)
- {
- // ... 鍏朵粬璧嬪��
- _roundRobinService = roundRobinService;
- }
-}
-```
-
-#### 5. 鏈嶅姟娉ㄥ唽
-
-**Program.cs:**
-```csharp
-// 娉ㄥ唽涓哄崟渚嬶紝淇濊瘉鍏ㄥ眬鍏变韩璁℃暟鍣�
-builder.Services.AddSingleton<RoundRobinService>();
-```
-
-## 鏁版嵁娴佺▼
-
-```mermaid
-graph TD
- A[鍒涘缓鍑哄簱浠诲姟] --> B[鑾峰彇搴撳瓨宸烽亾淇℃伅]
- B --> C[鏌ユ壘鍖归厤鐨勫贩閬撳墠缂�]
- C --> D{鍦板潃鍒楄〃鏁伴噺}
- D -->|0涓獆 E[杩斿洖榛樿鍦板潃 10080]
- D -->|1涓獆 F[鐩存帴杩斿洖璇ュ湴鍧�]
- D -->|澶氫釜| G[璋冪敤 RoundRobinService]
- G --> H[鏌ヨ/鏇存柊璁℃暟鍣╙
- H --> I[杩斿洖 addresses counter % count]
- I --> J[鍒涘缓浠诲姟]
- F --> J
- E --> J
-```
-
-## 杞绀轰緥
-
-**閰嶇疆:**
-```json
-{
- "TargetAddresses": {
- "GW": ["10081", "10082", "10083"]
- }
-}
-```
-
-**璋冪敤搴忓垪:**
-| 娆℃暟 | 璁℃暟鍣ㄥ�� | 杩斿洖鍦板潃 |
-|------|---------|---------|
-| 1 | 0 | 10081 |
-| 2 | 1 | 10082 |
-| 3 | 2 | 10083 |
-| 4 | 0 | 10081 |
-| 5 | 1 | 10082 |
-| ... | ... | ... |
-
-## 閿欒澶勭悊
-
-1. **閰嶇疆閿欒**锛�
- - 鍦板潃鍒楄〃涓虹┖ 鈫� 杩斿洖榛樿鍦板潃 "10080"
- - 宸烽亾涓嶅尮閰嶄换浣曞墠缂� 鈫� 杩斿洖榛樿鍦板潃 "10080"
-
-2. **骞跺彂瀹夊叏**锛�
- - 浣跨敤 `ConcurrentDictionary` 淇濊瘉绾跨▼瀹夊叏
- - `AddOrUpdate` 鏄師瀛愭搷浣�
-
-3. **搴旂敤閲嶅惎**锛�
- - 杞浣嶇疆閲嶇疆涓� 0
- - 鍙帴鍙楃殑鏉冭 锛堢畝鍖栧疄鐜帮級
-
-## 鍚戝悗鍏煎鎬�
-
-### 鏃ч厤缃牸寮�
-```json
-{
- "TargetAddresses": {
- "GW": "10081",
- "CW": "10080"
- }
-}
-```
-
-### 鏂伴厤缃牸寮�
-```json
-{
- "TargetAddresses": {
- "GW": ["10081"],
- "CW": ["10080"]
- }
-}
-```
-
-**鍏煎鎬у鐞嗭細**
-- JSON 閰嶇疆缁戝畾浼氳嚜鍔ㄥ鐞嗕袱绉嶆牸寮�
-- 鍗曚釜瀛楃涓蹭細琚В鏋愪负鍗曞厓绱犳暟缁�
-- 鐜版湁閰嶇疆鏃犻渶淇敼鍗冲彲宸ヤ綔
-
-## 鎬ц兘褰卞搷
-
-1. **鍐呭瓨寮�閿�**锛氭瘡涓贩閬撳墠缂�涓�涓暣鏁拌鏁板櫒锛堢害 50 瀛楄妭锛�
-2. **CPU 寮�閿�**锛氭ā杩愮畻鍜屽瓧鍏告煡鎵撅紝O(1) 澶嶆潅搴�
-3. **绾跨▼瀹夊叏**锛氭棤閿佽璁★紝`ConcurrentDictionary` 浣跨敤浼樺寲鐨勫悓姝ユ満鍒�
-
-## 娴嬭瘯璁″垝
-
-### 鍗曞厓娴嬭瘯
-1. `RoundRobinService.GetNextAddress` 杞閫昏緫
-2. 鍗曚釜鍦板潃鐩存帴杩斿洖
-3. 澶氫釜鍦板潃杞杩斿洖
-4. 骞跺彂璋冪敤娴嬭瘯
-
-### 闆嗘垚娴嬭瘯
-1. 淇敼 appsettings.json 涓哄鍑哄彛閰嶇疆
-2. 鍒涘缓澶氫釜鍑哄簱浠诲姟
-3. 楠岃瘉鐩爣鍦板潃杞鍒嗛厤
-4. 楠岃瘉鏃ュ織璁板綍
-
-### 鎵嬪姩娴嬭瘯
-```sql
--- 鍑嗗娴嬭瘯鏁版嵁
-UPDATE Dt_StockInfo
-SET OutboundDate = DATEADD(MINUTE, -5, GETDATE())
-WHERE PalletCode IN ('TEST001', 'TEST002', 'TEST003')
- AND StockStatus = 1;
-```
-
-鍚姩搴旂敤锛岃瀵熸棩蹇楋細
-```
-info: 鍒涘缓浠诲姟 TEST001锛岀洰鏍囧湴鍧�: 10081
-info: 鍒涘缓浠诲姟 TEST002锛岀洰鏍囧湴鍧�: 10082
-info: 鍒涘缓浠诲姟 TEST003锛岀洰鏍囧湴鍧�: 10083
-```
-
-## 閮ㄧ讲娉ㄦ剰浜嬮」
-
-1. **閰嶇疆鏇存柊**锛�
- - 灏� `TargetAddresses` 鐨勫�间粠瀛楃涓叉敼涓烘暟缁勬牸寮�
- - 纭繚姣忎釜鏁扮粍鑷冲皯鏈変竴涓厓绱�
-
-2. **渚濊禆娉ㄥ叆**锛�
- - 纭繚 `RoundRobinService` 宸叉敞鍐屼负鍗曚緥
- - `TaskService` 鏋勯�犲嚱鏁伴渶瑕佹敞鍏ヨ鏈嶅姟
-
-3. **鍥炴粴鏂规**锛�
- - 淇濈暀 `appsettings.json` 澶囦唤
- - 濡傞亣闂鍙仮澶嶄负鍗曞嚭鍙i厤缃�
-
-## 鏈潵鏀硅繘
-
-1. **鏉冮噸杞**锛氭敮鎸佷负姣忎釜鍦板潃閰嶇疆鏉冮噸
-2. **鍋ュ悍妫�鏌�**锛氭帓闄や笉鍙敤鐨勫嚭搴撳彛
-3. **鎸佷箙鍖�**锛氬皢杞浣嶇疆淇濆瓨鍒� Redis/鏁版嵁搴�
-4. **鐩戞帶缁熻**锛氳褰曟瘡涓湴鍧�鐨勪换鍔″垎閰嶆暟閲�
-
-## 瀹炴柦娓呭崟
-
-- [x] 淇敼 `AutoOutboundTaskOptions.TargetAddresses` 绫诲瀷
-- [x] 鍒涘缓 `RoundRobinService` 绫�
-- [x] 淇敼 `TaskService.DetermineTargetAddress` 鏂规硶
-- [x] 鍦� `Program.cs` 娉ㄥ唽 `RoundRobinService`
-- [x] 鏇存柊 `appsettings.json` 閰嶇疆绀轰緥
-- [x] 缂栬瘧楠岃瘉
-- [ ] 鎵嬪姩娴嬭瘯锛堥渶瑕佽繍琛岀幆澧冨拰鏁版嵁搴擄級
-- [x] 鏇存柊璁捐鏂囨。
-
-**瀹炴柦鏃ユ湡**: 2026-03-09
-**瀹炴柦浜�**: Claude Code
-**鐘舵��**: 浠g爜瀹炵幇瀹屾垚锛屽緟鎵嬪姩娴嬭瘯
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
deleted file mode 100644
index 53822c6..0000000
--- a/Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-implementation.md
+++ /dev/null
@@ -1,675 +0,0 @@
-# 澶氬嚭搴撳彛杞鍔熻兘瀹炵幇璁″垝
-
-> **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>
-```
diff --git "a/Code/WMS/docs/superpowers/plans/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md" "b/Code/WMS/docs/superpowers/plans/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md"
deleted file mode 100644
index 5875b44..0000000
--- "a/Code/WMS/docs/superpowers/plans/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md"
+++ /dev/null
@@ -1,297 +0,0 @@
-# MES 鎵樼洏杩涚珯鍑虹珯闆嗘垚瀹炵幇璁″垝
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 鍦� TaskService 鐨勫叆搴撳畬鎴�/鍑哄簱瀹屾垚鏂规硶涓泦鎴� MES 杩涚珯/鍑虹珯璋冪敤锛屾柊澧炵┖鎵樼洏鍏ュ簱/鍑哄簱瀹屾垚鏂规硶銆�
-
-**Architecture:** 鍦� `ExecuteWithinTransactionAsync` 浜嬪姟鍐呮坊鍔� MES 璋冪敤锛孧ES 澶辫触鍒欎簨鍔″洖婊氥��
-
-**Tech Stack:** ASP.NET Core 6.0, IMesService, ExecuteWithinTransactionAsync
-
----
-
-## 浠诲姟鎬昏
-
-| 浠诲姟 | 鏂规硶 | 鎿嶄綔 |
-|------|------|------|
-| Task 1 | `InboundFinishTaskAsync` | 娣诲姞 `InboundInContainer` 璋冪敤 |
-| Task 2 | `OutboundFinishTaskAsync` | 娣诲姞 `OutboundInContainer` 璋冪敤 |
-| Task 3 | `InboundFinishTaskTrayAsync`锛堟柊澧烇級 | 绌烘墭鐩樺叆搴撳畬鎴愶紝鏃犻渶 MES |
-| Task 4 | `OutboundFinishTaskTrayAsync`锛堟柊澧烇級 | 绌烘墭鐩樺嚭搴撳畬鎴愶紝鏃犻渶 MES |
-
----
-
-## 浠诲姟鍓嶇疆鏉′欢
-
-`TaskService` 闇�娉ㄥ叆 `IMesService`銆傛鏌ョ幇鏈夋瀯閫犲嚱鏁版槸鍚﹀凡鏈夛細
-```csharp
-private readonly IMesService _mesService;
-```
-
-濡傛灉涓嶅瓨鍦紝闇�娣诲姞銆�
-
----
-
-## Task 1: 淇敼 InboundFinishTaskAsync 娣诲姞 MES 杩涚珯璋冪敤
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛坄InboundFinishTaskAsync` 鏂规硶锛岀害绗� 215 琛岋級
-
-- [ ] **Step 1: 鏌ョ湅褰撳墠浠g爜纭涓婁笅鏂�**
-
-璇诲彇 `TaskService.cs` 绗� 199-240 琛岋紝纭 `CompleteTaskAsync` 璋冪敤鐨勪綅缃��
-
-- [ ] **Step 2: 鍦� CompleteTaskAsync 涔嬪墠娣诲姞 MES InboundInContainer 璋冪敤**
-
-鍦� `return await CompleteTaskAsync(task);` 涔嬪墠娣诲姞锛�
-
-```csharp
-// 璋冪敤MES鎵樼洏杩涚珯
-var inboundRequest = new InboundInContainerRequest
-{
- EquipmentCode = "STK-GROUP-001",
- ResourceCode = "STK-GROUP-001",
- LocalTime = DateTime.Now,
- ContainerCode = taskDto.PalletCode
-};
-var inboundResult = _mesService.InboundInContainer(inboundRequest);
-if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess)
-{
- return content.Error($"浠诲姟瀹屾垚澶辫触锛歁ES杩涚珯澶辫触: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "鏈煡閿欒"}");
-}
-```
-
-- [ ] **Step 3: 娣诲姞 using 寮曠敤锛堝鏋滈渶瑕侊級**
-
-纭鏂囦欢椤堕儴宸叉湁 `using WIDESEA_IBasicService;` 鍜� `using WIDESEA_DTO.MES;`銆傚鏋滄病鏈夛紝娣诲姞銆�
-
-- [ ] **Step 4: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-纭鏃犵紪璇戦敊璇��
-
-- [ ] **Step 5: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): InboundFinishTaskAsync娣诲姞MES杩涚珯璋冪敤"
-```
-
----
-
-## Task 2: 淇敼 OutboundFinishTaskAsync 娣诲姞 MES 鍑虹珯璋冪敤
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛坄OutboundFinishTaskAsync` 鏂规硶锛岀害绗� 258 琛岋級
-
-- [ ] **Step 1: 鏌ョ湅褰撳墠浠g爜纭涓婁笅鏂�**
-
-璇诲彇 `TaskService.cs` 绗� 258-280 琛岋紝纭 `CompleteTaskAsync` 璋冪敤鐨勪綅缃��
-
-- [ ] **Step 2: 鍦� CompleteTaskAsync 涔嬪墠娣诲姞 MES OutboundInContainer 璋冪敤**
-
-鍦� `return await CompleteTaskAsync(task);` 涔嬪墠娣诲姞锛�
-
-```csharp
-// 璋冪敤MES鎵樼洏鍑虹珯
-var outboundRequest = new OutboundInContainerRequest
-{
- EquipmentCode = "STK-GROUP-001",
- ResourceCode = "STK-GROUP-001",
- LocalTime = DateTime.Now,
- ContainerCode = taskDto.PalletCode,
- ParamList = new List<ParamItem>()
-};
-var outboundResult = _mesService.OutboundInContainer(outboundRequest);
-if (outboundResult == null || outboundResult.Data == null || !outboundResult.Data.IsSuccess)
-{
- return content.Error($"浠诲姟瀹屾垚澶辫触锛歁ES鍑虹珯澶辫触: {outboundResult?.Data?.Msg ?? outboundResult?.ErrorMessage ?? "鏈煡閿欒"}");
-}
-```
-
-- [ ] **Step 3: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-纭鏃犵紪璇戦敊璇��
-
-- [ ] **Step 4: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): OutboundFinishTaskAsync娣诲姞MES鍑虹珯璋冪敤"
-```
-
----
-
-## Task 3: 鏂板 InboundFinishTaskTrayAsync 绌烘墭鐩樺叆搴撳畬鎴愭柟娉�
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛堝湪 `InboundFinishTaskTrayAsync` 鏂规硶涔嬪悗娣诲姞鏂版柟娉曪級
-
-- [ ] **Step 1: 鏌ョ湅鐜版湁 InboundFinishTaskTrayAsync 鏂规硶浣嶇疆**
-
-璇诲彇 `TaskService.cs` 绗� 330-350 琛岋紝纭 `CreateTaskInboundTrayAsync` 涔嬪悗鐨勪綅缃��
-
-- [ ] **Step 2: 娣诲姞鏂版柟娉� InboundFinishTaskTrayAsync**
-
-鍦� `CreateTaskInboundTrayAsync` 鏂规硶涔嬪悗娣诲姞锛�
-
-```csharp
-/// <summary>
-/// 绌烘墭鐩樺叆搴撳畬鎴�
-/// </summary>
-public async Task<WebResponseContent> InboundFinishTaskTrayAsync(CreateTaskDto taskDto)
-{
- try
- {
- var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode);
- if (task == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟");
-
- var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress);
- if (location == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑璐т綅");
-
- var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode);
- if (stockInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴斿簱瀛樹俊鎭�");
-
- return await ExecuteWithinTransactionAsync(async () =>
- {
- stockInfo.LocationCode = location.LocationCode;
- stockInfo.LocationId = location.Id;
- stockInfo.StockStatus = StockStatusEmun.绌烘墭鐩樺簱瀛�.GetHashCode();
-
- location.LocationStatus = LocationStatusEnum.InStock.GetHashCode();
-
- var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location);
- var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo);
- if (!updateLocationResult || !updateStockResult)
- return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
-
- var deleteResult = await BaseDal.DeleteDataAsync(task);
- if (!deleteResult) return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
-
- return WebResponseContent.Instance.OK("浠诲姟瀹屾垚");
- });
- }
- catch (Exception ex)
- {
- return WebResponseContent.Instance.Error($"瀹屾垚浠诲姟澶辫触: {ex.Message}");
- }
-}
-```
-
-- [ ] **Step 3: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-纭鏃犵紪璇戦敊璇��
-
-- [ ] **Step 4: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): 鏂板InboundFinishTaskTrayAsync绌烘墭鐩樺叆搴撳畬鎴愭柟娉�"
-```
-
----
-
-## Task 4: 鏂板 OutboundFinishTaskTrayAsync 绌烘墭鐩樺嚭搴撳畬鎴愭柟娉�
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛堝湪 `OutboundFinishTaskTrayAsync` 鏂规硶涔嬪悗娣诲姞鏂版柟娉曪級
-
-- [ ] **Step 1: 鏌ョ湅鐜版湁 GetOutBoundTrayTaskAsync 鏂规硶浣嶇疆**
-
-璇诲彇 `TaskService.cs` 绗� 357-393 琛岋紝纭 `GetOutBoundTrayTaskAsync` 涔嬪悗鐨勪綅缃��
-
-- [ ] **Step 2: 娣诲姞鏂版柟娉� OutboundFinishTaskTrayAsync**
-
-鍦� `GetOutBoundTrayTaskAsync` 鏂规硶涔嬪悗娣诲姞锛�
-
-```csharp
-/// <summary>
-/// 绌烘墭鐩樺嚭搴撳畬鎴�
-/// </summary>
-public async Task<WebResponseContent> OutboundFinishTaskTrayAsync(CreateTaskDto taskDto)
-{
- try
- {
- var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode);
- if (task == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟");
-
- var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress);
- if (location == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑璐т綅");
-
- var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode);
- if (stockInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴斿簱瀛樹俊鎭�");
-
- return await ExecuteWithinTransactionAsync(async () =>
- {
- stockInfo.LocationId = 0;
- stockInfo.LocationCode = null;
- stockInfo.StockStatus = StockStatusEmun.鍑哄簱瀹屾垚.GetHashCode();
-
- location.LocationStatus = LocationStatusEnum.Free.GetHashCode();
-
- var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location);
- var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo);
- if (!updateLocationResult || !updateStockResult)
- return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
-
- var deleteResult = await BaseDal.DeleteDataAsync(task);
- if (!deleteResult) return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
-
- return WebResponseContent.Instance.OK("浠诲姟瀹屾垚");
- });
- }
- catch (Exception ex)
- {
- return WebResponseContent.Instance.Error($"瀹屾垚浠诲姟澶辫触: {ex.Message}");
- }
-}
-```
-
-- [ ] **Step 3: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-纭鏃犵紪璇戦敊璇��
-
-- [ ] **Step 4: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): 鏂板OutboundFinishTaskTrayAsync绌烘墭鐩樺嚭搴撳畬鎴愭柟娉�"
-```
-
----
-
-## Task 5: 鏁翠綋鏋勫缓楠岃瘉
-
-- [ ] **Step 1: 鏋勫缓鏁翠釜瑙e喅鏂规**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_WMSServer.sln
-```
-
-纭鏃犵紪璇戦敊璇�佹棤璀﹀憡銆�
-
----
-
-## 楠岃瘉妫�鏌ユ竻鍗�
-
-- [ ] `InboundFinishTaskAsync` 涓� `InboundInContainer` 鍦� `CompleteTaskAsync` 涔嬪墠
-- [ ] `OutboundFinishTaskAsync` 涓� `OutboundInContainer` 鍦� `CompleteTaskAsync` 涔嬪墠
-- [ ] 鎵�鏈� MES 璋冪敤妫�鏌� `mesResult.Data?.IsSuccess`
-- [ ] 閿欒淇℃伅鏍煎紡锛歚"浠诲姟瀹屾垚澶辫触锛歁ES{鎿嶄綔}澶辫触: {閿欒淇℃伅}"`
-- [ ] `InboundFinishTaskTrayAsync` 鍜� `OutboundFinishTaskTrayAsync` 鏂板鏂规硶绛惧悕姝g‘
-- [ ] 瑙e喅鏂规鏋勫缓鏃犻敊璇�
diff --git "a/Code/WMS/docs/superpowers/plans/2026-03-30-MES\347\224\265\350\212\257\347\273\221\345\256\232\350\247\243\347\273\221\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md" "b/Code/WMS/docs/superpowers/plans/2026-03-30-MES\347\224\265\350\212\257\347\273\221\345\256\232\350\247\243\347\273\221\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md"
deleted file mode 100644
index bdd957d..0000000
--- "a/Code/WMS/docs/superpowers/plans/2026-03-30-MES\347\224\265\350\212\257\347\273\221\345\256\232\350\247\243\347\273\221\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md"
+++ /dev/null
@@ -1,213 +0,0 @@
-# MES 鐢佃姱缁戝畾瑙g粦闆嗘垚瀹炵幇璁″垝
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 鍦� StockService 鐨勭粍鐩樸�佹崲鐩樸�佹媶鐩樻搷浣滀腑姝g‘璋冪敤 MES 鐢佃姱缁戝畾/瑙g粦鎺ュ彛锛屽苟灏� MES 璋冪敤绾冲叆 WMS 浜嬪姟鍐呫��
-
-**Architecture:** 淇敼 `StockService` 涓変釜鏂规硶锛屽皢 `_mesService.BindContainer()` / `_mesService.UnBindContainer()` 姝g‘鍦扮敤 `await` 璋冪敤骞舵鏌ヨ繑鍥炵粨鏋滐紝MES 澶辫触鍒欎簨鍔″洖婊氥��
-
-**Tech Stack:** ASP.NET Core 6.0, SqlSugar, IMesService
-
----
-
-## 浠诲姟鎬昏
-
-| 浠诲姟 | 鏂规硶 | 鎿嶄綔 |
-|------|------|------|
-| Task 1 | `GroupPalletAsync` | 淇 `_mesService.BindContainer()` 缂哄皯 await 鍜岀粨鏋滄鏌� |
-| Task 2 | `ChangePalletAsync` | 娣诲姞瑙g粦婧愭墭鐩� + 缁戝畾鐩爣鎵樼洏 |
-| Task 3 | `SplitPalletAsync` | 娣诲姞瑙g粦鐢佃姱 |
-
----
-
-## Task 1: 淇 GroupPalletAsync 涓殑 MES 璋冪敤
-
-**Files:**
-- Modify: `WIDESEA_StockService/StockSerivce.cs:132-176`
-
-- [ ] **Step 1: 鏌ョ湅褰撳墠浠g爜纭涓婁笅鏂�**
-
-璇诲彇 `StockSerivce.cs` 绗� 132-176 琛岋紝纭 `bindRequest` 瀵硅薄鐨勬瀯寤哄拰 `_mesService.BindContainer()` 璋冪敤鐨勪綅缃��
-
-- [ ] **Step 2: 淇敼 BindContainer 璋冪敤涓� await 骞舵鏌ョ粨鏋�**
-
-灏嗙 166 琛岋細
-```csharp
-_mesService.BindContainer()
-```
-
-淇敼涓猴細
-```csharp
-var mesResult = await _mesService.BindContainer(bindRequest);
-if (mesResult == null || !mesResult.Success)
-{
- return content.Error($"缁勭洏鎴愬姛锛屼絾MES缁戝畾澶辫触: {mesResult?.Message ?? "鏈煡閿欒"}");
-}
-```
-
-- [ ] **Step 3: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_StockService/WIDESEA_StockService.csproj
-```
-
-纭鏃犵紪璇戦敊璇��
-
-- [ ] **Step 4: 鎻愪氦**
-
-```bash
-git add WIDESEA_StockService/StockSerivce.cs
-git commit -m "fix(StockService): GroupPalletAsync姝g‘await MES BindContainer璋冪敤骞舵鏌ョ粨鏋�"
-```
-
----
-
-## Task 2: 淇敼 ChangePalletAsync 娣诲姞 MES 瑙g粦鍜岀粦瀹氳皟鐢�
-
-**Files:**
-- Modify: `WIDESEA_StockService/StockSerivce.cs:181-240`
-
-- [ ] **Step 1: 鏌ョ湅褰撳墠浠g爜纭涓婁笅鏂�**
-
-璇诲彇 `StockSerivce.cs` 绗� 181-240 琛岋紝纭锛�
-- `detailEntities` 鍙橀噺瀹氫箟浣嶇疆锛堝寘鍚鎹㈢洏鐨勭數鑺槑缁嗭級
-- `targetStock.Id` 璧嬪�间綅缃�
-- `return content.OK("鎹㈢洏鎴愬姛")` 涔嬪墠鐨勯�昏緫
-
-- [ ] **Step 2: 鍦ㄦ洿鏂板簱瀛樻槑缁嗗墠娣诲姞 UnBindContainer 璋冪敤**
-
-鍦ㄧ 231 琛� `var result = await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);` 涔嬪墠娣诲姞锛�
-
-```csharp
-// 璋冪敤MES瑙g粦婧愭墭鐩樼數鑺�
-var unbindRequest = new UnBindContainerRequest
-{
- EquipmentCode = "STK-GROUP-001",
- ResourceCode = "STK-GROUP-001",
- LocalTime = DateTime.Now,
- ContainCode = stock.SourcePalletNo,
- SfcList = detailEntities.Select(d => d.SerialNumber).ToList()
-};
-var unbindResult = await _mesService.UnBindContainer(unbindRequest);
-if (unbindResult == null || !unbindResult.Success)
-{
- return content.Error($"鎹㈢洏鎴愬姛锛屼絾MES瑙g粦澶辫触: {unbindResult?.Message ?? "鏈煡閿欒"}");
-}
-```
-
-- [ ] **Step 3: 鍦ㄦ洿鏂板簱瀛樻槑缁嗗悗娣诲姞 BindContainer 璋冪敤**
-
-鍦ㄧ 231 琛屼箣鍚庛�乣return content.OK("鎹㈢洏鎴愬姛");` 涔嬪墠娣诲姞锛�
-
-```csharp
-// 璋冪敤MES缁戝畾鐩爣鎵樼洏鐢佃姱
-var bindRequest = new BindContainerRequest
-{
- ContainerCode = stock.TargetPalletNo,
- EquipmentCode = "STK-GROUP-001",
- ResourceCode = "STK-GROUP-001",
- LocalTime = DateTime.Now,
- OperationType = 0,
- ContainerSfcList = detailEntities.Select(d => new ContainerSfcItem
- {
- Sfc = d.SerialNumber,
- Location = d.InboundOrderRowNo.ToString()
- }).ToList()
-};
-var bindResult = await _mesService.BindContainer(bindRequest);
-if (bindResult == null || !bindResult.Success)
-{
- return content.Error($"鎹㈢洏鎴愬姛锛屼絾MES缁戝畾澶辫触: {bindResult?.Message ?? "鏈煡閿欒"}");
-}
-```
-
-- [ ] **Step 4: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_StockService/WIDESEA_StockService.csproj
-```
-
-纭鏃犵紪璇戦敊璇��
-
-- [ ] **Step 5: 鎻愪氦**
-
-```bash
-git add WIDESEA_StockService/StockSerivce.cs
-git commit -m "feat(StockService): ChangePalletAsync娣诲姞MES瑙g粦鍜岀粦瀹氳皟鐢�"
-```
-
----
-
-## Task 3: 淇敼 SplitPalletAsync 娣诲姞 MES 瑙g粦璋冪敤
-
-**Files:**
-- Modify: `WIDESEA_StockService/StockSerivce.cs:245-286`
-
-- [ ] **Step 1: 鏌ョ湅褰撳墠浠g爜纭涓婁笅鏂�**
-
-璇诲彇 `StockSerivce.cs` 绗� 245-286 琛岋紝纭锛�
-- `detailEntities` 鍙橀噺瀹氫箟鍜屽寘鍚殑鐢佃姱鍒楄〃
-- `return content.OK("鎷嗙洏鎴愬姛");` 涔嬪墠鐨勯�昏緫
-
-- [ ] **Step 2: 鍦ㄥ垹闄ゅ簱瀛樻槑缁嗗墠娣诲姞 UnBindContainer 璋冪敤**
-
-鍦ㄧ 277 琛� `var result = await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);` 涔嬪墠娣诲姞锛�
-
-```csharp
-// 璋冪敤MES瑙g粦鐢佃姱
-var unbindRequest = new UnBindContainerRequest
-{
- EquipmentCode = "STK-GROUP-001",
- ResourceCode = "STK-GROUP-001",
- LocalTime = DateTime.Now,
- ContainCode = stock.SourcePalletNo,
- SfcList = detailEntities.Select(d => d.SerialNumber).ToList()
-};
-var unbindResult = await _mesService.UnBindContainer(unbindRequest);
-if (unbindResult == null || !unbindResult.Success)
-{
- return content.Error($"鎷嗙洏鎴愬姛锛屼絾MES瑙g粦澶辫触: {unbindResult?.Message ?? "鏈煡閿欒"}");
-}
-```
-
-- [ ] **Step 3: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_StockService/WIDESEA_StockService.csproj
-```
-
-纭鏃犵紪璇戦敊璇��
-
-- [ ] **Step 4: 鎻愪氦**
-
-```bash
-git add WIDESEA_StockService/StockSerivce.cs
-git commit -m "feat(StockService): SplitPalletAsync娣诲姞MES瑙g粦璋冪敤"
-```
-
----
-
-## Task 4: 鏁翠綋鏋勫缓楠岃瘉
-
-- [ ] **Step 1: 鏋勫缓鏁翠釜瑙e喅鏂规**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_WMSServer.sln
-```
-
-纭鏃犵紪璇戦敊璇�佹棤璀﹀憡銆�
-
-- [ ] **Step 2: 鎻愪氦鎵�鏈夋洿鏀�**
-
-濡傛灉涔嬪墠娌℃湁鍚堝苟鎻愪氦锛屽湪姝ゆ墽琛屾渶缁堟彁浜ゃ��
-
----
-
-## 楠岃瘉妫�鏌ユ竻鍗�
-
-- [ ] `GroupPalletAsync` 涓� `await _mesService.BindContainer()` 姝g‘ await
-- [ ] `ChangePalletAsync` 涓厛 UnBind 鍐� Bind锛岄『搴忔纭�
-- [ ] `SplitPalletAsync` 涓� UnBind 鍦� Delete 涔嬪墠
-- [ ] 鎵�鏈� MES 璋冪敤妫�鏌� `Success` 灞炴��
-- [ ] 閿欒淇℃伅鏍煎紡缁熶竴锛歚"{鎿嶄綔}鎴愬姛锛屼絾MES{鎿嶄綔}澶辫触: {閿欒淇℃伅}"`
-- [ ] 瑙e喅鏂规鏋勫缓鏃犻敊璇�
diff --git a/Code/WMS/docs/superpowers/plans/2026-03-30-dashboard-chart-plan.md b/Code/WMS/docs/superpowers/plans/2026-03-30-dashboard-chart-plan.md
deleted file mode 100644
index c0b228b..0000000
--- a/Code/WMS/docs/superpowers/plans/2026-03-30-dashboard-chart-plan.md
+++ /dev/null
@@ -1,837 +0,0 @@
-# 棣栭〉浠〃鐩樺浘琛ㄥ姛鑳藉疄鐜拌鍒�
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 鍦� WMS 鍓嶇棣栭〉娣诲姞浠〃鐩樺浘琛紝灞曠ず鍑哄叆搴撶粺璁″拰搴撳瓨鏁版嵁
-
-**Architecture:**
-- 鍚庣锛氭柊寤� DashboardController锛屾彁渚�6涓粺璁℃帴鍙o紝浣跨敤 SqlSugar 鐩存帴鏌ヨ Dt_Task_Hty锛堝凡瀹屾垚浠诲姟鍘嗗彶琛級鍜� Dt_StockInfo 琛�
-- 鍓嶇锛氶噸鍐� Home.vue锛屼娇鐢� ECharts 5.0.2 瀹炵幇浠〃鐩樺竷灞�锛屽鐢� bigdata.vue 涓殑 ECharts 浣跨敤妯″紡
-- 鏁版嵁鏉ユ簮锛欴t_Task_Hty.InsertTime锛堜换鍔″畬鎴愭椂闂达級锛孴askType 鍖哄垎鍏ュ簱(500-599)/鍑哄簱(100-199)
-
-**Tech Stack:** ASP.NET Core 6.0, Vue 3, ECharts 5.0.2, SqlSugar
-
----
-
-## 鏂囦欢缁撴瀯
-
-```
-鍚庣鏂板:
-- WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs (浠〃鐩樻帶鍒跺櫒)
-
-鍓嶇淇敼:
-- WIDESEA_WMSClient/src/views/Home.vue (閲嶅啓涓轰华琛ㄧ洏椤甸潰)
-```
-
----
-
-## 瀹炵幇浠诲姟
-
-### Task 1: 鍒涘缓鍚庣 DashboardController
-
-**鏂囦欢:**
-- Create: `WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs`
-
-**璇存槑:** 鍒涘缓 DashboardController锛屽寘鍚�6涓� API 鎺ュ彛
-
-- [ ] **Step 1: 鍒涘缓鎺у埗鍣ㄦ枃浠�**
-
-```csharp
-using Microsoft.AspNetCore.Mvc;
-using SqlSugar;
-using WIDESEA_Core;
-using WIDESEA_Model.Models;
-
-namespace WIDESEA_WMSServer.Controllers.Dashboard
-{
- /// <summary>
- /// 浠〃鐩�
- /// </summary>
- [Route("api/Dashboard")]
- [ApiController]
- public class DashboardController : ControllerBase
- {
- private readonly ISqlSugarClient _db;
-
- public DashboardController(ISqlSugarClient db)
- {
- _db = db;
- }
-
- /// <summary>
- /// 鎬昏鏁版嵁
- /// </summary>
- [HttpGet("Overview")]
- public async Task<WebResponseContent> Overview()
- {
- // 瀹炵幇瑙� Step 2
- }
-
- /// <summary>
- /// 姣忔棩缁熻
- /// </summary>
- [HttpGet("DailyStats")]
- public async Task<WebResponseContent> DailyStats([FromQuery] int days = 30)
- {
- // 瀹炵幇瑙� Step 3
- }
-
- /// <summary>
- /// 姣忓懆缁熻
- /// </summary>
- [HttpGet("WeeklyStats")]
- public async Task<WebResponseContent> WeeklyStats([FromQuery] int weeks = 12)
- {
- // 瀹炵幇瑙� Step 4
- }
-
- /// <summary>
- /// 姣忔湀缁熻
- /// </summary>
- [HttpGet("MonthlyStats")]
- public async Task<WebResponseContent> MonthlyStats([FromQuery] int months = 12)
- {
- // 瀹炵幇瑙� Step 5
- }
-
- /// <summary>
- /// 搴撳瓨搴撻緞鍒嗗竷
- /// </summary>
- [HttpGet("StockAgeDistribution")]
- public async Task<WebResponseContent> StockAgeDistribution()
- {
- // 瀹炵幇瑙� Step 6
- }
-
- /// <summary>
- /// 鍚勪粨搴撳簱瀛樺垎甯�
- /// </summary>
- [HttpGet("StockByWarehouse")]
- public async Task<WebResponseContent> StockByWarehouse()
- {
- // 瀹炵幇瑙� Step 7
- }
- }
-}
-```
-
-- [ ] **Step 2: 瀹炵幇 Overview 鎺ュ彛**
-
-鍦� Overview 鏂规硶涓疄鐜帮細
-
-```csharp
-public async Task<WebResponseContent> Overview()
-{
- var today = DateTime.Today;
- var firstDayOfMonth = new DateTime(today.Year, today.Month, 1);
-
- // 浠婃棩鍏ュ簱鏁�
- var todayInbound = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= today && t.TaskType >= 500 && t.TaskType < 600)
- .CountAsync();
-
- // 浠婃棩鍑哄簱鏁�
- var todayOutbound = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= today && t.TaskType >= 100 && t.TaskType < 200)
- .CountAsync();
-
- // 鏈湀鍏ュ簱鏁�
- var monthInbound = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= firstDayOfMonth && t.TaskType >= 500 && t.TaskType < 600)
- .CountAsync();
-
- // 鏈湀鍑哄簱鏁�
- var monthOutbound = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= firstDayOfMonth && t.TaskType >= 100 && t.TaskType < 200)
- .CountAsync();
-
- // 褰撳墠鎬诲簱瀛�
- var totalStock = await _db.Queryable<Dt_StockInfo>().CountAsync();
-
- return WebResponseContent.Instance.OK(null, new
- {
- TodayInbound = todayInbound,
- TodayOutbound = todayOutbound,
- MonthInbound = monthInbound,
- MonthOutbound = monthOutbound,
- TotalStock = totalStock
- });
-}
-```
-
-- [ ] **Step 3: 瀹炵幇 DailyStats 鎺ュ彛**
-
-```csharp
-public async Task<WebResponseContent> DailyStats([FromQuery] int days = 30)
-{
- if (days <= 0) days = 30;
- if (days > 365) days = 365;
-
- var startDate = DateTime.Today.AddDays(-days + 1);
-
- var query = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= startDate)
- .Select(t => new { t.InsertTime, t.TaskType })
- .ToListAsync();
-
- var result = query
- .GroupBy(t => t.InsertTime.Date)
- .Select(g => new
- {
- Date = g.Key.ToString("yyyy-MM-dd"),
- Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
- Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
- })
- .OrderBy(x => x.Date)
- .ToList();
-
- return WebResponseContent.Instance.OK(null, result);
-}
-```
-
-- [ ] **Step 4: 瀹炵幇 WeeklyStats 鎺ュ彛**
-
-```csharp
-public async Task<WebResponseContent> WeeklyStats([FromQuery] int weeks = 12)
-{
- if (weeks <= 0) weeks = 12;
-
- var startDate = DateTime.Today.AddDays(-weeks * 7);
-
- var query = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= startDate)
- .Select(t => new { t.InsertTime, t.TaskType })
- .ToListAsync();
-
- var result = query
- .GroupBy(t => GetWeekKey(t.InsertTime))
- .Select(g => new
- {
- Week = g.Key,
- Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
- Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
- })
- .OrderBy(x => x.Week)
- .ToList();
-
- return WebResponseContent.Instance.OK(null, result);
-}
-
-private string GetWeekKey(DateTime date)
-{
- // 鑾峰彇鍛ㄤ竴寮�濮嬬殑鍛� (ISO 8601)
- var diff = (7 + (date.DayOfWeek - DayOfWeek.Monday)) % 7;
- var monday = date.AddDays(-diff);
- var weekNum = System.Globalization.CultureInfo.InvariantCulture
- .Calendar.GetWeekOfYear(monday, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
- return $"{monday.Year}-W{weekNum:D2}";
-}
-```
-
-- [ ] **Step 5: 瀹炵幇 MonthlyStats 鎺ュ彛**
-
-```csharp
-public async Task<WebResponseContent> MonthlyStats([FromQuery] int months = 12)
-{
- if (months <= 0) months = 12;
-
- var startDate = DateTime.Today.AddMonths(-months + 1);
- startDate = new DateTime(startDate.Year, startDate.Month, 1);
-
- var query = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= startDate)
- .Select(t => new { t.InsertTime, t.TaskType })
- .ToListAsync();
-
- var result = query
- .GroupBy(t => new { t.InsertTime.Year, t.InsertTime.Month })
- .Select(g => new
- {
- Month = $"{g.Key.Year}-{g.Key.Month:D2}",
- Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
- Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
- })
- .OrderBy(x => x.Month)
- .ToList();
-
- return WebResponseContent.Instance.OK(null, result);
-}
-```
-
-- [ ] **Step 6: 瀹炵幇 StockAgeDistribution 鎺ュ彛**
-
-```csharp
-public async Task<WebResponseContent> StockAgeDistribution()
-{
- var now = DateTime.Now;
-
- // 浣跨敤 SQL 鐩存帴鍒嗙粍缁熻锛岄伩鍏嶅姞杞芥墍鏈夋暟鎹埌鍐呭瓨
- var result = new[]
- {
- new { Range = "7澶╁唴", Count = await _db.Queryable<Dt_StockInfo>().Where(s => EF.Functions.DateDiffDay(s.CreateDate, now) <= 7).CountAsync() },
- new { Range = "7-30澶�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => EF.Functions.DateDiffDay(s.CreateDate, now) > 7 && EF.Functions.DateDiffDay(s.CreateDate, now) <= 30).CountAsync() },
- new { Range = "30-90澶�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => EF.Functions.DateDiffDay(s.CreateDate, now) > 30 && EF.Functions.DateDiffDay(s.CreateDate, now) <= 90).CountAsync() },
- new { Range = "90澶╀互涓�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => EF.Functions.DateDiffDay(s.CreateDate, now) > 90).CountAsync() }
- };
-
- return WebResponseContent.Instance.OK(null, result);
-}
-```
-
-- [ ] **Step 7: 瀹炵幇 StockByWarehouse 鎺ュ彛**
-
-```csharp
-public async Task<WebResponseContent> StockByWarehouse()
-{
- var result = await _db.Queryable<Dt_StockInfo>()
- .GroupBy(s => s.WarehouseId)
- .Select(g => new
- {
- WarehouseId = g.Key,
- Count = g.Count()
- })
- .ToListAsync();
-
- // 鑱旀煡浠撳簱鍚嶇О
- var warehouseIds = result.Select(x => x.WarehouseId).ToList();
- var warehouses = await _db.Queryable<Dt_Warehouse>()
- .Where(w => warehouseIds.Contains(w.WarehouseId))
- .Select(w => new { w.WarehouseId, w.WarehouseName })
- .ToListAsync();
-
- var finalResult = result.Select(r =>
- {
- var wh = warehouses.FirstOrDefault(w => w.WarehouseId == r.WarehouseId);
- return new
- {
- Warehouse = wh?.WarehouseName ?? $"浠撳簱{r.WarehouseId}",
- Count = r.Count
- };
- }).ToList();
-
- return WebResponseContent.Instance.OK(null, finalResult);
-}
-```
-
-- [ ] **Step 8: 鎻愪氦浠g爜**
-
-```bash
-git add WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs
-git commit -m "feat(Dashboard): 娣诲姞浠〃鐩樻帶鍒跺櫒锛屽寘鍚�6涓粺璁℃帴鍙�"
-```
-
----
-
-### Task 2: 閲嶅啓鍓嶇 Home.vue 瀹炵幇浠〃鐩�
-
-**鏂囦欢:**
-- Modify: `WIDESEA_WMSClient/src/views/Home.vue`
-
-**璇存槑:** 閲嶅啓涓虹┖鐧界殑棣栭〉锛屽疄鐜颁华琛ㄧ洏鍥捐〃甯冨眬
-
-- [ ] **Step 1: 閲嶅啓 Home.vue 妯℃澘閮ㄥ垎**
-
-```vue
-<template>
- <div class="dashboard-container">
- <!-- 椤堕儴锛氭湰鏈堝嚭鍏ュ簱瓒嬪娍 (鍏ㄥ) -->
- <div class="chart-row full-width">
- <div class="chart-card">
- <div class="card-title">鏈湀鍑哄叆搴撹秼鍔�</div>
- <div id="chart-monthly-trend" class="chart-content"></div>
- </div>
- </div>
-
- <!-- 绗簩琛岋細浠婃棩/鏈懆鍑哄叆搴撳姣� -->
- <div class="chart-row">
- <div class="chart-card">
- <div class="card-title">浠婃棩鍑哄叆搴撳姣�</div>
- <div id="chart-today" class="chart-content"></div>
- </div>
- <div class="chart-card">
- <div class="card-title">鏈懆鍑哄叆搴撳姣�</div>
- <div id="chart-week" class="chart-content"></div>
- </div>
- </div>
-
- <!-- 绗笁琛岋細鏈湀瀵规瘮/搴撳瓨鎬婚噺 -->
- <div class="chart-row">
- <div class="chart-card">
- <div class="card-title">鏈湀鍑哄叆搴撳姣�</div>
- <div id="chart-month" class="chart-content"></div>
- </div>
- <div class="chart-card">
- <div class="card-title">褰撳墠搴撳瓨鎬婚噺</div>
- <div class="stock-total">
- <div class="total-number">{{ overviewData.TotalStock || 0 }}</div>
- <div class="total-label">鎵樼洏</div>
- </div>
- </div>
- </div>
-
- <!-- 绗洓琛岋細搴撻緞鍒嗗竷/浠撳簱鍒嗗竷 -->
- <div class="chart-row">
- <div class="chart-card">
- <div class="card-title">搴撳瓨搴撻緞鍒嗗竷</div>
- <div id="chart-stock-age" class="chart-content"></div>
- </div>
- <div class="chart-card">
- <div class="card-title">鍚勪粨搴撳簱瀛樺垎甯�</div>
- <div id="chart-warehouse" class="chart-content"></div>
- </div>
- </div>
- </div>
-</template>
-```
-
-- [ ] **Step 2: 閲嶅啓鑴氭湰閮ㄥ垎**
-
-```javascript
-<script>
-import * as echarts from "echarts";
-
-export default {
- name: "Home",
- data() {
- return {
- charts: {},
- overviewData: {
- TodayInbound: 0,
- TodayOutbound: 0,
- MonthInbound: 0,
- MonthOutbound: 0,
- TotalStock: 0
- },
- weeklyData: [],
- monthlyData: [],
- stockAgeData: [],
- warehouseData: []
- };
- },
- mounted() {
- this.initCharts();
- this.loadData();
- window.addEventListener("resize", this.handleResize);
- },
- beforeUnmount() {
- window.removeEventListener("resize", this.handleResize);
- Object.values(this.charts).forEach(chart => chart.dispose());
- },
- methods: {
- handleResize() {
- Object.values(this.charts).forEach(chart => chart.resize());
- },
-
- initCharts() {
- this.charts.monthlyTrend = echarts.init(document.getElementById("chart-monthly-trend"));
- this.charts.today = echarts.init(document.getElementById("chart-today"));
- this.charts.week = echarts.init(document.getElementById("chart-week"));
- this.charts.month = echarts.init(document.getElementById("chart-month"));
- this.charts.stockAge = echarts.init(document.getElementById("chart-stock-age"));
- this.charts.warehouse = echarts.init(document.getElementById("chart-warehouse"));
- },
-
- async loadData() {
- await this.loadOverview();
- await this.loadWeeklyStats();
- await this.loadMonthlyStats();
- await this.loadStockAgeDistribution();
- await this.loadStockByWarehouse();
- },
-
- async loadOverview() {
- try {
- const res = await this.http.get("/api/Dashboard/Overview");
- if (res.Status && res.Data) {
- this.overviewData = res.Data;
- this.updateTodayChart();
- this.updateWeekChart();
- this.updateMonthChart();
- }
- } catch (e) {
- console.error("鍔犺浇鎬昏鏁版嵁澶辫触", e);
- }
- },
-
- async loadWeeklyStats() {
- try {
- const res = await this.http.get("/api/Dashboard/WeeklyStats", { weeks: 12 });
- if (res.Status && res.Data) {
- this.weeklyData = res.Data;
- this.updateWeekChart();
- }
- } catch (e) {
- console.error("鍔犺浇姣忓懆缁熻澶辫触", e);
- }
- },
-
- async loadMonthlyStats() {
- try {
- const res = await this.http.get("/api/Dashboard/MonthlyStats", { months: 12 });
- if (res.Status && res.Data) {
- this.monthlyData = res.Data;
- this.updateMonthlyTrendChart();
- }
- } catch (e) {
- console.error("鍔犺浇姣忔湀缁熻澶辫触", e);
- }
- },
-
- async loadStockAgeDistribution() {
- try {
- const res = await this.http.get("/api/Dashboard/StockAgeDistribution");
- if (res.Status && res.Data) {
- this.stockAgeData = res.Data;
- this.updateStockAgeChart();
- }
- } catch (e) {
- console.error("鍔犺浇搴撻緞鍒嗗竷澶辫触", e);
- }
- },
-
- async loadStockByWarehouse() {
- try {
- const res = await this.http.get("/api/Dashboard/StockByWarehouse");
- if (res.Status && res.Data) {
- this.warehouseData = res.Data;
- this.updateWarehouseChart();
- }
- } catch (e) {
- console.error("鍔犺浇浠撳簱鍒嗗竷澶辫触", e);
- }
- },
-
- // 鏇存柊浠婃棩瀵规瘮鍥捐〃
- updateTodayChart() {
- const option = {
- tooltip: { trigger: "axis" },
- legend: { data: ["鍏ュ簱", "鍑哄簱"], textStyle: { color: "#fff" } },
- xAxis: {
- type: "category",
- data: ["浠婃棩"],
- axisLabel: { color: "#fff" }
- },
- yAxis: {
- type: "value",
- axisLabel: { color: "#fff" }
- },
- series: [
- { name: "鍏ュ簱", type: "bar", data: [this.overviewData.TodayInbound], itemStyle: { color: "#5470c6" } },
- { name: "鍑哄簱", type: "bar", data: [this.overviewData.TodayOutbound], itemStyle: { color: "#91cc75" } }
- ]
- };
- this.charts.today.setOption(option, true);
- },
-
- // 鏇存柊鏈懆瀵规瘮鍥捐〃
- updateWeekChart() {
- // 鏈懆鏁版嵁浠� weeklyData 涓绠楀綋鍛ㄦ暟鎹�
- const thisWeek = this.getThisWeekData(this.weeklyData);
- const option = {
- tooltip: { trigger: "axis" },
- legend: { data: ["鍏ュ簱", "鍑哄簱"], textStyle: { color: "#fff" } },
- xAxis: {
- type: "category",
- data: ["鏈懆"],
- axisLabel: { color: "#fff" }
- },
- yAxis: {
- type: "value",
- axisLabel: { color: "#fff" }
- },
- series: [
- { name: "鍏ュ簱", type: "bar", data: [thisWeek.Inbound], itemStyle: { color: "#5470c6" } },
- { name: "鍑哄簱", type: "bar", data: [thisWeek.Outbound], itemStyle: { color: "#91cc75" } }
- ]
- };
- this.charts.week.setOption(option, true);
- },
-
- getThisWeekData(weeklyData) {
- if (!weeklyData || weeklyData.length === 0) return { Inbound: 0, Outbound: 0 };
- const thisWeekKey = this.getCurrentWeekKey();
- const thisWeek = weeklyData.find(w => w.Week === thisWeekKey);
- return thisWeek || { Inbound: 0, Outbound: 0 };
- },
-
- getCurrentWeekKey() {
- const now = new Date();
- const diff = (7 + (now.getDay() - 1)) % 7;
- const monday = new Date(now);
- monday.setDate(now.getDate() - diff);
- const year = monday.getFullYear();
- const month = monday.getMonth() + 1;
- const day = monday.getDate();
- // ISO week start (Monday)
- const jan1 = new Date(year, 0, 1);
- const weekNum = Math.ceil(((monday - jan1) / 86400000 + jan1.getDay() + 1) / 7);
- return `${year}-W${String(weekNum).padStart(2, "0")}`;
- },
-
- // 鏇存柊鏈湀瀵规瘮鍥捐〃
- updateMonthChart() {
- const option = {
- tooltip: { trigger: "axis" },
- legend: { data: ["鍏ュ簱", "鍑哄簱"], textStyle: { color: "#fff" } },
- xAxis: {
- type: "category",
- data: ["鏈湀"],
- axisLabel: { color: "#fff" }
- },
- yAxis: {
- type: "value",
- axisLabel: { color: "#fff" }
- },
- series: [
- { name: "鍏ュ簱", type: "bar", data: [this.overviewData.MonthInbound], itemStyle: { color: "#5470c6" } },
- { name: "鍑哄簱", type: "bar", data: [this.overviewData.MonthOutbound], itemStyle: { color: "#91cc75" } }
- ]
- };
- this.charts.month.setOption(option, true);
- },
-
- // 鏇存柊鏈堝害瓒嬪娍鍥捐〃锛堟姌绾垮浘锛�
- updateMonthlyTrendChart() {
- const option = {
- tooltip: { trigger: "axis" },
- legend: { data: ["鍏ュ簱", "鍑哄簱"], textStyle: { color: "#fff" } },
- xAxis: {
- type: "category",
- data: this.monthlyData.map(m => m.Month),
- axisLabel: { color: "#fff", rotate: 45 }
- },
- yAxis: [
- {
- type: "value",
- name: "鏁伴噺",
- axisLabel: { color: "#fff" }
- }
- ],
- series: [
- { name: "鍏ュ簱", type: "line", data: this.monthlyData.map(m => m.Inbound), itemStyle: { color: "#5470c6" } },
- { name: "鍑哄簱", type: "line", data: this.monthlyData.map(m => m.Outbound), itemStyle: { color: "#91cc75" } }
- ]
- };
- this.charts.monthlyTrend.setOption(option, true);
- },
-
- // 鏇存柊搴撻緞鍒嗗竷鍥捐〃
- updateStockAgeChart() {
- const option = {
- tooltip: { trigger: "item" },
- legend: { data: this.stockAgeData.map(s => s.Range), textStyle: { color: "#fff" } },
- series: [
- {
- type: "pie",
- radius: "60%",
- data: this.stockAgeData.map((s, i) => ({
- name: s.Range,
- value: s.Count
- })),
- emphasis: {
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: "rgba(0, 0, 0, 0.5)"
- }
- }
- }
- ]
- };
- this.charts.stockAge.setOption(option, true);
- },
-
- // 鏇存柊浠撳簱鍒嗗竷鍥捐〃
- updateWarehouseChart() {
- const option = {
- tooltip: { trigger: "axis" },
- xAxis: {
- type: "category",
- data: this.warehouseData.map(w => w.Warehouse),
- axisLabel: { color: "#fff", rotate: 30 }
- },
- yAxis: {
- type: "value",
- axisLabel: { color: "#fff" }
- },
- series: [
- {
- type: "bar",
- data: this.warehouseData.map(w => w.Count),
- itemStyle: { color: "#5470c6" }
- }
- ]
- };
- this.charts.warehouse.setOption(option, true);
- }
- }
-};
-</script>
-```
-
-- [ ] **Step 3: 娣诲姞鏍峰紡**
-
-```vue
-<style scoped>
-.dashboard-container {
- padding: 20px;
- background-color: #0e1a2b;
- min-height: calc(100vh - 60px);
-}
-
-.chart-row {
- display: flex;
- gap: 20px;
- margin-bottom: 20px;
-}
-
-.chart-row.full-width {
- width: 100%;
-}
-
-.chart-card {
- flex: 1;
- background: rgba(255, 255, 255, 0.05);
- border: 1px solid rgba(25, 186, 139, 0.17);
- border-radius: 4px;
- padding: 15px;
- position: relative;
-}
-
-.chart-card::before {
- content: "";
- position: absolute;
- top: 0;
- left: 0;
- width: 10px;
- height: 10px;
- border-top: 2px solid #02a6b5;
- border-left: 2px solid #02a6b5;
-}
-
-.chart-card::after {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- width: 10px;
- height: 10px;
- border-top: 2px solid #02a6b5;
- border-right: 2px solid #02a6b5;
-}
-
-.card-title {
- color: #fff;
- font-size: 16px;
- text-align: center;
- margin-bottom: 10px;
-}
-
-.chart-content {
- height: 280px;
- width: 100%;
-}
-
-.stock-total {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- height: 280px;
-}
-
-.total-number {
- font-size: 64px;
- font-weight: bold;
- color: #67caca;
- font-family: -apple-system, BlinkMacSystemFont, Segoe UI, PingFang SC, Microsoft YaHei, Helvetica Neue, Helvetica, Arial, sans-serif;
-}
-
-.total-label {
- font-size: 18px;
- color: #fcf0d8;
- margin-top: 10px;
-}
-
-/* 鍏ㄥ鍥捐〃 */
-.full-width .chart-card {
- flex: none;
- width: 100%;
-}
-
-.full-width .chart-content {
- height: 350px;
-}
-</style>
-```
-
-- [ ] **Step 4: 鎻愪氦浠g爜**
-
-```bash
-git add WIDESEA_WMSClient/src/views/Home.vue
-git commit -m "feat(Home): 閲嶅啓棣栭〉涓轰华琛ㄧ洏鍥捐〃椤甸潰"
-```
-
----
-
-### Task 3: 楠岃瘉瀹炵幇
-
-- [ ] **Step 1: 鏋勫缓鍚庣**
-
-```bash
-cd WIDESEA_WMSServer
-dotnet build WIDESEA_WMSServer.sln
-```
-
-棰勬湡锛氭瀯寤烘垚鍔燂紝鏃犻敊璇�
-
-- [ ] **Step 2: 鏋勫缓鍓嶇**
-
-```bash
-cd WIDESEA_WMSClient
-yarn build
-```
-
-棰勬湡锛氭瀯寤烘垚鍔燂紝鏃犻敊璇�
-
-- [ ] **Step 3: 鍚姩鍚庣娴嬭瘯 API**
-
-```bash
-cd WIDESEA_WMSServer/WIDESEA_WMSServer
-dotnet run
-```
-
-浣跨敤娴忚鍣ㄦ垨 Postman 娴嬭瘯锛�
-- `GET http://localhost:9291/api/Dashboard/Overview`
-- `GET http://localhost:9291/api/Dashboard/DailyStats?days=30`
-- `GET http://localhost:9291/api/Dashboard/WeeklyStats?weeks=12`
-- `GET http://localhost:9291/api/Dashboard/MonthlyStats?months=12`
-- `GET http://localhost:9291/api/Dashboard/StockAgeDistribution`
-- `GET http://localhost:9291/api/Dashboard/StockByWarehouse`
-
-棰勬湡锛氬悇鎺ュ彛杩斿洖 JSON 鏁版嵁锛屾牸寮忕鍚堣璁℃枃妗�
-
----
-
-## 鎬荤粨
-
-### 鍚庣锛圖ashboardController锛�
-| 鎺ュ彛 | 璺敱 | 璇存槑 |
-|------|------|------|
-| Overview | GET /api/Dashboard/Overview | 鎬昏鏁版嵁 |
-| DailyStats | GET /api/Dashboard/DailyStats?days=30 | 姣忔棩缁熻 |
-| WeeklyStats | GET /api/Dashboard/WeeklyStats?weeks=12 | 姣忓懆缁熻 |
-| MonthlyStats | GET /api/Dashboard/MonthlyStats?months=12 | 姣忔湀缁熻 |
-| StockAgeDistribution | GET /api/Dashboard/StockAgeDistribution | 搴撻緞鍒嗗竷 |
-| StockByWarehouse | GET /api/Dashboard/StockByWarehouse | 浠撳簱鍒嗗竷 |
-
-### 鍓嶇锛圚ome.vue锛�
-| 鍥捐〃 | 缁勪欢 ID | 鍥捐〃绫诲瀷 |
-|------|---------|----------|
-| 鏈湀鍑哄叆搴撹秼鍔� | chart-monthly-trend | 鎶樼嚎鍥� |
-| 浠婃棩鍑哄叆搴撳姣� | chart-today | 鏌辩姸鍥� |
-| 鏈懆鍑哄叆搴撳姣� | chart-week | 鏌辩姸鍥� |
-| 鏈湀鍑哄叆搴撳姣� | chart-month | 鏌辩姸鍥� |
-| 褰撳墠搴撳瓨鎬婚噺 | (鏁板瓧鍗$墖) | - |
-| 搴撳瓨搴撻緞鍒嗗竷 | chart-stock-age | 楗煎浘 |
-| 鍚勪粨搴撳簱瀛樺垎甯� | chart-warehouse | 鏌辩姸鍥� |
diff --git a/Code/WMS/docs/superpowers/plans/2026-03-30-stock-chat-implementation-plan.md b/Code/WMS/docs/superpowers/plans/2026-03-30-stock-chat-implementation-plan.md
deleted file mode 100644
index 7cddf9c..0000000
--- a/Code/WMS/docs/superpowers/plans/2026-03-30-stock-chat-implementation-plan.md
+++ /dev/null
@@ -1,314 +0,0 @@
-# 搴撳瓨3D鏌ョ湅鍣� Implementation Plan
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task.
-
-**Goal:** 瀹炵幇搴撳瓨3D鏌ョ湅鍣紝鐢ㄦ埛鍙湪 Three.js 3D 鍦烘櫙涓贰瑙嗕粨搴撱�佺偣鍑昏揣浣嶆煡鐪嬪簱瀛樿鎯�
-
-**Architecture:** 鍓嶇 Vue 3 + Element Plus + Three.js锛屽悗绔� ASP.NET Core 6 Web API + SignalR 瀹炴椂鎺ㄩ��
-
-**Tech Stack:** Three.js, @microsoft/signalr, Element Plus, Vue 3 Composition API
-
----
-
-## 鏂囦欢缁撴瀯
-
-```
-鍚庣 (WIDESEA_WMSServer)
-鈹溾攢鈹� WIDESEA_DTO/Stock/Stock3DLayoutDTO.cs # 3D甯冨眬鍝嶅簲DTO [鏂板缓]
-鈹溾攢鈹� WIDESEA_IStockService/IStockInfoService.cs # 娣诲姞Get3DLayoutAsync鏂规硶绛惧悕 [淇敼]
-鈹溾攢鈹� WIDESEA_StockService/StockInfoService.cs # 瀹炵幇Get3DLayoutAsync [淇敼]
-鈹溾攢鈹� WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs # 娣诲姞Get3DLayout绔偣 [淇敼]
-鈹斺攢鈹� WIDESEA_WMSServer/Hubs/StockHub.cs # SignalR Hub [鏂板缓]
-
-鍓嶇 (WIDESEA_WMSClient)
-鈹溾攢鈹� package.json # 娣诲姞three渚濊禆 [淇敼]
-鈹溾攢鈹� src/router/viewGird.js # 娉ㄥ唽璺敱 [淇敼]
-鈹溾攢鈹� src/views/stock/stockChat.vue # 涓婚〉闈㈢粍浠� [鏂板缓]
-鈹斺攢鈹� src/extension/stock/stockChat.js # 鎵╁睍閰嶇疆 [鏂板缓]
-```
-
----
-
-## 瀹炵幇浠诲姟
-
-### Task 1: 鍚庣 - 鍒涘缓 Stock3DLayoutDTO
-
-**Files:**
-- Create: `WIDESEA_WMSServer/WIDESEA_DTO/Stock/Stock3DLayoutDTO.cs`
-
-**璇︾粏瑙勮寖锛�**
-
-鍒涘缓涓や釜 DTO 绫伙細
-1. `Stock3DLayoutDTO` - 鍖呭惈浠撳簱鍩烘湰淇℃伅銆佸昂瀵搞�佺瓫閫夊垪琛ㄣ�佽揣浣嶆暟缁�
-2. `Location3DItemDTO` - 鍖呭惈鍗曚釜璐т綅鐨勬墍鏈�3D娓叉煋鎵�闇�鏁版嵁
-
-**楠屾敹鏍囧噯锛�**
-- DTO 鍖呭惈鎵�鏈� spec 涓畾涔夌殑瀛楁
-- 鍛藉悕绌洪棿姝g‘
-- 鍙互琚� Service 灞傛纭紩鐢�
-
-```csharp
-namespace WIDESEA_DTO.Stock
-{
- /// <summary>
- /// 浠撳簱3D甯冨眬鍝嶅簲DTO
- /// </summary>
- public class Stock3DLayoutDTO
- {
- public int WarehouseId { get; set; }
- public string WarehouseName { get; set; }
- public int MaxRow { get; set; }
- public int MaxColumn { get; set; }
- public int MaxLayer { get; set; }
- public List<string> MaterielCodeList { get; set; } = new();
- public List<string> BatchNoList { get; set; } = new();
- public List<Location3DItemDTO> Locations { get; set; } = new();
- }
-
- /// <summary>
- /// 璐т綅3D鏁版嵁椤�
- /// </summary>
- public class Location3DItemDTO
- {
- public int LocationId { get; set; }
- public string LocationCode { get; set; }
- public int Row { get; set; }
- public int Column { get; set; }
- public int Layer { get; set; }
- public int LocationStatus { get; set; } // 0=绌�, 1=鍗犵敤, 2=閿佸畾, 3=绂佺敤
- public int StockStatus { get; set; } // 0=鏃犺揣, 1=鏈夎揣, 2=搴撳瓨绱у紶, 3=宸叉弧
- public float StockQuantity { get; set; }
- public float MaxCapacity { get; set; }
- public string? PalletCode { get; set; }
- public string? MaterielCode { get; set; }
- public string? MaterielName { get; set; }
- public string? BatchNo { get; set; }
- }
-}
-```
-
----
-
-### Task 2: 鍚庣 - 鏇存柊 IStockInfoService 鎺ュ彛
-
-**Files:**
-- Modify: `WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs`
-
-**璇︾粏瑙勮寖锛�**
-
-鍦ㄦ帴鍙d腑娣诲姞鏂规硶绛惧悕锛�
-```csharp
-/// <summary>
-/// 鑾峰彇浠撳簱3D甯冨眬鏁版嵁
-/// </summary>
-/// <param name="warehouseId">浠撳簱ID</param>
-/// <returns>3D甯冨眬DTO</returns>
-Task<Stock3DLayoutDTO> Get3DLayoutAsync(int warehouseId);
-```
-
-**楠屾敹鏍囧噯锛�**
-- 鏂规硶绛惧悕姝g‘
-- 娣诲姞浜嗘枃妗f敞閲�
-- 寮曠敤浜� Stock3DLayoutDTO
-
----
-
-### Task 3: 鍚庣 - 瀹炵幇 Get3DLayoutAsync
-
-**Files:**
-- Modify: `WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs`
-
-**璇︾粏瑙勮寖锛�**
-
-瀹炵幇 Get3DLayoutAsync 鏂规硶锛�
-1. 鏌ヨ浠撳簱淇℃伅
-2. 鏌ヨ璇ヤ粨搴撴墍鏈夎揣浣�
-3. 鏌ヨ搴撳瓨淇℃伅锛堝寘鍚槑缁嗭級
-4. 鎻愬彇鐗╂枡缂栧彿鍜屾壒娆″彿鍒楄〃
-5. 鏄犲皠鍒� Location3DItemDTO
-6. 璁$畻浠撳簱灏哄
-
-**楠屾敹鏍囧噯锛�**
-- 鏂规硶鑳芥纭繑鍥� Stock3DLayoutDTO
-- 鎵�鏈� locationStatus 鍜� stockStatus 鍊兼纭槧灏�
-- 鎬ц兘閫傚悎涓瀷浠撳簱锛�1000-5000璐т綅锛�
-
----
-
-### Task 4: 鍚庣 - 娣诲姞 API 绔偣
-
-**Files:**
-- Modify: `WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs`
-
-**璇︾粏瑙勮寖锛�**
-
-娣诲姞绔偣锛�
-```csharp
-/// <summary>
-/// 鑾峰彇浠撳簱3D甯冨眬
-/// </summary>
-/// <param name="warehouseId">浠撳簱ID</param>
-/// <returns>3D甯冨眬鏁版嵁</returns>
-[HttpGet("Get3DLayout")]
-public async Task<WebResponseContent> Get3DLayout(int warehouseId)
-{
- var result = await Service.Get3DLayoutAsync(warehouseId);
- return WebResponseContent.Instance.OK(result);
-}
-```
-
-**楠屾敹鏍囧噯锛�**
-- 璺敱姝g‘锛欸ET /api/StockInfo/Get3DLayout?warehouseId={id}
-- 杩斿洖鏍煎紡绗﹀悎 WebResponseContent 瑙勮寖
-
----
-
-### Task 5: 鍚庣 - 鍒涘缓 SignalR Hub
-
-**Files:**
-- Create: `WIDESEA_WMSServer/WIDESEA_WMSServer/Hubs/StockHub.cs`
-- Modify: `WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs`
-
-**璇︾粏瑙勮寖锛�**
-
-1. 鍒涘缓 StockHub 绫伙紝缁ф壙 Microsoft.AspNetCore.SignalR.Hub
-2. 娣诲姞 SendStockUpdate 鏂规硶渚涘閮ㄨ皟鐢�
-3. 鍦� Program.cs 涓敞鍐� SignalR 鏈嶅姟骞舵槧灏� Hub
-
-**楠屾敹鏍囧噯锛�**
-- Hub 鍙鍓嶇杩炴帴
-- SendStockUpdate 鏂规硶瀛樺湪涓斿彲琚皟鐢�
-
----
-
-### Task 6: 鍓嶇 - 瀹夎 Three.js 渚濊禆
-
-**Files:**
-- Modify: `WIDESEA_WMSClient/package.json`
-
-**璇︾粏瑙勮寖锛�**
-
-娣诲姞 three 渚濊禆鍒� package.json锛�
-```json
-"three": "^0.160.0"
-```
-
-**楠屾敹鏍囧噯锛�**
-- package.json 鍖呭惈 three 渚濊禆
-- 鐗堟湰鍙峰悎鐞嗭紙^0.160.0 鎴栨洿鏂扮ǔ瀹氱増锛�
-
----
-
-### Task 7: 鍓嶇 - 娉ㄥ唽璺敱
-
-**Files:**
-- Modify: `WIDESEA_WMSClient/src/router/viewGird.js`
-
-**璇︾粏瑙勮寖锛�**
-
-鍦� stockView 璺敱鍚庢坊鍔狅細
-```javascript
-{
- path: '/stockChat',
- name: 'stockChat',
- component: () => import('@/views/stock/stockChat.vue')
-}
-```
-
-**楠屾敹鏍囧噯锛�**
-- 璺敱娉ㄥ唽姝g‘
-- 涓庡叾浠栬矾鐢辨牸寮忎竴鑷�
-
----
-
-### Task 8: 鍓嶇 - 鍒涘缓 stockChat.vue 涓荤粍浠�
-
-**Files:**
-- Create: `WIDESEA_WMSClient/src/views/stock/stockChat.vue`
-
-**璇︾粏瑙勮寖锛�**
-
-缁勪欢蹇呴』鍖呭惈锛�
-1. 浠撳簱 Tabs锛坋l-tabs锛�
-2. 宸ュ叿鏍忥紙绛涢�� + 閲嶇疆瑙嗚鎸夐挳锛�
-3. 3D Canvas 瀹瑰櫒
-4. 鐘舵�佸浘渚�
-5. 璇︽儏寮圭獥锛坋l-dialog fullscreen锛�
-
-Three.js 鍦烘櫙锛�
-1. 鍦烘櫙鍒濆鍖栵紙鑳屾櫙鑹� 0x1a1a2e锛�
-2. 閫忚鐩告満
-3. WebGLRenderer
-4. OrbitControls锛堥樆灏煎惎鐢ㄧ殑杞ㄩ亾鎺у埗鍣級
-5. 鐜鍏� + 瀹氬悜鍏�
-6. 鍦伴潰锛圥laneGeometry锛岀綉鏍硷級
-7. InstancedMesh 鎵归噺娓叉煋璐т綅
-8. Raycaster 鐐瑰嚮鎷惧彇
-9. 鐩告満 lerp 鑱氱劍鍔ㄧ敾
-
-棰滆壊缂栫爜锛堝墠绔疄鐜帮級锛�
-- DISABLED(3): 0x2d2d2d
-- LOCKED(2): 0xF56C6C
-- EMPTY(0/鏃犺揣): 0x4a4a4a
-- HAS_STOCK(1): 0x409EFF
-- LOW_STOCK(2): 0xE6A23C
-- FULL(3): 0x67C23A
-
-**楠屾敹鏍囧噯锛�**
-- 椤甸潰鍙互姝e父鍔犺浇
-- Three.js 鍦烘櫙姝g‘鍒濆鍖�
-- 鐐瑰嚮璐т綅鑳芥樉绀鸿鎯呭脊绐�
-- 棰滆壊缂栫爜姝g‘
-
----
-
-### Task 9: 鍓嶇 - 鍒涘缓鎵╁睍閰嶇疆鏂囦欢
-
-**Files:**
-- Create: `WIDESEA_WMSClient/src/extension/stock/stockChat.js`
-
-**璇︾粏瑙勮寖锛�**
-
-鍒涘缓鏍囧噯鎵╁睍鏂囦欢鏍煎紡锛�
-```javascript
-let extension = {
- components: {
- gridHeader: '',
- gridBody: '',
- gridFooter: '',
- modelHeader: '',
- modelBody: '',
- modelFooter: ''
- },
- tableAction: '',
- buttons: { view: [], box: [], detail: [] },
- methods: {
- onInit() {},
- onInited() {}
- }
-};
-export default extension;
-```
-
-**楠屾敹鏍囧噯锛�**
-- 绗﹀悎椤圭洰鐜版湁鎵╁睍鏂囦欢妯″紡
-
----
-
-### Task 10: 鍓嶇 - 闆嗘垚 SignalR 瀹炴椂鏇存柊
-
-**Files:**
-- Modify: `WIDESEA_WMSClient/src/views/stock/stockChat.vue`
-
-**璇︾粏瑙勮寖锛�**
-
-1. 鍦� onMounted 涓垵濮嬪寲 SignalR 杩炴帴
-2. 杩炴帴 /stockHub
-3. 鐩戝惉 StockUpdated 浜嬩欢
-4. 鏇存柊瀵瑰簲璐т綅鐨� stockQuantity 鍜� stockStatus
-5. 鍔ㄦ�佹洿鏂拌揣浣嶉鑹�
-6. 鍦� onUnmounted 涓柇寮�杩炴帴
-
-**楠屾敹鏍囧噯锛�**
-- SignalR 杩炴帴姝e父寤虹珛
-- 鏀跺埌鏇存柊鏃惰揣浣嶉鑹茶兘鍔ㄦ�佸彉鍖�
diff --git "a/Code/WMS/docs/superpowers/plans/2026-03-30-\344\273\273\345\212\241\345\272\223\345\255\230\345\216\206\345\217\262\350\256\260\345\275\225\345\256\236\347\216\260\350\256\241\345\210\222.md" "b/Code/WMS/docs/superpowers/plans/2026-03-30-\344\273\273\345\212\241\345\272\223\345\255\230\345\216\206\345\217\262\350\256\260\345\275\225\345\256\236\347\216\260\350\256\241\345\210\222.md"
deleted file mode 100644
index 140c61b..0000000
--- "a/Code/WMS/docs/superpowers/plans/2026-03-30-\344\273\273\345\212\241\345\272\223\345\255\230\345\216\206\345\217\262\350\256\260\345\275\225\345\256\236\347\216\260\350\256\241\345\210\222.md"
+++ /dev/null
@@ -1,273 +0,0 @@
-# 浠诲姟搴撳瓨鍘嗗彶璁板綍瀹炵幇璁″垝
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 鍦� TaskService 鐨勪换鍔″畬鎴愭柟娉曚腑娣诲姞浠诲姟鍘嗗彶鍜屽簱瀛樺巻鍙蹭繚瀛樸��
-
-**Architecture:** 娉ㄥ叆 `ITask_HtyService` 鍜� `IStockInfo_HtyService`锛屼慨鏀� `CompleteTaskAsync` 娣诲姞鍘嗗彶淇濆瓨锛屼袱涓┖鎵樼洏鏂规硶鍐呰仈娣诲姞鍘嗗彶淇濆瓨銆�
-
-**Tech Stack:** ASP.NET Core 6.0, MapsterMapper, SqlSugar
-
----
-
-## 浠诲姟鎬昏
-
-| 浠诲姟 | 鍐呭 |
-|------|------|
-| Task 1 | 娉ㄥ叆鏈嶅姟锛圛Task_HtyService, IStockInfo_HtyService锛� |
-| Task 2 | 淇敼 CompleteTaskAsync 娣诲姞浠诲姟鍘嗗彶淇濆瓨 |
-| Task 3 | 淇敼 3 涓皟鐢ㄦ柟浼犲叆 operateType |
-| Task 4 | InboundFinishTaskTrayAsync 娣诲姞鍘嗗彶淇濆瓨 |
-| Task 5 | OutboundFinishTaskTrayAsync 娣诲姞鍘嗗彶淇濆瓨 |
-
----
-
-## Task 1: 娉ㄥ叆鍘嗗彶鏈嶅姟
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`
-
-- [ ] **Step 1: 娣诲姞瀛楁**
-
-鍦� `_mesService` 瀛楁鍚庢坊鍔狅細
-```csharp
-private readonly ITask_HtyService _task_HtyService;
-private readonly IStockInfo_HtyService _stockInfo_HtyService;
-```
-
-- [ ] **Step 2: 淇敼鏋勯�犲嚱鏁�**
-
-鍦ㄦ瀯閫犲嚱鏁板弬鏁颁腑娣诲姞锛�
-```csharp
-ITask_HtyService task_HtyService,
-IStockInfo_HtyService stockInfo_HtyService,
-```
-
-鍦ㄦ瀯閫犲嚱鏁颁綋鍐呮坊鍔狅細
-```csharp
-_task_HtyService = task_HtyService;
-_stockInfo_HtyService = stockInfo_HtyService;
-```
-
-- [ ] **Step 3: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-- [ ] **Step 4: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): 娉ㄥ叆ITask_HtyService鍜孖StockInfo_HtyService"
-```
-
----
-
-## Task 2: 淇敼 CompleteTaskAsync 娣诲姞浠诲姟鍘嗗彶淇濆瓨
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛坄CompleteTaskAsync` 鏂规硶锛�
-
-- [ ] **Step 1: 淇敼鏂规硶绛惧悕**
-
-灏嗭細
-```csharp
-private async Task<WebResponseContent> CompleteTaskAsync(Dt_Task task)
-```
-
-淇敼涓猴細
-```csharp
-private async Task<WebResponseContent> CompleteTaskAsync(Dt_Task task, string operateType)
-```
-
-- [ ] **Step 2: 淇敼鍘嗗彶淇濆瓨閫昏緫**
-
-灏嗭細
-```csharp
-var historyTask = _mapper.Map<Dt_Task_Hty>(task);
-historyTask.InsertTime = DateTime.Now;
-```
-
-淇敼涓猴細
-```csharp
-var historyTask = _mapper.Map<Dt_Task_Hty>(task);
-historyTask.InsertTime = DateTime.Now;
-historyTask.OperateType = operateType;
-var saveResult = await _task_HtyService.Repository.AddDataAsync(historyTask) > 0;
-if (!saveResult) return WebResponseContent.Instance.Error("浠诲姟鍘嗗彶淇濆瓨澶辫触");
-```
-
-- [ ] **Step 3: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-- [ ] **Step 4: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): CompleteTaskAsync娣诲姞浠诲姟鍘嗗彶淇濆瓨閫昏緫"
-```
-
----
-
-## Task 3: 淇敼 3 涓皟鐢ㄦ柟浼犲叆 operateType
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`
-
-- [ ] **Step 1: 淇敼 InboundFinishTaskAsync 鐨� CompleteTaskAsync 璋冪敤**
-
-灏嗭細
-```csharp
-return await CompleteTaskAsync(task);
-```
-
-淇敼涓猴細
-```csharp
-return await CompleteTaskAsync(task, "鍏ュ簱瀹屾垚");
-```
-
-- [ ] **Step 2: 淇敼 OutboundFinishTaskAsync 鐨� CompleteTaskAsync 璋冪敤**
-
-灏嗭細
-```csharp
-return await CompleteTaskAsync(task);
-```
-
-淇敼涓猴細
-```csharp
-return await CompleteTaskAsync(task, "鍑哄簱瀹屾垚");
-```
-
-- [ ] **Step 3: 淇敼 RelocationFinishTaskAsync 鐨� CompleteTaskAsync 璋冪敤**
-
-灏嗭細
-```csharp
-return await CompleteTaskAsync(task);
-```
-
-淇敼涓猴細
-```csharp
-return await CompleteTaskAsync(task, "绉诲簱瀹屾垚");
-```
-
-- [ ] **Step 4: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-- [ ] **Step 5: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): 浠诲姟瀹屾垚鏂规硶浼犲叆姝g‘鐨凮perateType"
-```
-
----
-
-## Task 4: InboundFinishTaskTrayAsync 娣诲姞鍘嗗彶淇濆瓨
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛坄InboundFinishTaskTrayAsync` 鏂规硶锛岀害绗� 403 琛岋級
-
-- [ ] **Step 1: 鍦ㄥ垹闄や换鍔″墠娣诲姞浠诲姟鍘嗗彶鍜屽簱瀛樺巻鍙蹭繚瀛�**
-
-鍦� `var deleteResult = await BaseDal.DeleteDataAsync(task);` 涔嬪墠娣诲姞锛�
-
-```csharp
-// 淇濆瓨浠诲姟鍘嗗彶
-var historyTask = _mapper.Map<Dt_Task_Hty>(task);
-historyTask.InsertTime = DateTime.Now;
-historyTask.OperateType = "绌烘墭鐩樺叆搴撳畬鎴�";
-if (await _task_HtyService.Repository.AddDataAsync(historyTask) <= 0)
- return content.Error("浠诲姟鍘嗗彶淇濆瓨澶辫触");
-
-// 淇濆瓨搴撳瓨鍘嗗彶
-var historyStock = _mapper.Map<Dt_StockInfo_Hty>(stockInfo);
-historyStock.InsertTime = DateTime.Now;
-historyStock.OperateType = "绌烘墭鐩樺叆搴撳畬鎴�";
-if (await _stockInfo_HtyService.Repository.AddDataAsync(historyStock) <= 0)
- return content.Error("搴撳瓨鍘嗗彶淇濆瓨澶辫触");
-```
-
-- [ ] **Step 2: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-- [ ] **Step 3: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): InboundFinishTaskTrayAsync娣诲姞浠诲姟鍜屽簱瀛樺巻鍙蹭繚瀛�"
-```
-
----
-
-## Task 5: OutboundFinishTaskTrayAsync 娣诲姞鍘嗗彶淇濆瓨
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛坄OutboundFinishTaskTrayAsync` 鏂规硶锛岀害绗� 487 琛岋級
-
-- [ ] **Step 1: 鍦ㄥ垹闄や换鍔″墠娣诲姞浠诲姟鍘嗗彶鍜屽簱瀛樺巻鍙蹭繚瀛�**
-
-鍦� `var deleteResult = await BaseDal.DeleteDataAsync(task);` 涔嬪墠娣诲姞锛�
-
-```csharp
-// 淇濆瓨浠诲姟鍘嗗彶
-var historyTask = _mapper.Map<Dt_Task_Hty>(task);
-historyTask.InsertTime = DateTime.Now;
-historyTask.OperateType = "绌烘墭鐩樺嚭搴撳畬鎴�";
-if (await _task_HtyService.Repository.AddDataAsync(historyTask) <= 0)
- return content.Error("浠诲姟鍘嗗彶淇濆瓨澶辫触");
-
-// 淇濆瓨搴撳瓨鍘嗗彶
-var historyStock = _mapper.Map<Dt_StockInfo_Hty>(stockInfo);
-historyStock.InsertTime = DateTime.Now;
-historyStock.OperateType = "绌烘墭鐩樺嚭搴撳畬鎴�";
-if (await _stockInfo_HtyService.Repository.AddDataAsync(historyStock) <= 0)
- return content.Error("搴撳瓨鍘嗗彶淇濆瓨澶辫触");
-```
-
-- [ ] **Step 2: 鏋勫缓楠岃瘉**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
-```
-
-- [ ] **Step 3: 鎻愪氦**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService.cs
-git commit -m "feat(TaskService): OutboundFinishTaskTrayAsync娣诲姞浠诲姟鍜屽簱瀛樺巻鍙蹭繚瀛�"
-```
-
----
-
-## Task 6: 鏁翠綋鏋勫缓楠岃瘉
-
-- [ ] **Step 1: 鏋勫缓鏁翠釜瑙e喅鏂规**
-
-```bash
-cd WIDESEA_WMSServer && dotnet build WIDESEA_WMSServer.sln
-```
-
-纭鏃犵紪璇戦敊璇��
-
----
-
-## 楠岃瘉妫�鏌ユ竻鍗�
-
-- [ ] `ITask_HtyService` 鍜� `IStockInfo_HtyService` 宸叉敞鍏�
-- [ ] `CompleteTaskAsync` 绛惧悕宸蹭慨鏀逛负甯� `operateType` 鍙傛暟
-- [ ] `InboundFinishTaskAsync` 浼犲叆 `"鍏ュ簱瀹屾垚"`
-- [ ] `OutboundFinishTaskAsync` 浼犲叆 `"鍑哄簱瀹屾垚"`
-- [ ] `RelocationFinishTaskAsync` 浼犲叆 `"绉诲簱瀹屾垚"`
-- [ ] `InboundFinishTaskTrayAsync` 娣诲姞浜嗕换鍔″巻鍙插拰搴撳瓨鍘嗗彶
-- [ ] `OutboundFinishTaskTrayAsync` 娣诲姞浜嗕换鍔″巻鍙插拰搴撳瓨鍘嗗彶
-- [ ] 瑙e喅鏂规鏋勫缓鏃犻敊璇�
diff --git a/Code/WMS/docs/superpowers/plans/2026-03-31-taskService-refactor-plan.md b/Code/WMS/docs/superpowers/plans/2026-03-31-taskService-refactor-plan.md
deleted file mode 100644
index 2167ab2..0000000
--- a/Code/WMS/docs/superpowers/plans/2026-03-31-taskService-refactor-plan.md
+++ /dev/null
@@ -1,338 +0,0 @@
-# TaskService.cs 閲嶆瀯瀹炴柦璁″垝
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 灏� 1500+ 琛岀殑 `TaskService.cs` 鎷嗗垎涓� 4 涓� partial class 鏂囦欢锛屼繚鎸佷笟鍔¢�昏緫涓嶅彉锛屾帶鍒跺櫒璋冪敤鏂瑰紡涓嶅彉銆�
-
-**Architecture:** 浣跨敤 C# partial class 鐗规�э紝灏� TaskService 鎸夊姛鑳芥ā鍧楁媶鍒嗕负 WCS銆丄GV銆佸垎瀹规煖涓変釜鐙珛鏂囦欢锛屼富鏂囦欢淇濈暀瀛楁鍜屾瀯閫犲嚱鏁般�傜紪璇戝悗鍚堝苟涓哄崟涓�绫诲瀷锛屽鎺у埗鍣ㄥ畬鍏ㄩ�忔槑銆�
-
-**Tech Stack:** C# / ASP.NET Core 6.0 / partial class
-
----
-
-## 鏂囦欢缁撴瀯
-
-```
-WIDESEA_TaskInfoService/
-鈹溾攢鈹� TaskService.cs # 绮剧畝鍚� ~100琛岋細瀛楁銆佹瀯閫犲嚱鏁�
-鈹溾攢鈹� TaskService_WCS.cs # ~550琛岋細WCS閫昏緫澶勭悊
-鈹溾攢鈹� TaskService_AGV.cs # ~280琛岋細鏋佸嵎搴揂GV浠诲姟
-鈹斺攢鈹� TaskService_GradingMachine.cs # ~140琛岋細鍒嗗鏌滄帴鍙�
-```
-
----
-
-## Task 1: 鍒涘缓 TaskService_WCS.cs
-
-**Files:**
-- Create: `WIDESEA_TaskInfoService/TaskService_WCS.cs`
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛堝垹闄ゅ凡杩佺Щ鏂规硶锛�
-
-- [ ] **Step 1: 鍒涘缓 TaskService_WCS.cs partial class 鏂囦欢**
-
-```csharp
-using Mapster;
-using MapsterMapper;
-using Microsoft.Extensions.Configuration;
-using SqlSugar;
-using System.DirectoryServices.Protocols;
-using System.Text.Json;
-using WIDESEA_Common.LocationEnum;
-using WIDESEA_Common.StockEnum;
-using WIDESEA_Common.TaskEnum;
-using WIDESEA_Common.WareHouseEnum;
-using WIDESEA_Core;
-using WIDESEA_Core.BaseRepository;
-using WIDESEA_Core.BaseServices;
-using WIDESEA_Core.Core;
-using WIDESEA_Core.Enums;
-using WIDESEA_Core.Helper;
-using WIDESEA_DTO.GradingMachine;
-using WIDESEA_DTO.MES;
-using WIDESEA_DTO.Stock;
-using WIDESEA_DTO.Task;
-using WIDESEA_IBasicService;
-using WIDESEA_IStockService;
-using WIDESEA_ITaskInfoService;
-using WIDESEA_Model.Models;
-
-namespace WIDESEA_TaskInfoService
-{
- public partial class TaskService
- {
- #region WCS閫昏緫澶勭悊
-
- /// <summary>
- /// 鍒涘缓浠诲姟锛堢粍鐩樺叆搴撲换鍔°�佺┖鎵樼洏鍥炲簱浠诲姟锛�
- /// </summary>
- public async Task<WebResponseContent> CreateTaskInboundAsync(CreateTaskDto taskDto)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉
- }
-
- /// <summary>
- /// 鏍规嵁鎸囧畾鐨勪换鍔¤鎯呭紓姝ュ垱寤烘柊鐨勫嚭搴撲换鍔�
- /// </summary>
- public async Task<WebResponseContent> CreateTaskOutboundAsync(CreateTaskDto taskDto)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉
- }
-
- // ... 鍏朵粬 WCS 鐩稿叧鏂规硶锛堣鍘熸枃浠� 82-939 琛岋級
- // GetTasksLocationAsync
- // InboundFinishTaskAsync
- // OutboundFinishTaskAsync
- // RelocationFinishTaskAsync
- // CreateTaskInboundTrayAsync
- // InboundFinishTaskTrayAsync
- // GetOutBoundTrayTaskAsync
- // OutboundFinishTaskTrayAsync
- // UpdateTaskByStatusAsync
- // CreateAutoOutboundTasksAsync
- // CreateRobotGroupPalletTaskAsync
- // CreateRobotChangePalletTaskAsync
- // CreateRobotSplitPalletTaskAsync
- // CreateRobotPalletTaskAsync
- // GetTaskByPalletCodeAsync (private, 澶嶅埗鍒版鏂囦欢)
- // CompleteTaskAsync (private, 澶嶅埗鍒版鏂囦欢)
- // DetermineTargetAddress (private, 澶嶅埗鍒版鏂囦欢)
-
- #endregion WCS閫昏緫澶勭悊
- }
-}
-```
-
-- [ ] **Step 2: 楠岃瘉缂栬瘧**
-
-Run: `dotnet build WIDESEA_WMSServer.sln`
-Expected: 鏃犵紪璇戦敊璇紙WCS 鏂规硶鏆傛椂閲嶅瀹氫箟锛屼笅涓�姝ュ垹闄ゅ師鏂囦欢涓殑瀹炵幇锛�
-
----
-
-## Task 2: 鍒涘缓 TaskService_AGV.cs
-
-**Files:**
-- Create: `WIDESEA_TaskInfoService/TaskService_AGV.cs`
-
-- [ ] **Step 1: 鍒涘缓 TaskService_AGV.cs partial class 鏂囦欢**
-
-```csharp
-using Mapster;
-using MapsterMapper;
-using Microsoft.Extensions.Configuration;
-using SqlSugar;
-using System.DirectoryServices.Protocols;
-using System.Text.Json;
-using WIDESEA_Common.LocationEnum;
-using WIDESEA_Common.StockEnum;
-using WIDESEA_Common.TaskEnum;
-using WIDESEA_Common.WareHouseEnum;
-using WIDESEA_Core;
-// ... 鍏朵粬 using 涓庡師鏂囦欢涓�鑷�
-
-namespace WIDESEA_TaskInfoService
-{
- public partial class TaskService
- {
- #region 鏋佸嵎搴撲换鍔℃ā鍧�
-
- /// <summary>
- /// 鍑哄叆搴撶敵璇�
- /// </summary>
- public async Task<AGVResponse> ApplyInOutAsync(ApplyInOutDto applyInOutDto)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 1132-1245 琛岋級
- }
-
- /// <summary>
- /// 鎵嬪姩鍑哄簱瀹屾垚鍙嶉缁橝GV
- /// </summary>
- public async Task<WebResponseContent> OutTaskComplete(OutTaskCompleteDto outTaskCompleteDto)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 1252-1306 琛岋級
- }
-
- /// <summary>
- /// 杈撻�佺嚎鐢宠杩涘叆
- /// </summary>
- public async Task<AGVResponse> ApplyEnterAsync(ApplyEnterDto applyEnterDto)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 1339-1383 琛岋級
- }
-
- /// <summary>
- /// 鍙栨斁璐у畬鎴�
- /// </summary>
- public async Task<AGVResponse> TaskCompleteAsync(TaskCompleteDto taskCompleteDto)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 1390-1463 琛岋級
- }
-
- /// <summary>
- /// 浠诲姟鍙栨秷
- /// </summary>
- public async Task<AGVResponse> TaskCancelAsync(TaskCancelDto taskCancelDto)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 1470-1519 琛岋級
- }
-
- #endregion 鏋佸嵎搴撲换鍔℃ā鍧�
- }
-}
-```
-
-- [ ] **Step 2: 楠岃瘉缂栬瘧**
-
-Run: `dotnet build WIDESEA_WMSServer.sln`
-Expected: 鏃犵紪璇戦敊璇�
-
----
-
-## Task 3: 鍒涘缓 TaskService_GradingMachine.cs
-
-**Files:**
-- Create: `WIDESEA_TaskInfoService/TaskService_GradingMachine.cs`
-
-- [ ] **Step 1: 鍒涘缓 TaskService_GradingMachine.cs partial class 鏂囦欢**
-
-```csharp
-using Mapster;
-using MapsterMapper;
-using Microsoft.Extensions.Configuration;
-using SqlSugar;
-using System.DirectoryServices.Protocols;
-using System.Text.Json;
-using WIDESEA_Common.LocationEnum;
-// ... 鍏朵粬 using 涓庡師鏂囦欢涓�鑷�
-
-namespace WIDESEA_TaskInfoService
-{
- public partial class TaskService
- {
- #region 鍒嗗鏌滄帴鍙�
-
- /// <summary>
- /// 鍫嗗灈鏈哄彇鏀捐揣瀹屾垚鍚庣墿娴侀�氱煡鍖栨垚鍒嗗鏌滃畬鎴愪俊鍙�
- /// </summary>
- public async Task<WebResponseContent> InOrOutCompletedAsync(GradingMachineInputDto input)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 948-986 琛岋級
- }
-
- /// <summary>
- /// 鍖栨垚鍒嗗鏌滃畾鏃跺悜鐗╂祦鏇存柊鍒嗗鏌滅姸鎬佷俊鎭�
- /// </summary>
- public async Task<WebResponseContent> SendLocationStatusAsync(GradingMachineInputDto input)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 993-1023 琛岋級
- }
-
- /// <summary>
- /// 鍒嗗鏌滃伐浣滃畬鎴愬悗璋冪敤姝ゆ帴鍙i�氱煡鐗╂祦鍑哄簱
- /// </summary>
- public async Task<WebResponseContent> RequestOutboundAsync(GradingMachineInputDto input)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 1030-1082 琛岋級
- }
-
- /// <summary>
- /// 鍏ュ簱瀹屾垚鍒嗗璋冪敤鑾峰彇鎵樼洏涓婃瘡涓�氶亾鐢佃姱
- /// </summary>
- public async Task<WebResponseContent> GetPalletCodeCellAsync(GradingMachineInputDto input)
- {
- // ... 淇濇寔鍘熸湁瀹炵幇涓嶅彉锛堣鍘熸枃浠� 1089-1118 琛岋級
- }
-
- #endregion 鍒嗗鏌滄帴鍙�
- }
-}
-```
-
-- [ ] **Step 2: 楠岃瘉缂栬瘧**
-
-Run: `dotnet build WIDESEA_WMSServer.sln`
-Expected: 鏃犵紪璇戦敊璇�
-
----
-
-## Task 4: 绮剧畝 TaskService.cs
-
-**Files:**
-- Modify: `WIDESEA_TaskInfoService/TaskService.cs`
-
-- [ ] **Step 1: 鍒犻櫎宸茶縼绉诲埌 partial 鏂囦欢鐨勬柟娉曞疄鐜�**
-
-淇濈暀鍐呭锛�
-- 鎵�鏈� using 璇彞
-- namespace 澹版槑
-- partial class 澹版槑
-- 瀛楁瀹氫箟锛坃mapper, _stockInfoService 绛夛級
-- 鏋勯�犲嚱鏁�
-- Repository 灞炴��
-- TaskTypes / TaskOutboundTypes 灞炴��
-- AGV_OutTaskComplete / WCS_ReceiveTask 閰嶇疆瀛楁
-
-鍒犻櫎鍐呭锛�
-- 鎵�鏈� #region WCS閫昏緫澶勭悊 鐨勬柟娉曞疄鐜�
-- 鎵�鏈� #region 鍒嗗鏌滄帴鍙� 鐨勬柟娉曞疄鐜�
-- 鎵�鏈� #region 鏋佸嵎搴撲换鍔℃ā鍧� 鐨勬柟娉曞疄鐜�
-- CompleteTaskAsync銆丟etTaskByPalletCodeAsync銆丏etermineTargetAddress 绉佹湁鏂规硶
-
-鍒犻櫎鍚庢枃浠剁粨鏋勶細
-```csharp
-using Mapster;
-using MapsterMapper;
-// ... 鎵�鏈� using
-
-namespace WIDESEA_TaskInfoService
-{
- public partial class TaskService : ServiceBase<Dt_Task, IRepository<Dt_Task>>, ITaskService
- {
- // 瀛楁 (~10琛�)
- // 鏋勯�犲嚱鏁� (~15琛�)
- // Repository 灞炴�� (1琛�)
- // TaskTypes 灞炴�� (2琛�)
- // AGV 閰嶇疆瀛楁 (2琛�)
-
- // 娉ㄦ剰锛氬師鏈夌殑 #region WCS閫昏緫澶勭悊銆佸垎瀹规煖鎺ュ彛銆佹瀬鍗峰簱浠诲姟妯″潡 region 鍧楀叏閮ㄥ垹闄�
- // 瀵瑰簲鐨勬柟娉曞疄鐜板凡杩佺Щ鍒� partial class 鏂囦欢
- }
-}
-```
-
-- [ ] **Step 2: 楠岃瘉缂栬瘧**
-
-Run: `dotnet build WIDESEA_WMSServer.sln`
-Expected: 鏃犵紪璇戦敊璇紝鎵�鏈夋帶鍒跺櫒绔偣姝e父
-
----
-
-## Task 5: 鏈�缁堥獙璇�
-
-- [ ] **Step 1: 瀹屾暣缂栬瘧**
-
-Run: `dotnet build WIDESEA_WMSServer.sln`
-Expected: SUCCESS锛屾棤璀﹀憡
-
-- [ ] **Step 2: 妫�鏌ユ枃浠惰鏁�**
-
-Run: `wc -l WIDESEA_TaskInfoService/TaskService*.cs`
-Expected:
-- TaskService.cs: ~100琛�
-- TaskService_WCS.cs: ~550琛�
-- TaskService_AGV.cs: ~280琛�
-- TaskService_GradingMachine.cs: ~140琛�
-
-- [ ] **Step 3: 鎻愪氦浠g爜**
-
-```bash
-git add WIDESEA_TaskInfoService/TaskService*.cs
-git commit -m "refactor(TaskService): 鎷嗗垎涓簆artial class妯″潡鍖�
-
-- TaskService_WCS.cs: WCS閫昏緫澶勭悊锛堝叆搴�/鍑哄簱/绉诲簱/鏈烘鎵�/鑷姩鍑哄簱锛�
-- TaskService_AGV.cs: 鏋佸嵎搴揂GV浠诲姟妯″潡
-- TaskService_GradingMachine.cs: 鍒嗗鏌滄帴鍙�
-- TaskService.cs: 淇濈暀瀛楁/鏋勯�犲嚱鏁�/鎺ュ彛澹版槑
-
-Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
-```
diff --git "a/Code/WMS/docs/superpowers/specs/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\350\256\276\350\256\241.md" "b/Code/WMS/docs/superpowers/specs/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\350\256\276\350\256\241.md"
deleted file mode 100644
index c46f71f..0000000
--- "a/Code/WMS/docs/superpowers/specs/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\350\256\276\350\256\241.md"
+++ /dev/null
@@ -1,103 +0,0 @@
-# MES 鎵樼洏杩涚珯鍑虹珯闆嗘垚璁捐
-
-## 姒傝堪
-
-鍦� `TaskService` 鐨勫叆搴撳畬鎴�/鍑哄簱瀹屾垚鏂规硶涓泦鎴� MES 鎵樼洏杩涚珯/鍑虹珯璋冪敤锛屾柊澧炵┖鎵樼洏鍏ュ簱/鍑哄簱瀹屾垚鏂规硶銆�
-
-## 浜嬪姟绛栫暐
-
-MES 璋冪敤绾冲叆 `ExecuteWithinTransactionAsync` 鍐� 鈥� MES 澶辫触鏃朵簨鍔″洖婊氾紝WMS 鏁版嵁涓嶈惤搴撱��
-
-## 鏁版嵁娴�
-
-| 鏂规硶 | 鎿嶄綔 | MES 璋冪敤 |
-|------|------|----------|
-| `InboundFinishTaskAsync` | 鍏ュ簱瀹屾垚 | `InboundInContainer` |
-| `OutboundFinishTaskAsync` | 鍑哄簱瀹屾垚 | `OutboundInContainer` |
-| `InboundFinishTaskTrayAsync`锛堟柊澧烇級 | 绌烘墭鐩樺叆搴撳畬鎴� | 鏃� |
-| `OutboundFinishTaskTrayAsync`锛堟柊澧烇級 | 绌烘墭鐩樺嚭搴撳畬鎴� | 鏃� |
-
-## 娑夊強鏂囦欢
-
-- `WIDESEA_TaskInfoService/TaskService.cs`
-
-## 璇︾粏璁捐
-
-### 1. 鍏ュ簱瀹屾垚 (InboundFinishTaskAsync)
-
-**鐜版湁閫昏緫锛堜簨鍔″唴锛夛細**
-- 鏇存柊搴撳瓨淇℃伅锛圠ocationCode, OutboundDate, StockStatus锛�
-- 鏇存柊璐т綅鐘舵�佷负 InStock
-- 璋冪敤 CompleteTaskAsync 鍒犻櫎浠诲姟
-
-**淇敼鍚庯細**
-- 鍦� `CompleteTaskAsync` 涔嬪墠娣诲姞 MES `InboundInContainer` 璋冪敤
-- 璇锋眰鍙傛暟锛�
- - `EquipmentCode = "STK-GROUP-001"`
- - `ResourceCode = "STK-GROUP-001"`
- - `ContainerCode = taskDto.PalletCode`
- - `LocalTime = DateTime.Now`
-- MES 澶辫触 鈫� 浜嬪姟鍥炴粴锛岃繑鍥為敊璇�
-
-### 2. 鍑哄簱瀹屾垚 (OutboundFinishTaskAsync)
-
-**鐜版湁閫昏緫锛堜簨鍔″唴锛夛細**
-- 鏇存柊搴撳瓨淇℃伅锛圠ocationId=0, LocationCode=null, OutboundDate锛�
-- 鏇存柊璐т綅鐘舵�佷负 Free
-- 璋冪敤 CompleteTaskAsync 鍒犻櫎浠诲姟
-
-**淇敼鍚庯細**
-- 鍦� `CompleteTaskAsync` 涔嬪墠娣诲姞 MES `OutboundInContainer` 璋冪敤
-- 璇锋眰鍙傛暟锛�
- - `EquipmentCode = "STK-GROUP-001"`
- - `ResourceCode = "STK-GROUP-001"`
- - `ContainerCode = taskDto.PalletCode`
- - `LocalTime = DateTime.Now`
-- `OutboundInContainerRequest` 鏈� `ParamList` 瀛楁锛岀洰鍓嶄负绌哄垪琛� `new List<ParamItem>()`
-- MES 澶辫触 鈫� 浜嬪姟鍥炴粴锛岃繑鍥為敊璇�
-
-### 3. 鏂板绌烘墭鐩樺叆搴撳畬鎴� (InboundFinishTaskTrayAsync)
-
-**鏂规硶绛惧悕锛�**
-```csharp
-public async Task<WebResponseContent> InboundFinishTaskTrayAsync(CreateTaskDto taskDto)
-```
-
-**閫昏緫锛�**
-1. 鏌ヨ浠诲姟锛堟墭鐩樺彿 = taskDto.PalletCode锛�
-2. 鏌ヨ璐т綅淇℃伅
-3. 鏌ヨ搴撳瓨淇℃伅
-4. 浜嬪姟鍐咃細
- - 鏇存柊搴撳瓨 LocationCode/LocationId
- - 鏇存柊璐т綅鐘舵�佷负 InStock
- - 鏇存柊搴撳瓨鐘舵�佷负绌烘墭鐩樺簱瀛�
- - 鍒犻櫎浠诲姟锛堜笉璋冪敤 CompleteTaskAsync锛岃嚜宸卞疄鐜帮級
-5. 鏃犻渶 MES 璋冪敤
-
-### 4. 鏂板绌烘墭鐩樺嚭搴撳畬鎴� (OutboundFinishTaskTrayAsync)
-
-**鏂规硶绛惧悕锛�**
-```csharp
-public async Task<WebResponseContent> OutboundFinishTaskTrayAsync(CreateTaskDto taskDto)
-```
-
-**閫昏緫锛�**
-1. 鏌ヨ浠诲姟锛堟墭鐩樺彿 = taskDto.PalletCode锛�
-2. 鏌ヨ璐т綅淇℃伅
-3. 鏌ヨ搴撳瓨淇℃伅
-4. 浜嬪姟鍐咃細
- - 鏇存柊搴撳瓨 LocationId=0, LocationCode=null
- - 鏇存柊璐т綅鐘舵�佷负 Free
- - 鏇存柊搴撳瓨鐘舵�佷负鍑哄簱瀹屾垚
- - 鍒犻櫎浠诲姟锛堣嚜宸卞疄鐜帮級
-5. 鏃犻渶 MES 璋冪敤
-
-## 閿欒澶勭悊
-
-- MES 璋冪敤妫�鏌� `mesResult.Data?.IsSuccess`锛圡ES 涓氬姟灞傛垚鍔燂級
-- 閿欒杩斿洖锛歚"浠诲姟瀹屾垚澶辫触锛歁ES杩涚珯澶辫触: {mesResult?.Data?.Msg ?? mesResult?.ErrorMessage ?? "鏈煡閿欒"}"`
-- 绌烘墭鐩樻柟娉曟棤 MES 閿欒澶勭悊
-
-## 璁惧缂栫爜
-
-缁熶竴浣跨敤 `STK-GROUP-001`锛屼笌缁勭洏淇濇寔涓�鑷淬��
diff --git "a/Code/WMS/docs/superpowers/specs/2026-03-30-MES\347\224\265\350\212\257\347\273\221\345\256\232\350\247\243\347\273\221\351\233\206\346\210\220\350\256\276\350\256\241.md" "b/Code/WMS/docs/superpowers/specs/2026-03-30-MES\347\224\265\350\212\257\347\273\221\345\256\232\350\247\243\347\273\221\351\233\206\346\210\220\350\256\276\350\256\241.md"
deleted file mode 100644
index a1fa2d0..0000000
--- "a/Code/WMS/docs/superpowers/specs/2026-03-30-MES\347\224\265\350\212\257\347\273\221\345\256\232\350\247\243\347\273\221\351\233\206\346\210\220\350\256\276\350\256\241.md"
+++ /dev/null
@@ -1,95 +0,0 @@
-# MES 鐢佃姱缁戝畾瑙g粦闆嗘垚璁捐
-
-## 姒傝堪
-
-鍦� `StockService` 鐨勭粍鐩樸�佹崲鐩樸�佹媶鐩樻搷浣滀腑锛屽皢 MES 鐢佃姱缁戝畾/瑙g粦璋冪敤绾冲叆 WMS 浜嬪姟鍐咃紝纭繚搴撳瓨鏁版嵁涓� MES 鐘舵�佷竴鑷淬��
-
-## 浜嬪姟绛栫暐
-
-**MES 璋冪敤绾冲叆 WMS 浜嬪姟鍐�** 鈥� 濡傛灉 MES 璋冪敤澶辫触锛屾暣涓簨鍔″洖婊氾紝WMS 搴撳瓨鏁版嵁涓嶄細鍙樺寲銆�
-
-## 鏁版嵁娴�
-
-| 鎿嶄綔 | MES 璋冪敤 | 鏃舵満 |
-|------|----------|------|
-| **缁勭洏** | `BindContainer` | WMS 搴撳瓨鍐欏叆鍚� |
-| **鎹㈢洏** | `UnBindContainer` 鈫� `BindContainer` | 瑙g粦鍦ㄦ崲鍑哄墠锛岀粦瀹氬湪鎹㈠叆鍚� |
-| **鎷嗙洏** | `UnBindContainer` | 搴撳瓨鏄庣粏鍒犻櫎鍓� |
-
-## 娑夊強鏂囦欢
-
-- `WIDESEA_StockService/StockSerivce.cs`
-
-## 璇︾粏璁捐
-
-### 1. 缁勭洏 (GroupPalletAsync)
-
-**鐜版湁閫昏緫锛�**
-- 鍦ㄤ簨鍔″唴鎵ц WMS 搴撳瓨鍐欏叆
-- 绗� 166 琛屽凡瀛樺湪 `_mesService.BindContainer()` 璋冪敤锛屼絾缂哄皯 `await` 鍜岀粨鏋滃鐞�
-
-**淇敼鍚庯細**
-- 淇涓� `await _mesService.BindContainer(bindRequest)`
-- 妫�鏌ヨ繑鍥炵粨鏋滐紝`result.Success == false` 鏃朵簨鍔″洖婊�
-- 閿欒杩斿洖锛歚"缁勭洏鎴愬姛锛屼絾MES璋冪敤澶辫触: {MES閿欒}"`
-
-### 2. 鎹㈢洏 (ChangePalletAsync)
-
-**鐜版湁閫昏緫锛�**
-- 浜嬪姟鍐咃細鏌ヨ婧愭墭鐩樺拰鐩爣鎵樼洏 鈫� 鏇存柊搴撳瓨鏄庣粏鐨� `StockId`
-
-**淇敼鍚庯細**
-- 鍦ㄦ洿鏂板簱瀛樻槑缁嗗墠锛岃皟鐢� `UnBindContainer` 瑙g粦婧愭墭鐩樼數鑺�
-- 鍦ㄦ洿鏂板簱瀛樻槑缁嗗悗锛岃皟鐢� `BindContainer` 缁戝畾鍒扮洰鏍囨墭鐩�
-- MES 澶辫触 鈫� 浜嬪姟鍥炴粴
-
-**UnBindContainer 璇锋眰鏋勫缓锛�**
-```csharp
-var unbindRequest = new UnBindContainerRequest
-{
- EquipmentCode = "STK-GROUP-001",
- ResourceCode = "STK-GROUP-001",
- LocalTime = DateTime.Now,
- ContainCode = stock.SourcePalletNo,
- SfcList = detailEntities.Select(d => d.SerialNumber).ToList()
-};
-```
-
-### 3. 鎷嗙洏 (SplitPalletAsync)
-
-**鐜版湁閫昏緫锛�**
-- 浜嬪姟鍐咃細鏌ヨ搴撳瓨鏄庣粏 鈫� 鍒犻櫎鏄庣粏璁板綍
-
-**淇敼鍚庯細**
-- 鍒犻櫎鍓嶏紝璋冪敤 `UnBindContainer` 瑙g粦鐢佃姱
-- MES 澶辫触 鈫� 浜嬪姟鍥炴粴
-
-**UnBindContainer 璇锋眰鏋勫缓锛�**
-```csharp
-var unbindRequest = new UnBindContainerRequest
-{
- EquipmentCode = "STK-GROUP-001",
- ResourceCode = "STK-GROUP-001",
- LocalTime = DateTime.Now,
- ContainCode = stock.SourcePalletNo,
- SfcList = detailEntities.Select(d => d.SerialNumber).ToList()
-};
-```
-
-## 閿欒澶勭悊
-
-缁熶竴閿欒澶勭悊绛栫暐锛�
-- MES 璋冪敤澶辫触鏃讹紝浜嬪姟鍥炴粴
-- 杩斿洖锛歚"{鎿嶄綔}鎴愬姛锛屼絾MES璋冪敤澶辫触: {MES閿欒}"`
-
-鍏朵腑 `{MES閿欒}` 鏉ヨ嚜 `result.Message`銆�
-
-## 璁惧缂栫爜
-
-纭紪鐮� `EquipmentCode = "STK-GROUP-001"` 鍜� `ResourceCode = "STK-GROUP-001"`锛屼笌缁勭洏鐜版湁閫昏緫淇濇寔涓�鑷淬��
-
-## 瀹炵幇瑕佺偣
-
-- 鎵�鏈� MES 璋冪敤浣跨敤 `await`
-- 妫�鏌� `HttpResponseResult<MesResponse>` 鐨� `Success` 灞炴��
-- MES 璋冪敤澶辫触鏃惰繑鍥為敊璇俊鎭紝浜嬪姟鑷姩鍥炴粴锛坄ExecuteWithinTransactionAsync` 鍦� `result.Status != true` 鏃跺洖婊氾級
diff --git a/Code/WMS/docs/superpowers/specs/2026-03-30-dashboard-chart-design.md b/Code/WMS/docs/superpowers/specs/2026-03-30-dashboard-chart-design.md
deleted file mode 100644
index 5e46ed1..0000000
--- a/Code/WMS/docs/superpowers/specs/2026-03-30-dashboard-chart-design.md
+++ /dev/null
@@ -1,223 +0,0 @@
-# 棣栭〉浠〃鐩樺浘琛ㄥ姛鑳借璁�
-
-## 1. 姒傝堪
-
-鍦� WMS 鍓嶇棣栭〉娣诲姞浠〃鐩樺浘琛紝灞曠ず浠撳簱鐨勫嚭鍏ュ簱缁熻鍜屽簱瀛樻暟鎹�傛暟鎹熀浜庝换鍔″畬鎴愭椂闂磋繘琛岀粺璁°��
-
-> **鏁版嵁鏉ユ簮璇存槑锛�** 宸插畬鎴愪换鍔″瓨鍌ㄥ湪鍘嗗彶琛� `Dt_Task_Hty` 涓紝浣跨敤 `InsertTime`锛堜换鍔″畬鎴愬悗绉诲叆鍘嗗彶鐨勬椂闂达級浣滀负浠诲姟瀹屾垚鏃堕棿銆�
-
-## 2. 椤甸潰甯冨眬
-
-閲囩敤娣峰悎甯冨眬锛氶《閮ㄥぇ鍥惧睍绀鸿秼鍔匡紝涓嬫柟缃戞牸灞曠ず瀵规瘮鍜岃鎯呫��
-
-```
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 鏈湀鍑哄叆搴撹秼鍔匡紙鍏ㄥ锛屾姌绾�+鏌辩姸缁勫悎锛� 鈹�
-鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 浠婃棩鍑哄叆搴撳姣� 鈹� 鏈懆鍑哄叆搴撳姣� 鈹�
-鈹� 锛堟煴鐘跺浘锛� 鈹� 锛堟煴鐘跺浘锛� 鈹�
-鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 鏈湀鍑哄叆搴撳姣� 鈹� 褰撳墠搴撳瓨鎬婚噺 鈹�
-鈹� 锛堟煴鐘跺浘锛� 鈹� 锛堟暟瀛楀崱鐗囷級 鈹�
-鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 搴撳瓨搴撻緞鍒嗗竷 鈹� 鍚勪粨搴撳簱瀛樺垎甯� 鈹�
-鈹� 锛堟煴鐘跺浘锛� 鈹� 锛堟煴鐘跺浘锛� 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-```
-
-> 绗竴琛岋紙鏈湀瓒嬪娍鍥撅級锛氬叏瀹芥樉绀�
-> 涓嬫柟 2x2 缃戞牸锛�4涓浘琛ㄥ潎鍖�鍒嗗竷
-
-## 3. 鍚庣鎺ュ彛璁捐
-
-### 3.1 鎬昏鎺ュ彛
-
-**GET** `/api/Dashboard/Overview`
-
-杩斿洖棣栭〉鍔犺浇鏃堕渶瑕佺殑鎵�鏈夋眹鎬绘暟瀛楋紝涓�娆¤皟鐢ㄨ幏鍙栧叧閿寚鏍囥��
-
-**鍝嶅簲鏁版嵁锛�**
-```json
-{
- "Status": true,
- "Data": {
- "TodayInbound": 120,
- "TodayOutbound": 95,
- "MonthInbound": 3500,
- "MonthOutbound": 3200,
- "TotalStock": 45000
- }
-}
-```
-
-> 娉細搴撳瓨鏁伴噺鍗曚綅涓�"鎵樼洏鏁�"鎴�"鐢佃姱鏁�"锛屽彇鍐充簬瀹為檯涓氬姟缁熻鍙e緞銆�
-
-### 3.2 姣忔棩缁熻鎺ュ彛
-
-**GET** `/api/Dashboard/DailyStats?days=30`
-
-杩斿洖杩慛澶╃殑姣忔棩鍑哄叆搴撶粺璁°��
-
-**鍙傛暟锛�**
-- `days`锛氬ぉ鏁帮紝榛樿 30锛屾渶澶� 365
-- 缁熻鍩轰簬鏈嶅姟鍣ㄦ湰鍦版椂闂达紝褰撴棩鏁版嵁鍖呭惈褰撴棩缁熻
-
-**鍝嶅簲鏁版嵁锛�**
-```json
-{
- "Status": true,
- "Data": [
- { "Date": "2026-03-01", "Inbound": 120, "Outbound": 95 },
- { "Date": "2026-03-02", "Inbound": 150, "Outbound": 130 },
- ...
- ]
-}
-```
-
-### 3.3 姣忓懆缁熻鎺ュ彛
-
-**GET** `/api/Dashboard/WeeklyStats?weeks=12`
-
-杩斿洖杩慛鍛ㄧ殑姣忓懆鍑哄叆搴撶粺璁°�傚懆浠庡懆涓�寮�濮嬭绠椼��
-
-**鍙傛暟锛�**
-- `weeks`锛氬懆鏁帮紝榛樿 12
-
-**鍝嶅簲鏁版嵁锛�**
-```json
-{
- "Status": true,
- "Data": [
- { "Week": "2026-W09", "Inbound": 850, "Outbound": 780 },
- { "Week": "2026-W10", "Inbound": 920, "Outbound": 870 },
- ...
- ]
-}
-```
-
-### 3.4 姣忔湀缁熻鎺ュ彛
-
-**GET** `/api/Dashboard/MonthlyStats?months=12`
-
-杩斿洖杩慛鏈堢殑姣忔湀鍑哄叆搴撶粺璁°��
-
-**鍙傛暟锛�**
-- `months`锛氭湀鏁帮紝榛樿 12
-
-**鍝嶅簲鏁版嵁锛�**
-```json
-{
- "Status": true,
- "Data": [
- { "Month": "2025-04", "Inbound": 3500, "Outbound": 3200 },
- { "Month": "2025-05", "Inbound": 3800, "Outbound": 3600 },
- ...
- ]
-}
-```
-
-### 3.5 搴撳瓨搴撻緞鍒嗗竷鎺ュ彛
-
-**GET** `/api/Dashboard/StockAgeDistribution`
-
-杩斿洖搴撳瓨搴撻緞鍒嗗竷鏁版嵁銆�
-
-**鍝嶅簲鏁版嵁锛�**
-```json
-{
- "Status": true,
- "Data": [
- { "Range": "7澶╁唴", "Count": 12000 },
- { "Range": "7-30澶�", "Count": 18000 },
- { "Range": "30-90澶�", "Count": 10000 },
- { "Range": "90澶╀互涓�", "Count": 5000 }
- ]
-}
-```
-
-### 3.6 鍚勪粨搴撳簱瀛樺垎甯冩帴鍙�
-
-**GET** `/api/Dashboard/StockByWarehouse`
-
-杩斿洖鍚勪粨搴撶殑搴撳瓨鏁伴噺鍒嗗竷銆�
-
-**鍝嶅簲鏁版嵁锛�**
-```json
-{
- "Status": true,
- "Data": [
- { "Warehouse": "浠撳簱A", "Count": 15000 },
- { "Warehouse": "浠撳簱B", "Count": 12000 },
- { "Warehouse": "浠撳簱C", "Count": 18000 }
- ]
-}
-```
-
-## 4. 鎶�鏈疄鐜�
-
-### 4.1 鍚庣瀹炵幇
-
-**鏂板鏂囦欢锛�**
-- `WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs` - 浠〃鐩樻帶鍒跺櫒
-
-**鏁版嵁鏉ユ簮锛�**
-- `Dt_Task_Hty` 琛細宸插畬鎴愪换鍔$殑鍘嗗彶琛紝浣跨敤 `InsertTime` 浣滀负浠诲姟瀹屾垚鏃堕棿
-- `TaskTypeEnum` 鏋氫妇锛氬叆搴撲换鍔¤寖鍥� 500-600锛堝 `Inbound=510`锛夛紝鍑哄簱浠诲姟鑼冨洿 100-200锛堝 `Outbound=100`锛�
-- `Dt_StockInfo` 琛細褰撳墠搴撳瓨鏁版嵁锛屼娇鐢� `CreateDate` 浣滀负鍏ュ簱鏃堕棿璁$畻搴撻緞
-
-**缁熻鏁版嵁閫昏緫锛�**
-- 鎸� `InsertTime` 鐨勬棩鏈�/鍛�/鏈堝垎缁勭粺璁′换鍔℃暟閲�
-- 鍏ュ簱鍒ゆ柇锛歚TaskType >= 500 && TaskType < 600`
-- 鍑哄簱鍒ゆ柇锛歚TaskType >= 100 && TaskType < 200`
-- 搴撻緞 = 褰撳墠鏃堕棿 - `CreateDate`
-
-### 4.2 鍓嶇瀹炵幇
-
-**淇敼鏂囦欢锛�**
-- `WIDESEA_WMSClient/src/views/Home.vue` - 閲嶅啓涓虹┖鐧界殑棣栭〉锛屾坊鍔犱华琛ㄧ洏鍥捐〃
-
-**鍥捐〃缁勪欢锛�**
-- 澶嶇敤 `src/views/charts/bigdata.vue` 涓殑 ECharts 浣跨敤妯″紡
-- 浣跨敤 ECharts 5.0.2
-
-**椤甸潰缁撴瀯锛�**
-```
-Home.vue
-鈹溾攢鈹� 鏈湀瓒嬪娍鍥撅紙鎶樼嚎+鏌辩姸缁勫悎锛�
-鈹溾攢鈹� 浠婃棩/鏈懆/鏈湀鍑哄叆搴撳姣旓紙鏌辩姸鍥撅級
-鈹溾攢鈹� 褰撳墠搴撳瓨鎬婚噺锛堟暟瀛楀崱鐗囷級
-鈹溾攢鈹� 搴撳瓨搴撻緞鍒嗗竷锛堟煴鐘跺浘锛�
-鈹斺攢鈹� 鍚勪粨搴撳簱瀛樺垎甯冿紙鏌辩姸鍥撅級
-```
-
-**API 璋冪敤锛�**
-- 棣栭〉鍔犺浇鏃惰皟鐢� Overview 鎺ュ彛鑾峰彇姹囨�绘暟鎹�
-- 鍚勫浘琛ㄧ粍浠� mounted 鏃惰皟鐢ㄥ搴旀帴鍙h幏鍙栬缁嗘暟鎹�
-
-## 5. 瀹炵幇浠诲姟
-
-### 鍚庣
-1. 鍒涘缓 DashboardController
-2. 瀹炵幇 Overview 鎺ュ彛
-3. 瀹炵幇 DailyStats 鎺ュ彛
-4. 瀹炵幇 WeeklyStats 鎺ュ彛
-5. 瀹炵幇 MonthlyStats 鎺ュ彛
-6. 瀹炵幇 StockAgeDistribution 鎺ュ彛
-7. 瀹炵幇 StockByWarehouse 鎺ュ彛
-
-### 鍓嶇
-1. 閲嶅啓 Home.vue锛屼娇鐢� ECharts 瀹炵幇浠〃鐩樺竷灞�
-2. 瀹炵幇 Overview 鎺ュ彛璋冪敤
-3. 瀹炵幇鍚勫浘琛ㄧ粍浠�
-4. 璋冩暣鍥捐〃鏍峰紡鍜屽搷搴斿紡甯冨眬
-
-## 6. 棰勮鏂囦欢鍙樻洿
-
-**鏂板锛�**
-- `WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs`
-
-**淇敼锛�**
-- `WIDESEA_WMSClient/src/views/Home.vue`
-
-**鍙傝�冿細**
-- `WIDESEA_WMSClient/src/views/charts/bigdata.vue` - ECharts 浣跨敤绀轰緥
diff --git a/Code/WMS/docs/superpowers/specs/2026-03-30-stock-chat-3d-design.md b/Code/WMS/docs/superpowers/specs/2026-03-30-stock-chat-3d-design.md
deleted file mode 100644
index 16c0101..0000000
--- a/Code/WMS/docs/superpowers/specs/2026-03-30-stock-chat-3d-design.md
+++ /dev/null
@@ -1,258 +0,0 @@
-# 搴撳瓨3D鏌ョ湅鍣� (stockChat) 璁捐鏂囨。
-
-## 1. 姒傝堪
-
-- **鍔熻兘鍚嶇О**锛氬簱瀛�3D浠撳簱鏌ョ湅鍣� (stockChat)
-- **鏂囦欢璺緞**锛歚WIDESEA_WMSClient/src/views/stock/stockChat.vue`
-- **鏍稿績鍔熻兘**锛氫娇鐢� Three.js + WebGL 瀹炵幇浠撳簱3D鍙鍖栵紝鐢ㄦ埛鍙湪3D鍦烘櫙涓贰瑙嗕粨搴撱�佹煡鐪嬭揣浣嶇姸鎬併�佺偣鍑昏揣浣嶆煡鐪嬪簱瀛樿鎯�
-- **鐩爣鐢ㄦ埛**锛氫粨搴撶鐞嗗憳銆佽皟搴︿汉鍛樸�佽川妫�浜哄憳
-
-## 2. 鎶�鏈�夊瀷
-
-| 鎶�鏈� | 閫夊瀷 | 璇存槑 |
-|------|------|------|
-| 3D寮曟搸 | Three.js | WebGL 涓绘祦搴擄紝Vue 3 鍙嬪ソ |
-| 娓叉煋绛栫暐 | InstancedMesh | 鎵归噺娓叉煋澶ч噺璐т綅锛屽崟娆� drawcall |
-| 鐘舵�佺鐞� | Vue 3 Composition API | `ref/reactive` |
-| UI缁勪欢 | Element Plus | 涓庨」鐩幇鏈夋妧鏈爤涓�鑷� |
-| 瀹炴椂閫氫俊 | SignalR | 涓庡悗绔� WebSocket 閰嶅悎瀹炵幇搴撳瓨鍔ㄦ�佹洿鏂� |
-
-## 3. 鍔熻兘闇�姹�
-
-### 3.1 鏍稿績鍔熻兘
-
-1. **浠撳簱3D甯冨眬灞曠ず**
- - 鍏ㄩ儴璐т綅鍧囨覆鏌擄紝鎸夌姸鎬佺潃鑹�
- - 璐ф灦寮忔帓鍒楋紝鍖呭惈宸烽亾
- - 鍦伴潰缃戞牸鑳屾櫙
-
-2. **澶氫粨搴� Tab 鍒囨崲**
- - Element Plus Tabs 缁勪欢
- - 姣忎釜浠撳簱鐙珛鍔犺浇鏁版嵁
- - Tab 鍒囨崲鏃堕噸缃�3D鍦烘櫙
-
-3. **璐т綅鐐瑰嚮璇︽儏寮圭獥**
- - 鍏ㄥ睆 Dialog 灞曠ず
- - 鏄剧ず锛氳揣浣嶄俊鎭�佸簱瀛樼姸鎬併�佹墭鐩樼紪鍙枫�佺墿鏂欐槑缁嗗垪琛�
- - 鏀寔鏌ョ湅鎵规銆佷繚璐ㄦ湡棰勮
-
-4. **3D鍦烘櫙浜や簰**
- - 榧犳爣鏃嬭浆锛圤rbitControls锛�
- - 婊氳疆缂╂斁
- - 涓敭骞崇Щ
- - 鐐瑰嚮璐т綅楂樹寒 + 鐩告満鑱氱劍
-
-5. **瀹炴椂搴撳瓨鐘舵�佹洿鏂�**
- - SignalR 鐩戝惉搴撳瓨鍙樺寲
- - 璐т綅棰滆壊鍔ㄦ�佹洿鏂�
-
-6. **绛涢�夎繃婊�**
- - 鎸夌墿鏂欑被鍨�/鎵规/搴撳瓨鐘舵�佽繃婊�
- - 楂樹寒鏄剧ず鍖归厤璐т綅
-
-7. **鐘舵�佸浘渚�**
- - 鍙充笂瑙�/搴曢儴棰滆壊鍥句緥
- - 璇存槑姣忕棰滆壊浠h〃鐨勮揣浣嶇姸鎬�
-
-### 3.2 璐т綅鐘舵�侀鑹茬紪鐮侊紙棰滆壊浼樺厛绾э細locationStatus > stockStatus锛�
-
-**棰滆壊鍒ゅ畾瑙勫垯锛堟寜浼樺厛绾ч『搴忥級锛�**
-
-1. **`locationStatus = 3`锛堢鐢級** 鈫� 娣辩伆 `#2d2d2d`锛堟渶楂樹紭鍏堢骇锛�
-2. **`locationStatus = 2`锛堥攣瀹氾級** 鈫� 绾㈣壊 `#F56C6C`
-3. **`locationStatus = 1`锛堝崰鐢級涓� `stockStatus = 0`锛堟棤璐э級** 鈫� 鏆楃伆 `#4a4a4a`
-4. **`locationStatus = 1`锛堝崰鐢級涓� `stockStatus = 1`锛堟湁璐э級** 鈫� 钃濊壊 `#409EFF`
-5. **`locationStatus = 1`锛堝崰鐢級涓� `stockStatus = 2`锛堝簱瀛樼揣寮� <10%锛�** 鈫� 姗欒壊 `#E6A23C`
-6. **`locationStatus = 1`锛堝崰鐢級涓� `stockStatus = 3`锛堝凡婊� 鈮�90%锛�** 鈫� 缁胯壊 `#67C23A`
-7. **`locationStatus = 0`锛堢┖锛�** 鈫� 鏆楃伆 `#4a4a4a`
-
-**闃堝�煎畾涔夛細**
-- 搴撳瓨绱у紶锛歚stockQuantity / maxCapacity < 10%`
-- 宸叉弧锛歚stockQuantity / maxCapacity 鈮� 90%`
-
-## 4. 鍚庣 API
-
-### 4.1 鏂板鎺ュ彛
-
-```
-GET /api/StockInfo/Get3DLayout?warehouseId={id}
-```
-
-**鍝嶅簲缁撴瀯**锛�
-```json
-{
- "status": true,
- "data": {
- "warehouseId": 1,
- "warehouseName": "涓讳粨搴�",
- "maxRow": 10,
- "maxColumn": 20,
- "maxLayer": 5,
- "materielCodeList": ["M001", "M002", "M003"],
- "batchNoList": ["B20260301", "B20260302"],
- "locations": [
- {
- "locationId": 1,
- "locationCode": "A-01-02-03",
- "row": 1,
- "column": 2,
- "layer": 3,
- "locationStatus": 0,
- "stockStatus": 2,
- "stockQuantity": 50,
- "maxCapacity": 100,
- "palletCode": "PLT-001",
- "materielCode": "M001",
- "materielName": "鐗╂枡A",
- "batchNo": "B20260301"
- }
- ]
- }
-}
-```
-
-**璇存槑**锛�
-- `locationStatus`: 0=绌�, 1=鍗犵敤, 2=閿佸畾, 3=绂佺敤
-- `stockStatus`: 0=鏃犺揣, 1=鏈夎揣, 2=搴撳瓨绱у紶, 3=宸叉弧
-- `maxCapacity`: 璐т綅鏈�澶у閲忥紙鐢ㄤ簬璁$畻濉厖鐜囷級
-- `materielCodeList`: 褰撳墠浠撳簱鎵�鏈夌墿鏂欑紪鍙峰垪琛紙鐢ㄤ簬绛涢�変笅鎷夛級
-- `batchNoList`: 褰撳墠浠撳簱鎵�鏈夋壒娆″彿鍒楄〃锛堢敤浜庣瓫閫変笅鎷夛級
-- **棰滆壊鍒ゅ畾鍦ㄥ墠绔疄鐜�**锛氬悗绔繑鍥� `stockQuantity` 鍜� `maxCapacity`锛屽墠绔寜 3.2 瑙勫垯璁$畻棰滆壊
-
-### 4.2 SignalR 瀹炴椂鎺ㄩ��
-
-**Hub 璺緞**锛歚/stockHub`
-
-**鎺ㄩ�佷簨浠�**锛�
-```javascript
-// 搴撳瓨鍙樺寲浜嬩欢
-stockUpdated: { locationId, warehouseId, stockQuantity, stockStatus }
-```
-
-## 5. 鍓嶇鏂囦欢缁撴瀯
-
-```
-WIDESEA_WMSClient/src/
-鈹溾攢鈹� views/stock/
-鈹� 鈹斺攢鈹� stockChat.vue # 涓婚〉闈㈢粍浠�
-鈹溾攢鈹� extension/stock/
-鈹� 鈹斺攢鈹� stockChat.js # ViewGrid 鎵╁睍閰嶇疆
-鈹斺攢鈹� api/
- 鈹斺攢鈹� http.js # 澶嶇敤鐜版湁 http 灏佽
-```
-
-## 6. 缁勪欢缁撴瀯 (stockChat.vue)
-
-```vue
-<template>
- <div class="stock-chat-container">
- <!-- 浠撳簱 Tabs -->
- <el-tabs v-model="activeWarehouse" @tab-change="onWarehouseChange">
- <el-tab-pane
- v-for="wh in warehouseList"
- :key="wh.warehouseId"
- :label="wh.warehouseName"
- :name="wh.warehouseId"
- />
- </el-tabs>
-
- <!-- 宸ュ叿鏍� -->
- <div class="toolbar">
- <el-select v-model="filterStockStatus" placeholder="搴撳瓨鐘舵�佺瓫閫�" clearable>
- <el-option label="鏈夎揣" :value="1" />
- <el-option label="搴撳瓨绱у紶" :value="2" />
- <el-option label="宸叉弧" :value="3" />
- </el-select>
- <el-select v-model="filterMaterielCode" placeholder="鐗╂枡绛涢��" clearable>
- <el-option v-for="code in materielCodeList" :key="code" :label="code" :value="code" />
- </el-select>
- <el-select v-model="filterBatchNo" placeholder="鎵规绛涢��" clearable>
- <el-option v-for="batch in batchNoList" :key="batch" :label="batch" :value="batch" />
- </el-select>
- <el-button @click="resetCamera">閲嶇疆瑙嗚</el-button>
- </div>
-
- <!-- 3D Canvas -->
- <div ref="canvasContainer" class="canvas-container" />
-
- <!-- 鐘舵�佸浘渚� -->
- <div class="legend">
- <div v-for="item in legendItems" :key="item.status" class="legend-item">
- <span class="color-box" :style="{ background: item.color }" />
- <span>{{ item.label }}</span>
- </div>
- </div>
-
- <!-- 璇︽儏寮圭獥 -->
- <el-dialog v-model="detailDialogVisible" title="搴撳瓨璇︽儏" fullscreen>
- <!-- 璇︽儏鍐呭 -->
- </el-dialog>
- </div>
-</template>
-```
-
-## 7. Three.js 鍦烘櫙璁捐
-
-### 7.1 鍒濆鍖栨祦绋�
-
-1. 鍒涘缓 `WebGLRenderer`锛屾寕杞藉埌 `canvasContainer`
-2. 鍒涘缓 `PerspectiveCamera`锛堥�忚鐩告満锛�
-3. 鍒涘缓 `Scene` 鍦烘櫙
-4. 娣诲姞鍏夌収锛堢幆澧冨厜 + 瀹氬悜鍏夛級
-5. 鍒涘缓鍦伴潰锛坄PlaneGeometry` + 缃戞牸鏉愯川锛�
-6. 鍒涘缓璐ф灦璐т綅锛坄InstancedMesh`锛�
-7. 娣诲姞 `OrbitControls` 鎺у埗鍣�
-8. 鍚姩娓叉煋寰幆
-
-### 7.2 璐т綅瀹氫綅绠楁硶
-
-```
-x = (column - maxColumn/2) * CELL_SIZE_X
-y = layer * CELL_SIZE_Y
-z = (row - maxRow/2) * CELL_SIZE_Z
-```
-
-### 7.3 鐐瑰嚮鎷惧彇
-
-- 浣跨敤 `Raycaster` 杩涜灏勭嚎妫�娴�
-- 閫氳繃 `instanceId` 璇嗗埆琚偣鍑荤殑璐т綅瀹炰緥
-- 楂樹寒锛氫复鏃舵浛鎹㈡潗璐ㄩ鑹�
-
-### 7.4 鐩告満鑱氱劍鍔ㄧ敾
-
-- 浣跨敤绠�鍗曠嚎鎬ф彃鍊硷紙lerp锛夊钩婊戠Щ鍔ㄧ浉鏈�
-- 鐩爣浣嶇疆锛氳揣浣嶅潗鏍� + 鍋忕Щ閲�
-- 鎻掑�煎叕寮忥細`camera.position.lerp(target, 0.05)` 姣忓抚鎵ц
-
-## 8. 鎬ц兘浼樺寲
-
-| 绛栫暐 | 璇存槑 |
-|------|------|
-| InstancedMesh | 鍗曟 drawcall 娓叉煋鎵�鏈夎揣浣� |
-| 瑙嗛敟浣撳墧闄� | 鐩告満澶栫殑璐т綅涓嶆覆鏌� |
-| 棰滆壊缂撳瓨 | 鏉愯川澶嶇敤锛岄伩鍏嶉绻佸垱寤� |
-| requestAnimationFrame | 娓叉煋寰幆浣跨敤 RAF |
-| 鏁版嵁鍒嗛〉 | 澶т粨搴撳彲鑰冭檻鎸夊尯鍩熷垎鐗囧姞杞� |
-
-## 9. 璺敱娉ㄥ唽
-
-鍦� `viewGird.js` 涓敞鍐岃矾鐢憋細
-```javascript
-{
- path: '/stockChat',
- name: 'stockChat',
- component: () => import('@/views/stock/stockChat.vue')
-}
-```
-
-## 10. 瀹炵幇娉ㄦ剰浜嬮」
-
-### 10.1 鍚庣浜や粯鐗�
-- `Get3DLayout` API 瀹炵幇锛岃繑鍥炵粨鏋勮 4.1
-- SignalR Hub 閰嶇疆锛坄/stockHub`锛夛紝鎺ㄩ�� `stockUpdated` 浜嬩欢
-- 璐т綅棰滆壊鍒ゅ畾閫昏緫鎸� 3.2 瑙勫垯鍦ㄥ悗绔垨鍓嶇瀹炵幇鍧囧彲
-
-### 10.2 鍓嶇绛涢�夎仈鍔�
-- `filterStockStatus`銆乣filterMaterielCode`銆乣filterBatchNo` 涓夎�呰仈鍔�
-- 绛涢�夌粨鏋滈珮浜樉绀猴紝闈炲尮閰嶈揣浣嶅彉鏆楋紙opacity: 0.3锛�
-- 绛涢�変负绌烘椂鏄剧ず鍏ㄩ儴璐т綅姝e父棰滆壊
diff --git "a/Code/WMS/docs/superpowers/specs/2026-03-30-\344\273\273\345\212\241\345\272\223\345\255\230\345\216\206\345\217\262\350\256\260\345\275\225\350\256\276\350\256\241.md" "b/Code/WMS/docs/superpowers/specs/2026-03-30-\344\273\273\345\212\241\345\272\223\345\255\230\345\216\206\345\217\262\350\256\260\345\275\225\350\256\276\350\256\241.md"
deleted file mode 100644
index 7c55221..0000000
--- "a/Code/WMS/docs/superpowers/specs/2026-03-30-\344\273\273\345\212\241\345\272\223\345\255\230\345\216\206\345\217\262\350\256\260\345\275\225\350\256\276\350\256\241.md"
+++ /dev/null
@@ -1,83 +0,0 @@
-# 浠诲姟搴撳瓨鍘嗗彶璁板綍璁捐
-
-## 姒傝堪
-
-鍦� `TaskService` 涓敞鍏ヤ换鍔″巻鍙插拰搴撳瓨鍘嗗彶鏈嶅姟锛屽湪鎵�鏈変换鍔″畬鎴愭柟娉曚腑淇濆瓨鍘嗗彶璁板綍銆�
-
-## 娑夊強鏂囦欢
-
-- `WIDESEA_TaskInfoService/TaskService.cs`
-
-## 璇︾粏璁捐
-
-### 1. 娉ㄥ叆鏈嶅姟
-
-鍦� `TaskService` 涓坊鍔狅細
-```csharp
-private readonly ITask_HtyService _task_HtyService;
-private readonly IStockInfo_HtyService _stockInfo_HtyService;
-```
-
-鏋勯�犲嚱鏁版坊鍔犲弬鏁板苟璧嬪�笺��
-
-### 2. 淇敼 CompleteTaskAsync
-
-`InboundFinishTaskAsync`銆乣OutboundFinishTaskAsync`銆乣RelocationFinishTaskAsync` 閮借皟鐢ㄤ簡 `CompleteTaskAsync`锛屽洜姝ゅ彧闇�淇敼 `CompleteTaskAsync` 鍗冲彲銆�
-
-鐢变簬 `Dt_Task` 娌℃湁 `OperateType` 瀛楁锛岄渶瑕佺粰 `CompleteTaskAsync` 娣诲姞鍙傛暟锛�
-
-**淇敼鏂规硶绛惧悕锛�**
-```csharp
-private async Task<WebResponseContent> CompleteTaskAsync(Dt_Task task, string operateType)
-```
-
-**淇敼鍚庝唬鐮侊細**
-```csharp
-var historyTask = _mapper.Map<Dt_Task_Hty>(task);
-historyTask.InsertTime = DateTime.Now;
-historyTask.OperateType = operateType;
-var saveResult = await _task_HtyService.Repository.AddDataAsync(historyTask) > 0;
-if (!saveResult) return WebResponseContent.Instance.Error("浠诲姟鍘嗗彶淇濆瓨澶辫触");
-return WebResponseContent.Instance.OK("浠诲姟瀹屾垚");
-```
-
-**璋冪敤鏂逛慨鏀癸紙3澶勶級锛�**
-- `InboundFinishTaskAsync`锛氳皟鐢� `await CompleteTaskAsync(task, "鍏ュ簱瀹屾垚")`
-- `OutboundFinishTaskAsync`锛氳皟鐢� `await CompleteTaskAsync(task, "鍑哄簱瀹屾垚")`
-- `RelocationFinishTaskAsync`锛氳皟鐢� `await CompleteTaskAsync(task, "绉诲簱瀹屾垚")`
-
-### 3. InboundFinishTaskTrayAsync 鍜� OutboundFinishTaskTrayAsync
-
-杩欎袱涓柟娉�**涓嶈皟鐢�** `CompleteTaskAsync`锛岄渶瑕佸湪浜嬪姟鍐呫�佸垹闄や换鍔″墠娣诲姞浠诲姟鍘嗗彶鍜屽簱瀛樺巻鍙蹭繚瀛橈細
-
-```csharp
-// 浠诲姟鍘嗗彶
-var historyTask = _mapper.Map<Dt_Task_Hty>(task);
-historyTask.InsertTime = DateTime.Now;
-historyTask.OperateType = "绌烘墭鐩樺叆搴撳畬鎴�"; // 鎴�"绌烘墭鐩樺嚭搴撳畬鎴�"
-if (await _task_HtyService.Repository.AddDataAsync(historyTask) <= 0)
- return content.Error("浠诲姟鍘嗗彶淇濆瓨澶辫触");
-
-// 搴撳瓨鍘嗗彶
-var historyStock = _mapper.Map<Dt_StockInfo_Hty>(stockInfo);
-historyStock.InsertTime = DateTime.Now;
-historyStock.OperateType = "绌烘墭鐩樺叆搴撳畬鎴�"; // 鎴�"绌烘墭鐩樺嚭搴撳畬鎴�"
-if (await _stockInfo_HtyService.Repository.AddDataAsync(historyStock) <= 0)
- return content.Error("搴撳瓨鍘嗗彶淇濆瓨澶辫触");
-```
-
-### 4. 鎿嶄綔绫诲瀷鏋氫妇
-
-| 鏂规硶 | OperateType |
-|------|-------------|
-| `InboundFinishTaskAsync` | "鍏ュ簱瀹屾垚" |
-| `OutboundFinishTaskAsync` | "鍑哄簱瀹屾垚" |
-| `RelocationFinishTaskAsync` | "绉诲簱瀹屾垚" |
-| `InboundFinishTaskTrayAsync` | "绌烘墭鐩樺叆搴撳畬鎴�" |
-| `OutboundFinishTaskTrayAsync` | "绌烘墭鐩樺嚭搴撳畬鎴�" |
-
-## 鍏抽敭鐐�
-
-- `Dt_Task_Hty` 缁ф壙鑷� `Dt_Task`锛屽寘鍚� `SourceId`锛堝師琛ㄤ富閿級銆乣OperateType`锛堟搷浣滅被鍨嬶級銆乣InsertTime`锛堟彃鍏ユ椂闂达級
-- 浣跨敤 `MapsterMapper` 鐨� `_mapper.Map<T>()` 杩涜瀵硅薄鏄犲皠
-- 鍘嗗彶淇濆瓨蹇呴』鍦ㄥ垹闄ゅ師璁板綍**涔嬪墠**鎵ц
diff --git a/Code/WMS/docs/superpowers/specs/2026-03-31-taskService-refactor-design.md b/Code/WMS/docs/superpowers/specs/2026-03-31-taskService-refactor-design.md
deleted file mode 100644
index e4c65f7..0000000
--- a/Code/WMS/docs/superpowers/specs/2026-03-31-taskService-refactor-design.md
+++ /dev/null
@@ -1,106 +0,0 @@
-# TaskService.cs 閲嶆瀯璁捐
-
-## 1. 鑳屾櫙
-
-`TaskService.cs` 褰撳墠瓒呰繃 1500 琛岋紝鍖呭惈涓変釜鑱岃矗宸紓鏄庢樉鐨勫姛鑳芥ā鍧楋細
-- **WCS 閫昏緫澶勭悊**锛氬叆搴�/鍑哄簱/绉诲簱/鏈烘鎵�/鑷姩鍑哄簱浠诲姟
-- **鍒嗗鏌滄帴鍙�**锛氬寲鎴愬垎瀹规煖鐘舵�佸悓姝ュ拰鍑哄簱璇锋眰
-- **鏋佸嵎搴� AGV 鎺ュ彛**锛欰GV 鍑哄叆搴撶敵璇枫�佽緭閫佺嚎鐢宠銆佸彇鏀捐揣瀹屾垚
-
-鏂囦欢杩囧ぇ瀵艰嚧锛�
-- 闅句互瀹氫綅鍜屼慨鏀圭壒瀹氬姛鑳�
-- 浠g爜瀹℃煡鍥伴毦
-- 骞惰寮�鍙戝啿绐佺巼楂�
-
-## 2. 鐩爣
-
-灏� `TaskService.cs` 鎷嗗垎涓� partial class 鏂囦欢锛�**涓嶆敼鍙樹换浣曚笟鍔¢�昏緫**锛�**涓嶄慨鏀规帶鍒跺櫒璋冪敤鏂瑰紡**銆�
-
-## 3. 鎷嗗垎鏂规
-
-### 3.1 鏂囦欢缁撴瀯
-
-| 鏂囦欢 | 鑱岃矗 | 棰勪及琛屾暟 |
-|------|------|----------|
-| `TaskService.cs` | partial class 澹版槑銆佸瓧娈靛畾涔夈�佹瀯閫犲嚱鏁� | ~100琛� |
-| `TaskService_WCS.cs` | WCS 閫昏緫澶勭悊锛堝叆搴�/鍑哄簱/绉诲簱/绌烘墭鐩�/鏈烘鎵�/鑷姩鍑哄簱锛� | ~550琛� |
-| `TaskService_AGV.cs` | 鏋佸嵎搴� AGV 浠诲姟锛堝嚭鍏ュ簱鐢宠/杈撻�佺嚎鐢宠/鍙栨斁璐у畬鎴�/浠诲姟鍙栨秷锛� | ~280琛� |
-| `TaskService_GradingMachine.cs` | 鍒嗗鏌滄帴鍙o紙鐘舵�侀�氱煡/鍑哄簱璇锋眰/鐢佃姱鏌ヨ锛� | ~140琛� |
-
-### 3.2 淇濈暀鍦ㄤ富鏂囦欢鐨勫唴瀹�
-
-```csharp
-// TaskService.cs
-public partial class TaskService : ServiceBase<Dt_Task, IRepository<Dt_Task>>, ITaskService
-{
- // 瀛楁
- private readonly IMapper _mapper;
- private readonly IStockInfoService _stockInfoService;
- private readonly ILocationInfoService _locationInfoService;
- private readonly HttpClientHelper _httpClientHelper;
- private readonly IConfiguration _configuration;
- private readonly RoundRobinService _roundRobinService;
- private readonly IMesService _mesService;
- private readonly ITask_HtyService _task_HtyService;
- private readonly IStockInfo_HtyService _stockInfo_HtyService;
- private readonly IUnitOfWorkManage _unitOfWorkManage;
-
- // 鏋勯�犲嚱鏁�
- public TaskService(...) : base(BaseDal) { ... }
-
- // Repository 灞炴��
- public IRepository<Dt_Task> Repository => BaseDal;
-
- // 甯搁噺
- public List<int> TaskTypes => typeof(TaskTypeEnum).GetEnumIndexList();
- public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
-
- // 閰嶇疆瀛楁锛圓GV URL锛�
- public string AGV_OutTaskComplete = ...;
- public string WCS_ReceiveTask = ...;
-}
-```
-
-### 3.3 鍏叡鏂规硶澶勭悊
-
-浠ヤ笅鏂规硶鍥犺澶氫釜妯″潡璋冪敤锛岄噰鐢�**澶嶅埗鏂瑰紡**淇濇寔瀹屽叏鐙珛锛�
-
-| 鏂规硶 | 澶嶅埗鍒� |
-|------|--------|
-| `CompleteTaskAsync` | `TaskService_WCS.cs` |
-| `GetTaskByPalletCodeAsync` | `TaskService_WCS.cs` |
-| `DetermineTargetAddress` | `TaskService_WCS.cs` |
-
-### 3.4 涓嶆媶鍒嗙殑鍐呭
-
-- 鎵�鏈� `#region` 淇濇寔涓嶅彉
-- 鎵�鏈夋灇涓惧紩鐢ㄤ繚鎸佷笉鍙�
-- 鎵�鏈� using 璇彞鍦ㄥ悇鏂囦欢涓噸澶�
-
-## 4. 瀹炴柦姝ラ
-
-1. **鍒涘缓 `TaskService_WCS.cs`**
- - 浠庡師鏂囦欢鎻愬彇 WCS 閫昏緫澶勭悊鐩稿叧鏂规硶
- - 娣诲姞 partial class 澹版槑鍜屽繀瑕� using
-
-2. **鍒涘缓 `TaskService_AGV.cs`**
- - 浠庡師鏂囦欢鎻愬彇鏋佸嵎搴� AGV 鐩稿叧鏂规硶
- - 淇濈暀 `AGV_OutTaskComplete` 鍜� `WCS_ReceiveTask` 鐨勮闂�
-
-3. **鍒涘缓 `TaskService_GradingMachine.cs`**
- - 浠庡師鏂囦欢鎻愬彇鍒嗗鏌滄帴鍙g浉鍏虫柟娉�
-
-4. **绮剧畝 `TaskService.cs`**
- - 鍒犻櫎宸茶縼绉荤殑鏂规硶瀹炵幇
- - 淇濈暀 partial class 澹版槑銆佸瓧娈点�佹瀯閫犲嚱鏁�
-
-5. **楠岃瘉缂栬瘧閫氳繃**
- - 纭繚鎵�鏈夋柟娉曠鍚嶄笉鍙�
- - 纭繚鎺у埗鍣ㄨ皟鐢ㄦ甯�
-
-## 5. 绾︽潫
-
-- **涓嶄慨鏀逛换浣曚笟鍔¢�昏緫**锛氬彧鎼Щ浠g爜锛屼笉鏀瑰疄鐜�
-- **涓嶄慨鏀规帴鍙� ITaskService**锛氭帶鍒跺櫒渚濊禆鎺ュ彛锛屼笉鎰熺煡瀹炵幇鎷嗗垎
-- **涓嶄慨鏀� DI 娉ㄥ唽**锛欰utofac 鎵弿淇濇寔涓嶅彉
-- **浣跨敤 partial class**锛氫繚璇佺紪璇戝悗绫诲瀷瀹屽叏鍚堝苟
diff --git "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/AGENTS.md" "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/AGENTS.md"
deleted file mode 100644
index edbd5ac..0000000
--- "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/AGENTS.md"
+++ /dev/null
@@ -1,44 +0,0 @@
-锘�# Repository Guidelines
-
-## 椤圭洰缁撴瀯涓庢ā鍧楃粍缁�
-鏈粨搴撴槸鍩轰簬 .NET 6 + Vue 3 鐨� S7 PLC 妯℃嫙鍣紝閲囩敤鍓嶅悗绔垎绂绘灦鏋勩��
-
-- `WIDESEAWCS_S7Simulator.Core`锛氭牳蹇冮鍩熸ā鍨嬨�佸唴瀛樺尯鍩燂紙`M/DB/I/Q/T/C`锛夈�佹ā鎷熷櫒杩愯鏃朵笌鎸佷箙鍖栬兘鍔涖��
-- `WIDESEAWCS_S7Simulator.Application`锛氬簲鐢ㄥ眰鎶借薄涓庡崗璁�/搴旂敤鏈嶅姟銆�
-- `WIDESEAWCS_S7Simulator.Server`锛欰SP.NET Core Web API锛坄Controllers/`銆乣Program.cs`锛夛紝杩愯鏁版嵁浣嶄簬 `Data/`銆�
-- `WIDESEAWCS_S7Simulator.Web`锛歏ue 3 + TypeScript 鍓嶇锛坄src/views`銆乣src/api`銆乣src/router`銆乣src/types`锛夈��
-- `WIDESEAWCS_S7Simulator.UnitTests`锛歺Unit 鍗曞厓娴嬭瘯椤圭洰銆�
-- `docs/`锛氳璁¤鏄庝笌鍗忚鏂囨。銆�
-
-## 鏋勫缓銆佹祴璇曚笌鏈湴寮�鍙戝懡浠�
-浠ヤ笅鍛戒护榛樿鍦ㄤ粨搴撴牴鐩綍鎵ц銆�
-
-- `dotnet restore WIDESEAWCS_S7Simulator.slnx`锛氳繕鍘� NuGet 渚濊禆銆�
-- `dotnet build WIDESEAWCS_S7Simulator.slnx`锛氭瀯寤哄悗绔墍鏈夐」鐩��
-- `dotnet test WIDESEAWCS_S7Simulator.UnitTests`锛氳繍琛� xUnit 娴嬭瘯銆�
-- `dotnet run --project WIDESEAWCS_S7Simulator.Server`锛氬惎鍔ㄥ悗绔� API锛堥粯璁� `http://localhost:5137`锛夈��
-- `cd WIDESEAWCS_S7Simulator.Web && pnpm install`锛氬畨瑁呭墠绔緷璧栥��
-- `cd WIDESEAWCS_S7Simulator.Web && pnpm dev`锛氬惎鍔ㄥ墠绔紑鍙戞湇鍔★紙閫氬父涓� `http://localhost:3000` 鎴� `5173`锛夈��
-- `cd WIDESEAWCS_S7Simulator.Web && pnpm build`锛氭墽琛岀被鍨嬫鏌ュ苟鏋勫缓鐢熶骇鍖呫��
-
-## 浠g爜椋庢牸涓庡懡鍚嶈鑼�
-- C#锛�4 绌烘牸缂╄繘锛涚被鍨�/鏂规硶浣跨敤 `PascalCase`锛屽眬閮ㄥ彉閲�/鍙傛暟浣跨敤 `camelCase`锛屾帴鍙d娇鐢� `I` 鍓嶇紑銆�
-- TypeScript/Vue锛氶〉闈㈢粍浠朵娇鐢� `PascalCase`锛堝 `DetailsView.vue`锛夛紱鍙橀噺涓庡嚱鏁颁娇鐢� `camelCase`锛汚PI DTO 绫诲瀷闆嗕腑鍦� `src/types`銆�
-- 鎺у埗鍣ㄤ繚鎸佽交閲忥紝涓氬姟閫昏緫灏介噺涓嬫矇鍒� Core/Application 鏈嶅姟銆�
-- 浼樺厛缂栧啓鑱岃矗鍗曚竴銆佷綋閲忓彲鎺х殑鏂囦欢锛岄伩鍏嶁�滃ぇ鑰屽叏鈥濈被銆�
-- 鏂板鎴栦慨鏀逛唬鐮佹椂锛屽繀椤昏ˉ鍏呭繀瑕佹敞閲婏細璇存槑鍏抽敭涓氬姟鎰忓浘銆佸崗璁瓧娈靛惈涔夈�佽竟鐣屾潯浠舵垨闈炵洿瑙傚疄鐜帮紱閬垮厤鏃犳剰涔夋敞閲娿��
-- 鎵�鏈夋柊澧炴敞閲婂繀椤讳娇鐢ㄤ腑鏂囷紝骞剁‘淇濅互 UTF-8 绛夌粺涓�缂栫爜淇濆瓨锛屾彁浜ゅ墠闇�鑷娉ㄩ噴鏄剧ず姝e父锛屼弗绂佸嚭鐜颁贡鐮併��
-
-## 娴嬭瘯瑙勮寖
-- 娴嬭瘯妗嗘灦锛歺Unit锛堥厤濂� `Microsoft.NET.Test.Sdk`銆乣coverlet.collector`锛夈��
-- 娴嬭瘯鍛藉悕寤鸿閲囩敤鈥滆涓篲缁撴灉鈥濇ā寮忥紝渚嬪锛歚MemoryStoreTests.ReadBit_ReturnsExpectedValue`銆�
-- 娑夊強鍐呭瓨鍦板潃瑙f瀽銆佸崗璁ā鏉裤�佹寔涔呭寲銆佸疄渚嬬敓鍛藉懆鏈熺殑鏀瑰姩锛屽繀椤诲悓姝ヨˉ鍏呮垨鏇存柊娴嬭瘯銆�
-- 鎻愪氦 PR 鍓嶈嚦灏戞墽琛屼竴娆� `dotnet test`銆�
-
-## 鎻愪氦涓� Pull Request 瑙勮寖
-- 鎻愪氦淇℃伅閬靛惊褰撳墠浠撳簱涔犳儻锛歚feat: ...`銆乣fix: ...`銆乣refactor: ...`銆乣docs: ...`锛堝彲浣跨敤涓枃鎻忚堪锛夈��
-- 鎻愪氦浠g爜鏃跺繀椤荤紪鍐欐槑纭殑鎻愪氦璇︽儏锛岃嚦灏戣鏄庯細鍋氫簡浠�涔堛�佷负浠�涔堝仛銆佸奖鍝嶄簡鍝簺妯″潡鎴栨枃浠躲��
-- 姣忔鎻愪氦鑱氱劍涓�涓�昏緫鍙樻洿锛岄伩鍏嶆贩鍏ユ棤鍏虫枃浠躲��
-- PR 闇�鍖呭惈锛氬彉鏇寸洰鐨勩�佸叧閿敼鍔ㄣ�佹祴璇曠粨鏋滐紙濡� `dotnet test`銆乣pnpm build`锛夛紝UI 鏀瑰姩闄勬埅鍥炬垨褰曞睆銆�
-- 鑻ュ叧鑱斾换鍔�/缂洪櫡锛岃闄勪笂缂栧彿锛屽苟娉ㄦ槑閰嶇疆鎴栨暟鎹縼绉诲奖鍝嶃��
-- 鏈敹鍒版槑纭�滄彁浜も�濇寚浠ゅ墠锛岀姝㈡墽琛� `git commit`銆乣git push` 鎴栧垱寤� PR銆�
diff --git "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/CLAUDE.md" "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/CLAUDE.md"
deleted file mode 100644
index 6fb17a7..0000000
--- "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/CLAUDE.md"
+++ /dev/null
@@ -1,190 +0,0 @@
-# CLAUDE.md
-
-鏈枃浠朵负 Claude Code (claude.ai/code) 鍦ㄦ浠g爜搴撲腑宸ヤ綔鏃舵彁渚涙寚瀵笺��
-
-## 椤圭洰姒傝堪
-
-WIDESEAWCS_S7Simulator 鏄竴涓� S7 PLC 妯℃嫙鍣ㄧ郴缁燂紝鐢ㄤ簬妯℃嫙瑗块棬瀛� S7 绯诲垪 PLC 鐨勬湇鍔″櫒琛屼负銆傞噰鐢ㄥ墠鍚庣鍒嗙鏋舵瀯锛屾敮鎸佸悓鏃惰繍琛屽涓� PLC 瀹炰緥锛屽苟鎻愪緵 Web 鐣岄潰杩涜绠$悊銆�
-
-### 鎶�鏈爤
-
-**鍚庣**
-- .NET 6.0 / ASP.NET Core Web API
-- HslCommunication 12.6.3锛圫7 閫氫俊搴擄級
-- Swagger/OpenAPI
-
-**鍓嶇**
-- Vue 3.5 + TypeScript 5.7
-- Vite 6.0锛堝紑鍙戞湇鍔″櫒 + 鏋勫缓锛�
-- Element Plus 2.9锛圲I 缁勪欢搴擄級
-- Pinia锛堢姸鎬佺鐞嗭級
-- Vue Router 4.5
-- Axios锛圚TTP 瀹㈡埛绔級
-
-## 甯哥敤鍛戒护
-
-### 鍚庣寮�鍙�
-
-```bash
-# 杩愯鍚庣鏈嶅姟鍣紙榛樿绔彛 5137锛�
-cd WIDESEAWCS_S7Simulator.Server
-dotnet run
-
-# 鏋勫缓瑙e喅鏂规
-dotnet build WIDESEAWCS_S7Simulator.slnx
-
-# 杩愯鍗曞厓娴嬭瘯
-dotnet test WIDESEAWCS_S7Simulator.UnitTests
-
-# 鍙戝竷 Release 鐗堟湰
-dotnet publish -c Release
-```
-
-### 鍓嶇寮�鍙�
-
-```bash
-# 杩涘叆鍓嶇鐩綍
-cd WIDESEAWCS_S7Simulator.Web
-
-# 瀹夎渚濊禆锛堜娇鐢� pnpm锛�
-pnpm install
-
-# 鍚姩寮�鍙戞湇鍔″櫒锛堥粯璁ょ鍙� 3000锛屼唬鐞� /api 鍒板悗绔� 5137锛�
-pnpm dev
-
-# 鏋勫缓鐢熶骇鐗堟湰
-pnpm build
-
-# 棰勮鐢熶骇鏋勫缓
-pnpm preview
-```
-
-### 鍚屾椂鍚姩鍓嶅悗绔�
-
-鍦ㄤ袱涓粓绔腑鍒嗗埆杩愯锛�
-- 缁堢 1锛歚cd WIDESEAWCS_S7Simulator.Server && dotnet run`
-- 缁堢 2锛歚cd WIDESEAWCS_S7Simulator.Web && pnpm dev`
-
-璁块棶 http://localhost:3000 浣跨敤 Web 鐣岄潰銆�
-
-## 椤圭洰鏋舵瀯
-
-### 楂樺眰鏋舵瀯
-
-```
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� Vue 3 鍓嶇 鈹�
-鈹� (WIDESEAWCS_S7Simulator.Web - 绔彛 3000) 鈹�
-鈹� - 瀹炰緥鍒楄〃銆佸垱寤恒�佺紪杈戦〉闈� 鈹�
-鈹� - Axios API 瀹㈡埛绔紙浠g悊鍒� /api锛� 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
- 鈫�
- 鈫� HTTP/REST API
- 鈫�
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� ASP.NET Core API 鈹�
-鈹� (WIDESEAWCS_S7Simulator.Server - 绔彛 5137) 鈹�
-鈹� - SimulatorInstancesController (瀹炰緥 CRUD) 鈹�
-鈹� - MemoryController (鍐呭瓨璇诲啓) 鈹�
-鈹� - ClientsController (瀹㈡埛绔繛鎺�) 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
- 鈫�
- 鈫� 渚濊禆娉ㄥ叆
- 鈫�
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� Core 涓氬姟閫昏緫灞� 鈹�
-鈹� (WIDESEAWCS_S7Simulator.Core) 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� SimulatorInstanceManager - 瀹炰緥鐢熷懡鍛ㄦ湡绠$悊 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� S7ServerInstance - 鍗曚釜 S7 鏈嶅姟鍣ㄥ疄渚� 鈹� 鈹�
-鈹� 鈹� - HslCommunication.SiemensS7Server 鈹� 鈹�
-鈹� 鈹� - MemoryStore (鍐呭瓨鍖哄煙绠$悊) 鈹� 鈹�
-鈹� 鈹� - 瀹㈡埛绔繛鎺ョ洃鎺� 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� MemoryStore - 鍐呭瓨鍖哄煙鎶借薄 鈹� 鈹�
-鈹� 鈹� - MRegion / DBRegion / IRegion / QRegion 鈹� 鈹�
-鈹� 鈹� - TRegion / CRegion 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� FilePersistenceService - 閰嶇疆鎸佷箙鍖栧埌 Data 鐩綍 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-```
-
-### 椤圭洰缁撴瀯璇存槑
-
-**WIDESEAWCS_S7Simulator.Core** - 鏍稿績涓氬姟閫昏緫
-- `Entities/`: 瀹炰綋绫伙紙InstanceConfig, InstanceState, S7ClientConnection锛�
-- `Enums/`: 鏋氫妇锛圫iemensPLCType, InstanceStatus锛�
-- `Interfaces/`: 鏍稿績鎺ュ彛锛圛S7ServerInstance, ISimulatorInstanceManager, IMemoryStore锛�
-- `Manager/`: SimulatorInstanceManager锛堢鐞嗗涓疄渚嬶級
-- `Server/`: S7ServerInstance锛堝崟涓� S7 鏈嶅姟鍣ㄥ疄鐜帮級
-- `Memory/`: 鍐呭瓨鍖哄煙瀹炵幇锛圡Region, DBRegion, IRegion, QRegion, TRegion, CRegion, MemoryStore锛�
-- `Persistence/`: FilePersistenceService锛堥厤缃寔涔呭寲锛�
-
-**WIDESEAWCS_S7Simulator.Server** - ASP.NET Core Web API
-- `Controllers/`: API 鎺у埗鍣�
-- `Program.cs`: 搴旂敤鍏ュ彛锛岄厤缃� CORS銆佷緷璧栨敞鍏ャ�丼wagger
-
-**WIDESEAWCS_S7Simulator.Application** - 搴旂敤灞傦紙鐩墠涓虹┖锛�
-
-**WIDESEAWCS_S7Simulator.Web** - Vue 3 鍓嶇
-- `src/api/index.ts`: Axios API 瀹㈡埛绔�
-- `src/types/index.ts`: TypeScript 绫诲瀷瀹氫箟
-- `src/views/`: 椤甸潰缁勪欢锛圚omeView, CreateView, EditView, DetailsView锛�
-- `src/router/`: Vue Router 閰嶇疆
-- `vite.config.ts`: Vite 閰嶇疆锛堝紑鍙戞湇鍔″櫒浠g悊鍒板悗绔級
-
-**WIDESEAWCS_S7Simulator.UnitTests** - 鍗曞厓娴嬭瘯
-- `Memory/`: 鍐呭瓨鍖哄煙娴嬭瘯
-
-## 鏁版嵁鎸佷箙鍖�
-
-瀹炰緥閰嶇疆淇濆瓨鍦� `WIDESEAWCS_S7Simulator.Server/Data/` 鐩綍涓嬶紝姣忎釜瀹炰緥涓�涓� JSON 鏂囦欢銆�
-
-鍚姩鏃朵細鑷姩鍔犺浇宸蹭繚瀛樼殑瀹炰緥锛堥粯璁や笉鑷姩鍚姩锛岄渶閫氳繃 API 鎴� UI 鎵嬪姩鍚姩锛夈��
-
-## API 绔偣璇存槑
-
-鎵�鏈� API 浠� `/api/` 涓哄墠缂�锛屼富瑕佹帶鍒跺櫒锛�
-- `/api/SimulatorInstances/*` - 瀹炰緥绠$悊锛圕RUD銆佸惎鍔�/鍋滄/閲嶅惎锛�
-- `/api/Memory/*` - 鍐呭瓨璇诲啓
-- `/api/Clients/*` - 瀹㈡埛绔繛鎺ヤ俊鎭�
-
-瀹屾暣 API 鏂囨。锛氬惎鍔ㄥ悗绔悗璁块棶 http://localhost:5137/swagger
-
-## 鍐呭瓨鍖哄煙璇存槑
-
-S7 PLC 鍐呭瓨鍖哄煙鐢� MemoryStore 缁熶竴绠$悊锛�
-- **M 鍖�**锛氫綅瀛樺偍鍣紙榛樿 1024 瀛楄妭锛�
-- **DB 鍖�**锛氭暟鎹潡锛堝彲閰嶇疆鍧楁暟閲忓拰澶у皬锛�
-- **I 鍖�**锛氳緭鍏ュ尯锛堥粯璁� 128 瀛楄妭锛�
-- **Q 鍖�**锛氳緭鍑哄尯锛堥粯璁� 128 瀛楄妭锛�
-- **T 鍖�**锛氬畾鏃跺櫒锛堥粯璁� 100 涓級
-- **C 鍖�**锛氳鏁板櫒锛堥粯璁� 100 涓級
-
-鍦板潃鏍煎紡鏀寔锛歚M100`, `DB1.DBD0`, `I0.0`, `Q0.0`, `T1`, `C1`
-
-## 寮�鍙戞敞鎰忎簨椤�
-
-### 鎻愪氦浠g爜瑙勮寖
-- 浠g爜淇敼鍚庝笉瑕佽嚜鍔ㄦ彁浜� git
-- 鍙湁鐢ㄦ埛鏄庣‘璇�"鎻愪氦"鏃舵墠鎵ц git commit
-
-### 搴忓垪鍖栭厤缃�
-鍚庣浣跨敤 camelCase JSON 鍛藉悕绛栫暐锛圫ystem.Text.Json锛夛紝鏋氫妇浼氬簭鍒楀寲涓哄瓧绗︿覆銆�
-
-### CORS 閰嶇疆
-寮�鍙戠幆澧冨厑璁镐互涓嬫簮璁块棶 API锛歚http://localhost:3000`, `http://localhost:5173`, `http://localhost:5174`, `http://localhost:3001`
-
-### HSL 婵�娲荤爜
-S7ServerInstance 鏀寔閫氳繃 `InstanceConfig.ActivationKey` 璁剧疆 HSL Communication 搴撶殑婵�娲荤爜銆�
-
-### 瀹㈡埛绔繛鎺ョ洃鎺�
-S7ServerInstance 姣� 5 绉掗�氳繃妫�鏌� TCP 杩炴帴鏉ョ洃鎺у鎴风杩炴帴鐘舵�侊紙浣跨敤 `IPGlobalProperties.GetActiveTcpConnections()`锛夈��
-
-### 绔彛鍐茬獊
-鍒涘缓瀹炰緥鏃堕渶纭繚绔彛鏈鍗犵敤锛屽涓疄渚嬩笉鑳戒娇鐢ㄧ浉鍚岀鍙c��
diff --git "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-03-16-protocol-template-db-monitoring.md" "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-03-16-protocol-template-db-monitoring.md"
deleted file mode 100644
index 421bf8c..0000000
--- "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-03-16-protocol-template-db-monitoring.md"
+++ /dev/null
@@ -1,36 +0,0 @@
-锘�# 鍗忚妯℃澘涓嶥B鐩戞祴鍥炲啓 Implementation Plan
-
-> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 鏂板鍗忚妯℃澘绠$悊銆佸疄渚嬬粦瀹氭ā鏉裤�佹湇鍔$杞鐩戞祴WCS鍐欏叆DB骞跺洖鍐橮LC鍖哄瓧娈点��
-
-**Architecture:** 鍦� Core 澧炲姞鍗忚妯℃澘/瀛楁妯″瀷涓庤鍒欏鐞嗗櫒锛涘湪 Server 澧炲姞妯℃澘鎸佷箙鍖栨湇鍔°�佹ā鏉跨鐞咥PI銆佸悗鍙拌疆璇㈡湇鍔★紱鍦� Web 澧炲姞妯℃澘绠$悊椤典笌瀹炰緥鍒涘缓鏃舵ā鏉块�夋嫨銆�
-
-**Tech Stack:** .NET 6, ASP.NET Core, Vue3 + Element Plus
-
----
-
-### Task 1: Core 鍗忚妯″瀷涓庤鍒欏鐞嗗櫒
-- [ ] 鏂板鍗忚瀹炰綋涓庢灇涓�
-- [ ] 鏂板鍗忚DB澶勭悊鍣紙鏍规嵁 WCS_ACK 鍙樺寲鍥炲啓 PLC 瀛楁锛�
-- [ ] 琛ュ厖鍗曞厓娴嬭瘯锛堝厛澶辫触锛�
-
-### Task 2: Server 妯℃澘鏈嶅姟涓庡悗鍙扮洃娴�
-- [ ] 鏂板妯℃澘鏈嶅姟鎺ュ彛涓庢枃浠跺瓨鍌ㄥ疄鐜�
-- [ ] 鏂板妯℃澘绠$悊鎺у埗鍣�
-- [ ] 鏂板鍚庡彴杞鏈嶅姟骞舵敞鍐� DI
-- [ ] 鍦ㄥ疄渚嬪垱寤�/鏇存柊鏃舵牎楠屾ā鏉垮瓨鍦�
-
-### Task 3: 瀹炰緥閰嶇疆鎵╁睍涓庢寔涔呭寲
-- [ ] InstanceConfig 澧炲姞 ProtocolTemplateId
-- [ ] 鎸佷箙鍖栨ā鍨嬩笌鏄犲皠鍚屾
-
-### Task 4: Web 妯℃澘绠$悊涓庡疄渚嬮�夋嫨
-- [ ] 鏂板绫诲瀷涓� API
-- [ ] 鏂板妯℃澘绠$悊椤甸潰涓庤矾鐢�
-- [ ] Create/Edit 椤甸潰澧炲姞妯℃澘閫夋嫨骞舵彁浜�
-
-### Task 5: 楠岃瘉
-- [ ] dotnet test
-- [ ] dotnet build
-- [ ] 鍓嶇 npm run build
diff --git "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-04-08-database-instance-sync-plan.md" "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-04-08-database-instance-sync-plan.md"
deleted file mode 100644
index 7ebd6b2..0000000
--- "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-04-08-database-instance-sync-plan.md"
+++ /dev/null
@@ -1,593 +0,0 @@
-# S7 妯℃嫙鍣ㄦ暟鎹簱瀹炰緥鍚屾瀹炵幇璁″垝
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** 浠� WCS 鏁版嵁搴撹嚜鍔ㄥ悓姝ヨ澶囧埌 S7 妯℃嫙鍣ㄥ疄渚嬶紝鍚姩鏃跺悓姝ヤ竴娆★紝涔熸敮鎸� API 鎵嬪姩瑙﹀彂
-
-**Architecture:** 鍦� Application 灞傛柊澧� DatabaseDeviceService 璇诲彇 WCS 鏁版嵁搴擄紝InstanceSyncService 鍗忚皟鍚屾閫昏緫锛孲imulatorInstanceManager 鍒涘缓/绠$悊瀹炰緥銆傚崗璁ā鏉块�氳繃鐜版湁 IProtocolTemplateService 淇濆瓨鍒版湰鍦� JSON 鏂囦欢銆�
-
-**Tech Stack:** .NET 6, SqlSugarCore, ASP.NET Core, JSON 鏂囦欢鎸佷箙鍖�
-
----
-
-## 鏂囦欢缁撴瀯
-
-```
-Application/
-鈹溾攢鈹� DTOs/
-鈹� 鈹斺攢鈹� WcsDeviceDto.cs # 鏁版嵁搴撳瓧娈垫槧灏� DTO
-鈹溾攢鈹� WcsDbOptions.cs # WCS 鏁版嵁搴撻厤缃�
-鈹溾攢鈹� DatabaseDeviceService.cs # 璇诲彇 WCS 鏁版嵁搴�
-鈹斺攢鈹� InstanceSyncService.cs # 鍚屾鍗忚皟閫昏緫
-
-Server/
-鈹溾攢鈹� Controllers/
-鈹� 鈹斺攢鈹� SyncController.cs # API 鎺ュ彛
-鈹溾攢鈹� appsettings.json # 娣诲姞 WcsDb 閰嶇疆
-鈹斺攢鈹� Program.cs # 娉ㄥ唽鏈嶅姟銆佸惎鍔ㄥ悓姝�
-```
-
----
-
-## Task 1: 娣诲姞 SqlSugarCore 渚濊禆
-
-**Files:**
-- Modify: `WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj`
-
-- [ ] **Step 1: 娣诲姞 SqlSugarCore NuGet 鍖�**
-
-```xml
-<PackageReference Include="SqlSugarCore" Version="5.1.4.170" />
-```
-
-- [ ] **Step 2: Commit**
-
-```bash
-git add WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj
-git commit -m "feat: 娣诲姞 SqlSugarCore 渚濊禆鐢ㄤ簬鏁版嵁搴撹繛鎺�"
-```
-
----
-
-## Task 2: 鍒涘缓 WCS 鏁版嵁搴� DTO
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Application/DTOs/WcsDeviceDto.cs`
-
-- [ ] **Step 1: 鍒涘缓 WcsDeviceDto.cs**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Application.DTOs;
-
-/// <summary>
-/// 璁惧淇℃伅 DTO锛堟槧灏� WCS Dt_DeviceInfo 琛級
-/// </summary>
-public class WcsDeviceDto
-{
- public int Id { get; set; }
- public string DeviceCode { get; set; } = string.Empty;
- public string DeviceName { get; set; } = string.Empty;
- public string DeviceType { get; set; } = string.Empty;
- public string DeviceStatus { get; set; } = string.Empty;
- public string DeviceIp { get; set; } = string.Empty;
- public int DevicePort { get; set; }
- public string DevicePlcType { get; set; } = string.Empty;
- public string DeviceRemark { get; set; } = string.Empty;
-}
-
-/// <summary>
-/// 璁惧鍗忚 DTO锛堟槧灏� WCS Dt_DeviceProtocol 琛級
-/// </summary>
-public class WcsDeviceProtocolDto
-{
- public int Id { get; set; }
- public int DeviceId { get; set; }
- public string DeviceChildCode { get; set; } = string.Empty;
- public string DeviceProDataBlock { get; set; } = string.Empty;
- public decimal DeviceProOffset { get; set; }
- public string DeviceProDataType { get; set; } = string.Empty;
- public int DeviceProDataLength { get; set; }
- public string DeviceProParamName { get; set; } = string.Empty;
- public string DeviceProParamType { get; set; } = string.Empty;
- public string DeviceProParamDes { get; set; } = string.Empty;
- public string DeviceProRemark { get; set; } = string.Empty;
-}
-```
-
-- [ ] **Step 2: Commit**
-
-```bash
-git add WIDESEAWCS_S7Simulator.Application/DTOs/WcsDeviceDto.cs
-git commit -m "feat: 娣诲姞 WCS 璁惧 DTO"
-```
-
----
-
-## Task 3: 鍒涘缓 WcsDbOptions 閰嶇疆绫�
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Application/WcsDbOptions.cs`
-
-- [ ] **Step 1: 鍒涘缓 WcsDbOptions.cs**
-
-```csharp
-namespace WIDESEAWCS_S7Simulator.Application;
-
-/// <summary>
-/// WCS 鏁版嵁搴撹繛鎺ラ厤缃�
-/// </summary>
-public class WcsDbOptions
-{
- public const string SectionName = "WcsDb";
-
- /// <summary>
- /// 鏄惁鍚敤鏁版嵁搴撳悓姝�
- /// </summary>
- public bool Enabled { get; set; }
-
- /// <summary>
- /// 杩炴帴瀛楃涓�
- /// </summary>
- public string ConnectionString { get; set; } = string.Empty;
-
- /// <summary>
- /// 鏁版嵁搴撶被鍨嬶細SqlServer=2, MySql=1
- /// </summary>
- public int DbType { get; set; } = 2;
-}
-```
-
-- [ ] **Step 2: Commit**
-
-```bash
-git add WIDESEAWCS_S7Simulator.Application/WcsDbOptions.cs
-git commit -m "feat: 娣诲姞 WcsDbOptions 閰嶇疆绫�"
-```
-
----
-
-## Task 4: 鍒涘缓 DatabaseDeviceService
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Application/DatabaseDeviceService.cs`
-
-- [ ] **Step 1: 鍒涘缓 DatabaseDeviceService.cs**
-
-```csharp
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-using SqlSugar;
-using WIDESEAWCS_S7Simulator.Application.DTOs;
-
-namespace WIDESEAWCS_S7Simulator.Application;
-
-/// <summary>
-/// 璇诲彇 WCS 鏁版嵁搴撹澶囨暟鎹�
-/// </summary>
-public class DatabaseDeviceService : IDisposable
-{
- private readonly WcsDbOptions _options;
- private readonly ILogger<DatabaseDeviceService> _logger;
- private readonly SqlSugarScope _db;
-
- public DatabaseDeviceService(IOptions<WcsDbOptions> options, ILogger<DatabaseDeviceService> logger)
- {
- _options = options.Value;
- _logger = logger;
-
- _db = new SqlSugarScope(new ConnectionConfig
- {
- ConnectionString = _options.ConnectionString,
- DbType = (DbType)_options.DbType,
- IsAutoCloseConnection = true,
- InitKeyType = InitKeyType.Attribute
- });
- }
-
- /// <summary>
- /// 鑾峰彇鎵�鏈� SiemensS7 绫诲瀷鐨勮澶�
- /// </summary>
- public async Task<List<WcsDeviceDto>> GetSiemensS7DevicesAsync()
- {
- try
- {
- var devices = await _db.Queryable<WcsDeviceDto>()
- .Where(d => d.DevicePlcType == "SiemensS7")
- .ToListAsync();
- _logger.LogInformation("浠庢暟鎹簱鑾峰彇鍒� {Count} 涓� SiemensS7 璁惧", devices.Count);
- return devices;
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "浠庢暟鎹簱鑾峰彇璁惧澶辫触");
- return new List<WcsDeviceDto>();
- }
- }
-
- /// <summary>
- /// 鑾峰彇鎸囧畾璁惧鐨勫崗璁垪琛�
- /// </summary>
- public async Task<List<WcsDeviceProtocolDto>> GetDeviceProtocolsAsync(int deviceId)
- {
- try
- {
- var protocols = await _db.Queryable<WcsDeviceProtocolDto>()
- .Where(p => p.DeviceId == deviceId)
- .ToListAsync();
- return protocols;
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "鑾峰彇璁惧鍗忚澶辫触 DeviceId={DeviceId}", deviceId);
- return new List<WcsDeviceProtocolDto>();
- }
- }
-
- public void Dispose()
- {
- _db.Dispose();
- }
-}
-```
-
-- [ ] **Step 2: Commit**
-
-```bash
-git add WIDESEAWCS_S7Simulator.Application/DatabaseDeviceService.cs
-git commit -m "feat: 娣诲姞 DatabaseDeviceService 璇诲彇 WCS 鏁版嵁搴�"
-```
-
----
-
-## Task 5: 鍒涘缓 InstanceSyncService
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Application/InstanceSyncService.cs`
-
-- [ ] **Step 1: 鍒涘缓 InstanceSyncService.cs**
-
-```csharp
-using Microsoft.Extensions.Logging;
-using WIDESEAWCS_S7Simulator.Application.Protocol;
-using WIDESEAWCS_S7Simulator.Core.Entities;
-using WIDESEAWCS_S7Simulator.Core.Enums;
-using WIDESEAWCS_S7Simulator.Core.Interfaces;
-using WIDESEAWCS_S7Simulator.Core.Protocol;
-
-namespace WIDESEAWCS_S7Simulator.Application;
-
-/// <summary>
-/// 瀹炰緥鍚屾鏈嶅姟锛氬崗璋冩暟鎹簱璇诲彇銆佸崗璁ā鏉跨敓鎴愩�佸疄渚嬪垱寤�
-/// </summary>
-public class InstanceSyncService
-{
- private readonly DatabaseDeviceService _deviceService;
- private readonly ISimulatorInstanceManager _instanceManager;
- private readonly IProtocolTemplateService _templateService;
- private readonly ILogger<InstanceSyncService> _logger;
-
- private DateTime? _lastSyncTime;
-
- public DateTime? LastSyncTime => _lastSyncTime;
-
- public InstanceSyncService(
- DatabaseDeviceService deviceService,
- ISimulatorInstanceManager instanceManager,
- IProtocolTemplateService templateService,
- ILogger<InstanceSyncService> logger)
- {
- _deviceService = deviceService;
- _instanceManager = instanceManager;
- _templateService = templateService;
- _logger = logger;
- }
-
- /// <summary>
- /// 鎵ц鍚屾锛氫粠鏁版嵁搴撹鍙栬澶囷紝鍒涘缓瀹炰緥鍜屽崗璁ā鏉�
- /// </summary>
- public async Task SyncInstancesAsync()
- {
- _logger.LogInformation("寮�濮嬪悓姝ュ疄渚�...");
- _lastSyncTime = DateTime.Now;
-
- // 1. 鑾峰彇鎵�鏈� SiemensS7 璁惧
- var devices = await _deviceService.GetSiemensS7DevicesAsync();
- if (devices.Count == 0)
- {
- _logger.LogWarning("鏈壘鍒� SiemensS7 璁惧锛屽悓姝ュ彇娑�");
- return;
- }
-
- // 2. 鑾峰彇鐜版湁瀹炰緥ID鍒楄〃
- var existingInstanceIds = _instanceManager.GetAllInstances().Select(i => i.Config.Id).ToHashSet(StringComparer.OrdinalIgnoreCase);
- var dbDeviceCodes = devices.Select(d => d.DeviceCode).ToHashSet(StringComparer.OrdinalIgnoreCase);
-
- // 3. 娓呯悊宸蹭笉瀛樺湪鐨勫疄渚嬶紙鏁版嵁搴撲腑娌℃湁浣嗗唴瀛樹腑鏈夛級
- foreach (var instanceId in existingInstanceIds)
- {
- if (!dbDeviceCodes.Contains(instanceId))
- {
- _logger.LogInformation("鏁版嵁搴撲腑宸插垹闄よ澶� {InstanceId}锛屼粠鍐呭瓨绉婚櫎", instanceId);
- await _instanceManager.DeleteInstanceAsync(instanceId, deleteConfig: false);
- }
- }
-
- // 4. 鍒涘缓鎴栨洿鏂板疄渚�
- foreach (var device in devices)
- {
- try
- {
- // 4.1 鑾峰彇璁惧鍗忚
- var protocols = await _deviceService.GetDeviceProtocolsAsync(device.Id);
-
- // 4.2 鍒涘缓鍗忚妯℃澘
- var templateId = $"protocol-{device.DeviceCode}";
- var template = new ProtocolTemplate
- {
- Id = templateId,
- Name = $"{device.DeviceName} 鍗忚妯℃澘",
- Version = "1.0",
- Fields = protocols.Select(p => new ProtocolFieldMapping
- {
- FieldKey = p.DeviceProParamName,
- DbNumber = int.TryParse(p.DeviceProDataBlock, out var dbNum) ? dbNum : 50,
- Offset = (int)p.DeviceProOffset,
- Bit = 1,
- DataType = MapDataType(p.DeviceProDataType),
- Length = p.DeviceProDataLength,
- Direction = ProtocolFieldDirection.Bidirectional
- }).ToList()
- };
- await _templateService.UpsertAsync(template);
-
- // 4.3 鍒涘缓瀹炰緥閰嶇疆
- var config = new InstanceConfig
- {
- Id = device.DeviceCode,
- Name = device.DeviceName,
- PLCType = SiemensPLCType.S71500, // 榛樿 S7-1500锛屽彲鏍规嵁闇�瑕佹墿灞�
- Port = device.DevicePort,
- AutoStart = false,
- ProtocolTemplateId = templateId,
- MemoryConfig = GetDefaultMemoryConfig()
- };
-
- // 4.4 鍒涘缓鎴栨洿鏂板疄渚�
- if (_instanceManager.InstanceExists(device.DeviceCode))
- {
- _logger.LogInformation("瀹炰緥 {DeviceCode} 宸插瓨鍦紝璺宠繃鍒涘缓", device.DeviceCode);
- }
- else
- {
- await _instanceManager.CreateInstanceAsync(config);
- _logger.LogInformation("宸插垱寤哄疄渚� {DeviceCode} (绔彛:{Port})", device.DeviceCode, device.DevicePort);
- }
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "鍚屾璁惧 {DeviceCode} 澶辫触", device.DeviceCode);
- }
- }
-
- _logger.LogInformation("鍚屾瀹屾垚");
- }
-
- /// <summary>
- /// 鏁版嵁绫诲瀷鏄犲皠锛氭暟鎹簱瀛楃涓� -> ProtocolDataType 鏋氫妇
- /// ProtocolDataType: Byte=0, Int=1, DInt=2, String=3, Bool=4
- /// </summary>
- private static ProtocolDataType MapDataType(string? dbDataType)
- {
- return dbDataType?.ToLowerInvariant() switch
- {
- "bit" => ProtocolDataType.Bool, // Bool=4
- "byte" => ProtocolDataType.Byte, // Byte=0
- "int" or "word" => ProtocolDataType.Int, // Int=1
- "dint" => ProtocolDataType.DInt, // DInt=2
- "string" or "string8" or "string16" => ProtocolDataType.String, // String=3
- _ => ProtocolDataType.Byte
- };
- }
-
- /// <summary>
- /// 鑾峰彇榛樿鍐呭瓨閰嶇疆
- /// </summary>
- private static MemoryRegionConfig GetDefaultMemoryConfig()
- {
- return new MemoryRegionConfig
- {
- MRegionSize = 1024,
- DBBlockCount = 1,
- DBBlockNumbers = new List<int> { 50 },
- DBBlockSize = 65536,
- IRegionSize = 256,
- QRegionSize = 256,
- TRegionCount = 64,
- CRegionCount = 64
- };
- }
-}
-```
-
-- [ ] **Step 2: Commit**
-
-```bash
-git add WIDESEAWCS_S7Simulator.Application/InstanceSyncService.cs
-git commit -m "feat: 娣诲姞 InstanceSyncService 鍚屾鍗忚皟閫昏緫"
-```
-
----
-
-## Task 6: 鍒涘缓 SyncController
-
-**Files:**
-- Create: `WIDESEAWCS_S7Simulator.Server/Controllers/SyncController.cs`
-
-- [ ] **Step 1: 鍒涘缓 SyncController.cs**
-
-```csharp
-using Microsoft.AspNetCore.Mvc;
-using WIDESEAWCS_S7Simulator.Application;
-
-namespace WIDESEAWCS_S7Simulator.Server.Controllers;
-
-[ApiController]
-[Route("api/[controller]")]
-public class SyncController : ControllerBase
-{
- private readonly InstanceSyncService _syncService;
- private readonly ILogger<SyncController> _logger;
-
- public SyncController(InstanceSyncService syncService, ILogger<SyncController> logger)
- {
- _syncService = syncService;
- _logger = logger;
- }
-
- /// <summary>
- /// 鎵嬪姩瑙﹀彂瀹炰緥鍚屾
- /// </summary>
- [HttpPost("SyncInstances")]
- public async Task<IActionResult> SyncInstances()
- {
- try
- {
- _logger.LogInformation("鏀跺埌鎵嬪姩鍚屾璇锋眰");
- await _syncService.SyncInstancesAsync();
- return Ok(new { message = "鍚屾瀹屾垚", lastSyncTime = _syncService.LastSyncTime });
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "鎵嬪姩鍚屾澶辫触");
- return StatusCode(500, new { message = "鍚屾澶辫触", error = ex.Message });
- }
- }
-
- /// <summary>
- /// 鑾峰彇涓婃鍚屾鏃堕棿
- /// </summary>
- [HttpGet("LastSyncTime")]
- public IActionResult GetLastSyncTime()
- {
- return Ok(new { lastSyncTime = _syncService.LastSyncTime });
- }
-}
-```
-
-- [ ] **Step 2: Commit**
-
-```bash
-git add WIDESEAWCS_S7Simulator.Server/Controllers/SyncController.cs
-git commit -m "feat: 娣诲姞 SyncController API 鎺ュ彛"
-```
-
----
-
-## Task 7: 淇敼 appsettings.json 娣诲姞 WcsDb 閰嶇疆
-
-**Files:**
-- Modify: `WIDESEAWCS_S7Simulator.Server/appsettings.json`
-
-- [ ] **Step 1: 娣诲姞 WcsDb 閰嶇疆鑺�**
-
-鍦� appsettings.json 鏍瑰璞℃坊鍔狅細
-
-```json
-"WcsDb": {
- "Enabled": true,
- "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWCS_ShanMei;User ID=sa;Password=${WCS_DB_PASSWORD};Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
- "DbType": 2
-}
-```
-
-娉ㄦ剰锛歚${WCS_DB_PASSWORD}` 涓虹幆澧冨彉閲忓崰浣嶇锛屽疄闄呴儴缃叉椂鏇挎崲涓虹湡瀹炲瘑鐮佹垨閫氳繃鐜鍙橀噺娉ㄥ叆銆�
-
-- [ ] **Step 2: Commit**
-
-```bash
-git add WIDESEAWCS_S7Simulator.Server/appsettings.json
-git commit -m "feat: 娣诲姞 WcsDb 鏁版嵁搴撻厤缃�"
-```
-
----
-
-## Task 8: 淇敼 Program.cs 娉ㄥ唽鏈嶅姟鍜屽惎鍔ㄥ悓姝�
-
-**Files:**
-- Modify: `WIDESEAWCS_S7Simulator.Server/Program.cs`
-
-- [ ] **Step 1: 娉ㄥ唽鏈嶅姟骞跺惎鍔ㄦ椂鍚屾**
-
-鍦� `builder.Services.AddControllers()` 涔嬪悗娣诲姞锛�
-
-```csharp
-// WCS 鏁版嵁搴撻厤缃�
-builder.Services.Configure<WcsDbOptions>(builder.Configuration.GetSection(WcsDbOptions.SectionName));
-builder.Services.AddSingleton<DatabaseDeviceService>();
-builder.Services.AddSingleton<InstanceSyncService>();
-```
-
-鍦� `app.MapControllers()` 涔嬪悗锛屽皢鍚屾鏁村悎鍒扮幇鏈夌殑 `Task.Run` 涓細
-
-```csharp
-// 鍚姩鏃跺姞杞藉凡淇濆瓨鐨勫疄渚嬶紙涓嶈嚜鍔ㄥ惎鍔級
-var instanceManager = app.Services.GetRequiredService<ISimulatorInstanceManager>();
-var syncService = app.Services.GetRequiredService<InstanceSyncService>();
-_ = Task.Run(async () =>
-{
- try
- {
- // 鍏堝姞杞藉凡淇濆瓨鐨勫疄渚�
- await instanceManager.LoadSavedInstancesAsync(autoStart: false);
- Console.WriteLine($"Loaded {instanceManager.GetAllInstances().Count()} saved instances.");
-
- // 濡傛灉鍚敤浜� WCS 鏁版嵁搴撳悓姝ワ紝鍒欐墽琛屽悓姝�
- var wcsDbOptions = app.Services.GetRequiredService<IOptions<WcsDbOptions>>().Value;
- if (wcsDbOptions.Enabled)
- {
- await syncService.SyncInstancesAsync();
- Console.WriteLine($"WCS DB sync completed. Last sync: {syncService.LastSyncTime}");
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine($"Error during startup: {ex.Message}");
- }
-});
-```
-
-- [ ] **Step 2: Commit**
-
-```bash
-git add WIDESEAWCS_S7Simulator.Server/Program.cs
-git commit -m "feat: Program.cs 娉ㄥ唽鍚屾鏈嶅姟骞跺惎鍔ㄦ椂鍚屾"
-```
-
----
-
-## Task 9: 鏋勫缓楠岃瘉
-
-- [ ] **Step 1: 杩愯 dotnet build 楠岃瘉缂栬瘧**
-
-```bash
-cd WIDESEAWCS_S7Simulator.Server
-dotnet build
-```
-
-棰勬湡锛氭棤缂栬瘧閿欒
-
-- [ ] **Step 2: Commit any last changes if needed**
-
----
-
-## 鎵ц椤哄簭
-
-1. Task 1 - 娣诲姞 SqlSugarCore 渚濊禆
-2. Task 2 - 鍒涘缓 WCS 鏁版嵁搴� DTO
-3. Task 3 - 鍒涘缓 WcsDbOptions 閰嶇疆绫�
-4. Task 4 - 鍒涘缓 DatabaseDeviceService
-5. Task 5 - 鍒涘缓 InstanceSyncService
-6. Task 6 - 鍒涘缓 SyncController
-7. Task 7 - 淇敼 appsettings.json
-8. Task 8 - 淇敼 Program.cs
-9. Task 9 - 鏋勫缓楠岃瘉
diff --git "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/specs/2026-04-08-database-instance-sync-design.md" "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/specs/2026-04-08-database-instance-sync-design.md"
deleted file mode 100644
index 1b4b317..0000000
--- "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/docs/superpowers/specs/2026-04-08-database-instance-sync-design.md"
+++ /dev/null
@@ -1,142 +0,0 @@
-# S7 妯℃嫙鍣ㄦ暟鎹簱瀹炰緥鍚屾璁捐
-
-## 鑳屾櫙
-
-S7 妯℃嫙鍣ㄥ綋鍓嶉�氳繃鏈湴 JSON 鏂囦欢鎵嬪姩閰嶇疆瀹炰緥鍜屽崗璁ā鏉匡紝宸ヤ綔閲忓ぇ涓斿鏄撳嚭閿欍�俉CS 绯荤粺宸叉湁瀹屾暣鐨勮澶囦俊鎭暟鎹簱锛圫QL Server锛夛紝鍖呭惈 `Dt_DeviceInfo` 鍜� `Dt_DeviceProtocol` 琛ㄣ�傞渶瑕佸疄鐜颁粠鏁版嵁搴撹嚜鍔ㄥ悓姝ヨ澶囧埌 S7 妯℃嫙鍣ㄥ疄渚嬨��
-
-## 闇�姹�
-
-1. **鏁版嵁婧�**锛歚Dt_DeviceInfo.DevicePlcType = 'SiemensS7'`
-2. **鍗忚妯℃澘**锛氭瘡涓澶囩敓鎴愪竴涓崗璁ā鏉匡紝鍖呭惈璇ヨ澶囨墍鏈� `Dt_DeviceProtocol` 瀛楁
-3. **鍐呭瓨閰嶇疆**锛氱粺涓�浣跨敤榛樿鍊硷紙M鍖�1024瀛楄妭锛孌B鍧�1涓紝DB鍧楀ぇ灏�65536锛�
-4. **鍚屾鏃舵満**锛氬惎鍔ㄦ椂鑷姩鍚屾 + API 鎵嬪姩瑙﹀彂
-
-## 鏁翠綋鏋舵瀯
-
-```
-鍚姩鏃� / API瑙﹀彂
- 鈹�
- 鈻�
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� InstanceSyncService 鈹�
-鈹� (Application 灞�) 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
- 鈹� 璇诲彇 Dt_DeviceInfo (DevicePlcType='SiemensS7')
- 鈹� 璇诲彇 Dt_DeviceProtocol (鎸� DeviceId 鍏宠仈)
- 鈻�
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� DatabaseDeviceService 鈹�
-鈹� (Application 灞�) 鈹�
-鈹� - SqlSugar 杩炴帴 WCS DB 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
- 鈹� InstanceConfig + ProtocolTemplate
- 鈻�
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� SimulatorInstanceManager 鈹�
-鈹� - 鍒涘缓/鏇存柊瀹炰緥 鈹�
-鈹� - 搴旂敤鍐呭瓨榛樿鍊� 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-```
-
-## 鏂板缁勪欢
-
-| 缁勪欢 | 浣嶇疆 | 鑱岃矗 |
-|------|------|------|
-| `WcsDbOptions` | Application | 鏁版嵁搴撹繛鎺ラ厤缃被 |
-| `DatabaseDeviceService` | Application | 璇诲彇 WCS 璁惧鏁版嵁 |
-| `InstanceSyncService` | Application | 鍚屾閫昏緫 |
-| `SyncController` | Server | API 鎺ュ彛 |
-
-## 閰嶇疆鏂板
-
-`appsettings.json` 娣诲姞锛�
-
-```json
-{
- "WcsDb": {
- "Enabled": true,
- "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWCS_ShanMei;User ID=sa;Password=${WCS_DB_PASSWORD};...",
- "DbType": 2
- }
-}
-```
-
-Note: `DbType` uses integer values (SqlServer=2, MySql=1). `${WCS_DB_PASSWORD}` is an environment variable placeholder.
-
-## 鍗忚妯℃澘鏄犲皠
-
-| Dt_DeviceProtocol 瀛楁 | ProtocolTemplate 瀛楁 |
-|----------------------|----------------------|
-| `DeviceChildCode` | `fieldKey` |
-| `DeviceProDataBlock` | `dbNumber` |
-| `DeviceProOffset` | `offset` |
-| `DeviceProDataType` | `dataType`锛堥渶杞崲鏄犲皠锛� |
-| `DeviceProDataLength` | `length` |
-| 鍥哄畾鍊� `1` | `bit` |
-| `Bidirectional` (2) | `direction` |
-
-### 鏁版嵁绫诲瀷鏄犲皠
-
-ProtocolDataType 鏋氫妇鍊硷細Byte=0, Int=1, DInt=2, String=3, Bool=4
-
-| 鏁版嵁搴� DeviceProDataType | ProtocolDataType |
-|------------------------|-----------------|
-| `Bit` | `Bool` (4) |
-| `Byte` | `Byte` (0) |
-| `Int`, `Word` | `Int` (1) |
-| `DInt` | `DInt` (2) |
-| `String`, `String8`, `String16` | `String` (3) |
-
-## 瀹炰緥閰嶇疆榛樿鍊�
-
-```csharp
-new MemoryRegionConfig
-{
- MRegionSize = 1024,
- DBBlockCount = 1,
- DBBlockNumbers = new List<int> { 50 },
- DBBlockSize = 65536,
- IRegionSize = 256,
- QRegionSize = 256,
- TRegionCount = 64,
- CRegionCount = 64
-}
-```
-
-## 鍗忚妯℃澘 ID 鏍煎紡
-
-`protocol-{DeviceCode}`
-
-姣忎釜璁惧锛圖eviceCode锛夌敓鎴愪竴涓崗璁ā鏉匡紝鍖呭惈璇ヨ澶囨墍鏈� DeviceChildCode 鐨勫崗璁瓧娈点��
-
-## API 鎺ュ彛
-
-| 鏂规硶 | 璺緞 | 璇存槑 |
-|------|------|------|
-| POST | `/api/Sync/SyncInstances` | 鎵嬪姩瑙﹀彂鍚屾 |
-| GET | `/api/Sync/LastSyncTime` | 鑾峰彇涓婃鍚屾鏃堕棿 |
-
-## 鍚屾閫昏緫
-
-1. 璇诲彇鏁版嵁搴撲腑鎵�鏈� `DevicePlcType = 'SiemensS7'` 鐨勮澶�
-2. 瀵规瘡涓澶囷紝鍒涘缓 `InstanceConfig`锛圛D = DeviceCode锛岀鍙� = DevicePort锛�
-3. 瀵规瘡涓澶囷紝鍚堝苟鍏舵墍鏈� `Dt_DeviceProtocol` 璁板綍鐢熸垚鍗忚妯℃澘
-4. 瀵规瘮鐜版湁瀹炰緥锛�
- - **鏂板鐨�**锛氬垱寤哄疄渚� + 淇濆瓨鍗忚妯℃澘
- - **宸插瓨鍦ㄧ殑**锛氭洿鏂板疄渚嬮厤缃紙鍙�夛級
- - **鏁版嵁搴撳凡鍒犻櫎鐨�**锛氫粠鍐呭瓨绉婚櫎锛屼繚鐣欐枃浠堕厤缃�
-5. 鍚屾鍚庡疄渚嬬姸鎬侀粯璁や负 **Stopped**锛堜笉鑷姩鍚姩锛�
-
-## 鏂囦欢鍙樻洿
-
-### 鏂板鏂囦欢
-
-- `WIDESEAWCS_S7Simulator.Application/WcsDbOptions.cs`
-- `WIDESEAWCS_S7Simulator.Application/DatabaseDeviceService.cs`
-- `WIDESEAWCS_S7Simulator.Application/InstanceSyncService.cs`
-- `WIDESEAWCS_S7Simulator.Server/Controllers/SyncController.cs`
-
-### 淇敼鏂囦欢
-
-- `WIDESEAWCS_S7Simulator.Server/appsettings.json` - 娣诲姞 WcsDb 閰嶇疆
-- `WIDESEAWCS_S7Simulator.Server/Program.cs` - 娉ㄥ唽鏈嶅姟銆佸惎鍔ㄦ椂鍚屾
--
Gitblit v1.9.3