From 0dbc8273bdfbcabcc4b770546245f6b17d787de9 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 13 三月 2026 14:44:50 +0800
Subject: [PATCH] fix: 修复API控制器依赖注入和路由配置
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs | 193 ++++-
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Http/HTTP/HttpClientHelper.cs | 1
Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json | 134 ++-
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperConfig.cs | 13
Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/config/applicationhost.config | 1026 +++++++++++++++++++++++++++++++++
Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.json | 31 +
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs | 6
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Program.cs | 18
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj | 1
Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.json | 83 +-
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/CustomProfile.cs | 22
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Task_HtyService.cs | 3
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceInfoService.cs | 3
Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs | 6
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs | 6
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs | 5
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs | 3
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/Sys_MenuRepository.cs | 3
Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.backup.json | 31 +
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs | 87 +-
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs | 4
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs | 5
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperSetup.cs | 18
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj | 7
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs | 3
Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.backup.json | 85 +-
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskEnumHelper.cs | 6
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj | 3
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs | 2
/dev/null | 0
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ShuttleCarJob/ShuttleCarJob.cs | 3
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceProtocolDetailService.cs | 3
Code/WCS/.claude/settings.local.json | 37 +
33 files changed, 1,589 insertions(+), 262 deletions(-)
diff --git a/Code/WCS/.claude/settings.local.json b/Code/WCS/.claude/settings.local.json
new file mode 100644
index 0000000..de301f0
--- /dev/null
+++ b/Code/WCS/.claude/settings.local.json
@@ -0,0 +1,37 @@
+{
+ "permissions": {
+ "allow": [
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator && dotnet new webapp -n WIDESEAWCS_S7Simulator.Web -f net6.0 && dotnet sln add WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator && dotnet new xunit -n WIDESEAWCS_S7Simulator.UnitTests -f net6.0 && dotnet sln add WIDESEAWCS_S7Simulator.UnitTests/WIDESEAWCS_S7Simulator.UnitTests.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator/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)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && rm -rf WIDESEAWCS_S7Simulator && dotnet new sln -n WIDESEAWCS_S7Simulator)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && dotnet new sln -n WIDESEAWCS_S7Simulator --force)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && dotnet new classlib -n WIDESEAWCS_S7Simulator.Core -f net6.0 -o WIDESEAWCS_S7Simulator.Core && dotnet sln WIDESEAWCS_S7Simulator.sln add WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && dotnet new classlib -n WIDESEAWCS_S7Simulator.Application -f net6.0 -o WIDESEAWCS_S7Simulator.Application && dotnet sln WIDESEAWCS_S7Simulator.sln add WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && dotnet new webapi -n WIDESEAWCS_S7Simulator.Server -f net6.0 -o WIDESEAWCS_S7Simulator.Server && dotnet sln WIDESEAWCS_S7Simulator.sln add WIDESEAWCS_S7Simulator.Server/WIDESEAWCS_S7Simulator.Server.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && dotnet new webapp -n WIDESEAWCS_S7Simulator.Web -f net6.0 -o WIDESEAWCS_S7Simulator.Web && dotnet sln WIDESEAWCS_S7Simulator.sln add WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && dotnet new xunit -n WIDESEAWCS_S7Simulator.UnitTests -f net6.0 -o WIDESEAWCS_S7Simulator.UnitTests && dotnet sln WIDESEAWCS_S7Simulator.sln add WIDESEAWCS_S7Simulator.UnitTests/WIDESEAWCS_S7Simulator.UnitTests.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && ls -la *.sln*)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.Server/WIDESEAWCS_S7Simulator.Server.csproj && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.UnitTests/WIDESEAWCS_S7Simulator.UnitTests.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator.Application && dotnet add reference ../WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && mkdir -p WIDESEAWCS_S7Simulator && mv WIDESEAWCS_S7Simulator.Core WIDESEAWCS_S7Simulator.Application WIDESEAWCS_S7Simulator.Server WIDESEAWCS_S7Simulator.Web WIDESEAWCS_S7Simulator.UnitTests WIDESEAWCS_S7Simulator/)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS && mv WIDESEAWCS_S7Simulator.slnx WIDESEAWCS_S7Simulator/)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.Server/WIDESEAWCS_S7Simulator.Server.csproj && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj && dotnet sln WIDESEAWCS_S7Simulator.slnx add WIDESEAWCS_S7Simulator.UnitTests/WIDESEAWCS_S7Simulator.UnitTests.csproj)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server && dotnet add package Serilog.AspNetCore && dotnet add package AutoMapper && dotnet add package Microsoft.AspNetCore.SignalR)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web && dotnet add package Microsoft.AspNetCore.SignalR.Client)",
+ "Bash(cd /d/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator && dotnet build --no-restore 2>&1 | tail -20)",
+ "Bash(cd \"D:\\\\Git\\\\ShanMeiXinNengYuan\\\\Code\\\\WCS\\\\WIDESEAWCS_S7Simulator\" && dotnet build WIDESEAWCS_S7Simulator.slnx --no-restore 2>&1 | head -50)",
+ "Bash(cd \"D:/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core\" && dotnet build)",
+ "Bash(cd \"D:/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core\" && dotnet build --no-restore 2>&1)",
+ "Bash(cd \"D:\\\\Git\\\\ShanMeiXinNengYuan\\\\Code\\\\WCS\\\\WIDESEAWCS_S7Simulator\\\\WIDESEAWCS_S7Simulator.Core\" && dotnet build)",
+ "Bash(cd D:/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core && dotnet build 2>&1 | head -20)",
+ "Bash(cd \"D:\\\\Git\\\\ShanMeiXinNengYuan\\\\Code\\\\WCS\\\\WIDESEAWCS_S7Simulator\" && dotnet build WIDESEAWCS_S7Simulator.UnitTests/WIDESEAWCS_S7Simulator.UnitTests.csproj 2>&1 | grep -E \"\\(error|Error|澶辫触|failed\\)\" | head -20)",
+ "Bash(cd \"D:\\\\Git\\\\ShanMeiXinNengYuan\\\\Code\\\\WCS\\\\WIDESEAWCS_S7Simulator\" && dotnet build WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj)",
+ "Bash(cd \"D:\\\\Git\\\\ShanMeiXinNengYuan\\\\Code\\\\WCS\\\\WIDESEAWCS_S7Simulator\" && dotnet test WIDESEAWCS_S7Simulator.UnitTests/WIDESEAWCS_S7Simulator.UnitTests.csproj --no-build)",
+ "Bash(cd \"D:/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator\" && dotnet test --no-build)",
+ "Bash(cd \"D:/Git/ShanMeiXinNengYuan/Code/WCS/WIDESEAWCS_S7Simulator\" && dotnet test 2>&1 | tail -20)",
+ "mcp__web-search-prime__web_search_prime",
+ "mcp__web-reader__webReader"
+ ]
+ }
+}
diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/config/applicationhost.config b/Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/config/applicationhost.config
new file mode 100644
index 0000000..cdd2df8
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/config/applicationhost.config
@@ -0,0 +1,1026 @@
+<?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" />
+ <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>
+ <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>
+ </system.webServer>
+ </location>
+</configuration>
diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.backup.json b/Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.backup.json
new file mode 100644
index 0000000..514df79
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.backup.json
@@ -0,0 +1,31 @@
+{
+ "Version": 1,
+ "WorkspaceRootPath": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_S7Simulator\\",
+ "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_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.json b/Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.json
new file mode 100644
index 0000000..514df79
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/.vs/WIDESEAWCS_S7Simulator.slnx/v18/DocumentLayout.json
@@ -0,0 +1,31 @@
+{
+ "Version": 1,
+ "WorkspaceRootPath": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_S7Simulator\\",
+ "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_S7Simulator/WIDESEAWCS_S7Simulator.Web/Program.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Program.cs
index 3d3d371..56709a4 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Program.cs
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Program.cs
@@ -1,8 +1,25 @@
+using WIDESEAWCS_S7Simulator.Core.Interfaces;
+using WIDESEAWCS_S7Simulator.Core.Manager;
+using WIDESEAWCS_S7Simulator.Core.Memory;
+using WIDESEAWCS_S7Simulator.Core.Persistence;
+using WIDESEAWCS_S7Simulator.Core.Entities;
+
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
+builder.Services.AddControllers(); // 娣诲姞API鎺у埗鍣ㄦ敮鎸�
builder.Services.AddHttpClient(); // 娉ㄥ唽HttpClient鏈嶅姟锛岀敤浜庤皟鐢ˋPI
+
+// 娉ㄥ唽鏍稿績鏈嶅姟
+builder.Services.AddSingleton<ISimulatorInstanceManager, SimulatorInstanceManager>();
+builder.Services.AddSingleton<IPersistenceService>(sp =>
+ new FilePersistenceService("Data"));
+builder.Services.AddSingleton<IMemoryStore>(sp =>
+{
+ var config = new MemoryRegionConfig();
+ return new MemoryStore(config);
+});
var app = builder.Build();
@@ -22,5 +39,6 @@
app.UseAuthorization();
app.MapRazorPages();
+app.MapControllers(); // 鏄犲皠API鎺у埗鍣ㄨ矾鐢�
app.Run();
diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj
index 8a2c3ae..0b7ab1e 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj
@@ -2,6 +2,7 @@
<ItemGroup>
<ProjectReference Include="..\WIDESEAWCS_S7Simulator.Application\WIDESEAWCS_S7Simulator.Application.csproj" />
+ <ProjectReference Include="..\WIDESEAWCS_S7Simulator.Server\WIDESEAWCS_S7Simulator.Server.csproj" />
</ItemGroup>
<ItemGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json b/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json
index 569dded..5b81049 100644
--- a/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json
+++ b/Code/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json
@@ -3,16 +3,44 @@
"WorkspaceRootPath": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\",
"Documents": [
{
- "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\stackercranetaskselector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\stackercranetaskselector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
"AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\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:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\stackercrane\\common\\commonstackercrane.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\stackercrane\\common\\commonstackercrane.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\stackercranetaskselector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\stackercranetaskselector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{861C4D0B-A478-48DB-A0FA-AE70F5BA210A}|WIDESEAWCS_Communicator\\WIDESEAWCS_Communicator.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_communicator\\siemens\\siemenss7communicator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{861C4D0B-A478-48DB-A0FA-AE70F5BA210A}|WIDESEAWCS_Communicator\\WIDESEAWCS_Communicator.csproj|solutionrelative:wideseawcs_communicator\\siemens\\siemenss7communicator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\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:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\stackercranecommandbuilder.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\stackercranecommandbuilder.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\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:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_common\\taskenum\\taskstatusenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\taskenum\\taskstatusenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_common\\httpenum\\configkey.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\httpenum\\configkey.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_core\\http\\http\\httpclienthelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|solutionrelative:wideseawcs_core\\http\\http\\httpclienthelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinenewjob\\conveyorlinetargetaddressselector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
@@ -23,32 +51,12 @@
"RelativeMoniker": "D:0:0:{D4D17AAD-CB14-AF78-5BD1-F16380EBE911}|WIDESEAWCS_Tests\\WIDESEAWCS_Tests.csproj|solutionrelative:wideseawcs_tests\\stackercranetaskselectortests.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
- "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_common\\taskenum\\taskstatusenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\taskenum\\taskstatusenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\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:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\quartznet\\quartznetextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\quartznet\\quartznetextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_quartzjob\\conveyorline\\commonconveyorline.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6236BFFF-173D-44A8-9FC3-7C001EA30347}|WIDESEAWCS_QuartzJob\\WIDESEAWCS_QuartzJob.csproj|solutionrelative:wideseawcs_quartzjob\\conveyorline\\commonconveyorline.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_core\\http\\http\\httpclienthelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}|WIDESEAWCS_Core\\WIDESEAWCS_Core.csproj|solutionrelative:wideseawcs_core\\http\\http\\httpclienthelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_common\\httpenum\\configkey.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\httpenum\\configkey.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\stackercranecommandbuilder.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\stackercranecommandbuilder.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|d:\\git\\shanmeixinnengyuan\\code\\wcs\\wideseawcs_server\\wideseawcs_tasks\\conveyorlinenewjob\\commonconveyorlinenewjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
@@ -66,7 +74,7 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 14,
+ "SelectedChildIndex": 18,
"Children": [
{
"$type": "Bookmark",
@@ -82,20 +90,46 @@
},
{
"$type": "Document",
- "DocumentIndex": 5,
+ "DocumentIndex": 3,
+ "Title": "SiemensS7Communicator.cs",
+ "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Communicator\\Siemens\\SiemensS7Communicator.cs",
+ "RelativeDocumentMoniker": "WIDESEAWCS_Communicator\\Siemens\\SiemensS7Communicator.cs",
+ "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Communicator\\Siemens\\SiemensS7Communicator.cs",
+ "RelativeToolTip": "WIDESEAWCS_Communicator\\Siemens\\SiemensS7Communicator.cs",
+ "ViewState": "AgIAAB8DAAAAAAAAAAAkwBgDAAAwAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-03-13T02:38:07.878Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 6,
+ "Title": "Program.cs",
+ "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
+ "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Program.cs",
+ "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
+ "RelativeToolTip": "WIDESEAWCS_Server\\Program.cs",
+ "ViewState": "AgIAACEAAAAAAAAAAAAcwDAAAAArAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-03-13T01:21:23.859Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 7,
"Title": "TaskStatusEnum.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\TaskEnum\\TaskStatusEnum.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Common\\TaskEnum\\TaskStatusEnum.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\TaskEnum\\TaskStatusEnum.cs",
"RelativeToolTip": "WIDESEAWCS_Common\\TaskEnum\\TaskStatusEnum.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAMEAAAAAAAAAAAAAAA==",
+ "ViewState": "AgIAACIAAAAAAAAAAAAewDQAAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-12T07:12:53.626Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 7,
+ "DocumentIndex": 12,
"Title": "QuartzNetExtension.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\QuartzNet\\QuartzNetExtension.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\QuartzNet\\QuartzNetExtension.cs",
@@ -108,7 +142,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 4,
+ "DocumentIndex": 11,
"Title": "StackerCraneTaskSelectorTests.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tests\\StackerCraneTaskSelectorTests.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Tests\\StackerCraneTaskSelectorTests.cs",
@@ -121,13 +155,13 @@
},
{
"$type": "Document",
- "DocumentIndex": 10,
+ "DocumentIndex": 8,
"Title": "ConfigKey.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\HttpEnum\\ConfigKey.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Common\\HttpEnum\\ConfigKey.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\HttpEnum\\ConfigKey.cs",
"RelativeToolTip": "WIDESEAWCS_Common\\HttpEnum\\ConfigKey.cs",
- "ViewState": "AgIAAB8AAAAAAAAAAAAkwDkAAAAaAAAAAAAAAA==",
+ "ViewState": "AgIAAB8AAAAAAAAAAAAkwDYAAAAbAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-12T01:55:15.084Z",
"EditorCaption": ""
@@ -140,14 +174,14 @@
"RelativeDocumentMoniker": "WIDESEAWCS_Core\\Http\\HTTP\\HttpClientHelper.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\Http\\HTTP\\HttpClientHelper.cs",
"RelativeToolTip": "WIDESEAWCS_Core\\Http\\HTTP\\HttpClientHelper.cs",
- "ViewState": "AgIAAEoAAAAAAAAAAAAjwF0AAAAtAAAAAAAAAA==",
+ "ViewState": "AgIAAAoAAAAAAAAAAAAAACoAAABwAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-12T01:54:05.934Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 8,
+ "DocumentIndex": 13,
"Title": "CommonConveyorLine.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\ConveyorLine\\CommonConveyorLine.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\ConveyorLine\\CommonConveyorLine.cs",
@@ -160,7 +194,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 12,
+ "DocumentIndex": 14,
"Title": "CommonConveyorLineNewJob.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineNewJob\\CommonConveyorLineNewJob.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineNewJob\\CommonConveyorLineNewJob.cs",
@@ -168,50 +202,51 @@
"RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineNewJob\\CommonConveyorLineNewJob.cs",
"ViewState": "AgIAAFcAAAAAAAAAAAAEwHAAAAA9AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-11T09:29:57.419Z"
+ "WhenOpened": "2026-03-11T09:29:57.419Z",
+ "EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 2,
+ "DocumentIndex": 1,
"Title": "CommonStackerCrane.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\StackerCrane\\Common\\CommonStackerCrane.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_QuartzJob\\StackerCrane\\Common\\CommonStackerCrane.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_QuartzJob\\StackerCrane\\Common\\CommonStackerCrane.cs",
"RelativeToolTip": "WIDESEAWCS_QuartzJob\\StackerCrane\\Common\\CommonStackerCrane.cs",
- "ViewState": "AgIAAJcBAAAAAAAAAAAlwKoBAAAcAAAAAAAAAA==",
+ "ViewState": "AgIAAHgBAAAAAAAAAAAjwLsBAAAMAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-11T09:22:04.384Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 6,
+ "DocumentIndex": 4,
"Title": "TaskService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
"RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
- "ViewState": "AgIAAFMBAAAAAAAAAAAkwGYBAAAoAAAAAAAAAA==",
+ "ViewState": "AgIAAGgBAAAAAAAAAAAawEsBAAAiAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-11T09:01:01.549Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 3,
+ "DocumentIndex": 10,
"Title": "ConveyorLineTargetAddressSelector.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineNewJob\\ConveyorLineTargetAddressSelector.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineNewJob\\ConveyorLineTargetAddressSelector.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineNewJob\\ConveyorLineTargetAddressSelector.cs",
"RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineNewJob\\ConveyorLineTargetAddressSelector.cs",
- "ViewState": "AgIAAFUAAAAAAAAAAAAuwAAAAAAAAAAAAAAAAA==",
+ "ViewState": "AgIAAFUAAAAAAAAAAAA+wAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-11T08:34:00.532Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 13,
+ "DocumentIndex": 15,
"Title": "ConveyorLineDispatchHandler.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineNewJob\\ConveyorLineDispatchHandler.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineNewJob\\ConveyorLineDispatchHandler.cs",
@@ -219,43 +254,44 @@
"RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineNewJob\\ConveyorLineDispatchHandler.cs",
"ViewState": "AgIAAEYAAAAAAAAAAAAQwFgAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-11T08:31:44.415Z"
+ "WhenOpened": "2026-03-11T08:31:44.415Z",
+ "EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 0,
+ "DocumentIndex": 2,
"Title": "StackerCraneTaskSelector.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneTaskSelector.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneTaskSelector.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneTaskSelector.cs",
"RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneTaskSelector.cs",
- "ViewState": "AgIAAEYAAAAAAAAAAAAjwFcAAAAJAAAAAAAAAA==",
+ "ViewState": "AgIAAEIAAAAAAAAAAAAnwFQAAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-11T08:28:58.072Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 11,
+ "DocumentIndex": 5,
"Title": "StackerCraneCommandBuilder.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneCommandBuilder.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneCommandBuilder.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneCommandBuilder.cs",
"RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\StackerCraneCommandBuilder.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "ViewState": "AgIAAA4AAAAAAAAAAIA0wB4AAAAXAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-11T08:28:41.512Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 1,
+ "DocumentIndex": 0,
"Title": "CommonStackerCraneJob.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
"RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
"RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
- "ViewState": "AgIAAEcAAAAAAAAAAAAmwF0AAAAhAAAAAAAAAA==",
+ "ViewState": "AgIAAEcAAAAAAAAAAAAAAE8AAAAQAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-11T08:27:57.894Z",
"EditorCaption": ""
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs
index b998518..217096c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs
@@ -59,6 +59,11 @@
/// </summary>
TransferCheck,
+ /// <summary>
+ /// 绉诲簱浠诲姟瀹屾垚锛堟牴鎹换鍔″彿閫氱煡WMS绉诲簱浠诲姟瀹屾垚锛�
+ /// </summary>
+ RelocationFinishTask,
+
#endregion WMS鎺ュ彛
}
}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskEnumHelper.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskEnumHelper.cs
index 81b46d6..52b53ba 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskEnumHelper.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskEnumHelper.cs
@@ -82,6 +82,12 @@
// 鑾峰彇TaskOutStatusEnum鏋氫妇绫诲瀷鐨勭储寮曞垪琛�
return type.GetEnumIndexList().Where(x => x > currentStatus && x < (int)TaskRobotStatusEnum.RobotFinish).OrderBy(x => x).FirstOrDefault();
}
+ // 濡傛灉type鏄疶askRobotStatusEnum鏋氫妇绫诲瀷
+ else if (type == typeof(TaskRelocationStatusEnum))
+ {
+ // 鑾峰彇TaskOutStatusEnum鏋氫妇绫诲瀷鐨勭储寮曞垪琛�
+ return type.GetEnumIndexList().Where(x => x > currentStatus && x < (int)TaskRelocationStatusEnum.RelocationFinish).OrderBy(x => x).FirstOrDefault();
+ }
// 濡傛灉浠ヤ笂鏉′欢閮戒笉婊¤冻锛屾姏鍑篘otImplementedException寮傚父
else
{
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Http/HTTP/HttpClientHelper.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Http/HTTP/HttpClientHelper.cs
index 3beeef7..d363f94 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Http/HTTP/HttpClientHelper.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Http/HTTP/HttpClientHelper.cs
@@ -40,6 +40,7 @@
_cache.TryAdd($"{RedisPrefix.Code}:{RedisName.API}:{nameof(ConfigKey.SplitPalletAsync)}", $"Stock/SplitPalletAsync");
_cache.TryAdd($"{RedisPrefix.Code}:{RedisName.API}:{nameof(ConfigKey.UpdateTaskByStatus)}", $"Task/UpdateTaskByStatus");
_cache.TryAdd($"{RedisPrefix.Code}:{RedisName.API}:{nameof(ConfigKey.TransferCheck)}", $"LocationInfo/TransferCheck");
+ _cache.TryAdd($"{RedisPrefix.Code}:{RedisName.API}:{nameof(ConfigKey.RelocationFinishTask)}", $"Task/RelocationFinishTask");
}
/// <summary>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
index 37f3c9c..4d6c8eb 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
@@ -53,7 +53,8 @@
<PackageReference Include="Autofac" Version="8.0.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="7.1.0" />
- <PackageReference Include="AutoMapper" Version="13.0.1" />
+ <PackageReference Include="Mapster" Version="7.4.0" />
+ <PackageReference Include="Mapster.DependencyInjection" Version="1.0.1" />
<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" />
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
index 90cb271..ca7905c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -76,7 +76,7 @@
[ImporterHeader(Name = "浠诲姟鐘舵��")]
[ExporterHeader(DisplayName = "浠诲姟鐘舵��")]
[SugarColumn(IsNullable = false, ColumnDescription = "浠诲姟鐘舵��")]
- public int TaskState { get; set; }
+ public int TaskStatus { get; set; }
/// <summary>
/// 璧峰鍦板潃
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceInfoService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceInfoService.cs
index 93fa22c..4d06750 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceInfoService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceInfoService.cs
@@ -15,7 +15,7 @@
*----------------------------------------------------------------*/
#endregion << 鐗� 鏈� 娉� 閲� >>
-using AutoMapper;
+using MapsterMapper;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
@@ -93,3 +93,4 @@
}
}
}
+
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceProtocolDetailService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceProtocolDetailService.cs
index 6439ef2..ff72016 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceProtocolDetailService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/DeviceProtocolDetailService.cs
@@ -15,7 +15,7 @@
*----------------------------------------------------------------*/
#endregion << 鐗� 鏈� 娉� 閲� >>
-using AutoMapper;
+using MapsterMapper;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -70,3 +70,4 @@
}
}
}
+
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperConfig.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperConfig.cs
index 5b2cc51..6fe8b8c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperConfig.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperConfig.cs
@@ -1,18 +1,15 @@
-锘縰sing AutoMapper;
+锘縰sing Mapster;
namespace WIDESEAWCS_WCSServer.Filter
{
/// <summary>
- /// 闈欐�佸叏灞� AutoMapper 閰嶇疆鏂囦欢
+ /// 闈欐�佸叏灞� Mapster 閰嶇疆鏂囦欢
/// </summary>
- public class AutoMapperConfig
+ public class MapsterConfig
{
- public static MapperConfiguration RegisterMappings()
+ public static void RegisterMappings(TypeAdapterConfig config)
{
- return new MapperConfiguration(cfg =>
- {
- cfg.AddProfile(new CustomProfile());
- });
+ CustomProfile.Register(config);
}
}
}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperSetup.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperSetup.cs
index d1ac9d1..c6cac5f 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperSetup.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/AutoMapperSetup.cs
@@ -1,16 +1,22 @@
-锘縩amespace WIDESEAWCS_WCSServer.Filter
+锘縰sing Mapster;
+using MapsterMapper;
+
+namespace WIDESEAWCS_WCSServer.Filter
{
/// <summary>
- /// Automapper 鍚姩鏈嶅姟
+ /// Mapster 鍚姩鏈嶅姟
/// </summary>
- public static class AutoMapperSetup
+ public static class MapsterSetup
{
- public static void AddAutoMapperSetup(this IServiceCollection services)
+ public static void AddMapsterSetup(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
- services.AddAutoMapper(typeof(AutoMapperConfig));
- AutoMapperConfig.RegisterMappings();
+ TypeAdapterConfig typeAdapterConfig = new TypeAdapterConfig();
+ MapsterConfig.RegisterMappings(typeAdapterConfig);
+
+ services.AddSingleton(typeAdapterConfig);
+ services.AddScoped<IMapper, ServiceMapper>();
}
}
}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/CustomProfile.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/CustomProfile.cs
index 2f33853..dc716d8 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/CustomProfile.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/CustomProfile.cs
@@ -1,9 +1,4 @@
-锘縰sing AutoMapper;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+锘縰sing Mapster;
using WIDESEA_DTO.System;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_Model.Models;
@@ -13,17 +8,20 @@
namespace WIDESEAWCS_WCSServer.Filter
{
- public class CustomProfile : Profile
+ public static class CustomProfile
{
/// <summary>
/// 閰嶇疆鏋勯�犲嚱鏁帮紝鐢ㄦ潵鍒涘缓鍏崇郴鏄犲皠
/// </summary>
- public CustomProfile()
+ public static void Register(TypeAdapterConfig config)
{
- CreateMap<Sys_Menu, MenuDTO>();
- CreateMap<Dt_DeviceInfo,DeviceInfoDTO>();
- CreateMap<WMSTaskDTO, Dt_Task>();
- CreateMap<Dt_Task, ConveyorLineTaskCommand>().ForMember(a => a.TargetAddress, b => b.MapFrom(b => b.NextAddress)).ForMember(a => a.Barcode, b => b.MapFrom(b => b.PalletCode)).ForMember(a => a.TaskNum, b => b.MapFrom(b => b.TaskNum));
+ config.NewConfig<Sys_Menu, MenuDTO>();
+ config.NewConfig<Dt_DeviceInfo, DeviceInfoDTO>();
+ config.NewConfig<WMSTaskDTO, Dt_Task>();
+ config.NewConfig<Dt_Task, ConveyorLineTaskCommand>()
+ .Map(dest => dest.TargetAddress, src => src.NextAddress)
+ .Map(dest => dest.Barcode, src => src.PalletCode)
+ .Map(dest => dest.TaskNum, src => src.TaskNum);
}
}
}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs
index a33363b..377148e 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs
@@ -1,4 +1,4 @@
-using Autofac;
+锘縰sing Autofac;
using Autofac.Core;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Builder;
@@ -9,6 +9,9 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
+using Serilog;
+using Serilog.Events;
+using System.IO;
using System.Reflection;
using System.Text;
using WIDESEA_Core;
@@ -31,52 +34,71 @@
using WIDESEAWCS_WCSServer.Filter;
var builder = WebApplication.CreateBuilder(args);
-// 1锟斤拷锟斤拷锟矫凤拷锟斤拷锟斤拷锟斤拷
+// 绗�1閮ㄥ垎锛氫富鏈轰笌鍩虹璁炬柦閰嶇疆
+
+// 浣跨敤 Serilog 浣滀负缁熶竴鏃ュ織鎻愪緵绋嬪簭锛堟浛鎹㈤粯璁� Logging Providers锛�
+builder.Logging.ClearProviders();
+builder.Host.UseSerilog((context, services, loggerConfiguration) =>
+{
+ // 閰嶇疆Serilog鏃ュ織璁板綍鍣�
+ loggerConfiguration
+ .ReadFrom.Configuration(context.Configuration) // 浠庡簲鐢ㄧ▼搴忛厤缃腑璇诲彇Serilog鐩稿叧璁剧疆锛堝appsettings.json锛�
+ .ReadFrom.Services(services) // 浠庝緷璧栨敞鍏ュ鍣ㄤ腑璇诲彇鏈嶅姟閰嶇疆锛屽厑璁稿湪閰嶇疆涓娇鐢ㄥ凡娉ㄥ唽鐨勬湇鍔�
+ .Enrich.FromLogContext() // 鍚敤鏃ュ織涓婁笅鏂囷紝鍙互鍦ㄦ棩蹇椾腑鍖呭惈濡傝姹侷D銆佺敤鎴稩D绛夊姩鎬佸睘鎬�
+
+ // 璁剧疆Microsoft鍛藉悕绌洪棿鐨勬棩蹇楃骇鍒负Information
+ // 杩欐牱鍙互鍑忓皯Microsoft妗嗘灦鏈韩鐨勮缁嗘棩蹇楋紝閬垮厤杩囧鐨凞ebug鏃ュ織
+ .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
+ .WriteTo.Console() // 娣诲姞鎺у埗鍙拌緭鍑烘帴鏀跺櫒锛屾棩蹇楀皢鏄剧ず鍦ㄦ帶鍒跺彴绐楀彛涓�
+ // 娣诲姞鏂囦欢杈撳嚭鎺ユ敹鍣紝灏嗘棩蹇楀啓鍏ユ枃浠剁郴缁�
+ .WriteTo.File(
+ /*Path.Combine(AppContext.BaseDirectory, "Logs", "serilog-.log"),*/ // 鎸囧畾鏃ュ織鏂囦欢鐨勫畬鏁磋矾寰勶細搴旂敤绋嬪簭鐩綍 + "Log"鏂囦欢澶� + "serilog-鏃ユ湡.log"
+ "logs/serilog-.log",
+ rollingInterval: RollingInterval.Day, // 璁剧疆鏃ュ織鏂囦欢鎸夊ぉ婊氬姩锛屾瘡澶╃敓鎴愪竴涓柊鐨勬棩蹇楁枃浠�
+ retainedFileCountLimit: 30, // 鏈�澶氫繚鐣欐渶杩�30澶╃殑鏃ュ織鏂囦欢锛岃秴杩�30澶╃殑鏂囦欢浼氳嚜鍔ㄥ垹闄�
+ shared: true); // 鍏佽澶氫釜杩涚▼鍚屾椂鍐欏叆鍚屼竴涓棩蹇楁枃浠讹紝閫傜敤浜庡瀹炰緥閮ㄧ讲鍦烘櫙
+});
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer<ContainerBuilder>(builder =>
{
- builder.RegisterModule(new AutofacModuleRegister());//锟斤拷锟叫接口诧拷姆锟斤拷锟阶拷锟�
+ // 娉ㄥ唽搴旂敤灞� Autofac 妯″潡锛堜粨鍌ㄣ�佹湇鍔°�丄OP 绛夛級
+ builder.RegisterModule(new AutofacModuleRegister());
builder.RegisterModule(new QuartzJobAutofacModuleRegister());
- builder.RegisterModule<AutofacPropertityModuleReg>();//
+ builder.RegisterModule<AutofacPropertityModuleReg>();
}).ConfigureAppConfiguration((hostingContext, config) =>
{
+ // 浣跨敤缁熶竴閰嶇疆鍏ュ彛骞跺彧淇濈暀 appsettings.json
hostingContext.Configuration.ConfigureApplication();
config.Sources.Clear();
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false);
});
builder.ConfigureApplication();
-// 2锟斤拷锟斤拷锟矫凤拷锟斤拷
-builder.Services.AddSingleton(new AppSettings(builder.Configuration));//注锟斤拷
-builder.Services.AddAllOptionRegister();//锟斤拷取锟斤拷锟斤拷锟侥硷拷
+// 绗�2閮ㄥ垎锛氭湇鍔℃敞鍐�
+builder.Services.AddSingleton(new AppSettings(builder.Configuration)); // 娉ㄥ唽閰嶇疆璁块棶瀵硅薄
+builder.Services.AddAllOptionRegister(); // 娉ㄥ唽 Options 缁戝畾
+builder.Services.AddMemoryCacheSetup(); // 鍐呭瓨缂撳瓨
+builder.Services.AddRedisSetup(builder.Configuration); // Redis 缂撳瓨
+builder.Services.AddSqlsugarSetup(); // SqlSugar 鏁版嵁搴撻厤缃�
+builder.Services.AddInitializationHostServiceSetup(); // 搴旂敤鍒濆鍖栫浉鍏冲悗鍙版湇鍔�
+builder.Services.AddHostedService<SeedDataHostedService>(); // 鍚姩鏃剁瀛愭暟鎹垵濮嬪寲
-builder.Services.AddMemoryCacheSetup();//锟斤拷锟斤拷
-builder.Services.AddRedisSetup(builder.Configuration);//Redis缂撳瓨
-builder.Services.AddSqlsugarSetup();//SqlSugar 锟斤拷锟斤拷锟斤拷锟斤拷
-builder.Services.AddInitializationHostServiceSetup();//应锟矫筹拷始锟斤拷锟斤拷锟斤拷注锟斤拷
-builder.Services.AddHostedService<SeedDataHostedService>();//锟斤拷始锟斤拷锟斤拷锟捷匡拷
+builder.Services.AddDbSetup(); // 鏁版嵁搴撳熀纭�閰嶇疆
-builder.Services.AddDbSetup();//Db 锟斤拷锟斤拷锟斤拷锟斤拷
-
-builder.Services.AddScoped<QuartzJobCreateDataTabel>();//锟斤拷锟斤拷锟斤拷锟� 注锟诫创锟斤拷QuartzJob锟斤拷锟捷匡拷锟斤拷锟�
-builder.Services.AddHostedService<QuartzJobDataTableHostedService>();//锟斤拷锟斤拷锟斤拷锟� 映锟斤拷QuartzJob锟斤拷锟捷匡拷锟�
+builder.Services.AddScoped<QuartzJobCreateDataTabel>(); // Quartz 浠诲姟琛ㄥ垱寤烘湇鍔�
+builder.Services.AddHostedService<QuartzJobDataTableHostedService>(); // Quartz 浠诲姟琛ㄥ垵濮嬪寲鍚庡彴鏈嶅姟
builder.Services.AddWebSocketSetup();
-
-builder.Services.AddAutoMapperSetup();
-
+builder.Services.AddMapsterSetup(); // Mapster 瀵硅薄鏄犲皠閰嶇疆
builder.Services.AddCorsSetup();
-
builder.Services.AddMiniProfilerSetup();
-
builder.Services.AddSwaggerSetup();
-
-builder.Services.AddJobSetup();//锟斤拷锟斤拷锟斤拷锟� 注锟诫反锟斤拷锟饺★拷锟斤拷锟斤拷锟斤拷锟�
+builder.Services.AddJobSetup(); // Quartz Job 璋冨害閰嶇疆
builder.Services.AddHttpContextSetup();
-builder.Services.AddHostedService<QuartzJobHostedService>();//锟斤拷锟斤拷锟斤拷锟� 锟斤拷锟斤拷锟斤拷锟斤拷
+builder.Services.AddHostedService<QuartzJobHostedService>(); // Quartz 鍚姩鎵樼鏈嶅姟
builder.Services.AddSingleton<TcpSocketServer>();
builder.Services.AddHostedService<SocketServerHostedService>();
@@ -91,7 +113,7 @@
builder.Services.AddAuthorizationSetup();
-builder.Services.AddIpPolicyRateLimitSetup(builder.Configuration);//IPLimit锟斤拷锟斤拷 锟斤拷锟斤拷锟斤拷锟斤拷
+builder.Services.AddIpPolicyRateLimitSetup(builder.Configuration); // IP 闄愭祦閰嶇疆
builder.Services.AddScoped<UseServiceDIAttribute>();
@@ -101,7 +123,7 @@
builder.Services.AddControllers(o =>
{
- o.Filters.Add(typeof(GlobalExceptionsFilter));//全锟斤拷锟届常
+ o.Filters.Add(typeof(GlobalExceptionsFilter)); // 鍏ㄥ眬寮傚父杩囨护鍣�
})
.AddNewtonsoftJson(options =>
{
@@ -113,26 +135,26 @@
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
options.SerializerSettings.Converters.Add(new StringEnumConverter());
});
-// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
+// 浣跨敤 DI 婵�娲� Controller锛岀‘淇濆睘鎬ф敞鍏�/瀹瑰櫒琛屼负涓�鑷�
builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var app = builder.Build();
-// 3锟斤拷锟斤拷锟斤拷锟叫硷拷锟�
-app.UseMiniProfiler();//锟斤拷锟杰凤拷锟斤拷锟斤拷
-app.ConfigureApplication();//锟斤拷锟斤拷锟侥硷拷
-app.UseApplicationSetup();//锟斤拷锟斤拷锟斤拷锟斤拷
+// 绗�3閮ㄥ垎锛欻TTP 绠¢亾閰嶇疆
+app.UseMiniProfiler(); // 鎬ц兘鍒嗘瀽闈㈡澘
+app.ConfigureApplication(); // 搴旂敤鍏ㄥ眬鍒濆鍖�
+app.UseApplicationSetup(); // 鍏叡涓棿浠跺垵濮嬪寲
app.UseAllServicesMiddle(builder.Services);
app.UseSession();
app.UseSwaggerAuthorized();
-app.UseSwaggerMiddle(() => Assembly.GetExecutingAssembly().GetManifestResourceStream("WIDESEAWCS_Server.index.html") ?? throw new Exception("未锟揭碉拷WIDESEAWCS_Server.index.html锟侥硷拷"));
+app.UseSwaggerMiddle(() => Assembly.GetExecutingAssembly().GetManifestResourceStream("WIDESEAWCS_Server.index.html") ?? throw new Exception("鏈壘鍒� WIDESEAWCS_Server.index.html 璧勬簮鏂囦欢"));
app.UseIpLimitMiddle();
app.UseApiLogMiddleware();
@@ -161,3 +183,4 @@
app.MapControllers();
app.Run();
+
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
index 69ecb81..d54af8d 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
@@ -65,6 +65,10 @@
</ItemGroup>
<ItemGroup>
+ <PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
+ <PackageReference Include="Serilog.Settings.Configuration" Version="8.0.4" />
+ <PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
+ <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>
@@ -85,9 +89,6 @@
</ItemGroup>
<ItemGroup>
- <Content Update="nlog.config">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </Content>
<Content Update="wwwroot\http.html">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</Content>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/Sys_MenuRepository.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/Sys_MenuRepository.cs
index 12b9dc6..23985ee 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/Sys_MenuRepository.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/Sys_MenuRepository.cs
@@ -1,4 +1,4 @@
-锘縰sing AutoMapper;
+锘縰sing MapsterMapper;
using SqlSugar;
using System;
using System.Collections.Concurrent;
@@ -204,3 +204,4 @@
}
}
}
+
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
index cc96eac..0207d9b 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
@@ -17,7 +17,7 @@
#endregion << 鐗� 鏈� 娉� 閲� >>
-using AutoMapper;
+using MapsterMapper;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
using WIDESEAWCS_Common.TaskEnum;
@@ -79,4 +79,4 @@
return await BaseDal.UpdateDataAsync(robotTask);
}
}
-}
\ No newline at end of file
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs
index 75feddd..bb7f55e 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs
@@ -55,7 +55,7 @@
// 鑾峰彇浠诲姟鏁伴噺
int taskNum = task.TaskNum;
// 鑾峰彇浠诲姟鐘舵��
- int taskState = task.TaskState;
+ int taskState = task.TaskStatus;
// 灏濊瘯灏嗕换鍔$姸鎬佽浆鎹负TaskOutStatusEnum鏋氫妇绫诲瀷
if (!int.TryParse(Enum.Parse<TaskOutStatusEnum>(taskState.ToString()).ToString(), out int result))
@@ -114,7 +114,7 @@
Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == item);
if (task == null) return;
int taskNum = task.TaskNum;
- int taskState = task.TaskState;
+ int taskState = task.TaskStatus;
if (!int.TryParse(Enum.Parse<TaskOutStatusEnum>(taskState.ToString()).ToString(), out int result))
{
@@ -212,7 +212,7 @@
{
throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�");
}
- active = steps.IndexOf(task.TaskState) + 1;
+ active = steps.IndexOf(task.TaskStatus) + 1;
}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
index 710e2d3..40a9737 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -17,7 +17,7 @@
#endregion << 鐗� 鏈� 娉� 閲� >>
-using AutoMapper;
+using MapsterMapper;
using Newtonsoft.Json;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
@@ -62,6 +62,8 @@
public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList();
+ public List<int> TaskRelocationTypes => typeof(TaskRelocationTypeEnum).GetEnumIndexList();
+
public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList();
public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, HttpClientHelper httpClientHelper) : base(BaseDal)
@@ -98,7 +100,7 @@
//鏆備笉鑰冭檻澶氳矾寰�
if (router !=null )
{
- task.TaskState = (int)TaskOutStatusEnum.OutNew;
+ task.TaskStatus = (int)TaskOutStatusEnum.OutNew;
task.CurrentAddress = item.SourceAddress;
task.NextAddress = router.ChildPosi;
}
@@ -109,7 +111,7 @@
//鏆備笉鑰冭檻澶氳矾寰�
if (!routers.IsNullOrEmpty())
{
- task.TaskState = (int)TaskInStatusEnum.InNew;
+ task.TaskStatus = (int)TaskInStatusEnum.InNew;
task.CurrentAddress = item.SourceAddress;
task.NextAddress = routers.ChildPosi;
}
@@ -170,7 +172,7 @@
/// <returns></returns>
public Dt_Task QueryConveyorLineTask(string deviceNo, string currentAddress)
{
- return BaseDal.QueryFirst(x => (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish) && x.CurrentAddress == currentAddress, TaskOrderBy);
+ return BaseDal.QueryFirst(x => (TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew || TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.SC_OutFinish) && x.CurrentAddress == currentAddress, TaskOrderBy);
}
/// <summary>
@@ -184,7 +186,7 @@
if (string.IsNullOrEmpty(nextAddress))
throw new ArgumentNullException(nameof(nextAddress), "涓嬩竴鍦板潃涓嶈兘涓虹┖");
- return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.NextAddress == nextAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting), TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.NextAddress == nextAddress && (x.TaskStatus == (int)TaskInStatusEnum.Line_InExecuting || x.TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting), TaskOrderBy);
}
/// <summary>
@@ -198,7 +200,7 @@
if (string.IsNullOrEmpty(currentAddress))
throw new ArgumentNullException(nameof(currentAddress), "褰撳墠鍦板潃涓嶈兘涓虹┖");
- return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InFinish || x.TaskState == (int)TaskOutStatusEnum.Line_OutFinish), TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress && (x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish || x.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish), TaskOrderBy);
}
/// <summary>
@@ -210,11 +212,11 @@
public Dt_Task? QuertStackerCraneTask(string deviceNo, TaskTypeGroup? taskTypeGroup = null)
{
if (taskTypeGroup == null)
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew), TaskOrderBy);
if (taskTypeGroup.Value == TaskTypeGroup.InboundGroup)
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy);
if (taskTypeGroup.Value == TaskTypeGroup.OutbondGroup)
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew, TaskOrderBy);
return null;
}
@@ -227,9 +229,9 @@
public Dt_Task QueryStackerCraneTask(string deviceNo, string currentAddress = "")
{
if (string.IsNullOrEmpty(currentAddress))
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew || TaskRelocationTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskRelocationStatusEnum.RelocationNew), TaskOrderBy);
else
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.CurrentAddress == currentAddress && (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.CurrentAddress == currentAddress && (TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew || TaskRelocationTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskRelocationStatusEnum.RelocationNew), TaskOrderBy);
}
/// <summary>
@@ -241,9 +243,9 @@
public Dt_Task QueryStackerCraneInTask(string deviceNo, string currentAddress = "")
{
if (string.IsNullOrEmpty(currentAddress))
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy);
else
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish && x.CurrentAddress == currentAddress, TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish && x.CurrentAddress == currentAddress, TaskOrderBy);
}
/// <summary>
@@ -255,9 +257,9 @@
public Dt_Task QueryStackerCraneOutTask(string deviceNo, string currentAddress = "")
{
if (string.IsNullOrEmpty(currentAddress))
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew, TaskOrderBy);
else
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy);
}
/// <summary>
@@ -268,7 +270,7 @@
/// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄闆嗗悎锛屽彲鑳戒负null</returns>
public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes)
{
- return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy);
+ return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy);
}
/// <summary>
@@ -288,11 +290,11 @@
if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
{
- task.TaskState = (int)TaskOutStatusEnum.OutPending;
+ task.TaskStatus = (int)TaskOutStatusEnum.OutPending;
}
else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
{
- task.TaskState = (int)TaskInStatusEnum.InPending;
+ task.TaskStatus = (int)TaskInStatusEnum.InPending;
}
task.ExceptionMessage = message;
task.ModifyDate = DateTime.Now;
@@ -318,7 +320,7 @@
{
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null) return;
- task.TaskState = status;
+ task.TaskStatus = status;
task.ModifyDate = DateTime.Now;
BaseDal.UpdateData(task);
}
@@ -350,12 +352,13 @@
/// <returns></returns>
public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task)
{
- int oldState = task.TaskState;
+ int oldState = task.TaskStatus;
var result = task.TaskType.GetTaskTypeGroup() switch
{
TaskTypeGroup.OutbondGroup => ProcessOutboundTaskStatus(task),
TaskTypeGroup.InboundGroup => ProcessInboundTaskStatus(task),
+ TaskTypeGroup.RelocationGroup => ProcessRelocationTaskStatus(task),
TaskTypeGroup.OtherGroup => ProcessRobotTaskStatus(task),
_ => WebResponseContent.Instance.Error($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�")
};
@@ -370,8 +373,8 @@
// 璁板綍浠诲姟鎵ц璇︽儏
string logMessage = App.User.UserId > 0
- ? $"浜哄伐鎵嬪姩灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戣烦杞埌銆恵task.TaskState}銆�"
- : $"绯荤粺鑷姩娴佺▼锛屼换鍔$姸鎬佷粠銆恵oldState}銆戣浆鍒般�恵task.TaskState}銆�";
+ ? $"浜哄伐鎵嬪姩灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戣烦杞埌銆恵task.TaskStatus}銆�"
+ : $"绯荤粺鑷姩娴佺▼锛屼换鍔$姸鎬佷粠銆恵oldState}銆戣浆鍒般�恵task.TaskStatus}銆�";
_taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage);
return WebResponseContent.Instance.OK();
@@ -382,16 +385,16 @@
/// </summary>
private WebResponseContent ProcessOutboundTaskStatus(Dt_Task task)
{
- if (task.TaskState >= (int)TaskOutStatusEnum.OutFinish)
- return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+ if (task.TaskStatus >= (int)TaskOutStatusEnum.OutFinish)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
- task.TaskState = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>();
+ task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
- if (task.TaskState <= 0)
- return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+ if (task.TaskStatus <= 0)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
// 鏍规嵁鐘舵�佽皟鐢ㄤ笉鍚岀殑WMS鎺ュ彛
- if (task.TaskState == (int)TaskOutStatusEnum.Line_OutFinish)
+ if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish)
{
return NotifyWMSOutboundFinish(task);
}
@@ -406,16 +409,16 @@
/// </summary>
private WebResponseContent ProcessInboundTaskStatus(Dt_Task task)
{
- if (task.TaskState >= (int)TaskInStatusEnum.InFinish)
- return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+ if (task.TaskStatus >= (int)TaskInStatusEnum.InFinish)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
- task.TaskState = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
+ task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
- if (task.TaskState <= 0)
- return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+ if (task.TaskStatus <= 0)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
// 鏍规嵁鐘舵�佽皟鐢ㄤ笉鍚岀殑WMS鎺ュ彛
- if (task.TaskState == (int)TaskInStatusEnum.Line_InFinish)
+ if (task.TaskStatus == (int)TaskInStatusEnum.Line_InFinish)
{
return GetWMSInboundLocation(task);
}
@@ -430,13 +433,41 @@
/// </summary>
private WebResponseContent ProcessRobotTaskStatus(Dt_Task task)
{
- if (task.TaskState >= (int)TaskRobotStatusEnum.RobotFinish)
- return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+ if (task.TaskStatus >= (int)TaskRobotStatusEnum.RobotFinish)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
- task.TaskState = task.TaskState.GetNextNotCompletedStatus<TaskRobotStatusEnum>();
+ task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRobotStatusEnum>();
- if (task.TaskState <= 0)
- return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+ if (task.TaskStatus <= 0)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+ return WebResponseContent.Instance.OK();
+ }
+
+ /// <summary>
+ /// 澶勭悊绉诲簱浠诲姟鐘舵�佽浆鎹�
+ /// </summary>
+ private WebResponseContent ProcessRelocationTaskStatus(Dt_Task task)
+ {
+ if (task.TaskStatus >= (int)TaskRelocationStatusEnum.RelocationFinish)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+ task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
+
+ if (task.TaskStatus <= 0)
+ return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
+
+ // 绉诲簱浠诲姟寮�濮嬫椂锛屽悓姝MS浠诲姟鐘舵��
+ if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
+ {
+ return UpdateWMSTaskStatus(task);
+ }
+
+ // 绉诲簱浠诲姟瀹屾垚鏃讹紝璋冪敤WMS绉诲簱瀹屾垚鎺ュ彛
+ if (task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish)
+ {
+ return NotifyWMSRelocationFinish(task);
+ }
return WebResponseContent.Instance.OK();
}
@@ -487,10 +518,32 @@
{
var result = _httpClientHelper.Post<WebResponseContent>(
nameof(ConfigKey.UpdateTaskByStatus),
- new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskState }.ToJson());
+ new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus }.ToJson());
if (!result.IsSuccess || !result.Data.Status)
return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+
+ return WebResponseContent.Instance.OK();
+ }
+
+ /// <summary>
+ /// 閫氱煡WMS绯荤粺绉诲簱浠诲姟瀹屾垚
+ /// </summary>
+ private WebResponseContent NotifyWMSRelocationFinish(Dt_Task task)
+ {
+ var result = _httpClientHelper.Post<WebResponseContent>(
+ nameof(ConfigKey.RelocationFinishTask),
+ new CreateTaskDto
+ {
+ PalletCode = task.PalletCode,
+ SourceAddress = task.CurrentAddress,
+ TargetAddress = task.TargetAddress,
+ Roadway = task.Roadway,
+ TaskType = task.TaskType
+ }.ToJson());
+
+ if (!result.IsSuccess || !result.Data.Status)
+ return WebResponseContent.Instance.Error($"閫氱煡WMS绯荤粺绉诲簱瀹屾垚澶辫触,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
return WebResponseContent.Instance.OK();
}
@@ -547,13 +600,13 @@
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
- if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
+ if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && task.TaskStatus == (int)TaskOutStatusEnum.SC_OutExecuting)
{
List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress);
if (!routers.Any()) return WebResponseContent.Instance.Error($"鏈壘鍒拌澶囪矾鐢变俊鎭�");
- int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>();
- task.TaskState = nextStatus;
+ int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
+ task.TaskStatus = nextStatus;
task.CurrentAddress = task.NextAddress;
task.NextAddress = routers.FirstOrDefault().ChildPosi;
task.ModifyDate = DateTime.Now;
@@ -573,10 +626,10 @@
return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈哄嚭搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Data.Message}銆�");
}
}
- else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting)
+ else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup && task.TaskStatus == (int)TaskInStatusEnum.SC_InExecuting)
{
- int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
- task.TaskState = nextStatus;
+ int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
+ task.TaskStatus = nextStatus;
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
@@ -600,7 +653,25 @@
}
else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
{
- //todo 璋冪敤WMS绉诲簱瀹屾垚
+ if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
+ {
+ int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
+ task.TaskStatus = nextStatus;
+ task.ModifyDate = DateTime.Now;
+ task.Modifier = "System";
+
+ WebResponseContent result = NotifyWMSRelocationFinish(task);
+ if (result.Status)
+ {
+ BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+ _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈虹Щ搴撳畬鎴�");
+ return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
+ }
+ else
+ {
+ return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Message}銆�");
+ }
+ }
}
else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OtherGroup)
{
@@ -630,25 +701,25 @@
{
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
- if (task.TaskState != (int)TaskInStatusEnum.InPending && task.TaskState != (int)TaskOutStatusEnum.OutPending)
+ if (task.TaskStatus != (int)TaskInStatusEnum.InPending && task.TaskStatus != (int)TaskOutStatusEnum.OutPending)
{
- return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙仮澶�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+ return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙仮澶�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
}
Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.IsNormal, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } });
if (taskExecuteDetail != null)
{
- task.TaskState = taskExecuteDetail.TaskState;
+ task.TaskStatus = taskExecuteDetail.TaskState;
}
else
{
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
{
- task.TaskState = (int)TaskOutStatusEnum.OutNew;
+ task.TaskStatus = (int)TaskOutStatusEnum.OutNew;
}
else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
{
- task.TaskState = (int)TaskInStatusEnum.InNew;
+ task.TaskStatus = (int)TaskInStatusEnum.InNew;
}
//todo
}
@@ -657,7 +728,7 @@
BaseDal.UpdateData(task);
- _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐鎭㈠鎸傝捣浠诲姟,鎭㈠鎸傝捣鏃朵换鍔$姸鎬併�恵task.TaskState}銆�");
+ _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐鎭㈠鎸傝捣浠诲姟,鎭㈠鎸傝捣鏃朵换鍔$姸鎬併�恵task.TaskStatus}銆�");
content = WebResponseContent.Instance.OK();
}
@@ -681,24 +752,24 @@
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
- int oldState = task.TaskState;
- Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState < task.TaskState && x.TaskState > 0, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } });
+ int oldState = task.TaskStatus;
+ Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState < task.TaskStatus && x.TaskState > 0, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } });
if (taskExecuteDetail != null)
{
- task.TaskState = taskExecuteDetail.TaskState;
+ task.TaskStatus = taskExecuteDetail.TaskState;
task.CurrentAddress = taskExecuteDetail.CurrentAddress;
task.NextAddress = taskExecuteDetail.NextAddress;
}
else
{
- return content = WebResponseContent.Instance.Error($"鏈壘鍒颁换鍔℃槑缁嗕俊鎭�,璇ヤ换鍔$姸鎬佷笉鍙洖婊氬埌涓婁竴姝�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+ return content = WebResponseContent.Instance.Error($"鏈壘鍒颁换鍔℃槑缁嗕俊鎭�,璇ヤ换鍔$姸鎬佷笉鍙洖婊氬埌涓婁竴姝�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
}
task.ExceptionMessage = string.Empty;
BaseDal.UpdateData(task);
- _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戝洖婊氬埌銆恵task.TaskState}銆�");
+ _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戝洖婊氬埌銆恵task.TaskStatus}銆�");
content = WebResponseContent.Instance.OK();
}
@@ -730,9 +801,9 @@
public Dt_Task QueryRobotCraneTask(string deviceNo, string currentAddress = "")
{
if (string.IsNullOrEmpty(currentAddress))
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskRobotTypes.Contains(x.TaskType) && x.TaskState <= (int)TaskRobotStatusEnum.RobotExecuting), TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskRobotTypes.Contains(x.TaskType) && x.TaskStatus <= (int)TaskRobotStatusEnum.RobotExecuting), TaskOrderBy);
else
- return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskRobotTypes.Contains(x.TaskType) && x.CurrentAddress == currentAddress && x.TaskState <= (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
+ return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskRobotTypes.Contains(x.TaskType) && x.CurrentAddress == currentAddress && x.TaskStatus <= (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
}
/// <summary>
@@ -745,4 +816,4 @@
return BaseDal.QueryFirst(x => x.TaskNum == taskNum);
}
}
-}
\ No newline at end of file
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Task_HtyService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Task_HtyService.cs
index 665b926..3eab9aa 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Task_HtyService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Task_HtyService.cs
@@ -15,7 +15,7 @@
*----------------------------------------------------------------*/
#endregion << 鐗� 鏈� 娉� 閲� >>
-using AutoMapper;
+using MapsterMapper;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
@@ -40,3 +40,4 @@
}
}
+
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
index ee7b5cd..ea9e325 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
@@ -21,7 +21,7 @@
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
-using AutoMapper;
+using MapsterMapper;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using Quartz;
using WIDESEAWCS_Communicator;
@@ -208,3 +208,4 @@
}
}
}
+
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
index fc8f1cc..2d66fcd 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
@@ -17,7 +17,7 @@
#endregion << 鐗� 鏈� 娉� 閲� >>
-using AutoMapper;
+using MapsterMapper;
using Microsoft.Extensions.Configuration;
using Quartz;
using SqlSugar;
@@ -169,7 +169,7 @@
const int InFinish = (int)TaskInStatusEnum.InFinish;
const int OutFinish = (int)TaskOutStatusEnum.OutFinish;
- int state = task.TaskState;
+ int state = task.TaskStatus;
bool isTargetAddress = task.TargetAddress == childDeviceCode;
// 澶勭悊鐘舵�侀�昏緫
@@ -199,4 +199,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
index 6dc2ef3..5ece693 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
@@ -17,7 +17,7 @@
#endregion << 鐗� 鏈� 娉� 閲� >>
-using AutoMapper;
+using MapsterMapper;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
@@ -92,7 +92,7 @@
Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
if (newTask != null)
{
- if (_taskService.UpdateTaskStatusToNext(newTask).Status && newTask.TaskState == (int)TaskInStatusEnum.Line_InFinish)
+ if (_taskService.UpdateTaskStatusToNext(newTask).Status && newTask.TaskStatus == (int)TaskInStatusEnum.Line_InFinish)
{
conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_STB, 1, childDeviceCode);
}
@@ -161,3 +161,4 @@
}
}
}
+
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ShuttleCarJob/ShuttleCarJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ShuttleCarJob/ShuttleCarJob.cs
index 2324fa8..6ef92ca 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ShuttleCarJob/ShuttleCarJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ShuttleCarJob/ShuttleCarJob.cs
@@ -1,4 +1,4 @@
-锘縰sing AutoMapper;
+锘縰sing MapsterMapper;
using Quartz;
using System;
using System.Collections.Generic;
@@ -48,3 +48,4 @@
}
}
}
+
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
index 5a8506e..4422050 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -82,12 +82,13 @@
commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;
}
+ commonStackerCrane.CheckStackerCraneTaskCompleted();
+
if (!commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs))
{
return Task.CompletedTask;
}
- commonStackerCrane.CheckStackerCraneTaskCompleted();
// 浠诲姟閫夋嫨涓嬫矇鍒颁笓鐢ㄩ�夋嫨鍣ㄣ��
Dt_Task? task = _taskSelector.SelectTask(commonStackerCrane);
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-common-stacker-crane-job-refactor-plan.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-common-stacker-crane-job-refactor-plan.md
deleted file mode 100644
index 28f391a..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-common-stacker-crane-job-refactor-plan.md
+++ /dev/null
@@ -1,54 +0,0 @@
-锘�# CommonStackerCraneJob Refactor 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:** 鍦ㄤ笉鏀瑰彉涓氬姟琛屼负鐨勫墠鎻愪笅锛岄檷浣� `CommonStackerCraneJob` 澶嶆潅搴︼紝鎷嗗垎鈥滀换鍔¢�夋嫨鈥濆拰鈥滃懡浠ゆ瀯寤衡�濊亴璐c��
-
-**Architecture:** 淇濈暀 `CommonStackerCraneJob` 浣滀负 Quartz Job 鍏ュ彛锛屽彧璐熻矗璋冨害娴佺▼锛涘皢浠诲姟閫夋嫨閫昏緫鍜屽懡浠ゆ瀯寤洪�昏緫鍒嗗埆涓嬫矇鍒板悓鐩綍鏂扮被銆傞�氳繃鏋勯�犲嚱鏁板唴缁勮渚濊禆锛堜笉淇敼鍏ㄥ眬 DI锛夛紝纭繚鏀瑰姩鑼冨洿浠呴檺 `StackerCraneJob` 鐩綍銆�
-
-**Tech Stack:** .NET 6, Quartz, 鐜版湁 WCS Task/Router 鏈嶅姟鎺ュ彛
-
----
-
-## Chunk 1: 缁撴瀯鎷嗗垎涓庤亴璐h惤浣�
-
-### Task 1: 鎷嗗垎浠诲姟閫夋嫨鍣�
-
-**Files:**
-- Create: `WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs`
-- Modify: `WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs`
-
-- [ ] Step 1: 鏂板缓浠诲姟閫夋嫨鍣ㄧ被锛岃縼绉� `GetTask` 涓� `IsOutTaskStationAvailable` 閫昏緫
-- [ ] Step 2: 鍦� Job 涓�氳繃绉佹湁瀛楁鎸佹湁浠诲姟閫夋嫨鍣ㄥ疄渚�
-- [ ] Step 3: 灏� `GetTask` 璋冪敤鏀逛负浠诲姟閫夋嫨鍣�
-
-### Task 2: 鎷嗗垎鍛戒护鏋勫缓鍣�
-
-**Files:**
-- Create: `WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneCommandBuilder.cs`
-- Modify: `WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs`
-
-- [ ] Step 1: 鏂板缓鍛戒护鏋勫缓鍣ㄧ被锛岃縼绉� `ConvertToStackerCraneTaskCommand` 涓庡懡浠ゆ瀯寤哄垎鏀�昏緫
-- [ ] Step 2: 淇濈暀閰嶇疆璇诲彇鍦� Job 涓紝鍛戒护鏋勫缓鍣ㄦ帴鍙楅厤缃笌鏈嶅姟渚濊禆
-- [ ] Step 3: Job 涓浛鎹㈠師鏈夊懡浠ゆ瀯寤鸿皟鐢�
-
-## Chunk 2: 娓呯悊涓庨獙璇�
-
-### Task 3: Job 鍏ュ彛鐦﹁韩涓庢敞閲婅ˉ鍏�
-
-**Files:**
-- Modify: `WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs`
-
-- [ ] Step 1: 绉婚櫎宸茶縼绉荤鏈夋柟娉曞強鏃犵敤 using
-- [ ] Step 2: 淇濈暀骞惰ˉ鍏呭叧閿祦绋嬫敞閲婏紙璁㈤槄銆佷换鍔¤幏鍙栥�佸懡浠や笅鍙戯級
-
-### Task 4: 缂栬瘧楠屾敹
-
-**Files:**
-- Modify: `WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs`锛堝闇�寰皟锛�
-- Modify: `WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs`锛堝闇�寰皟锛�
-- Modify: `WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneCommandBuilder.cs`锛堝闇�寰皟锛�
-
-- [ ] Step 1: 杩愯 `dotnet build WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj -c Debug`
-- [ ] Step 2: 鑻ュけ璐ワ紝鎸夌紪璇戦敊璇渶灏忎慨澶嶇洿鍒伴�氳繃
-- [ ] Step 3: 杈撳嚭缁撴灉涓庢敼鍔ㄦ枃浠舵竻鍗�
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-conveyorline-dispatch-handler-refactor-plan.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-conveyorline-dispatch-handler-refactor-plan.md
deleted file mode 100644
index 0450f7b..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-conveyorline-dispatch-handler-refactor-plan.md
+++ /dev/null
@@ -1,49 +0,0 @@
-锘�# ConveyorLineDispatchHandler Refactor 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:** 鍦ㄤ笉鏀瑰彉璋冨害琛屼负鐨勫墠鎻愪笅锛岄檷浣� `ConveyorLineDispatchHandler` 澶嶆潅搴︼紝鎷嗗垎鈥滃湴鍧�杞绛栫暐鈥濆拰鈥滀换鍔$瓫閫夐�昏緫鈥濄��
-
-**Architecture:** 淇濈暀 `ConveyorLineDispatchHandler` 浣滀负娴佺▼鍏ュ彛锛涘皢鍙浛鎹㈢瓥鐣ワ紙杞鍦板潃閫夋嫨锛変笌浠诲姟杩囨护閫昏緫鎷嗗埌鍚岀洰褰曟柊绫讳腑锛岄伩鍏嶅崟鏂囦欢鎵挎媴鍏ㄩ儴鑱岃矗銆�
-
-**Tech Stack:** .NET 6, 鐜版湁 TaskService/RouterService 涓� DTO 妯″瀷
-
----
-
-## Chunk 1: 缁撴瀯鎷嗗垎
-
-### Task 1: 鎷嗗垎鍦板潃閫夋嫨绛栫暐
-
-**Files:**
-- Create: `WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs`
-- Modify: `WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs`
-
-- [ ] Step 1: 杩佺Щ杞鍦板潃閫夋嫨涓庣姸鎬佺淮鎶ら�昏緫
-- [ ] Step 2: Handler 涓敼涓鸿皟鐢ㄩ�夋嫨鍣�
-
-### Task 2: 鎷嗗垎浠诲姟绛涢�夊櫒
-
-**Files:**
-- Create: `WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTaskFilter.cs`
-- Modify: `WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs`
-
-- [ ] Step 1: 杩佺Щ浠诲姟杩囨护鏉′欢鍜屽�欓�変换鍔℃瀯寤�
-- [ ] Step 2: Handler 涓敼涓鸿皟鐢ㄨ繃婊ゅ櫒
-
-## Chunk 2: 娓呯悊涓庨獙璇�
-
-### Task 3: 鍏ュ彛鐦﹁韩涓庢敞閲�
-
-**Files:**
-- Modify: `WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs`
-
-- [ ] Step 1: 鍒犻櫎杩佺Щ鍚庣鏈夋柟娉�
-- [ ] Step 2: 淇濈暀鍏抽敭娴佺▼娉ㄩ噴锛岃鏄庤涓轰繚鎸佺偣
-
-### Task 4: 缂栬瘧楠屾敹
-
-**Files:**
-- Modify: `WIDESEAWCS_Tasks/ConveyorLineNewJob/*.cs`锛堝闇�寰皟锛�
-
-- [ ] Step 1: 杩愯 `dotnet build WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj -c Debug`
-- [ ] Step 2: 鏈�灏忎慨澶嶇洿鍒伴�氳繃
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-formation-stacker-crane-job-refactor-plan.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-formation-stacker-crane-job-refactor-plan.md
deleted file mode 100644
index bbefbaf..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-formation-stacker-crane-job-refactor-plan.md
+++ /dev/null
@@ -1,49 +0,0 @@
-锘�# FormationCommonStackerCraneJob Refactor 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:** 鍦ㄤ笉鏀瑰彉涓氬姟琛屼负鐨勫墠鎻愪笅锛岄檷浣� `FormationCommonStackerCraneJob` 澶嶆潅搴︼紝鎷嗗垎鈥滀换鍔¢�夋嫨鈥濆拰鈥滃懡浠ゆ瀯寤衡�濊亴璐c��
-
-**Architecture:** 淇濈暀 `FormationCommonStackerCraneJob` 浣滀负 Quartz Job 鍏ュ彛锛屼粎璐熻矗璋冨害锛涘皢浠诲姟閫夋嫨鍜屽懡浠ゆ瀯寤轰笅娌夊埌鍚岀洰褰曟柊绫伙紝閫氳繃鏋勯�犲嚱鏁扮粍瑁呬緷璧栵紝鏀瑰姩闄愬畾鍦� `FormationStackerCraneJob` 鐩綍銆�
-
-**Tech Stack:** .NET 6, Quartz, 鐜版湁 WCS Task/Router 鏈嶅姟鎺ュ彛
-
----
-
-## Chunk 1: 缁撴瀯鎷嗗垎
-
-### Task 1: 鎷嗗垎浠诲姟閫夋嫨鍣�
-
-**Files:**
-- Create: `WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationStackerCraneTaskSelector.cs`
-- Modify: `WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationCommonStackerCraneJob.cs`
-
-- [ ] Step 1: 杩佺Щ浠诲姟鎸戦�夊拰绔欏彴鍙敤鎬ч�昏緫
-- [ ] Step 2: Job 涓敼涓鸿皟鐢ㄤ换鍔¢�夋嫨鍣�
-
-### Task 2: 鎷嗗垎鍛戒护鏋勫缓鍣�
-
-**Files:**
-- Create: `WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationStackerCraneCommandBuilder.cs`
-- Modify: `WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationCommonStackerCraneJob.cs`
-
-- [ ] Step 1: 杩佺Щ鍛戒护杞崲涓庡湴鍧�瑙f瀽閫昏緫
-- [ ] Step 2: Job 涓敼涓鸿皟鐢ㄥ懡浠ゆ瀯寤哄櫒
-
-## Chunk 2: 娓呯悊涓庨獙璇�
-
-### Task 3: Job 鍏ュ彛鐦﹁韩
-
-**Files:**
-- Modify: `WIDESEAWCS_Tasks/FormationStackerCraneJob/FormationCommonStackerCraneJob.cs`
-
-- [ ] Step 1: 鍒犻櫎杩佺Щ鍚庣殑绉佹湁鏂规硶鍜屾棤鐢� using
-- [ ] Step 2: 琛ュ叧閿祦绋嬫敞閲�
-
-### Task 4: 缂栬瘧楠屾敹
-
-**Files:**
-- Modify: `WIDESEAWCS_Tasks/FormationStackerCraneJob/*.cs`锛堝闇�寰皟锛�
-
-- [ ] Step 1: 杩愯 `dotnet build WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj -c Debug`
-- [ ] Step 2: 鏈�灏忎慨澶嶇洿鍒伴�氳繃
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-wcs-ddd-refactor-plan.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-wcs-ddd-refactor-plan.md
deleted file mode 100644
index d1c08c5..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-11-wcs-ddd-refactor-plan.md
+++ /dev/null
@@ -1,1229 +0,0 @@
-# WCS DDD閲嶆瀯瀹炴柦璁″垝
-
-> **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.
-
-**鐩爣:** 瀹炵幇WCS绯荤粺鐨勬笎杩涘紡DDD閲嶆瀯锛屽寘鎷鍩熷眰銆佸簲鐢ㄥ眰鍜屽熀纭�璁炬柦灞傦紝閲嶇偣閲嶆瀯璁惧绠$悊棰嗗煙
-
-**鏋舵瀯:** 閲囩敤鏍囧噯鐨勫洓灞侱DD鏋舵瀯锛氳〃鐜板眰 鈫� 搴旂敤灞� 鈫� 棰嗗煙灞� 鈫� 鍩虹璁炬柦灞傦紝浣跨敤CQRS妯″紡鍒嗙鍛戒护鍜屾煡璇紝棰嗗煙浜嬩欢椹卞姩璁捐
-
-**鎶�鏈爤:**
-- .NET 6.0
-- SqlSugar ORM
-- Redis锛圫tackExchange.Redis锛�
-- xUnit + Moq锛堟祴璇曟鏋讹級
-- Autofac锛堜緷璧栨敞鍏ワ級
-
----
-
-## Chunk 1: 椤圭洰缁撴瀯鎼缓鍜屽熀纭�璁炬柦绫�
-
-### Task 1: 鍒涘缓棰嗗煙灞傞」鐩粨鏋�
-
-**Files:**
-- Create: `WIDESEAWCS_Domain/WIDESEAWCS_Domain.csproj`
-- Create: `WIDESEAWCS_Domain/Common/AggregateRoot.cs`
-- Create: `WIDESEAWCS_Domain/Common/IDomainEvent.cs`
-- Create: `WIDESEAWCS_Domain/Common/DomainEvent.cs`
-- Create: `WIDESEAWCS_Domain/Common/DomainException.cs`
-- Test: `WIDESEAWCS_Domain.Tests/AggregateRootTests.cs`
-
-- [ ] **Step 1: 鍒涘缓棰嗗煙灞傞」鐩枃浠�**
-
-```xml
-<Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
- <ImplicitUsings>enable</ImplicitUsings>
- <Nullable>enable</Nullable>
- </PropertyGroup>
-</Project>
-```
-
-- [ ] **Step 2: 鍒涘缓鑱氬悎鏍瑰熀绫�**
-
-```csharp
-namespace WIDESEAWCS_Domain.Common;
-
-public abstract class AggregateRoot<TId>
-{
- public TId Id { get; protected set; } = default!;
- public int Version { get; private set; }
- private readonly List<IDomainEvent> _domainEvents = new();
-
- protected AggregateRoot() { }
-
- protected AggregateRoot(TId id)
- {
- Id = id;
- }
-
- public IReadOnlyCollection<IDomainEvent> GetDomainEvents() => _domainEvents.AsReadOnly();
- public void ClearDomainEvents() => _domainEvents.Clear();
-
- protected void AddDomainEvent(IDomainEvent domainEvent)
- {
- _domainEvents.Add(domainEvent);
- }
-
- protected void IncrementVersion()
- {
- Version++;
- }
-}
-```
-
-- [ ] **Step 3: 鍒涘缓棰嗗煙浜嬩欢鎺ュ彛**
-
-```csharp
-namespace WIDESEAWCS_Domain.Common;
-
-public interface IDomainEvent
-{
- DateTime OccurredOn { get; }
-}
-```
-
-- [ ] **Step 4: 鍒涘缓棰嗗煙浜嬩欢鍩虹被**
-
-```csharp
-namespace WIDESEAWCS_Domain.Common;
-
-public abstract record DomainEvent : IDomainEvent
-{
- public DateTime OccurredOn { get; init; } = DateTime.UtcNow;
-}
-```
-
-- [ ] **Step 5: 鍒涘缓棰嗗煙寮傚父绫�**
-
-```csharp
-namespace WIDESEAWCS_Domain.Common;
-
-public abstract class DomainException : Exception
-{
- public string ErrorCode { get; }
-
- protected DomainException(string message, string errorCode = "DOMAIN_ERROR")
- : base(message)
- {
- ErrorCode = errorCode;
- }
-}
-
-public class InvalidDomainOperationException : DomainException
-{
- public InvalidDomainOperationException(string message)
- : base(message, "INVALID_OPERATION")
- {
- }
-}
-```
-
-- [ ] **Step 6: 鍒涘缓鑱氬悎鏍瑰熀绫绘祴璇�**
-
-```csharp
-using Xunit;
-using WIDESEAWCS_Domain.Common;
-
-namespace WIDESEAWCS_Domain.Tests;
-
-public class AggregateRootTests
-{
- [Fact]
- public void Constructor_Should_SetId()
- {
- // Arrange & Act
- var aggregate = new TestAggregate(1);
-
- // Assert
- Assert.Equal(1, aggregate.Id);
- }
-
- [Fact]
- public void AddDomainEvent_Should_AddEvent()
- {
- // Arrange
- var aggregate = new TestAggregate(1);
- var domainEvent = new TestDomainEvent();
-
- // Act
- aggregate.TestAddDomainEvent(domainEvent);
-
- // Assert
- var events = aggregate.GetDomainEvents();
- Assert.Single(events);
- Assert.Same(domainEvent, events.First());
- }
-
- [Fact]
- public void ClearDomainEvents_Should_RemoveAllEvents()
- {
- // Arrange
- var aggregate = new TestAggregate(1);
- aggregate.TestAddDomainEvent(new TestDomainEvent());
-
- // Act
- aggregate.ClearDomainEvents();
-
- // Assert
- Assert.Empty(aggregate.GetDomainEvents());
- }
-
- [Fact]
- public void IncrementVersion_Should_IncreaseVersion()
- {
- // Arrange
- var aggregate = new TestAggregate(1);
- var initialVersion = aggregate.Version;
-
- // Act
- aggregate.TestIncrementVersion();
-
- // Assert
- Assert.Equal(initialVersion + 1, aggregate.Version);
- }
-
- // 娴嬭瘯杈呭姪绫�
- private class TestAggregate : AggregateRoot<int>
- {
- public TestAggregate(int id) : base(id) { }
-
- public void TestAddDomainEvent(IDomainEvent domainEvent)
- => AddDomainEvent(domainEvent);
-
- public void TestIncrementVersion() => IncrementVersion();
- }
-
- private record TestDomainEvent : DomainEvent { }
-}
-```
-
-- [ ] **Step 7: 杩愯娴嬭瘯楠岃瘉鍩虹绫�**
-
-Run: `dotnet test WIDESEAWCS_Domain.Tests --filter "FullyQualifiedName~AggregateRootTests"`
-Expected: All tests pass
-
-- [ ] **Step 8: 鎻愪氦鍩虹绫�**
-
-```bash
-git add WIDESEAWCS_Domain/
-git commit -m "feat: 娣诲姞DDD鍩虹绫� - AggregateRoot, IDomainEvent, DomainException"
-```
-
----
-
-### Task 2: 鍒涘缓搴旂敤灞傞」鐩粨鏋�
-
-**Files:**
-- Create: `WIDESEAWCS_Application/WIDESEAWCS_Application.csproj`
-- Create: `WIDESEAWCS_Application/Common/IRepository.cs`
-- Create: `WIDESEAWCS_Application/Common/IUnitOfWork.cs`
-
-- [ ] **Step 1: 鍒涘缓搴旂敤灞傞」鐩枃浠�**
-
-```xml
-<Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
- <ImplicitUsings>enable</ImplicitUsings>
- <Nullable>enable</Nullable>
- </PropertyGroup>
-
- <ItemGroup>
- <ProjectReference Include="..\WIDESEAWCS_Domain\WIDESEAWCS_Domain.csproj" />
- </ItemGroup>
-</Project>
-```
-
-- [ ] **Step 2: 鍒涘缓浠撳偍鍩烘帴鍙�**
-
-```csharp
-using WIDESEAWCS_Domain.Common;
-
-namespace WIDESEAWCS_Application.Common;
-
-public interface IRepository<TEntity, TId> where TEntity : AggregateRoot<TId>
-{
- Task<TEntity?> GetById(TId id);
- Task Add(TEntity entity);
- Task Update(TEntity entity);
- Task Delete(TId id);
-}
-```
-
-- [ ] **Step 3: 鍒涘缓宸ヤ綔鍗曞厓鎺ュ彛**
-
-```csharp
-namespace WIDESEAWCS_Application.Common;
-
-public interface IUnitOfWork : IDisposable
-{
- ITransaction BeginTransaction();
- Task Commit();
- Task Rollback();
-}
-
-public interface ITransaction : IDisposable
-{
- Task Commit();
- Task Rollback();
-}
-```
-
-- [ ] **Step 4: 鎻愪氦搴旂敤灞傚熀纭�鎺ュ彛**
-
-```bash
-git add WIDESEAWCS_Application/
-git commit -m "feat: 娣诲姞搴旂敤灞傚熀纭�鎺ュ彛 - IRepository, IUnitOfWork"
-```
-
----
-
-### Task 3: 鍒涘缓鍩虹璁炬柦灞傞」鐩粨鏋�
-
-**Files:**
-- Create: `WIDESEAWCS_Infrastructure/WIDESEAWCS_Infrastructure.csproj`
-- Create: `WIDESEAWCS_Infrastructure/Persistence/InMemoryUnitOfWork.cs`
-- Create: `WIDESEAWCS_Infrastructure/Persistence/InMemoryTransaction.cs`
-
-- [ ] **Step 1: 鍒涘缓**鍩虹璁炬柦灞傞」鐩枃浠�**
-
-```xml
-<Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
- <ImplicitUsings>enable</ImplicitUsings>
- <Nullable>enable</Nullable>
- </PropertyGroup>
-
- <ItemGroup>
- <ProjectReference Include="..\WIDESEAWCS_Domain\WIDESEAWCS_Domain.csproj" />
- <ProjectReference Include="..\WIDESEAWCS_Application\WIDESEAWCS_Application.csproj" />
- <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
- </ItemGroup>
-</Project>
-```
-
-- [ ] **Step 2: 鍒涘缓鍐呭瓨宸ヤ綔鍗曞厓瀹炵幇**
-
-```csharp
-using WIDESEAWCS_Application.Common;
-
-namespace WIDESEAWCS_Infrastructure.Persistence;
-
-public class InMemoryUnitOfWork : IUnitOfWork
-{
- private readonly List<Action> _operations = new();
-
- public ITransaction BeginTransaction()
- {
- return new InMemoryTransaction(this);
- }
-
- public Task Commit()
- {
- foreach (var operation in _operations)
- {
- operation();
- }
- _operations.Clear();
- return Task.CompletedTask;
- }
-
- public Task Rollback()
- {
- _operations.Clear();
- return Task.CompletedTask;
- }
-
- public void Dispose()
- {
- _operations.Clear();
- }
-}
-```
-
-- [ ] **Step 3: 鍒涘缓鍐呭瓨浜嬪姟瀹炵幇**
-
-```csharp
-using WIDESEAWCS_Application.Common;
-
-namespace WIDESEAWCS_Infrastructure.Persistence;
-
-public class InMemoryTransaction : ITransaction
-{
- private readonly InMemoryUnitOfWork _unitOfWork;
- private bool _committed;
- private bool _rolledBack;
-
- public InMemoryTransaction(InMemoryUnitOfWork unitOfWork)
- {
- _unitOfWork = unitOfWork;
- }
-
- public Task Commit()
- {
- if (_rolledBack)
- throw new InvalidOperationException("Transaction already rolled back");
-
- _committed = true;
- return Task.CompletedTask;
- }
-
- public Task Rollback()
- {
- if (_committed)
- throw new InvalidOperationException("Transaction already committed");
-
- _rolledBack = true;
- return _unitOfWork.Rollback();
- }
-
- public void Dispose()
- {
- if (!_committed && !_rolledBack)
- {
- Rollback().GetAwaiter().GetResult();
- }
- }
-}
-```
-
-- [ ] **Step 4: 鎻愪氦鍩虹璁炬柦灞傚熀纭�瀹炵幇**
-
-```bash
-git add WIDESEAWCS_Infrastructure/
-git commit -m "feat: 娣诲姞鍩虹璁炬柦灞傚熀纭�瀹炵幇 - InMemoryUnitOfWork, InMemoryTransaction"
-```
-
----
-
-## Chunk 2: 璁惧绠$悊棰嗗煙瀹炵幇
-
-### Task 4: 瀹炵幇璁惧鍊煎璞�
-
-**Files:**
-- Create: `WIDESEAWCS_Domain/DeviceManagement/ValueObjects/DeviceId.cs`
-- Create: `WIDESEAWCS_Domain/DeviceManagement/ValueObjects/DeviceName.cs`
-- Create: `WIDESEAWCS_Domain/DeviceManagement/ValueObjects/DeviceAddress.cs`
-- Create: `WIDESEAWCS_Domain/DeviceManagement/ValueObjects/DeviceType.cs`
-- Create: `WIDESEAWCS_Domain/DeviceManagement/ValueObjects/DeviceStatus.cs`
-- Test: `WIDESEAWCS_Domain.Tests/DeviceManagement/ValueObjects/DeviceValueObjectsTests.cs`
-
-- [ ] **Step 1: 鍒涘缓璁惧ID鍊煎璞�**
-
-```csharp
-namespace WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-public record DeviceId(Guid Value)
-{
- public static DeviceId New() => new DeviceId(Guid.NewGuid());
- public static DeviceId From(Guid value) => new DeviceId(value);
-}
-```
-
-- [ ] **Step 2: 鍒涘缓璁惧鍚嶇О鍊煎璞�**
-
-```csharp
-namespace WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-public record DeviceName(string Value)
-{
- public DeviceName(string value)
- {
- if (string.IsNullOrWhiteSpace(value))
- throw new ArgumentException("璁惧鍚嶇О涓嶈兘涓虹┖", nameof(value));
- if (value.Length > 100)
- throw new ArgumentException("璁惧鍚嶇О闀垮害涓嶈兘瓒呰繃100涓瓧绗�", nameof(value));
- Value = value;
- }
-}
-```
-
-- [ ] **Step 3: 鍒涘缓璁惧鍦板潃鍊煎璞�**
-
-```csharp
-using System.Net;
-
-namespace WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-public record DeviceAddress(string Ip, int Port)
-{
- public DeviceAddress(string ip, int port)
- {
- if (!IPAddress.TryParse(ip, out _))
- throw new ArgumentException("IP鍦板潃鏍煎紡鏃犳晥", nameof(ip));
- if (port < 1 || port > 65535)
- throw new ArgumentException("绔彛鍙峰繀椤诲湪1-65535涔嬮棿", nameof(port));
- Ip = ip;
- Port = port;
- }
-}
-```
-
-- [ ] **Step 4: 鍒涘缓璁惧绫诲瀷鏋氫妇**
-
-```csharp
-namespace WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-public enum DeviceType
-{
- StackerCrane = 1, // 鍫嗗灈鏈�
- ConveyorLine = 2, // 杈撻�佺嚎
- ShuttleCar = 3, // 绌挎杞�
- Robot = 4, // 鏈烘鎵�
- AGV = 5 // 鑷姩瀵煎紩杞�
-}
-```
-
-- [ ] **Step 5: 鍒涘缓璁惧鐘舵�佹灇涓�**
-
-```csharp
-namespace WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-public enum DeviceStatus
-{
- Disconnected = 0, // 鏈繛鎺�
- Connecting = 1, // 杩炴帴涓�
- Connected = 2, // 宸茶繛鎺�
- Busy = 3, // 蹇欑
- Error = 4, // 閿欒
- Maintenance = 5 // 缁存姢涓�
-}
-```
-
-- [ ] **Step 6: 鎻愪氦璁惧鍊煎璞�**
-
-```bash
-git add WIDESEAWCS_Domain/DeviceManagement/ValueObjects/
-git commit -m "feat: 娣诲姞璁惧鍊煎璞� - DeviceId, DeviceName, DeviceAddress, DeviceType, DeviceStatus"
-```
-
----
-
-### Task 5: 瀹炵幇璁惧鑱氬悎鏍�
-
-**Files:**
-- Create: `WIDESEAWCS_Domain/DeviceManagement/Aggregates/Device.cs`
-- Create: `WIDESEAWCS_Domain/DeviceManagement/Events/DeviceConnectedEvent.cs`
-- Create: `WIDESEAWCS_Domain/DeviceManagement/Events/DeviceDisconnectedEvent.cs`
-- Create: `WIDESEAWCS_Domain/DeviceManagement/Events/DeviceHeartbeatEvent.cs`
-- Test: `WIDESEAWCS_Domain.Tests/DeviceManagement/Aggregates/DeviceTests.cs`
-
-- [ ] **Step 1: 鍒涘缓璁惧杩炴帴浜嬩欢**
-
-```csharp
-using WIDESEAWCS_Domain.Common;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-namespace WIDESEAWCS_Domain.DeviceManagement.Events;
-
-public record DeviceConnectedEvent : DomainEvent
-{
- public DeviceId DeviceId { get; init; }
- public DateTime ConnectedAt { get; init; } = DateTime.UtcNow;
-}
-```
-
-- [ ] **Step 2: 鍒涘缓璁惧鏂紑浜嬩欢**
-
-```csharp
-using WIDESEAWCS_Domain.Common;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-namespace WIDESEAWCS_Domain.DeviceManagement.Events;
-
-public record DeviceDisconnectedEvent : DomainEvent
-{
- public DeviceId DeviceId { get; init; }
- public string Reason { get; init; } = string.Empty;
-}
-```
-
-- [ ] **Step 3: 鍒涘缓璁惧蹇冭烦浜嬩欢**
-
-```csharp
-using WIDESEAWCS_Domain.Common;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-namespace WIDESEAWCS_Domain.DeviceManagement.Events;
-
-public record DeviceHeartbeatEvent : DomainEvent
-{
- public DeviceId DeviceId { get; init; }
- public DateTime HeartbeatAt { get; init; } = DateTime.UtcNow;
-}
-```
-
-- [ ] **Step 4: 鍒涘缓璁惧鑱氬悎鏍圭被**
-
-```csharp
-using WIDESEAWCS_Domain.Common;
-using WIDESEAWCS_Domain.DeviceManagement.Events;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-namespace WIDESEAW_Domain.DeviceManagement.Aggregates;
-
-public class Device : AggregateRoot<DeviceId>
-{
- private DeviceId _id;
- private DeviceName _name;
- private DeviceType _type;
- private DeviceStatus _status;
- private DeviceAddress? _address;
- private DateTime _lastConnectedAt;
- private DateTime _lastHeartbeatAt;
- private string? _errorMessage;
-
- public Device(DeviceId id, DeviceName name, DeviceType type)
- {
- _id = id;
- _name = name;
- _type = type;
- _status = DeviceStatus.Disconnected;
- _lastConnectedAt = DateTime.MinValue;
- _lastHeartbeatAt = DateTime.MinValue;
- }
-
- // 鍏叡灞炴�ц闂櫒
- public DeviceId Id => _id;
- public DeviceName Name => _name;
- public DeviceType Type => _type;
- public DeviceStatus Status => _status;
- public DeviceAddress? Address => _address;
- public DateTime LastConnectedAt => _lastConnectedAt;
- public DateTime LastHeartbeatAt => _lastHeartbeatAt;
- public string? ErrorMessage => _errorMessage;
-
- // 琛屼负鏂规硶
- public void Connect()
- {
- if (_status == DeviceStatus.Connected)
- throw new InvalidDomainOperationException("璁惧宸茶繛鎺ワ紝鏃犳硶閲嶅杩炴帴");
-
- _status = DeviceStatus.Connected;
- _lastConnectedAt = DateTime.UtcNow;
- _errorMessage = null;
- IncrementVersion();
-
- AddDomainEvent(new DeviceConnectedEvent
- {
- DeviceId = _id,
- ConnectedAt = _lastConnectedAt
- });
- }
-
- public void Disconnect(string reason)
- {
- if (_status == DeviceStatus.Disconnected)
- throw new InvalidDomainOperationException("璁惧宸叉柇寮�锛屾棤娉曢噸澶嶆柇寮�");
-
- _status = DeviceStatus.Disconnected;
- _errorMessage = reason;
- IncrementVersion();
-
- AddDomainEvent(new DeviceDisconnectedEvent
- {
- DeviceId = _id,
- Reason = reason
- });
- }
-
- public void UpdateHeartbeat()
- {
- if (_status != DeviceStatus.Connected && _status != DeviceStatus.Busy)
- throw new InvalidDomainOperationException("璁惧鏈繛鎺ユ垨蹇欑锛屾棤娉曟洿鏂板績璺�");
-
- _lastHeartbeatAt = DateTime.UtcNow;
- IncrementVersion();
-
- AddDomainEvent(new DeviceHeartbeatEvent
- {
- DeviceId = _id,
- HeartbeatAt = _lastHeartbeatAt
- });
- }
-
- public void SetAddress(DeviceAddress address)
- {
- _address = address;
- IncrementVersion();
- }
-
- // 鍐呴儴鏂规硶锛堜緵棰嗗煙鏈嶅姟浣跨敤锛�
- internal void SetStatus(DeviceStatus status)
- {
- _status = status;
- }
-
- internal void SetError(string errorMessage)
- {
- _status = DeviceStatus.Error;
- _errorMessage = errorMessage;
- IncrementVersion();
- }
-}
-```
-
-- [ ] **Step 5: 鎻愪氦璁惧鑱氬悎鏍瑰疄鐜�**
-
-```bash
-git add WIDESEAWCS_Domain/DeviceManagement/
-git commit -m "feat: 瀹炵幇璁惧鑱氬悎鏍瑰拰棰嗗煙浜嬩欢"
-```
-
----
-
-### Task 6: 瀹炵幇璁惧鐘舵�佹満
-
-**Files:**
-- Create: `WIDESEAWCS_Domain/DeviceManagement/Services/IDeviceStateMachine.cs`
-- Create: `WIDESEAWCS_Domain/DeviceManagement/Services/DeviceStateMachine.cs`
-
-- [ ] **Step 1: 鍒涘缓璁惧鐘舵�佹満鎺ュ彛**
-
-```csharp
-using WIDESEAWCS_Domain.DeviceManagement.Aggregates;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-namespace WIDESEAWCS_Domain.DeviceManagement.Services;
-
-public interface IDeviceStateMachine
-{
- bool CanTransition(DeviceStatus current, DeviceStatus target);
- void Transition(Device device, DeviceStatus target);
-}
-```
-
-- [ ] **Step 2: 鍒涘缓璁惧鐘舵�佹満瀹炵幇**
-
-```csharp
-using WIDESEAWCS_Domain.DeviceManagement.Aggregates;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-using WIDESEAWCS_Domain.Common;
-
-namespace WIDESEAWCS_Domain.DeviceManagement.Services;
-
-public class DeviceStateMachine : IDeviceStateMachine
-{
- private static readonly Dictionary<DeviceStatus, HashSet<DeviceStatus>> _transitions = new()
- {
- [DeviceStatus.Disconnected] = new()
- {
- DeviceStatus.Connecting,
- DeviceStatus.Maintenance
- },
- [DeviceStatus.Connecting] = new()
- {
- DeviceStatus.Connected,
- DeviceStatus.Error
- },
- [DeviceStatus.Connected] = new()
- {
- DeviceStatus.Busy,
- DeviceStatus.Disconnected,
- DeviceStatus.Error,
- DeviceStatus.Maintenance
- },
- [DeviceStatus.Busy] = new()
- {
- DeviceStatus.Connected,
- DeviceStatus.Error
- },
- [DeviceStatus.Error] = new()
- {
- DeviceStatus.Disconnected,
- DeviceStatus.Maintenance
- },
- [DeviceStatus.Maintenance] = new()
- {
- DeviceStatus.Disconnected
- }
- };
-
- public bool CanTransition(DeviceStatus current, DeviceStatus target)
- {
- if (!_transitions.TryGetValue(current, out var allowed))
- return false;
-
- return allowed.Contains(target);
- }
-
- public void Transition(Device device, DeviceStatus target)
- {
- if (!CanTransition(device.Status, target))
- {
- throw new InvalidDomainOperationException(
- $"鏃犳晥鐨勭姸鎬佽浆鎹�: {device.Status} -> {target}");
- }
-
- device.SetStatus(target);
- }
-}
-```
-
-- [ ] **Step 3: 鎻愪氦璁惧鐘舵�佹満瀹炵幇**
-
-```bash
-git add WIDESEAWCS_Domain/DeviceManagement/Services/
-git commit -m "feat: 瀹炵幇璁惧鐘舵�佹満棰嗗煙鏈嶅姟"
-```
-
----
-
-### Task 7: 瀹炵幇璁惧浠撳偍鎺ュ彛鍜屽疄鐜�
-
-**Files:**
-- Create: `WIDESEAWCS_Application/DeviceManagement/Repositories/IDeviceRepository.cs`
-- Create: `WIDESEAWCS_Infrastructure/Persistence/Repositories/InMemoryDeviceRepository.cs`
-
-- [ ] **Step 1: 鍒涘缓璁惧浠撳偍鎺ュ彛**
-
-```csharp
-using WIDESEAWCS_Application.Common;
-using WIDESEAWCS_Domain.DeviceManagement.Aggregates;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-namespace WIDESEAWCS_Application.DeviceManagement.Repositories;
-
-public interface IDeviceRepository : IRepository<Device, DeviceId>
-{
- Task<Device?> GetByName(DeviceName name);
- Task<IEnumerable<Device>> GetByType(DeviceType type);
- Task<IEnumerable<Device>> GetByStatus(DeviceStatus status);
- Task<IEnumerable<Device>> GetAllConnected();
-}
-```
-
-- [ ] **Step 2: 鍒涘缓鍐呭瓨璁惧浠撳偍瀹炵幇**
-
-```csharp
-using WIDESEAWCS_Application.Common;
-using WIDESEAWCS_Application.DeviceManagement.Repositories;
-using WIDESEAWCS_Domain.DeviceManagement.Aggregates;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-namespace WIDESEAWCS_Infrastructure.Persistence.Repositories;
-
-public class InMemoryDeviceRepository : IDeviceRepository
-{
- private readonly Dictionary<DeviceId, Device> _devices = new();
-
- public Task<Device?> GetById(DeviceId id)
- {
- _devices.TryGetValue(id, out var device);
- return Task.FromResult(device);
- }
-
- public Task Add(Device entity)
- {
- _devices[entity.Id] = entity;
- return Task.CompletedTask;
- }
-
- public Task Update(Device entity)
- {
- _devices[entity.Id] = entity;
- return Task.CompletedTask;
- }
-
- public Task Delete(DeviceId id)
- {
- _devices.Remove(id);
- return Task.CompletedTask;
- }
-
- public async Task<Device?> GetByName(DeviceName name)
- {
- var device = _devices.Values.FirstOrDefault(d => d.Name == name);
- return Task.FromResult(device);
- }
-
- public async Task<IEnumerable<Device>> GetByType(DeviceType type)
- {
- var devices = _devices.Values.Where(d => d.Type == type);
- return Task.FromResult(devices);
- }
-
- public async Task<IEnumerable<Device>> GetByStatus(DeviceStatus status)
- {
- var devices = _devices.Values.Where(d => d.Status == status);
- return Task.FromResult(devices);
- }
-
- public async Task<IEnumerable<Device>> GetAllConnected()
- {
- var devices = _devices.Values.Where(d => d.Status == DeviceStatus.Connected);
- return Task.FromResult(devices);
- }
-}
-```
-
-- [ ] **Step 3: 鎻愪氦璁惧浠撳偍瀹炵幇**
-
-```bash
-git add WIDESEAWCS_Application/DeviceManagement/Repositories/ WIDESEAWCS_Infrastructure/Persistence/Repositories/
-git commit -m "feat: 瀹炵幇璁惧浠撳偍鎺ュ彛鍜屽唴瀛樺疄鐜�"
-```
-
----
-
-## Chunk 3: 搴旂敤鏈嶅姟瀹炵幇
-
-### Task 8: 瀹炵幇璁惧搴旂敤鏈嶅姟
-
-**Files:**
-- Create: `WIDESEAWCS_Application/DeviceManagement/Services/DeviceApplicationService.cs`
-- Create: `WIDESEAWCS_Application/DeviceManagement/DTOs/DeviceDto.cs`
-
-- [ ] **Step 1: 鍒涘缓璁惧DTO**
-
-```csharp
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-
-namespace WIDESEAWCS_Application.DeviceManagement.DTOs;
-
-public record DeviceDto
-{
- public Guid Id { get; init; }
- public string Name { get; init; } = string.Empty;
- public DeviceType Type { get; init; }
- public DeviceStatus Status { get; init; }
- public string? Ip { get; init; }
- public int? Port { get; init; }
- public DateTime LastConnectedAt { get; init; }
- public DateTime LastHeartbeatAt { get; init; }
- public string? ErrorMessage { get; init; }
-}
-```
-
-- [ ] **Step 2: 鍒涘缓璁惧搴旂敤鏈嶅姟**
-
-```csharp
-using WIDESEAWCS_Application.Common;
-using WIDESEAWCS_Application.DeviceManagement.DTOs;
-using WIDESEAWCS_Application.DeviceManagement.Repositories;
-using WIDESEAWCS_Domain.DeviceManagement.Aggregates;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-using WIDESEAWCS_Domain.Common;
-
-namespace WIDESEAWCS_Application.DeviceManagement.Services;
-
-public class DeviceApplicationService
-{
- private readonly IDeviceRepository _deviceRepository;
- private readonly IUnitOfWork _unitOfWork;
-
- public DeviceApplicationService(
- IDeviceRepository deviceRepository,
- IUnitOfWork unitOfWork)
- {
- _deviceRepository = deviceRepository;
- _unitOfWork = unitOfWork;
- }
-
- public async Task<DeviceDto?> GetDevice(Guid id)
- {
- var deviceId = DeviceId.From(id);
- var device = await _deviceRepository.GetById(deviceId);
- return device?.ToDto();
- }
-
- public async Task<DeviceDto> CreateDevice(string name, DeviceType type, string ip, int port)
- {
- await using var transaction = _unitOfWork.BeginTransaction();
-
- var deviceId = DeviceId.New();
- var deviceName = new DeviceName(name);
- var device = new Device(deviceId, deviceName, type);
- device.SetAddress(new DeviceAddress(ip, port));
-
- await _deviceRepository.Add(device);
- await transaction.Commit();
- await _unitOfWork.Commit();
-
- return device.ToDto();
- }
-
- public async Task ConnectDevice(Guid id)
- {
- var deviceId = DeviceId.From(id);
- var device = await _deviceRepository.GetById(deviceId);
-
- if (device == null)
- throw new DomainException($"璁惧涓嶅瓨鍦�: {id}", "DEVICE_NOT_FOUND");
-
- device.Connect();
- await _deviceRepository.Update(device);
- }
-
- public async Task DisconnectDevice(Guid id, string reason)
- {
- var deviceId = DeviceId.From(id);
- var device = await _deviceRepository.GetById(deviceId);
-
- if (device == null)
- throw new DomainException($"璁惧涓嶅瓨鍦�: {id}", "DEVICE_NOT_FOUND");
-
- device.Disconnect(reason);
- await _deviceRepository.Update(device);
- }
-
- public async Task<IEnumerable<DeviceDto>> GetConnectedDevices()
- {
- var devices = await _deviceRepository.GetAllConnected();
- return devices.Select(d => d.ToDto());
- }
-}
-```
-
-- [ ] **Step 3: 鍦―evice绫讳腑娣诲姞ToDto鎵╁睍鏂规硶**
-
-```csharp
-// 鍦� WIDESEAWCS_Domain/DeviceManagement/Aggregates/DeviceExtensions.cs 涓垱寤�
-using WIDESEAWCS_Application.DeviceManagement.DTOs;
-
-namespace WIDESEAWCS_Domain.DeviceManagement.Aggregates;
-
-public static class DeviceExtensions
-{
- public static DeviceDto ToDto(this Device device)
- {
- return new DeviceDto
- {
- Id = device.Id.Value,
- Name = device.Name.Value,
- Type = device.Type,
- Status = device.Status,
- Ip = device.Address?.Ip,
- Port = device.Address?.Port,
- LastConnectedAt = device.LastConnectedAt,
- LastHeartbeatAt = device.LastHeartbeatAt,
- ErrorMessage = device.ErrorMessage
- };
- }
-}
-```
-
-- [ ] **Step 4: 鎻愪氦璁惧搴旂敤鏈嶅姟瀹炵幇**
-
-```bash
-git add WIDESEAWCS_Application/DeviceManagement/ WIDESEAWCS_Domain/DeviceManagement/Aggregates/DeviceExtensions.cs
-git commit -m "feat: 瀹炵幇璁惧搴旂敤鏈嶅姟鍜孌TO"
-```
-
----
-
-## Chunk 4: 闆嗘垚鍜岄獙璇�
-
-### Task 9: 閰嶇疆渚濊禆娉ㄥ叆
-
-**Files:**
-- Create: `WIDESEAWCS_Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs`
-
-- [ ] **Step 1: 鍒涘缓鏈嶅姟娉ㄥ唽鎵╁睍**
-
-```csharp
-using Microsoft.Extensions.DependencyInjection;
-using WIDESEAWCS_Application.Common;
-using WIDESEAWCS_Application.DeviceManagement.Repositories;
-using WIDESEAWCS_Application.DeviceManagement.Services;
-using WIDESEAWCS_Infrastructure.Persistence;
-using WIDESEAWCS_Infrastructure.Persistence.Repositories;
-using WIDESEAWCS_Domain.DeviceManagement.Services;
-
-namespace WIDESEAWCS_Infrastructure.DependencyInjection;
-
-public static class ServiceCollectionExtensions
-{
- public static IServiceCollection AddDeviceManagementServices(this IServiceCollection services)
- {
- // 娉ㄥ唽棰嗗煙鏈嶅姟
- services.AddSingleton<IDeviceStateMachine, DeviceStateMachine>();
-
- // 娉ㄥ唽浠撳偍
- services.AddSingleton<IDeviceRepository, InMemoryDeviceRepository>();
-
- // 娉ㄥ唽宸ヤ綔鍗曞厓
- services.AddSingleton<IUnitOfWork, InMemoryUnitOfWork>();
-
- // 娉ㄥ唽搴旂敤鏈嶅姟
- services.AddScoped<DeviceApplicationService>();
-
- return services;
- }
-}
-```
-
-- [ ] **Step 2: 鎻愪氦渚濊禆娉ㄥ叆閰嶇疆**
-
-```bash
-git add WIDESEAWCS_Infrastructure/DependencyInjection/
-git commit -m "feat: 閰嶇疆璁惧绠$悊鏈嶅姟渚濊禆娉ㄥ叆"
-```
-
----
-
-### Task 10: 闆嗘垚娴嬭瘯
-
-**Files:**
-- Create: `WIDESEAWCS_IntegrationTests/DeviceManagement/DeviceIntegrationTests.cs`
-
-- [ ] **Step 1: 鍒涘缓闆嗘垚娴嬭瘯**
-
-```csharp
-using Xunit;
-using Microsoft.Extensions.DependencyInjection;
-using WIDESEAWCS_Application.DeviceManagement.Services;
-using WIDESEAWCS_Domain.DeviceManagement.Aggregates;
-using WIDESEAWCS_Domain.DeviceManagement.ValueObjects;
-using WIDESEAWCS_Infrastructure.DependencyInjection;
-
-namespace WIDESEAWCS_IntegrationTests.DeviceManagement;
-
-public class DeviceIntegrationTests
-{
- private readonly IServiceProvider _serviceProvider;
- private readonly DeviceApplicationService _service;
-
- public DeviceIntegrationTests()
- {
- var services = new ServiceCollection();
- services.AddDeviceManagementServices();
- _serviceProvider = services.BuildServiceProvider();
- _service = _serviceProvider.GetRequiredService<DeviceApplicationService>();
- }
-
- [Fact]
- public async Task DeviceWorkflow_Should_CompleteSuccessfully()
- {
- // Arrange & Act - 鍒涘缓璁惧
- var device = await _service.CreateDevice("IntegrationTestDevice", DeviceType.StackerCrane, "127.0.0.1", 8080);
- Assert.NotEqual(Guid.Empty, device.Id);
- Assert.Equal(DeviceType.StackerCrane, device.Type);
- Assert.Equal("IntegrationTestDevice", device.Name.Value);
- Assert.Equal(DeviceStatus.Disconnected, device.Status);
-
- // Act - 杩炴帴璁惧
- await _service.ConnectDevice(device.Id);
- var connectedDevice = await _service.GetDevice(device.Id);
- Assert.NotNull(connectedDevice);
- Assert.Equal(DeviceStatus.Connected, connectedDevice!.Status);
-
- // Act - 鏂紑璁惧
- await _service.DisconnectDevice(device.Id, "Integration test disconnect");
- var disconnectedDevice = await _service.GetDevice(device.Id);
- Assert.NotNull(disconnectedDevice);
- Assert.Equal(DeviceStatus.Disconnected, disconnectedDevice!.Status);
- Assert.Equal("Integration test disconnect", disconnectedDevice!.ErrorMessage);
- }
-
- // Act - 鑾峰彇宸茶繛鎺ヨ澶�
- var connectedDevices = await _service.GetConnectedDevices();
- Assert.Single(connectedDevices);
- Assert.Equal("IntegrationTestDevice", connectedDevices.First().Name);
- }
-
- [Fact]
- public async Task GetConnectedDevices_Should_ReturnOnlyConnected()
- {
- // Arrange & Act - 鍒涘缓澶氫釜璁惧
- var device1 = await _service.CreateDevice("Device1", DeviceType.ConveyorLine, "127.0.0.2", 8081);
- var device2 = await _service.CreateDevice("Device2", DeviceType.ShuttleCar, "127.0.0.3", 8082);
-
- // Act - 鍙繛鎺ョ涓�涓澶�
- await _service.ConnectDevice(device1.Id);
-
- var connectedDevices = await _service.GetConnectedDevices();
- Assert.Single(connectedDevices);
- Assert.Equal("Device1", connectedDevices.First().Name);
- }
-}
-```
-
-- [ ] **Step 2: 鎻愪氦闆嗘垚娴嬭瘯**
-
-```bash
-git add WIDESEAWCS_IntegrationTests/DeviceManagement/
-git commit -m "test: 娣诲姞璁惧绠$悊闆嗘垚娴嬭瘯"
-```
-
----
-
-### Task 11: 鏇存柊鏂囨。
-
-**Files:**
-- Modify: `CLAUDE.md`
-
-- [ ] **Step 1: 鏇存柊CLAUDE.md娣诲姞DDD鏋舵瀯璇存槑**
-
-鍦–LAUDE.md涓坊鍔狅細
-```markdown
-## DDD鏋舵瀯瀹炴柦
-
-椤圭洰閲囩敤娓愯繘寮廌DD鏋舵瀯锛屽寘鍚互涓嬪眰娆★細
-
-### 棰嗗煙灞� (WIDESEAWCS_Domain)
-- 鑱氬悎鏍癸細Device, DeviceTask绛�
-- 鍊煎璞★細DeviceId, DeviceName, DeviceAddress绛�
-- 棰嗗煙鏈嶅姟锛欴eviceStateMachine, DeviceScheduler绛�
-- 棰嗗煙浜嬩欢锛欴eviceConnectedEvent, TaskCompletedEvent绛�
-
-### 搴旂敤灞� (WIDESEAWCS_Application)
-- 搴旂敤鏈嶅姟锛欴eviceApplicationService绛�
-- DTOs锛氳澶囥�佷换鍔$瓑鏁版嵁浼犺緭瀵硅薄
-- 浠撳偍鎺ュ彛锛欼DeviceRepository, ITaskRepository绛�
-- 宸ヤ綔鍗曞厓锛欼UnitOfWork
-
-### 鍩虹璁炬柦灞� (WIDESEAWCS_Infrastructure)
-- 浠撳偍瀹炵幇锛欼nMemoryDeviceRepository, DeviceRepository绛�
-- 鏁版嵁鎸佷箙鍖栵細SqlSugar闆嗘垚
-- 缂撳瓨锛歊edis缂撳瓨瀹炵幇
-- 閫氫俊锛氳澶囬�氫俊閫傞厤鍣�
-
-### 鐗规�у紑鍏�
-鏀寔鏂版棫浠g爜鍏卞瓨锛屽彲閫氳繃閰嶇疆鎺у埗锛�
-```json
-"FeatureFlags": {
- "UseNewDeviceManagement": true,
- "UseNewTaskScheduler": false
-}
-```
-```
-
-- [ ] **Step 2: 鎻愪氦鏂囨。鏇存柊**
-
-```bash
-git add CLAUDE.md
-git commit -m "docs: 鏇存柊CLAUDE.md娣诲姞DDD鏋舵瀯璇存槑"
-```
-
----
-
-### Task 12: 鎬荤粨鍜屽悗缁楠�
-
-- [ ] **Step 1: 鏌ョ湅鎵�鏈夋彁浜�**
-
-```bash
-git log --oneline --graph
-```
-
-- [ ] **Step 2: 鏄剧ず鎬荤粨淇℃伅**
-
-鏈瀹炴柦璁″垝宸插畬鎴愰樁娈�1-4锛屽叡11涓换鍔★細
-
-**宸插畬鎴愮殑宸ヤ綔**锛�
-1. 鍩虹璁炬柦鎼缓锛欴DD鍩虹绫汇�佸簲鐢ㄥ眰鎺ュ彛銆佸熀纭�璁炬柦灞傚疄鐜�
-2. 璁惧绠$悊棰嗗煙锛氳澶囧�煎璞°�佽仛鍚堟牴銆佺姸鎬佹満銆佷粨鍌�
-3. 搴旂敤灞傚疄鐜帮細璁惧搴旂敤鏈嶅姟銆丏TO銆佹墿灞曟柟娉�
-4. 闆嗘垚楠岃瘉锛氫緷璧栨敞鍏ラ厤缃�侀泦鎴愭祴璇�
-5. 鏂囨。鏇存柊锛欳LAUDE.md
-
-**涓嬩竴姝ュ缓璁�**锛�
-1. 缂栧啓瀹屾暣鐨勫崟鍏冩祴璇曞拰闆嗘垚娴嬭瘯
-2. 瀹炵幇SqlSugar浠撳偍瀹炵幇锛堟浛鎹㈠唴瀛樺疄鐜帮級
-3. 瀹炵幇缂撳瓨浼樺寲锛圧edis闆嗘垚锛�
-4. 閰嶇疆鐗规�у紑鍏虫敮鎸佹柊鏃т唬鐮佸叡瀛�
-5. 缂栧啓API鎺у埗鍣紙DeviceController锛�
-6. 杩涜鎬ц兘娴嬭瘯鍜屼紭鍖�
-7. 鍒涘缓Pull Request鍚堝苟鍒癿aster鍒嗘敮
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-11-wcs-ddd-refactor-design.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-11-wcs-ddd-refactor-design.md
deleted file mode 100644
index 881505e..0000000
--- a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/specs/2026-03-11-wcs-ddd-refactor-design.md
+++ /dev/null
@@ -1,934 +0,0 @@
-# WCS绯荤粺娓愯繘寮廌DD閲嶆瀯璁捐鏂囨。
-
-**鍒涘缓鏃ユ湡**: 2026-03-11
-**鐗堟湰**: 1.0
-**鑼冨洿**: 鍏ㄧ郴缁熼噸鏋勶紙娓愯繘寮廌DD锛�
-
-## 1. 鏋舵瀯鎬昏
-
-鍩轰簬鎮ㄧ殑闇�姹傦紝鎴戝皢鎻愬嚭涓�涓�傚悎2鍛ㄦ椂闂寸獥鍙g殑娓愯繘寮廌DD閲嶆瀯鏂规銆�
-
-```
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 琛ㄧ幇灞� (API) 鈹�
-鈹� WIDESEAWCS_Server (ASP.NET Core Controllers) 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
- 鈹�
- 鈻�
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 搴旂敤灞� 鈹�
-鈹� 搴旂敤鏈嶅姟 / DTO / 鍛戒护 / 鏌ヨ 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
- 鈹�
- 鈻�
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 棰嗗煙灞� (鏂板) 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� 璁惧绠$悊棰嗗煙 鈹� 鈹�
-鈹� 鈹� 鈥� 鑱氬悎鏍�: 璁惧, 璁惧缁�, 璁惧浠诲姟 鈹� 鈹�
-鈹� 鈹� 鈥� 瀹炰綋: 璁惧鐘舵��, 璁惧浣嶇疆, 璁惧灞炴�� 鈹� 鈹�
-鈹� 鈹� 鈥� 鍊煎璞�: 璁惧ID, 鍦板潃, 鐘舵�佹灇涓� 鈹� 鈹�
-鈹� 鈹� 鈥� 棰嗗煙鏈嶅姟: 璁惧璋冨害鍣�, 鐘舵�佹満 鈹� 鈹�
-鈹� 鈹� 鈥� 浠撳偍鎺ュ彛: IDeviceRepository, IDeviceTaskRepository 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� 浠撳偍浣滀笟棰嗗煙 鈹� 鈹�
-鈹� 鈹� 鈥� 鑱氬悎鏍�: 浣滀笟, 鎵樼洏, 搴撲綅 鈹� 鈹�
-鈹� 鈹� 鈥� 棰嗗煙浜嬩欢: 浣滀笟瀹屾垚, 浣滀笟寮傚父 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹� 鈹� 绯荤粺闆嗘垚棰嗗煙 鈹� 鈹�
-鈹� 鈹� 鈥� 闆嗘垚鏈嶅姟: WMS闆嗘垚, MES闆嗘垚, ERP闆嗘垚 鈹� 鈹�
-鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
- 鈹�
- 鈻�
-鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-鈹� 鍩虹璁炬柦灞� 鈹�
-鈹� 鈥� 浠撳偍瀹炵幇 (SqlSugar ORM) 鈹�
-鈹� 鈥� 閫氫俊椹卞姩 (HslCommunication) 鈹�
-鈹� 鈥� 缂撳瓨鏈嶅姟 (Redis) 鈹�
-鈹� 鈥� 浠诲姟璋冨害 (Quartz.NET) 鈹�
-鈹� 鈥� 鏁版嵁搴撹闂� (SqlSugar) 鈹�
-鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
-```
-
----
-
-## 2. 棰嗗煙灞傝璁� - 璁惧绠$悊棰嗗煙锛堟牳蹇冿級
-
-### 2.1 鑱氬悎鏍硅璁�
-
-```csharp
-// 璁惧鑱氬悎鏍�
-public class Device : AggregateRoot<DeviceId>
-{
- // 鍩烘湰灞炴��
- private DeviceId _id;
- private DeviceName _name;
- private DeviceType _type;
- private DeviceStatus _status;
- private DeviceAddress _address;
- private List<DeviceProperty> _properties;
-
- // 鐘舵�佺鐞�
- private DateTime _lastConnectedAt;
- private DateTime _lastHeartbeatAt;
- private string _errorMessage;
-
- // 棰嗗煙浜嬩欢
- private List<IDomainEvent> _domainEvents = new();
-
- // 鍏叡灞炴�ц闂櫒
- public DeviceId Id => _id;
- public DeviceName Name => _name;
- public DeviceType Type => _type;
- public DeviceStatus Status => _status;
- public DeviceAddress Address => _address;
- public DateTime LastConnectedAt => _lastConnectedAt;
- public DateTime LastHeartbeatAt => _lastHeartbeatAt;
-
- // 琛屼负鏂规硶
- public void Connect()
- {
- if (_status == DeviceStatus.Connected)
- throw new DomainException("璁惧宸茶繛鎺�");
-
- _status = DeviceStatus.Connected;
- _lastConnectedAt = DateTime.UtcNow;
- _domainEvents.Add(new DeviceConnectedEvent(_id));
- }
-
- public void Disconnect(string reason)
- {
- _status = DeviceStatus.Disconnected;
- _errorMessage = reason;
- _domainEvents.Add(new DeviceDisconnectedEvent(_id, reason));
- }
-
- public void UpdateHeartbeat()
- {
- _lastHeartbeatAt = DateTime.UtcNow;
- _domainEvents.Add(new DeviceHeartbeatEvent(_id));
- }
-
- public void SetProperty(string key, string value)
- {
- var property = _properties.FirstOrDefault(p => p.Key == key);
- if (property != null)
- property.UpdateValue(value);
- else
- _properties.Add(DeviceProperty.Create(key, value));
- }
-
- // 鐘舵�佽缃柟娉曪紙渚涚姸鎬佹満浣跨敤锛�
- internal void SetStatus(DeviceStatus status)
- {
- _status = status;
- }
-
- public IReadOnlyCollection<IDomainEvent> GetDomainEvents() => _domainEvents.AsReadOnly();
- public void ClearDomainEvents() => _domainEvents.Clear();
-}
-
-// 璁惧缁勮仛鍚堟牴
-public class DeviceGroup : AggregateRoot<DeviceGroupId>
-{
- private DeviceGroupId _id;
- private DeviceGroupName _name;
- private List<DeviceId> _deviceIds;
- private GroupStrategy _strategy;
- private int _currentIndex;
- private static readonly Random _random = Random.Shared;
-
-// 璁惧缁勮仛鍚堟牴锛堢户缁級
- public void AddDevice(DeviceId deviceId)
- {
- if (_deviceIds.Contains(deviceId))
- throw new DomainException("璁惧宸插湪缁勫唴");
- _deviceIds.Add(deviceId);
- }
-
- public void RemoveDevice(DeviceId deviceId)
- {
- _deviceIds.Remove(deviceId);
- }
-
- // 杞绛栫暐
- public DeviceId GetNextDevice()
- {
- if (!_deviceIds.Any())
- throw new DomainException("璁惧缁勪负绌�");
-
- switch (_strategy)
- {
- case GroupStrategy.RoundRobin:
- return _deviceIds[_currentIndex++ % _deviceIds.Count];
- case GroupStrategy.Random:
- return _deviceIds[_random.Next(_deviceIds.Count)];
- default:
- return _deviceIds[0];
- }
- }
-}
-
-// 璁惧浠诲姟鑱氬悎鏍�
-public class DeviceTask : AggregateRoot<DeviceTaskId>
-{
- private DeviceTaskId _id;
- private DeviceId _deviceId;
- private TaskType _type;
- private TaskStatus _status;
- private TaskPriority _priority;
- private TaskPayload _payload;
- private DateTime _createdAt;
- private DateTime? _startedAt;
- private DateTime? _completedAt;
- private string? _errorMessage;
- private List<IDomainEvent> _domainEvents = new();
-
- public void Start()
- {
- if (_status != TaskStatus.Pending)
- throw new DomainException("浠诲姟鐘舵�佷笉姝g‘");
-
- _status = TaskStatus.Running;
- _startedAt = DateTime.UtcNow;
- _domainEvents.Add(new TaskStartedEvent(_id, _deviceId));
- }
-
- public void Complete()
- {
- if (_status != TaskStatus.Running)
- throw new DomainException("浠诲姟鏈湪杩愯涓�");
-
- _status = TaskStatus.Completed;
- _completedAt = DateTime.UtcNow;
- _domainEvents.Add(new TaskCompletedEvent(_id, _deviceId));
- }
-
- public void Fail(string errorMessage)
- {
- _status = TaskStatus.Failed;
- _errorMessage = errorMessage;
- _completedAt = DateTime.UtcNow;
- _domainEvents.Add(new TaskFailedEvent(_id, _deviceId, errorMessage));
- }
-
- public IReadOnlyCollection<IDomainEvent> GetDomainEvents() => _domainEvents.AsReadOnly();
- public void ClearDomainEvents() => _domainEvents.Clear();
-}
-```
-
-### 2.2 鍊煎璞¤璁�
-
-```csharp
-// 璁惧ID鍊煎璞�
-public record DeviceId(Guid Value)
-{
- public static DeviceId New() => new DeviceId(Guid.NewGuid());
- public static DeviceId From(Guid value) => new DeviceId(value);
-}
-
-// 璁惧鍚嶇О鍊煎璞�
-public record DeviceName(string Value)
-{
- public DeviceName(string value)
- {
- if (string.IsNullOrWhiteSpace(value) || value.Length > 100)
- throw new ArgumentException("璁惧鍚嶇О鏃犳晥");
- Value = value;
- }
-}
-
-// 璁惧绫诲瀷鏋氫妇
-public enum DeviceType
-{
- StackerCrane, // 鍫嗗灈鏈�
- ConveyorLine, // 杈撻�佺嚎
- ShuttleCar, // 绌挎杞�
- Robot, // 鏈烘鎵�
- AGV // 鑷姩瀵煎紩杞�
-}
-
-// 璁惧鐘舵�佹灇涓�
-public enum DeviceStatus
-{
- Disconnected, // 鏈繛鎺�
- Connecting, // 杩炴帴涓�
- Connected, // 宸茶繛鎺�
- Busy, // 蹇欑
- Error, // 閿欒
- Maintenance // 缁存姢涓�
-}
-
-// 璁惧鍦板潃鍊煎璞�
-public record DeviceAddress(string Ip, int Port)
-{
- public DeviceAddress(string ip, int port)
- {
- if (!IPAddress.TryParse(ip, out _))
- throw new ArgumentException("IP鍦板潃鏃犳晥");
- if (port < 1 || port > 65535)
- throw new ArgumentException("绔彛鏃犳晥");
- Ip = ip;
- Port = port;
- }
-}
-```
-
-### 2.3 棰嗗煙鏈嶅姟璁捐
-
-```csharp
-// 璁惧璋冨害棰嗗煙鏈嶅姟
-public interface IDeviceScheduler
-{
- Task<DeviceTask> CreateTask(DeviceId deviceId, TaskType type, TaskPayload payload);
- Task<DeviceTask> AssignTask(DeviceId deviceId);
- Task CompleteTask(DeviceTaskId taskId);
- Task FailTask(DeviceTaskId taskId, string errorMessage);
-}
-
-public class DeviceScheduler : IDeviceScheduler
-{
- private readonly IDeviceTaskRepository _taskRepository;
- private readonly IDeviceRepository _deviceRepository;
- private readonly ITaskQueue _taskQueue;
-
- public async Task<DeviceTask> CreateTask(DeviceId deviceId, TaskType type, TaskPayload payload)
- {
- var device = await _deviceRepository.GetById(deviceId);
- if (device == null)
- throw new DomainException("璁惧涓嶅瓨鍦�");
-
- if (device.Status != DeviceStatus.Connected)
- throw new DomainException("璁惧鏈繛鎺�");
-
- var task = DeviceTask.Create(deviceId, type, payload);
- await _taskRepository.Add(task);
- await _taskQueue.Enqueue(task);
-
- return task;
- }
-
- public async Task<DeviceTask> AssignTask(DeviceId deviceId)
- {
- var tasks = await _taskRepository.GetPendingTasksForDevice(deviceId);
- if (!tasks.Any())
- return null;
-
- var task = tasks.OrderBy(t => t.Priority).First();
- task.Start();
- await _taskRepository.Update(task);
-
- return task;
- }
-}
-
-// 璁惧鐘舵�佹満棰嗗煙鏈嶅姟
-public interface IDeviceStateMachine
-{
- bool CanTransition(DeviceStatus current, DeviceStatus target);
- void Transition(Device device, DeviceStatus target);
-}
-
-public class DeviceStateMachine : IDeviceStateMachine
-{
- private static readonly Dictionary<DeviceStatus, HashSet<DeviceStatus>> _transitions = new()
- {
- [DeviceStatus.Disconnected] = new() { DeviceStatus.Connecting, DeviceStatus.Maintenance },
- [DeviceStatus.Connecting] = new() { DeviceStatus.Connected, DeviceStatus.Error },
- [DeviceStatus.Connected] = new() { DeviceStatus.Busy, DeviceStatus.Disconnected, DeviceStatus.Error, DeviceStatus.Maintenance },
- [DeviceStatus.Busy] = new() { DeviceStatus.Connected, DeviceStatus.Error },
- [DeviceStatus.Error] = new() { DeviceStatus.Disconnected, DeviceStatus.Maintenance },
- [DeviceStatus.Maintenance] = new() { DeviceStatus.Disconnected }
- };
-
- public bool CanTransition(DeviceStatus current, DeviceStatus target)
- {
- return _transitions.TryGetValue(current, out var allowed) && allowed.Contains(target);
- }
-
- public void Transition(Device device, DeviceStatus target)
- {
- if (!CanTransition(device.Status, target))
- throw new DomainException($"鏃犳晥鐨勭姸鎬佽浆鎹�: {device.Status} -> {target}");
-
- device.SetStatus(target);
- }
-}
-```
-
-### 2.4 鍩虹璁炬柦绫诲畾涔�
-
-```csharp
-// 鑱氬悎鏍瑰熀绫�
-public abstract class AggregateRoot<TId>
-{
- public TId Id { get; protected set; }
- public int Version { get; private set; }
- private readonly List<IDomainEvent> _domainEvents = new();
-
- protected AggregateRoot() { }
-
- protected AggregateRoot(TId id)
- {
- Id = id;
- }
-
- public IReadOnlyCollection<IDomainEvent> GetDomainEvents() => _domainEvents.AsReadOnly();
- public void ClearDomainEvents() => _domainEvents.Clear();
-
- protected void AddDomainEvent(IDomainEvent domainEvent)
- {
- _domainEvents.Add(domainEvent);
- }
-}
-
-// 棰嗗煙浜嬩欢鎺ュ彛
-public interface IDomainEvent
-{
- DateTime OccurredOn { get; }
-}
-
-// 棰嗗煙浜嬩欢鍩虹被
-public abstract record DomainEvent : IDomainEvent
-{
- public DateTime OccurredOn { get; init; } = DateTime.UtcNow;
-}
-
-// 棰嗗煙浜嬩欢璋冨害鍣ㄦ帴鍙�
-public interface IDomainEventDispatcher
-{
- Task Dispatch(IDomainEvent domainEvent);
- Task DispatchAsync(IEnumerable<IDomainEvent> domainEvents);
-}
-
-// 浠诲姟闃熷垪鎺ュ彛
-public interface ITaskQueue
-{
- Task Enqueue<T>(T item) where T : class;
- Task<T> Dequeue<T>() where T : class;
- Task<int> Count();
-}
-
-// 浠撳偍鍩烘帴鍙�
-public interface IRepository<TEntity, TId> where TEntity : AggregateRoot<TId>
-{
- Task<TEntity?> GetById(TId id);
- Task Add(TEntity entity);
- Task Update(TEntity entity);
- Task Delete(TId id);
-}
-
-// 宸ヤ綔鍗曞厓鎺ュ彛
-public interface IUnitOfWork : IDisposable
-{
- ITransaction BeginTransaction();
- Task Commit();
- Task Rollback();
-}
-
-public interface ITransaction : IDisposable
-{
- Task Commit();
- Task Rollback();
-}
-```
-
-### 2.5 浠撳偍鎺ュ彛璁捐
-
-```csharp
-// 璁惧浠撳偍鎺ュ彛
-public interface IDeviceRepository : IRepository<Device, DeviceId>
-{
- Task<Device?> GetByName(DeviceName name);
- Task<IEnumerable<Device>> GetByType(DeviceType type);
- Task<IEnumerable<Device>> GetByStatus(DeviceStatus status);
- Task<IEnumerable<Device>> GetAllConnected();
-}
-
-// 璁惧浠诲姟浠撳偍鎺ュ彛
-public interface IDeviceTaskRepository : IRepository<DeviceTask, DeviceTaskId>
-{
- Task<IEnumerable<DeviceTask>> GetPendingTasksForDevice(DeviceId deviceId);
- Task<IEnumerable<DeviceTask>> GetRunningTasksForDevice(DeviceId deviceId);
- Task<IEnumerable<DeviceTask>> GetTasksByStatus(TaskStatus status);
-}
-```
-
----
-
-## 3. 搴旂敤灞傝璁�
-
-### 3.1 搴旂敤鏈嶅姟璁捐
-
-```csharp
-// 璁惧搴旂敤鏈嶅姟
-public class DeviceApplicationService
-{
- private readonly IDeviceRepository _deviceRepository;
- private readonly IDeviceScheduler _deviceScheduler;
- private readonly IUnitOfWork _unitOfWork;
-
- public async Task<DeviceDto> GetDevice(DeviceId id)
- {
- var device = await _deviceRepository.GetById(id);
- return device.ToDto();
- }
-
- public async Task<DeviceTaskDto> CreateTask(CreateDeviceTaskCommand command)
- {
- await using var transaction = await _unitOfWork.BeginTransaction();
-
- var deviceId = DeviceId.From(command.DeviceId);
- var task = await _deviceScheduler.CreateTask(
- deviceId,
- command.Type,
- new TaskPayload(command.Payload)
- );
-
- await _unitOfWork.Commit();
- return task.ToDto();
- }
-
- public async Task CompleteTask(CompleteDeviceTaskCommand command)
- {
- var taskId = DeviceTaskId.From(command.TaskId);
- await _deviceScheduler.CompleteTask(taskId);
- }
-}
-
-// 鍛戒护鍜屾煡璇㈠璞�
-public record CreateDeviceTaskCommand(Guid DeviceId, TaskType Type, string Payload);
-public record CompleteDeviceTaskCommand(Guid TaskId);
-
-// DTO
-public record DeviceDto(Guid Id, string Name, DeviceType Type, DeviceStatus Status);
-public record DeviceTaskDto(Guid Id, Guid DeviceId, TaskType Type, TaskStatus Status);
-```
-
----
-
-## 4. 鍩虹璁炬柦灞傞噸鏋�
-
-### 4.1 浠撳偍瀹炵幇
-
-```csharp
-// 璁惧浠撳偍瀹炵幇
-public class DeviceRepository : IDeviceRepository
-{
- private readonly ISqlSugarClient _db;
- private readonly ICacheService _cache;
-
- public DeviceRepository(ISqlSugarClient db, ICacheService cache)
- {
- _db = db;
- _cache = cache;
- }
-
- public async Task<Device?> GetById(DeviceId id)
- {
- // 鍏堟煡缂撳瓨
- var cached = await _cache.Get<Device>($"device:{id.Value}");
- if (cached != null)
- return cached;
-
- // 鏌ユ暟鎹簱
- var entity = await _db.Queryable<Dt_DeviceInfo>()
- .Where(d => d.DeviceId == id.Value)
- .FirstAsync();
-
- if (entity == null) return null;
-
- // 杞崲涓洪鍩熸ā鍨�
- var device = MapToDomain(entity);
-
- // 鍐欏叆缂撳瓨
- await _cache.Set($"device:{id.Value}", device, TimeSpan.FromMinutes(5));
-
- return device;
- }
-
- public async Task Add(Device device)
- {
- var entity = MapToEntity(device);
- await _db.Insertable(entity).ExecuteCommandAsync();
-
- // 娓呴櫎鐩稿叧缂撳瓨
- await _cache.RemoveByPrefix("device:");
- }
-
- private Device MapToDomain(Dt_DeviceInfo entity) { /* ... */ }
- private Dt_DeviceInfo MapToEntity(Device domain) { /* ... */ }
-}
-```
-
-### 4.2 閫氫俊椹卞姩灏佽
-
-```csharp
-// 璁惧閫氫俊閫傞厤鍣ㄦ帴鍙�
-public interface IDeviceCommunicatorAdapter
-{
- Task<bool> Connect(DeviceAddress address);
- Task<bool> Disconnect();
- Task<DeviceData> ReadData(string address);
- Task WriteData(string address, object value);
- Task<bool> IsConnected();
-}
-
-// Siemens PLC閫傞厤鍣�
-public class SiemensCommunicatorAdapter : IDeviceCommunicatorAdapter
-{
- private readonly SiemensS7Net _plc;
-
- public SiemensCommunicatorAdapter(DeviceAddress address)
- {
- _plc = new SiemensS7Net(SiemensPLCS.S1200, address.Ip);
- _plc.ConnectTimeOut = 5000;
- }
-
- public async Task<bool> Connect(DeviceAddress address)
- {
- var result = await Task.Run(() => _plc.ConnectServer());
- return result.IsSuccess;
- }
-
- public async Task<DeviceData> ReadData(string address)
- {
- var result = await Task.Run(() => _plc.Read(address));
- if (!result.IsSuccess)
- throw new CommunicationException($"璇诲彇澶辫触: {result.Message}");
-
- return new DeviceData(result.Content);
- }
-
- // ... 鍏朵粬鏂规硶
-}
-```
-
----
-
-## 5. 鍒嗗眰娓呮櫚鍖�
-
-### 5.1 椤圭洰缁撴瀯閲嶇粍
-
-```
-WIDESEAWCS_Domain/
-鈹溾攢鈹� DeviceManagement/
-鈹� 鈹溾攢鈹� Aggregates/
-鈹� 鈹� 鈹溾攢鈹� Device.cs
-鈹� 鈹� 鈹溾攢鈹� DeviceGroup.cs
-鈹� 鈹� 鈹斺攢鈹� DeviceTask.cs
-鈹� 鈹溾攢鈹� Entities/
-鈹� 鈹� 鈹溾攢鈹� DeviceStatus.cs
-鈹� 鈹� 鈹溾攢鈹� DeviceLocation.cs
-鈹� 鈹� 鈹斺攢鈹� DeviceProperty.cs
-鈹� 鈹溾攢鈹� ValueObjects/
-鈹� 鈹� 鈹溾攢鈹� DeviceId.cs
-鈹� 鈹� 鈹溾攢鈹� DeviceName.cs
-鈹� 鈹� 鈹溾攢鈹� DeviceAddress.cs
-鈹� 鈹� 鈹斺攢鈹� TaskPayload.cs
-鈹� 鈹溾攢鈹� Services/
-鈹� 鈹� 鈹溾攢鈹� IDeviceScheduler.cs
-鈹� 鈹� 鈹溾攢鈹� DeviceScheduler.cs
-鈹� 鈹� 鈹溾攢鈹� IDeviceStateMachine.cs
-鈹� 鈹� 鈹斺攢鈹� DeviceStateMachine.cs
-鈹� 鈹溾攢鈹� Repositories/
-鈹� 鈹� 鈹溾攢鈹� IDeviceRepository.cs
-鈹� 鈹� 鈹斺攢鈹� IDeviceTaskRepository.cs
-鈹� 鈹斺攢鈹� Events/
-鈹� 鈹溾攢鈹� DeviceConnectedEvent.cs
-鈹� 鈹斺攢鈹� TaskCompletedEvent.cs
-鈹斺攢鈹� WarehouseOperations/
- 鈹斺攢鈹� ...
-
-WIDESEAWCS_Application/
-鈹溾攢鈹� Services/
-鈹� 鈹斺攢鈹� DeviceApplicationService.cs
-鈹溾攢鈹� Commands/
-鈹� 鈹斺攢鈹� CreateDeviceTaskCommand.cs
-鈹溾攢鈹� Queries/
-鈹� 鈹斺攢鈹� GetDeviceQuery.cs
-鈹斺攢鈹� DTOs/
- 鈹斺攢鈹� DeviceDto.cs
-
-WIDESEAWCS_Infrastructure/
-鈹溾攢鈹� Persistence/
-鈹� 鈹溾攢鈹� Repositories/
-鈹� 鈹� 鈹溾攢鈹� DeviceRepository.cs
-鈹� 鈹� 鈹斺攢鈹� DeviceTaskRepository.cs
-鈹� 鈹斺攢鈹� SqlSugar/
-鈹� 鈹斺攢鈹� DbContext.cs
-鈹溾攢鈹� Communication/
-鈹� 鈹溾攢鈹� Adapters/
-鈹� 鈹� 鈹溾攢鈹� SiemensCommunicatorAdapter.cs
-鈹� 鈹� 鈹溾攢鈹� OmronCommunicatorAdapter.cs
-鈹� 鈹� 鈹斺攢鈹� ModbusCommunicatorAdapter.cs
-鈹� 鈹斺攢鈹� IDeviceCommunicatorAdapter.cs
-鈹溾攢鈹� Caching/
-鈹� 鈹斺攢鈹� RedisCacheService.cs
-鈹斺攢鈹� Scheduling/
- 鈹斺攢鈹� QuartzJobManager.cs
-
-WIDESEAWCS_Server/
-鈹斺攢鈹� Controllers/
- 鈹斺攢鈹� DeviceController.cs
-```
-
----
-
-## 6. 鎬ц兘浼樺寲绛栫暐
-
-### 6.1 缂撳瓨浼樺寲
-
-```csharp
-// 澶氱骇缂撳瓨绛栫暐
-public class HybridCacheService : ICacheService
-{
- private readonly IMemoryCache _l1Cache;
- private readonly IConnectionMultiplexer _redis;
- private readonly IDistributedCache _l2Cache;
-
- public async Task<T?> Get<T>(string key)
- {
- // L1缂撳瓨
- if (_l1Cache.TryGetValue(key, out T l1Value))
- return l1Value;
-
- // L2缂撳瓨
- var l2Value = await _l2Cache.GetStringAsync(key);
- if (l2Value != null)
- {
- var value = JsonSerializer.Deserialize<T>(l2Value);
- _l1Cache.Set(key, value, TimeSpan.FromMinutes(1));
- return value;
- }
-
- return default;
- }
-
- public async Task Set<T>(string key, T value, TimeSpan? expiry = null)
- {
- _l1Cache.Set(key, value, TimeSpan.FromMinutes(1));
-
- var serialized = JsonSerializer.Serialize(value);
- await _l2Cache.SetStringAsync(key, serialized, expiry);
- }
-}
-```
-
-### 6.2 鏁版嵁搴撴煡璇紭鍖�
-
-```csharp
-// 鎵归噺鏌ヨ浼樺寲
-public class DeviceRepository : IDeviceRepository
-{
- public async Task<IDictionary<DeviceId, Device>> GetByIds(IEnumerable<DeviceId> ids)
- {
- var idList = ids.Select(id => id.Value).ToList();
-
- // 鎵归噺鏌ヨ
- var entities = await _db.Queryable<Dt_DeviceInfo>()
- .In(idList)
- .ToListAsync();
-
- return entities.ToDictionary(
- e => DeviceId.From(e.DeviceId),
- e => MapToDomain(e)
- );
- }
-
- // 寤惰繜鏌ヨ
- public async Task<IEnumerable<Device>> QueryActiveDevices()
- {
- return await _db.Queryable<Dt_DeviceInfo>()
- .Where(d => d.Status != DeviceStatus.Disconnected)
- .OrderBy(d => d.Name)
- .Select(d => MapToDomain(d))
- .ToListAsync();
- }
-}
-```
-
----
-
-## 7. 閿欒澶勭悊鍜屾棩蹇楃粺涓�
-
-### 7.1 缁熶竴寮傚父澶勭悊
-
-```csharp
-// 棰嗗煙寮傚父鍩虹被
-public abstract class DomainException : Exception
-{
- public string ErrorCode { get; }
-
- protected DomainException(string message, string errorCode = "DOMAIN_ERROR")
- : base(message)
- {
- ErrorCode = errorCode;
- }
-}
-
-// 搴旂敤寮傚父
-public class ApplicationException : Exception
-{
- public string ErrorCode { get; }
-
- public ApplicationException(string message, string errorCode = "APP_ERROR")
- : base(message)
- {
- ErrorCode = errorCode;
- }
-}
-
-// 鍏ㄥ眬寮傚父澶勭悊涓棿浠�
-public class GlobalExceptionHandlerMiddleware
-{
- public async Task InvokeAsync(HttpContext context, RequestDelegate next)
- {
- try
- {
- await next(context);
- }
- catch (DomainException ex)
- {
- context.Response.StatusCode = 400;
- await context.Response.WriteAsJsonAsync(new
- {
- error = ex.ErrorCode,
- message = ex.Message
- });
- }
- catch (ApplicationException ex)
- {
- context.Response.StatusCode = 500;
- await context.Response.WriteAsJsonAsync(new
- {
- error = ex.ErrorCode,
- message = ex.Message
- });
- }
- }
-}
-```
-
-### 7.2 缁撴瀯鍖栨棩蹇�
-
-```csharp
-// 棰嗗煙浜嬩欢鏃ュ織
-public class DomainEventLogger : IDomainEventDispatcher
-{
- private readonly ILogger<DomainEventLogger> _logger;
-
- public async Task Dispatch(IDomainEvent domainEvent)
- {
- _logger.LogInformation("棰嗗煙浜嬩欢: {EventType}, 鏁版嵁: {EventData}",
- domainEvent.GetType().Name,
- JsonSerializer.Serialize(domainEvent));
-
- // 鍙戦�佸埌浜嬩欢鎬荤嚎
- }
-}
-
-// 璁惧鎿嶄綔鏃ュ織
-public class DeviceOperationLogger : IDeviceOperationLogger
-{
- public void LogConnect(DeviceId deviceId, bool success, string? error = null)
- {
- if (success)
- {
- _logger.LogInformation("璁惧杩炴帴鎴愬姛: {DeviceId}", deviceId.Value);
- }
- else
- {
- _logger.LogError("璁惧杩炴帴澶辫触: {DeviceId}, 閿欒: {Error}",
- deviceId.Value, error);
- }
- }
-}
-```
-
----
-
-## 8. 瀹炴柦璁″垝锛�2鍛級
-
-### 绗�1鍛細棰嗗煙灞傛惌寤�
-
-| 澶╂暟 | 浠诲姟 |
-|------|------|
-| Day 1-2 | 鍒涘缓棰嗗煙椤圭洰缁撴瀯锛屽畾涔夊�煎璞″拰鑱氬悎鏍� |
-| Day 3-4 | 瀹炵幇棰嗗煙鏈嶅姟鍜岀姸鎬佹満 |
-| Day 5 | 鍒涘缓浠撳偍鎺ュ彛锛屽畾涔夐鍩熶簨浠� |
-
-### 绗�2鍛細搴旂敤灞傚拰鍩虹璁炬柦灞�
-
-| 澶╂暟 | 浠诲姟 |
-|------|------|
-| Day 1-2 | 瀹炵幇搴旂敤鏈嶅姟鍜孌TO |
-| Day 3 | 鍒涘缓浠撳偍瀹炵幇锛岃縼绉绘暟鎹闂�昏緫 |
-| Day 4 | 灏佽閫氫俊椹卞姩锛屼紭鍖栫紦瀛樼瓥鐣� |
-| Day 5 | 缁熶竴閿欒澶勭悊鍜屾棩蹇楋紝闆嗘垚娴嬭瘯 |
-
----
-
-## 9. 璁捐鍐崇瓥璁板綍
-
-### 9.1 涓轰粈涔堥�夋嫨娓愯繘寮廌DD鑰岄潪瀹屾暣DDD閲嶆瀯锛�
-
-**鍐崇瓥**锛氶�夋嫨娓愯繘寮廌DD閲嶆瀯鑰岄潪瀹屾暣DDD閲嶆瀯
-
-**鐞嗙敱**锛�
-1. 鏃堕棿绾︽潫锛�2鍛ㄥ唴鏃犳硶瀹屾垚瀹屾暣DDD閲嶆瀯
-2. 椋庨櫓鎺у埗锛氭笎杩涘紡闄嶄綆椋庨櫓锛屽彲鍒嗛樁娈甸獙璇�
-3. 绯荤粺绋冲畾鎬э細淇濇寔鐜版湁鍔熻兘鍙敤
-4. 璧勬簮鏁堢巼锛氫紭鍏堥噸鏋勬牳蹇冮鍩�
-
-### 9.2 涓轰粈涔堝皢璁惧绠$悊浣滀负鏍稿績棰嗗煙锛�
-
-**鍐崇瓥**锛氬皢璁惧绠$悊浣滀负绗竴涓噸鏋勭殑鏍稿績棰嗗煙
-
-**鐞嗙敱**锛�
-1. 涓氬姟浼樺厛绾э細璁惧绠$悊鏄疻CS绯荤粺鐨勬牳蹇�
-2. 浠g爜澶嶆潅搴︼細璁惧绠$悊鍖呭惈鐘舵�併�佽皟搴︺�侀�氫俊绛夊鏉傞�昏緫
-3. 浼樺寲绌洪棿澶э細璁惧绠$悊瀛樺湪杈冨鎬ц兘鍜岃�﹀悎闂
-4. 褰卞搷鑼冨洿骞匡細璁惧绠$悊鏄叾浠栦笟鍔$殑鍩虹
-
-### 9.3 涓轰粈涔堥噰鐢–QRS妯″紡锛�
-
-**鍐崇瓥**锛氬湪搴旂敤灞傞噰鐢–QRS妯″紡
-
-**鐞嗙敱**锛�
-1. 鍏虫敞鐐瑰垎绂伙細鍛戒护鍜屾煡璇㈣亴璐f竻鏅�
-2. 鎬ц兘浼樺寲锛氬彲鍒嗗埆浼樺寲璇诲啓鎿嶄綔
-3. 鎵╁睍鎬уソ锛氫究浜庢坊鍔犵紦瀛樸�佷簨浠跺鐞�
-
----
-
-## 10. 闈炲姛鑳芥�ч渶姹�
-
-### 10.1 鎬ц兘瑕佹眰
-- 璁惧鐘舵�佹煡璇㈠搷搴旀椂闂� < 100ms
-- 浠诲姟鍒涘缓鍝嶅簲鏃堕棿 < 200ms
-- 鏀寔鑷冲皯100涓苟鍙戣澶囪繛鎺�
-
-### 10.2 鍙淮鎶ゆ�ц姹�
-- 浠g爜瑕嗙洊鐜� > 80%
-- 鍦堝鏉傚害 < 10
-- 閬靛惊鍗曚竴鑱岃矗鍘熷垯
-
-### 10.3 鍙墿灞曟�ц姹�
-- 鏀寔鏂板璁惧绫诲瀷鏃犻渶淇敼鏍稿績浠g爜
-- 鏀寔鏂板浠诲姟绫诲瀷
-- 鏀寔澶氱閫氫俊鍗忚鎵╁睍
-
----
-
-## 11. 椋庨櫓璇勪及
-
-| 椋庨櫓 | 鍙兘鎬� | 褰卞搷 | 缂撹В鎺柦 |
-|------|--------|------|----------|
-| 鏃堕棿涓嶈冻 | 楂� | 楂� | 鍒嗛樁娈靛疄鏂斤紝浼樺厛鏍稿績鍔熻兘 |
-| 鏁版嵁杩佺Щ闂 | 涓� | 楂� | 鍏呭垎娴嬭瘯锛屼繚鐣欏洖婊氭柟妗� |
-| 鎬ц兘涓嬮檷 | 涓� | 涓� | 鎬ц兘鍩哄噯娴嬭瘯锛岀洃鎺т紭鍖� |
-| 鍥㈤槦閫傚簲 | 浣� | 涓� | 鎻愪緵鍩硅锛屾枃妗e畬鍠� |
diff --git a/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.backup.json b/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.backup.json
index f98d048..1615b8f 100644
--- a/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.backup.json
+++ b/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.backup.json
@@ -3,28 +3,32 @@
"WorkspaceRootPath": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\",
"Documents": [
{
- "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\backgroundservices\\autooutboundtaskbackgroundservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\backgroundservices\\autooutboundtaskbackgroundservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
- "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
+ "AbsoluteMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_basicservice\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|solutionrelative:widesea_basicservice\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|solutionrelative:widesea_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
- "AbsoluteMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_common\\stockenum\\stockstatusemun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|solutionrelative:widesea_common\\stockenum\\stockstatusemun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\controllers\\taskinfo\\taskcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\controllers\\taskinfo\\taskcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
- "AbsoluteMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_basicservice\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|solutionrelative:widesea_basicservice\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
+ "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\backgroundservices\\autooutboundtaskbackgroundservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\backgroundservices\\autooutboundtaskbackgroundservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_common\\stockenum\\stockstatusemun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|solutionrelative:widesea_common\\stockenum\\stockstatusemun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{7DC26D42-D8EE-46F0-BA66-A13457086885}|WIDESEA_StockService\\WIDESEA_StockService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_stockservice\\stockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
@@ -46,7 +50,7 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 3,
+ "SelectedChildIndex": 9,
"Children": [
{
"$type": "Bookmark",
@@ -62,20 +66,33 @@
},
{
"$type": "Document",
- "DocumentIndex": 0,
+ "DocumentIndex": 2,
+ "Title": "TaskController.cs",
+ "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\TaskInfo\\TaskController.cs",
+ "RelativeDocumentMoniker": "WIDESEA_WMSServer\\Controllers\\TaskInfo\\TaskController.cs",
+ "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\TaskInfo\\TaskController.cs",
+ "RelativeToolTip": "WIDESEA_WMSServer\\Controllers\\TaskInfo\\TaskController.cs",
+ "ViewState": "AgIAAEUAAAAAAAAAAAAEwFYAAABhAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-03-13T02:00:31.089Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 5,
"Title": "AutoOutboundTaskBackgroundService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\BackgroundServices\\AutoOutboundTaskBackgroundService.cs",
"RelativeDocumentMoniker": "WIDESEA_WMSServer\\BackgroundServices\\AutoOutboundTaskBackgroundService.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\BackgroundServices\\AutoOutboundTaskBackgroundService.cs",
"RelativeToolTip": "WIDESEA_WMSServer\\BackgroundServices\\AutoOutboundTaskBackgroundService.cs",
- "ViewState": "AgIAACEAAAAAAAAAAAAIwDEAAAAqAAAAAAAAAA==",
+ "ViewState": "AgIAACEAAAAAAAAAAAAIwDsAAAAoAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-12T10:18:13.91Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 2,
+ "DocumentIndex": 3,
"Title": "appsettings.json",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\appsettings.json",
"RelativeDocumentMoniker": "WIDESEA_WMSServer\\appsettings.json",
@@ -88,20 +105,20 @@
},
{
"$type": "Document",
- "DocumentIndex": 1,
+ "DocumentIndex": 4,
"Title": "Program.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Program.cs",
"RelativeDocumentMoniker": "WIDESEA_WMSServer\\Program.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Program.cs",
"RelativeToolTip": "WIDESEA_WMSServer\\Program.cs",
- "ViewState": "AgIAACYAAAAAAAAAAAAowD8AAABDAAAAAAAAAA==",
+ "ViewState": "AgIAABcAAAAAAAAAAAAswCYAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-12T09:52:09.124Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 4,
+ "DocumentIndex": 6,
"Title": "StockStatusEmun.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_Common\\StockEnum\\StockStatusEmun.cs",
"RelativeDocumentMoniker": "WIDESEA_Common\\StockEnum\\StockStatusEmun.cs",
@@ -109,12 +126,11 @@
"RelativeToolTip": "WIDESEA_Common\\StockEnum\\StockStatusEmun.cs",
"ViewState": "AgIAAAkAAAAAAAAAAAAswB0AAAARAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-12T09:08:34.784Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-03-12T09:08:34.784Z"
},
{
"$type": "Document",
- "DocumentIndex": 7,
+ "DocumentIndex": 8,
"Title": "TaskStatusEnum.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_Common\\TaskEnum\\TaskStatusEnum.cs",
"RelativeDocumentMoniker": "WIDESEA_Common\\TaskEnum\\TaskStatusEnum.cs",
@@ -122,25 +138,24 @@
"RelativeToolTip": "WIDESEA_Common\\TaskEnum\\TaskStatusEnum.cs",
"ViewState": "AgIAAAIAAAAAAAAAAAAiwCYBAAABAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-12T07:20:25.969Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-03-12T07:20:25.969Z"
},
{
"$type": "Document",
- "DocumentIndex": 5,
+ "DocumentIndex": 0,
"Title": "LocationInfoService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_BasicService\\LocationInfoService.cs",
"RelativeDocumentMoniker": "WIDESEA_BasicService\\LocationInfoService.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_BasicService\\LocationInfoService.cs",
"RelativeToolTip": "WIDESEA_BasicService\\LocationInfoService.cs",
- "ViewState": "AgIAAAYBAAAAAAAAAIAwwBoBAABuAAAAAAAAAA==",
+ "ViewState": "AgIAAKcAAAAAAAAAAAAiwLEAAAAVAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-12T02:05:14.224Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 8,
+ "DocumentIndex": 9,
"Title": "LocationInfoController.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\Basic\\LocationInfoController.cs",
"RelativeDocumentMoniker": "WIDESEA_WMSServer\\Controllers\\Basic\\LocationInfoController.cs",
@@ -148,12 +163,11 @@
"RelativeToolTip": "WIDESEA_WMSServer\\Controllers\\Basic\\LocationInfoController.cs",
"ViewState": "AgIAAEkAAAAAAAAAAAAIwF8AAAAsAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-12T01:53:01.837Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-03-12T01:53:01.837Z"
},
{
"$type": "Document",
- "DocumentIndex": 6,
+ "DocumentIndex": 7,
"Title": "StockInfoService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_StockService\\StockInfoService.cs",
"RelativeDocumentMoniker": "WIDESEA_StockService\\StockInfoService.cs",
@@ -161,18 +175,17 @@
"RelativeToolTip": "WIDESEA_StockService\\StockInfoService.cs",
"ViewState": "AgIAADQAAAAAAAAAAAAQwDkAAAAuAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-11T09:16:37.34Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-03-11T09:16:37.34Z"
},
{
"$type": "Document",
- "DocumentIndex": 3,
+ "DocumentIndex": 1,
"Title": "TaskService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_TaskInfoService\\TaskService.cs",
"RelativeDocumentMoniker": "WIDESEA_TaskInfoService\\TaskService.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_TaskInfoService\\TaskService.cs",
"RelativeToolTip": "WIDESEA_TaskInfoService\\TaskService.cs",
- "ViewState": "AgIAAEkCAAAAAAAAAAAQwFoCAAAQAAAAAAAAAA==",
+ "ViewState": "AgIAAEkBAAAAAAAAAAAiwIgBAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-02-06T06:34:59.734Z",
"EditorCaption": ""
diff --git a/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.json b/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.json
index 345455b..29f05c5 100644
--- a/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.json
+++ b/Code/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v18/DocumentLayout.json
@@ -3,28 +3,32 @@
"WorkspaceRootPath": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\",
"Documents": [
{
- "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\backgroundservices\\autooutboundtaskbackgroundservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\backgroundservices\\autooutboundtaskbackgroundservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
- "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
+ "AbsoluteMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_basicservice\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|solutionrelative:widesea_basicservice\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{7D7534D4-51D9-46DC-A6B7-6430042F4E12}|WIDESEA_TaskInfoService\\WIDESEA_TaskInfoService.csproj|solutionrelative:widesea_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
- "AbsoluteMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_common\\stockenum\\stockstatusemun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|solutionrelative:widesea_common\\stockenum\\stockstatusemun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\controllers\\taskinfo\\taskcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\controllers\\taskinfo\\taskcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
- "AbsoluteMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_basicservice\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{D11C804C-2FF4-4C18-A3EE-2F0574427BB3}|WIDESEA_BasicService\\WIDESEA_BasicService.csproj|solutionrelative:widesea_basicservice\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
+ "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_wmsserver\\backgroundservices\\autooutboundtaskbackgroundservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\backgroundservices\\autooutboundtaskbackgroundservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_common\\stockenum\\stockstatusemun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}|WIDESEA_Common\\WIDESEA_Common.csproj|solutionrelative:widesea_common\\stockenum\\stockstatusemun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{7DC26D42-D8EE-46F0-BA66-A13457086885}|WIDESEA_StockService\\WIDESEA_StockService.csproj|d:\\git\\shanmeixinnengyuan\\code\\wms\\widesea_wmsserver\\widesea_stockservice\\stockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
@@ -46,7 +50,7 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 3,
+ "SelectedChildIndex": 9,
"Children": [
{
"$type": "Bookmark",
@@ -62,7 +66,20 @@
},
{
"$type": "Document",
- "DocumentIndex": 0,
+ "DocumentIndex": 2,
+ "Title": "TaskController.cs",
+ "DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\TaskInfo\\TaskController.cs",
+ "RelativeDocumentMoniker": "WIDESEA_WMSServer\\Controllers\\TaskInfo\\TaskController.cs",
+ "ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\TaskInfo\\TaskController.cs",
+ "RelativeToolTip": "WIDESEA_WMSServer\\Controllers\\TaskInfo\\TaskController.cs",
+ "ViewState": "AgIAAEUAAAAAAAAAAAAEwFYAAABhAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-03-13T02:00:31.089Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 5,
"Title": "AutoOutboundTaskBackgroundService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\BackgroundServices\\AutoOutboundTaskBackgroundService.cs",
"RelativeDocumentMoniker": "WIDESEA_WMSServer\\BackgroundServices\\AutoOutboundTaskBackgroundService.cs",
@@ -75,7 +92,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 2,
+ "DocumentIndex": 3,
"Title": "appsettings.json",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\appsettings.json",
"RelativeDocumentMoniker": "WIDESEA_WMSServer\\appsettings.json",
@@ -88,20 +105,20 @@
},
{
"$type": "Document",
- "DocumentIndex": 1,
+ "DocumentIndex": 4,
"Title": "Program.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Program.cs",
"RelativeDocumentMoniker": "WIDESEA_WMSServer\\Program.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Program.cs",
"RelativeToolTip": "WIDESEA_WMSServer\\Program.cs",
- "ViewState": "AgIAACYAAAAAAAAAAAAowD8AAABDAAAAAAAAAA==",
+ "ViewState": "AgIAABcAAAAAAAAAAAAswCYAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-12T09:52:09.124Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 4,
+ "DocumentIndex": 6,
"Title": "StockStatusEmun.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_Common\\StockEnum\\StockStatusEmun.cs",
"RelativeDocumentMoniker": "WIDESEA_Common\\StockEnum\\StockStatusEmun.cs",
@@ -109,12 +126,11 @@
"RelativeToolTip": "WIDESEA_Common\\StockEnum\\StockStatusEmun.cs",
"ViewState": "AgIAAAkAAAAAAAAAAAAswB0AAAARAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-12T09:08:34.784Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-03-12T09:08:34.784Z"
},
{
"$type": "Document",
- "DocumentIndex": 7,
+ "DocumentIndex": 8,
"Title": "TaskStatusEnum.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_Common\\TaskEnum\\TaskStatusEnum.cs",
"RelativeDocumentMoniker": "WIDESEA_Common\\TaskEnum\\TaskStatusEnum.cs",
@@ -122,25 +138,24 @@
"RelativeToolTip": "WIDESEA_Common\\TaskEnum\\TaskStatusEnum.cs",
"ViewState": "AgIAAAIAAAAAAAAAAAAiwCYBAAABAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-12T07:20:25.969Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-03-12T07:20:25.969Z"
},
{
"$type": "Document",
- "DocumentIndex": 5,
+ "DocumentIndex": 0,
"Title": "LocationInfoService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_BasicService\\LocationInfoService.cs",
"RelativeDocumentMoniker": "WIDESEA_BasicService\\LocationInfoService.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_BasicService\\LocationInfoService.cs",
"RelativeToolTip": "WIDESEA_BasicService\\LocationInfoService.cs",
- "ViewState": "AgIAAAYBAAAAAAAAAIAwwBoBAABuAAAAAAAAAA==",
+ "ViewState": "AgIAAKcAAAAAAAAAAAAiwLgAAAAMAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-12T02:05:14.224Z",
"EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 8,
+ "DocumentIndex": 9,
"Title": "LocationInfoController.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\Basic\\LocationInfoController.cs",
"RelativeDocumentMoniker": "WIDESEA_WMSServer\\Controllers\\Basic\\LocationInfoController.cs",
@@ -148,12 +163,11 @@
"RelativeToolTip": "WIDESEA_WMSServer\\Controllers\\Basic\\LocationInfoController.cs",
"ViewState": "AgIAAEkAAAAAAAAAAAAIwF8AAAAsAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-12T01:53:01.837Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-03-12T01:53:01.837Z"
},
{
"$type": "Document",
- "DocumentIndex": 6,
+ "DocumentIndex": 7,
"Title": "StockInfoService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_StockService\\StockInfoService.cs",
"RelativeDocumentMoniker": "WIDESEA_StockService\\StockInfoService.cs",
@@ -161,18 +175,17 @@
"RelativeToolTip": "WIDESEA_StockService\\StockInfoService.cs",
"ViewState": "AgIAADQAAAAAAAAAAAAQwDkAAAAuAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-03-11T09:16:37.34Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-03-11T09:16:37.34Z"
},
{
"$type": "Document",
- "DocumentIndex": 3,
+ "DocumentIndex": 1,
"Title": "TaskService.cs",
"DocumentMoniker": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_TaskInfoService\\TaskService.cs",
"RelativeDocumentMoniker": "WIDESEA_TaskInfoService\\TaskService.cs",
"ToolTip": "D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS\\WIDESEA_WMSServer\\WIDESEA_TaskInfoService\\TaskService.cs",
"RelativeToolTip": "WIDESEA_TaskInfoService\\TaskService.cs",
- "ViewState": "AgIAAEkCAAAAAAAAAAAQwFoCAAAQAAAAAAAAAA==",
+ "ViewState": "AgIAAEkBAAAAAAAAAAAiwIgBAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-02-06T06:34:59.734Z",
"EditorCaption": ""
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs
index cf44abb..8ea1382 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs
@@ -44,7 +44,11 @@
.ReadFrom.Services(services)
.Enrich.FromLogContext()
.WriteTo.Console()
- .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day);
+ .WriteTo.File(
+ "logs/serilog-.log.txt",
+ rollingInterval: RollingInterval.Day,
+ retainedFileCountLimit: 30,
+ shared: true);
});
builder.ConfigureApplication();
diff --git "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\351\253\230\345\270\270\346\270\251\345\240\206\345\236\233\346\234\272\344\270\216\350\276\223\351\200\201\347\272\277/~$WCS\350\276\223\351\200\201\345\257\271\346\216\245\345\234\260\345\235\200\350\241\250.xlsx" "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\351\253\230\345\270\270\346\270\251\345\240\206\345\236\233\346\234\272\344\270\216\350\276\223\351\200\201\347\272\277/~$WCS\350\276\223\351\200\201\345\257\271\346\216\245\345\234\260\345\235\200\350\241\250.xlsx"
deleted file mode 100644
index 236d63d..0000000
--- "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\351\253\230\345\270\270\346\270\251\345\240\206\345\236\233\346\234\272\344\270\216\350\276\223\351\200\201\347\272\277/~$WCS\350\276\223\351\200\201\345\257\271\346\216\245\345\234\260\345\235\200\350\241\250.xlsx"
+++ /dev/null
Binary files differ
--
Gitblit v1.9.3