wanshenmean
2026-04-08 fd18eaba5e1c086a588509371f91310e7aafff9c
refactor: 升级多个项目目标框架至.NET 8.0

删除无用的状态文件和临时配置文件
清理项目中的废弃文档和历史记录
移除IDE生成的临时文件和缓存
优化项目结构和依赖项版本
已删除54个文件
已修改23个文件
13531 ■■■■■ 文件已修改
.omc/project-memory.json 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/.omc/state/agent-replay-607da09d-2c9a-4405-bfb9-46c9b0d2c05f.jsonl 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/.omc/state/idle-notif-cooldown.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/.omc/state/subagent-tracking.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/AGENTS.md 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/CLAUDE.md 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatCurrentSession.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/.vs/TencentCopilotChatHistorySession.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/CodeChunks.db 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/config/applicationhost.config 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/.vscode/launch.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/AGENTS.md 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/CLAUDE.md 299 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_RedisService/WIDESEAWCS_RedisService.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-13-s7-plc-simulator-implementation.md 2478 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-cache.md 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md 324 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-13-s7-plc-simulator-design.md 450 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-27-router-service-audit-design.md 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/docs(superpowers)/specs/2026-03-27-task-logging-design.md 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/.claude/settings.local.json 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/.omc/state/agent-replay-4cd1f4b9-ad6a-4b8f-8a01-8260579d1f66.jsonl 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/.omc/state/idle-notif-cooldown.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/.omc/state/subagent-tracking.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/AGENTS.md 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/CLAUDE.md 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSClient/.omc/project-memory.json 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/.claude/settings.local.json 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/config/applicationhost.config 1021 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/.vscode/settings.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/REFACTOR_PLAN.md 738 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-design.md 368 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-06-auto-outbound-task-implementation.md 729 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-design.md 327 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/docs/plans/2026-03-09-multi-outbound-address-roundrobin-implementation.md 675 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/plans/2026-03-30-MES托盘进站出站集成实现计划.md 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/plans/2026-03-30-MES电芯绑定解绑集成实现计划.md 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/plans/2026-03-30-dashboard-chart-plan.md 837 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/plans/2026-03-30-stock-chat-implementation-plan.md 314 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/plans/2026-03-30-任务库存历史记录实现计划.md 273 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/plans/2026-03-31-taskService-refactor-plan.md 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/specs/2026-03-30-MES托盘进站出站集成设计.md 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/specs/2026-03-30-MES电芯绑定解绑集成设计.md 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/specs/2026-03-30-dashboard-chart-design.md 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/specs/2026-03-30-stock-chat-3d-design.md 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/specs/2026-03-30-任务库存历史记录设计.md 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/specs/2026-03-31-taskService-refactor-design.md 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/测试工具/WIDESEAWCS_S7Simulator/AGENTS.md 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/测试工具/WIDESEAWCS_S7Simulator/CLAUDE.md 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/测试工具/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-03-16-protocol-template-db-monitoring.md 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/测试工具/WIDESEAWCS_S7Simulator/docs/superpowers/plans/2026-04-08-database-instance-sync-plan.md 593 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/测试工具/WIDESEAWCS_S7Simulator/docs/superpowers/specs/2026-04-08-database-instance-sync-design.md 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.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.db
Binary files differ
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/18.0.988.22099/SemanticSymbols.db
Binary 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
ÎļþÒÑɾ³ý