.omc/project-memory.json
ÎļþÒÑɾ³ý .omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json
ÎļþÒÑɾ³ý Code/WCS/.omc/state/agent-replay-607da09d-2c9a-4405-bfb9-46c9b0d2c05f.jsonl
ÎļþÒÑɾ³ý Code/WCS/.omc/state/idle-notif-cooldown.json
ÎļþÒÑɾ³ý Code/WCS/.omc/state/subagent-tracking.json
ÎļþÒÑɾ³ý Code/WCS/AGENTS.md
ÎļþÒÑɾ³ý Code/WCS/CLAUDE.md
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatCurrentSession.json
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatHistorySession.json
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.dbBinary files differ
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.dbBinary files differ
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,6 +18,7 @@ --> <configuration> <!-- The <configSections> section controls the registration of sections. @@ -56,6 +57,7 @@ <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" /> @@ -115,9 +117,9 @@ <section name="rewriteMaps" overrideModeDefault="Allow" /> </sectionGroup> <section name="webSocket" overrideModeDefault="Deny" /> <section name="aspNetCore" overrideModeDefault="Allow" /> </sectionGroup> <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" /> @@ -125,18 +127,20 @@ <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> <!-- The <listenerAdapters> section defines the protocols with which the @@ -146,6 +150,7 @@ <listenerAdapters> <add name="http" /> </listenerAdapters> <sites> <site name="WebSite1" id="1" serverAutoStart="true"> <application path="/"> @@ -153,14 +158,6 @@ </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> @@ -171,16 +168,25 @@ <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> <caching enabled="true" enableKernelCache="true"> </caching> <cgi /> <defaultDocument enabled="true"> <files> <add value="Default.htm" /> @@ -191,8 +197,11 @@ <add value="default.aspx" /> </files> </defaultDocument> <directoryBrowse enabled="false" /> <fastCgi /> <!-- The <globalModules> section defines all native-code modules. @@ -241,6 +250,7 @@ <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> @@ -261,6 +271,7 @@ <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" /> @@ -272,7 +283,9 @@ <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 /> @@ -282,8 +295,11 @@ <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" /> @@ -291,35 +307,52 @@ <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> <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" /> @@ -379,8 +412,11 @@ <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" /> @@ -761,7 +797,9 @@ <mimeMap fileExtension=".z" mimeType="application/x-compress" /> <mimeMap fileExtension=".zip" mimeType="application/x-zip-compressed" /> </staticContent> <tracing> <traceFailedRequests> <add path="*"> <traceAreas> @@ -773,6 +811,7 @@ <failureDefinitions statusCodes="200-999" /> </add> </traceFailedRequests> <traceProviderDefinitions> <add name="WWW Server" guid="{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}"> <areas> @@ -811,8 +850,11 @@ </areas> </add> </traceProviderDefinitions> </tracing> <urlCompression /> <validation /> <webdav> <globalSettings> @@ -822,6 +864,7 @@ <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" /> @@ -830,6 +873,7 @@ </webdav> <webSocket /> <applicationInitialization /> </system.webServer> <location path="" overrideMode="Allow"> <system.webServer> @@ -977,22 +1021,6 @@ <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> <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> Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/.vscode/launch.json
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/AGENTS.md
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/CLAUDE.md
@@ -1,245 +1,132 @@ # CLAUDE.md æ¬æä»¶ä¸º Claude Code (claude.ai/code) 卿¤ä»£ç åºä¸å·¥ä½æ¶æä¾æå¯¼ã This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## æå»ºå½ä»¤ ## é¡¹ç®æ¦è¿° **WIDESEAWCS** æ¯ä¸ä¸ªä»åºæ§å¶ç³»ç»ï¼åºäº ASP.NET Core 6.0 æå»ºãç¨äºç®¡çèªå¨åç©æå¤ç设å¤ï¼å åæºãè¾éçº¿ãæºå¨äººãç©¿æ¢è½¦çï¼çå·¥ä¸ä»å¨ç¯å¢ã ## æå»ºä¸è¿è¡å½ä»¤ ```bash # æå»ºæ´ä¸ªè§£å³æ¹æ¡ 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` | 常éãæä¸¾ãRedis é®å®ä¹ | | `WIDESEAWCS_Model` | æ°æ®åºå®ä½æ¨¡å | | `WIDESEAWCS_DTO` | æ°æ®ä¼ è¾å¯¹è±¡ | | `WIDESEAWCS_Communicator` | å·¥ä¸è®¾å¤éä¿¡åè®®ï¼ModbusãSiemens S7ãOmron çï¼ | | `WIDESEAWCS_Tasks` | åå°è®¾å¤æ§å¶ä½ä¸ | | `WIDESEAWCS_QuartzJob` | Quartz.NET è°åº¦åæ´¾åé»è¾ | | `WIDESEAWCS_RedisService` | L1+L2 æ··åç¼åæå¡ | ## 项ç®ç»æ ### å ³é®è®¾è®¡æ¨¡å¼ ``` WIDESEAWCS_Server/ # 主 ASP.NET Core API æå¡å¨ WIDESEAWCS_Core/ # æ ¸å¿åºç¡è®¾æ½ï¼åºç±»ãDIãæ©å±ãä¸é´ä»¶ WIDESEAWCS_Model/ # æ°æ®æ¨¡åå DTO WIDESEAWCS_Communicator/ # 硬件é信驱å¨ï¼SiemensãOmronãModbus çï¼ 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ãSQL ServerãSQLiteãOracleãPostgreSQL ## ä¾èµæ³¨å ¥ - IDependency æ¨¡å¼ ### æ°æ®æµå æå¡éè¿å®ç°ç©ºç `IDependency` æ è®°æ¥å£è¢« Autofac **èªå¨æ³¨å**ï¼ 1. API Controllers â Services â Repositories â SqlSugar â SQL Server 2. Quartz Jobsï¼å®æ¶è°åº¦ï¼ â è®¾å¤æ§å¶ä½ä¸ â Communicators â ç©çè®¾å¤ 3. Redis L1ï¼å åï¼ + L2ï¼Redisï¼ç¼åå±ä½äºæ°æ®åºåæ¹ ```csharp // å¨ WIDESEAWCS_Core/IDependency.cs ä¸ public interface IDependency { } ## å ³é®é ç½®ï¼appsettings.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ï¼Redisï¼æ··åç¼å**模å¼ãåå¨ä¸ç§å®ç°ï¼ ## åå°ä½ä¸ - `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. **å¯å¨åå§å顺åºå¾éè¦**ï¼Redis 就绪åæè½è¿è¡ `ApiRouteCacheWarmupHostedService` 2. **Quartz ä»»å¡è¡¨** éè¿ `QuartzJobDataTableHostedService` å¨å¯å¨æ¶èªå¨å建 3. **Socket æå¡å¨** ä½ä¸ºåä¾ `TcpSocketServer` ç±æç®¡æå¡è¿è¡ 4. **Redis ç¼å忥**ï¼å¯é ç½® `EnableAutoSync` é项ï¼å®æå° Redis åæ¥å° L1 å åç¼å 5. **设å¤åè®®é ç½®** åå¨å¨æ°æ®åºï¼`Dt_DeviceProtocol` 表ï¼ï¼èéé ç½®æä»¶ä¸ ä»»å¡éè¿ `SchedulerCenterServer` ä½¿ç¨ `Dt_DeviceInfo` 表ä¸ç设å¤ä¿¡æ¯å¨ææ³¨åã ## 注éä¸ææ¡£ (强å¶) **设å¤ç±»å**ï¼ - **XML ææ¡£æ³¨é**: ææ `public` ç±»ãæ¥å£ãæ¹æ³ã屿§**å¿ é¡»**å å« XML ææ¡£æ³¨é (`/// <summary>...</summary>`)ï¼è§£éå ¶ç¨éãåæ°åè¿åå¼ã - **è¡å 注é**: 对äºå¤æçä¸å¡é»è¾ãç®æ³å®ç°æéç´è§ç代ç åï¼**å¿ é¡»**æ·»å `//` è¡å 注éè§£éâ为ä»ä¹è¿ä¹åâã - **TODO æ è®°**: å¦æä»£ç æªå®æææä¸´æ¶æ¹æ¡ï¼å¿ é¡»ä½¿ç¨ `// TODO: 说æ` æ è®°ã - `IStackerCrane` - å åæº - `IConveyorLine` - è¾é线 - `IShuttleCar` - ç©¿æ¢è½¦ - `IRobot` - æºæ¢°æ ## éç¨è§è ## 硬件éä¿¡ - **弿¥ç¼ç¨**: ææ I/O æä½å¿ é¡»ä½¿ç¨ `async/await`ãåºä»£ç è¯·ä½¿ç¨ `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 è§£æå¹¶æ´æ°ç¶æ 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"` - 代ç /é ç½®ç¼å 使ç¨è¿äºåç¼é å `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/` ä¸å建æ¥å£ï¼å¨ `*Service/` ä¸å建类ï¼å®ç° `IDependency` 2. **æ°ä»»å¡**ï¼å¨ `WIDESEAWCS_Tasks/` ä¸ç»§æ¿ `JobBase` å `IJob` 3. **æ°è®¾å¤ç±»å**ï¼å¨ `WIDESEAWCS_QuartzJob/Device/` 䏿·»å æ¥å£å¹¶å®ç° ## éè¦è¯´æ - åºç¨ç¨åºä½¿ç¨ **CamelCase** JSON åºåå - æææå¡é»è®¤éè¿ Autofac ä½¿ç¨ **scoped** çå½å¨æ - Redis è¿æ¥ä½¿ç¨ **å»¶è¿åå§å** - 馿¬¡è®¿é®æ¶è§¦åè¿æ¥ - å¨ä»»å¡ä¸ä½¿ç¨ `ConsoleHelper.WriteSuccessLine()` / `WriteErrorLine()` è¿è¡æ§å¶å°è¾åº - TCP Socket æå¡å¨ç¬ç«äº HTTP API è¿è¡ ## 代ç 飿 ¼ä¸å½åè§è - è¯è¨ï¼C#ï¼å项ç®å·²å¯ç¨å¯ç©ºå¼ç¨ï¼nullableï¼ã - 缩è¿ï¼4 ä¸ªç©ºæ ¼ï¼å¤§æ¬å·æ¢è¡ï¼ä¸ç°æä»£ç ä¿æä¸è´ï¼ã - å½åï¼ç±»å/æ¹æ³/屿§ä½¿ç¨ `PascalCase`ï¼å±é¨åé/åæ°ä½¿ç¨ `camelCase`ï¼æ¥å£ä»¥ `I` åç¼å½åã - æä»¶å½åä¸ç±»ååä¿æä¸è´ï¼ä¾å¦ `Sys_UserService.cs`ã`TaskController.cs`ï¼ã - `.editorconfig` å½å对 `*.cs` æå¶ CS8618ï¼æªç»å¢é确认ä¸è¦æ°å¢å¤§èå´è¦åæå¶ã - 为æ°çææè ä¿®æ¹ç代ç çæ¯ä¸è¡æ·»å è¯¦ç»æ³¨éï¼å æ¬ï¼ - æ¹æ³çç®ç说æ - åæ°è¯´æ - è¿åå¼è¯´æ - æ¯ä¸è¡ä»£ç çä½ç¨ - å¼å¸¸æ åµç说æ ## ð ææ¯æ - **æ¡æ¶**: .NET 8.0 (LTS) - **è¯è¨**: C# 12 - **ORM**: SqlSugar - **æ°æ®åº**: SQL Server - **éªè¯**: FluentValidation - **åºåå**: Newtonsoft.Json 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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> Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-13-s7-plc-simulator-implementation.md
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-cache.md
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-13-s7-plc-simulator-design.md
ÎļþÒÑɾ³ý Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-27-router-service-audit-design.md
ÎļþÒÑɾ³ý Code/WCS/docs(superpowers)/specs/2026-03-27-task-logging-design.md
ÎļþÒÑɾ³ý Code/WMS/.claude/settings.local.json
ÎļþÒÑɾ³ý Code/WMS/.omc/state/agent-replay-4cd1f4b9-ad6a-4b8f-8a01-8260579d1f66.jsonl
ÎļþÒÑɾ³ý Code/WMS/.omc/state/idle-notif-cooldown.json
ÎļþÒÑɾ³ý Code/WMS/.omc/state/subagent-tracking.json
ÎļþÒÑɾ³ý Code/WMS/AGENTS.md
ÎļþÒÑɾ³ý Code/WMS/CLAUDE.md
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSClient/.omc/project-memory.json
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/.claude/settings.local.json
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/config/applicationhost.config
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/.vscode/settings.json
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/REFACTOR_PLAN.md
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-design.md
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-implementation.md
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-design.md
ÎļþÒÑɾ³ý Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-implementation.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/plans/2026-03-30-MESÍÐÅ̽øÕ¾³öÕ¾¼¯³ÉʵÏּƻ®.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/plans/2026-03-30-MESµçо°ó¶¨½â°ó¼¯³ÉʵÏּƻ®.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/plans/2026-03-30-dashboard-chart-plan.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/plans/2026-03-30-stock-chat-implementation-plan.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/plans/2026-03-30-ÈÎÎñ¿â´æÀúÊ·¼Ç¼ʵÏּƻ®.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/plans/2026-03-31-taskService-refactor-plan.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/specs/2026-03-30-MESÍÐÅ̽øÕ¾³öÕ¾¼¯³ÉÉè¼Æ.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/specs/2026-03-30-MESµçо°ó¶¨½â°ó¼¯³ÉÉè¼Æ.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/specs/2026-03-30-dashboard-chart-design.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/specs/2026-03-30-stock-chat-3d-design.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/specs/2026-03-30-ÈÎÎñ¿â´æÀúÊ·¼Ç¼Éè¼Æ.md
ÎļþÒÑɾ³ý Code/WMS/docs/superpowers/specs/2026-03-31-taskService-refactor-design.md
ÎļþÒÑɾ³ý Code/²âÊÔ¹¤¾ß/WIDESEAWCS_S7Simulator/AGENTS.md
ÎļþÒÑɾ³ý Code/²âÊÔ¹¤¾ß/WIDESEAWCS_S7Simulator/CLAUDE.md
ÎļþÒÑɾ³ý Code/²âÊÔ¹¤¾ß/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-03-16-protocol-template-db-monitoring.md
ÎļþÒÑɾ³ý Code/²âÊÔ¹¤¾ß/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-04-08-database-instance-sync-plan.md
ÎļþÒÑɾ³ý Code/²âÊÔ¹¤¾ß/WIDESEAWCS_S7Simulator/docs/superpowers/specs/2026-04-08-database-instance-sync-design.md
ÎļþÒÑɾ³ý